blob: a6d03c6f70d33af045f397944e17603e19b730fd [file]
"""Extension for configuring global settings of rules_python."""
load("@bazel_features//:features.bzl", "bazel_features")
load("//python/private:internal_config_repo.bzl", "internal_config_repo")
load("//python/private/pypi:deps.bzl", "pypi_deps")
_add_transition_setting = tag_class(
doc = """
Specify a build setting that terminal rules transition on by default.
Terminal rules are rules such as py_binary, py_test, py_wheel, or similar
rules that represent some deployable unit. Settings added here can
then be used a keys with the {obj}`config_settings` attribute.
:::{note}
This adds the label as a dependency of the Python rules. Take care to not refer
to repositories that are expensive to create or invalidate frequently.
:::
""",
attrs = {
"setting": attr.label(doc = "The build setting to add."),
},
)
_explicit_init_py = tag_class(
doc = """
Require explicit `__init__.py` files *in this module*.
Disables the legacy `__init__.py` generation for all `py_*` targets in this
module, requiring all Python targets to explicitly provide `__init__.py` files
when they're needed.
To override this at a per-target level, set `legacy_create_init` on applicable
`py_binary` or `py_test` targets:
```starlark
py_binary(
name = "hello_python",
# ...
# This Binary still relies on legacy behavior, so
# enable the legacy behavior as an exceptional case.
legacy_create_init = 1,
)
```
:::{note}
In the future, this will be enabled by default.
:::
:::{versionadded} VERSION_NEXT_FEATURE
:::
""",
attrs = {
"default": attr.bool(doc = "Whether explicit __init__.py files are required by default.", mandatory = True),
},
)
def _config_impl(module_ctx):
transition_setting_generators = {}
transition_settings = []
explicit_init_py_modules = {}
for mod in module_ctx.modules:
for tag in mod.tags.add_transition_setting:
setting = str(tag.setting)
if setting not in transition_setting_generators:
transition_setting_generators[setting] = []
transition_settings.append(setting)
transition_setting_generators[setting].append(mod.name)
for tag in mod.tags.explicit_init_py:
explicit_init_py_modules[mod.name] = str(tag.default)
if mod.is_root:
explicit_init_py_modules[""] = str(tag.default)
internal_config_repo(
name = "rules_python_internal",
transition_setting_generators = transition_setting_generators,
transition_settings = transition_settings,
explicit_init_py_modules = explicit_init_py_modules,
)
pypi_deps()
if bazel_features.external_deps.extension_metadata_has_reproducible:
return module_ctx.extension_metadata(reproducible = True)
else:
return None
config = module_extension(
doc = """Global settings for rules_python.
:::{versionadded} 1.7.0
:::
""",
implementation = _config_impl,
tag_classes = {
"add_transition_setting": _add_transition_setting,
"explicit_init_py": _explicit_init_py,
},
)