Skip to content

Commit

Permalink
fix(toolchains): register py cc toolchain for workspace builds
Browse files Browse the repository at this point in the history
The workspace `python_register_toolchains()` only registered the plain
Python toolchain by its specific name. The py cc toolchain wasn't also
being named. This meant things like `//python/cc:current_py_cc_headers`
couldn't find their toolchain. Bzlmod doesn't have this problem because
it uses the `:all` pattern to register everything.

To fix, also register the py cc toolchain where the plain Python
toolchain is registered, which makes it available.

Fixes bazelbuild#1669
  • Loading branch information
rickeylev committed Jan 7, 2024
1 parent 8aaaf93 commit 21cc2e0
Show file tree
Hide file tree
Showing 10 changed files with 109 additions and 2 deletions.
4 changes: 2 additions & 2 deletions .bazelrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
# (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it)
# To update these lines, execute
# `bazel run @rules_bazel_integration_test//tools:update_deleted_packages`
build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/pip_repository_entry_points
query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/pip_repository_entry_points
build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered
query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered

test --test_output=errors

Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ A brief description of the categories of changes:
* (coverage): coverage reports are now created when the version-aware
rules are used.
([#1600](https://github.com/bazelbuild/rules_python/issues/1600))
* (toolchains) Workspace builds register the py cc toolchain (bzlmod already
was). This makes e.g. `//python/cc:current_py_cc_headers` Just Work.
([#1669](https://github.com/bazelbuild/rules_python/issues/1669))

### Added

Expand Down
4 changes: 4 additions & 0 deletions python/repositories.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,10 @@ def python_register_toolchains(
toolchain_repo_name = toolchain_repo_name,
platform = platform,
))
native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_cc_toolchain".format(
toolchain_repo_name = toolchain_repo_name,
platform = platform,
))

toolchain_aliases(
name = name,
Expand Down
12 changes: 12 additions & 0 deletions tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ def _test_current_toolchain_headers_impl(env, target):

_tests.append(_test_current_toolchain_headers)

def _test_toolchain_is_registered_by_default(name):
analysis_test(
name = name,
impl = _test_toolchain_is_registered_by_default_impl,
target = "//python/cc:current_py_cc_headers",
)

def _test_toolchain_is_registered_by_default_impl(env, target):
env.expect.that_target(target).has_provider(CcInfo)

_tests.append(_test_toolchain_is_registered_by_default)

def current_py_cc_headers_test_suite(name):
test_suite(
name = name,
Expand Down
10 changes: 10 additions & 0 deletions tests/integration/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,13 @@ rules_python_integration_test(
bzlmod = False,
workspace_path = "ignore_root_user_error",
)

rules_python_integration_test(
name = "py_cc_toolchain_registered_test",
)

rules_python_integration_test(
name = "py_cc_toolchain_registered_workspace_test",
bzlmod = False,
workspace_path = "py_cc_toolchain_registered",
)
2 changes: 2 additions & 0 deletions tests/integration/py_cc_toolchain_registered/.bazelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# This aids debugging on failure
build --toolchain_resolution_debug=python
19 changes: 19 additions & 0 deletions tests/integration/py_cc_toolchain_registered/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright 2024 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.

load(":defs.bzl", "py_cc_toolchain_available_test")

# Simple test to verify that the py_cc_toolchain is registered and available
# by default (for bzlmod) and when users setup a hermetic toolchain (workspace)
py_cc_toolchain_available_test(name = "py_cc_toolchain_available_test")
7 changes: 7 additions & 0 deletions tests/integration/py_cc_toolchain_registered/MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module(name = "py_cc_toolchain_registered")

bazel_dep(name = "rules_python", version = "0.0.0")
local_path_override(
module_name = "rules_python",
path = "../../..",
)
13 changes: 13 additions & 0 deletions tests/integration/py_cc_toolchain_registered/WORKSPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
local_repository(
name = "rules_python",
path = "../../..",
)

load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains")

py_repositories()

python_register_toolchains(
name = "python_3_11",
python_version = "3.11",
)
37 changes: 37 additions & 0 deletions tests/integration/py_cc_toolchain_registered/defs.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Copyright 2022 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.

def _py_cc_toolchain_available_test_impl(ctx):
toolchain = ctx.toolchains["@rules_python//python/cc:toolchain_type"]

if toolchain == None:
fail("expected @rules_python//python/cc:toolchain_type toolchain " +
"to be found, but it was not found")

executable = ctx.actions.declare_file(ctx.label.name)
ctx.actions.write(executable, "# no-op file", is_executable = True)
return [DefaultInfo(
executable = executable,
)]

py_cc_toolchain_available_test = rule(
implementation = _py_cc_toolchain_available_test_impl,
toolchains = [
config_common.toolchain_type(
"@rules_python//python/cc:toolchain_type",
mandatory = False,
),
],
test = True,
)

0 comments on commit 21cc2e0

Please sign in to comment.