blob: d52cc5dd9561796412557ad84b9a6bf0b0e39783 [file] [log] [blame]
# 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.
"""Run a py_binary/py_test with altered config settings.
This facilitates verify running binaries with different configuration settings
without the overhead of a bazel-in-bazel integration test.
"""
load("//python/private:attr_builders.bzl", "attrb") # buildifier: disable=bzl-visibility
load("//python/private:common_labels.bzl", "labels") # buildifier: disable=bzl-visibility
load("//python/private:py_binary_macro.bzl", "py_binary_macro") # buildifier: disable=bzl-visibility
load("//python/private:py_binary_rule.bzl", "create_py_binary_rule_builder") # buildifier: disable=bzl-visibility
load("//python/private:py_test_macro.bzl", "py_test_macro") # buildifier: disable=bzl-visibility
load("//python/private:py_test_rule.bzl", "create_py_test_rule_builder") # buildifier: disable=bzl-visibility
load("//tests/support:support.bzl", "CUSTOM_RUNTIME")
def _perform_transition_impl(input_settings, attr, base_impl):
settings = {k: input_settings[k] for k in _RECONFIG_INHERITED_OUTPUTS if k in input_settings}
settings.update(base_impl(input_settings, attr))
settings[labels.VISIBLE_FOR_TESTING] = True
settings["//command_line_option:build_python_zip"] = attr.build_python_zip
if attr.bootstrap_impl:
settings[labels.BOOTSTRAP_IMPL] = attr.bootstrap_impl
if attr.extra_toolchains:
settings["//command_line_option:extra_toolchains"] = attr.extra_toolchains
if attr.python_src:
settings[labels.PYTHON_SRC] = attr.python_src
if attr.repl_dep:
settings[labels.REPL_DEP] = attr.repl_dep
if attr.venvs_use_declare_symlink:
settings[labels.VENVS_USE_DECLARE_SYMLINK] = attr.venvs_use_declare_symlink
if attr.venvs_site_packages:
settings[labels.VENVS_SITE_PACKAGES] = attr.venvs_site_packages
for key, value in attr.config_settings.items():
settings[str(key)] = value
return settings
_RECONFIG_INPUTS = [
"//command_line_option:extra_toolchains",
CUSTOM_RUNTIME,
labels.BOOTSTRAP_IMPL,
labels.PYTHON_SRC,
labels.REPL_DEP,
labels.VENVS_SITE_PACKAGES,
labels.VENVS_USE_DECLARE_SYMLINK,
]
_RECONFIG_OUTPUTS = _RECONFIG_INPUTS + [
"//command_line_option:build_python_zip",
labels.VISIBLE_FOR_TESTING,
]
_RECONFIG_INHERITED_OUTPUTS = [v for v in _RECONFIG_OUTPUTS if v in _RECONFIG_INPUTS]
_RECONFIG_ATTRS = {
"bootstrap_impl": attrb.String(),
"build_python_zip": attrb.String(default = "auto"),
"config_settings": attrb.LabelKeyedStringDict(),
"extra_toolchains": attrb.StringList(
doc = """
Value for the --extra_toolchains flag.
NOTE: You'll likely have to also specify //tests/support/cc_toolchains:all (or some CC toolchain)
to make the RBE presubmits happy, which disable auto-detection of a CC
toolchain.
""",
),
"python_src": attrb.Label(),
"repl_dep": attrb.Label(),
"venvs_site_packages": attrb.String(),
"venvs_use_declare_symlink": attrb.String(),
}
def _create_reconfig_rule(builder):
builder.attrs.update(_RECONFIG_ATTRS)
base_cfg_impl = builder.cfg.implementation()
builder.cfg.set_implementation(lambda *args: _perform_transition_impl(base_impl = base_cfg_impl, *args))
builder.cfg.update_inputs(_RECONFIG_INPUTS)
builder.cfg.update_outputs(_RECONFIG_OUTPUTS)
return builder.build()
_py_reconfig_binary = _create_reconfig_rule(create_py_binary_rule_builder())
_py_reconfig_test = _create_reconfig_rule(create_py_test_rule_builder())
def py_reconfig_test(**kwargs):
"""Create a py_test with customized build settings for testing.
Args:
**kwargs: kwargs to pass along to _py_reconfig_test.
"""
py_test_macro(_py_reconfig_test, **kwargs)
def py_reconfig_binary(**kwargs):
py_binary_macro(_py_reconfig_binary, **kwargs)