Skip to content

Commit

Permalink
Add load() statements for Python rules in third_party
Browse files Browse the repository at this point in the history
This replaces all direct uses of the native Python rules underneath the
third_party/ directory with load()s of the internal wrapper macros. These
macros are needed for compatibility with
`--incompatible_load_python_rules_from_bzl`.

Work toward #9006.

RELNOTES: None
  • Loading branch information
brandjon committed Jul 31, 2019
1 parent f169286 commit 664a809
Show file tree
Hide file tree
Showing 13 changed files with 128 additions and 2 deletions.
9 changes: 9 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,15 @@ new_local_repository(
path = "./third_party/protobuf/3.6.1/",
)

# Used by protobuf.
# TODO(#9029): This should be replaced by the real bazelbuild/rules_python.
# Also, all non-@bazel_tools uses of Python rules in the Bazel source tree
# should be updated to reference @rules_python//python:defs.bzl.
local_repository(
name = "rules_python",
path = "./third_party/rules_python",
)

local_repository(
name = "googleapis",
path = "./third_party/googleapis/",
Expand Down
2 changes: 2 additions & 0 deletions third_party/def_parser/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//tools/python:private/defs.bzl", "py_test")

licenses(["notice"]) # 3-clause BSD

package(
Expand Down
1 change: 1 addition & 0 deletions third_party/protobuf/3.6.1/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ config_setting(

load(":protobuf.bzl", "py_proto_library")
load(":compiler_config_setting.bzl", "create_compiler_config_setting")
load("@rules_python//python:defs.bzl", "py_library")

filegroup(
name = "srcs",
Expand Down
6 changes: 4 additions & 2 deletions third_party/protobuf/3.6.1/protobuf.bzl
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("@rules_python//python:defs.bzl", "py_library", "py_test")

def _GetPath(ctx, path):
if ctx.label.workspace_root:
return ctx.label.workspace_root + "/" + path
Expand Down Expand Up @@ -383,7 +385,7 @@ def py_proto_library(
if default_runtime and not default_runtime in py_libs + deps:
py_libs = py_libs + [default_runtime]

native.py_library(
py_library(
name = name,
srcs = outs + py_extra_srcs,
deps = py_libs + deps,
Expand All @@ -406,7 +408,7 @@ def internal_protobuf_py_tests(
"""
for m in modules:
s = "python/google/protobuf/internal/%s.py" % m
native.py_test(
py_test(
name = "py_%s" % m,
srcs = [s],
main = s,
Expand Down
58 changes: 58 additions & 0 deletions third_party/protobuf/3.6.1/python_defs.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Copyright 2019 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""This is a Bazel-internal file; do not load() it!
The incompatible change `--incompatible_load_python_rules_from_bzl` (#9006)
makes it so the four native Python rules cannot be used unless a magic tag is
present. It is intended that only `@rules_python` (bazelbuild/rules_python)
uses this tag, and all other uses access the native rules via the wrapper
macros defined in `@rules_python`.
However, `@bazel_tools` is not allowed to depend on any other repos. Therefore,
we replicate the behavior of `@rules_python`'s wrapper macros in this file, for
use by Bazel only.
This gets a bit tricky with the third_party/ directory. Some of its
subdirectories are full-blown workspaces that cannot directly reference this
file's label. For these cases we currently copy this file into those trees
under the name `python_defs.bzl`.
TODO(#9029): Currently all uses of Python in Bazel's source tree use this file,
but in principle only `@bazel_tools` needs to. The rest should use the real
`@rules_python`, or for third_party/ packages that get mirrored into
`@bazel_tools`, a dummy version of the repo that contains only this file under
label `@rules_python//python:defs.bzl`.
"""

_MIGRATION_TAG = "__PYTHON_RULES_MIGRATION_DO_NOT_USE_WILL_BREAK__"

def _add_tags(attrs):
if "tags" in attrs and attrs["tags"] != None:
attrs["tags"] += [_MIGRATION_TAG]
else:
attrs["tags"] = [_MIGRATION_TAG]
return attrs

def py_library(**attrs):
native.py_library(**_add_tags(attrs))

def py_binary(**attrs):
native.py_binary(**_add_tags(attrs))

def py_test(**attrs):
native.py_test(**_add_tags(attrs))

def py_runtime(**attrs):
native.py_runtime(**_add_tags(attrs))
2 changes: 2 additions & 0 deletions third_party/py/abseil/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//tools/python:private/defs.bzl", "py_library")

licenses(["notice"])

filegroup(
Expand Down
2 changes: 2 additions & 0 deletions third_party/py/concurrent/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//tools/python:private/defs.bzl", "py_library")

licenses(["notice"])

filegroup(
Expand Down
2 changes: 2 additions & 0 deletions third_party/py/gflags/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//tools/python:private/defs.bzl", "py_library")

licenses(["notice"])

filegroup(
Expand Down
2 changes: 2 additions & 0 deletions third_party/py/mock/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//tools/python:private/defs.bzl", "py_library")

licenses(["notice"])

filegroup(
Expand Down
2 changes: 2 additions & 0 deletions third_party/py/six/BUILD
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//tools/python:private/defs.bzl", "py_library")

licenses(["notice"])

filegroup(
Expand Down
7 changes: 7 additions & 0 deletions third_party/rules_python/WORKSPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# A stub version of bazelbuild/rules_python that contains only the defs.bzl
# file needed to access native Python rules under
# --incompatible_load_python_rules_from_bzl.
#
# TODO(#9029): Replace this with the real thing (probably).

workspace(name = "rules_python")
1 change: 1 addition & 0 deletions third_party/rules_python/python/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# This file intentionally left blank.
36 changes: 36 additions & 0 deletions third_party/rules_python/python/defs.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Copyright 2019 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Internal copy of //tools/python:private/defs.bzl."""

_MIGRATION_TAG = "__PYTHON_RULES_MIGRATION_DO_NOT_USE_WILL_BREAK__"

def _add_tags(attrs):
if "tags" in attrs and attrs["tags"] != None:
attrs["tags"] += [_MIGRATION_TAG]
else:
attrs["tags"] = [_MIGRATION_TAG]
return attrs

def py_library(**attrs):
native.py_library(**_add_tags(attrs))

def py_binary(**attrs):
native.py_binary(**_add_tags(attrs))

def py_test(**attrs):
native.py_test(**_add_tags(attrs))

def py_runtime(**attrs):
native.py_runtime(**_add_tags(attrs))

0 comments on commit 664a809

Please sign in to comment.