blob: 652e11722183fd088fa5c570d4f9186073363466 [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("//python/private:enum.bzl", "enum")
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. Note that
# --precompile_add_to_runfiles affects how the compiled files are included
# into a downstream binary.
ENABLED = "enabled",
# Don't compile Python source files at build time.
DISABLED = "disabled",
# Compile Python source files, but only if they're a generated file.
IF_GENERATED_SOURCE = "if_generated_source",
# Like `enabled`, except overrides target-level setting. This is mostly
# useful for development, testing enabling precompilation more broadly, or
# as an escape hatch if build-time compiling is not available.
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",
# Keep the original py source if it's a regular source file, but omit it
# if it's a generated file.
OMIT_IF_GENERATED_SOURCE = "omit_if_generated_source",
get_effective_value = _precompile_source_retention_flag_get_effective_value,
)
# Determines if a target adds its compiled files to its runfiles. When a target
# compiles its files, but doesn't add them to its own runfiles, it relies on
# a downstream target to retrieve them from `PyInfo.transitive_pyc_files`
# buildifier: disable=name-conventions
PrecompileAddToRunfilesFlag = enum(
# Always include the compiled files in the target's runfiles.
ALWAYS = "always",
# Don't include the compiled files in the target's runfiles; they are
# still added to `PyInfo.transitive_pyc_files`. See also:
# `py_binary.pyc_collection` attribute. This is useful for allowing
# incrementally enabling precompilation on a per-binary basis.
DECIDED_ELSEWHERE = "decided_elsewhere",
)
# Determine if `py_binary` collects transitive pyc files.
# NOTE: This flag is only respect if `py_binary.pyc_collection` is `inherit`.
# buildifier: disable=name-conventions
PycCollectionFlag = enum(
# Include `PyInfo.transitive_pyc_files` as part of the binary.
INCLUDE_PYC = "include_pyc",
# Don't include `PyInfo.transitive_pyc_files` as part of the binary.
DISABLED = "disabled",
)