blob: c190cf682bd823acfcc9442e697d634c3df78a17 [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.
"""Values and helpers for flags.
NOTE: The transitive loads of this should be kept minimal. This avoids loading
unnecessary files when all that are needed are flag definitions.
"""
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load(":enum.bzl", "enum")
def _FlagEnum_flag_values(self):
return sorted(self.__members__.values())
def FlagEnum(**kwargs):
"""Define an enum specialized for flags.
Args:
**kwargs: members of the enum.
Returns:
{type}`FlagEnum` struct. This is an enum with the following extras:
* `flag_values`: A function that returns a sorted list of the
flag values (enum `__members__`). Useful for passing to the
`values` attribute for string flags.
"""
return enum(
methods = dict(flag_values = _FlagEnum_flag_values),
**kwargs
)
def _AddSrcsToRunfilesFlag_is_enabled(ctx):
value = ctx.attr._add_srcs_to_runfiles_flag[BuildSettingInfo].value
if value == AddSrcsToRunfilesFlag.AUTO:
value = AddSrcsToRunfilesFlag.ENABLED
return value == AddSrcsToRunfilesFlag.ENABLED
# buildifier: disable=name-conventions
AddSrcsToRunfilesFlag = FlagEnum(
AUTO = "auto",
ENABLED = "enabled",
DISABLED = "disabled",
is_enabled = _AddSrcsToRunfilesFlag_is_enabled,
)
def _bootstrap_impl_flag_get_value(ctx):
return ctx.attr._bootstrap_impl_flag[BuildSettingInfo].value
# buildifier: disable=name-conventions
BootstrapImplFlag = enum(
SYSTEM_PYTHON = "system_python",
SCRIPT = "script",
get_value = _bootstrap_impl_flag_get_value,
)
def _precompile_flag_get_effective_value(ctx):
value = ctx.attr._precompile_flag[BuildSettingInfo].value
if value == PrecompileFlag.AUTO:
value = PrecompileFlag.DISABLED
return value
# Determines if the Python exec tools toolchain should be registered.
# buildifier: disable=name-conventions
ExecToolsToolchainFlag = enum(
# Enable registering the exec tools toolchain using the hermetic toolchain.
ENABLED = "enabled",
# Disable registering the exec tools toolchain using the hermetic toolchain.
DISABLED = "disabled",
)
# Determines if Python source files should be compiled at build time.
#
# NOTE: The flag value is overridden by the target-level attribute, except
# for the case of `force_enabled` and `forced_disabled`.
# buildifier: disable=name-conventions
PrecompileFlag = enum(
# Automatically decide the effective value based on environment,
# target platform, etc.
AUTO = "auto",
# Compile Python source files at build time.
ENABLED = "enabled",
# Don't compile Python source files at build time.
DISABLED = "disabled",
# Like `enabled`, except overrides target-level setting. This is mostly
# useful for development, testing enabling precompilation more broadly, or
# as an escape hatch to force all transitive deps to precompile.
FORCE_ENABLED = "force_enabled",
# Like `disabled`, except overrides target-level setting. This is useful
# useful for development, testing enabling precompilation more broadly, or
# as an escape hatch if build-time compiling is not available.
FORCE_DISABLED = "force_disabled",
get_effective_value = _precompile_flag_get_effective_value,
)
def _precompile_source_retention_flag_get_effective_value(ctx):
value = ctx.attr._precompile_source_retention_flag[BuildSettingInfo].value
if value == PrecompileSourceRetentionFlag.AUTO:
value = PrecompileSourceRetentionFlag.KEEP_SOURCE
return value
# Determines if, when a source file is compiled, if the source file is kept
# in the resulting output or not.
# buildifier: disable=name-conventions
PrecompileSourceRetentionFlag = enum(
# Automatically decide the effective value based on environment, etc.
AUTO = "auto",
# Include the original py source in the output.
KEEP_SOURCE = "keep_source",
# Don't include the original py source.
OMIT_SOURCE = "omit_source",
get_effective_value = _precompile_source_retention_flag_get_effective_value,
)