blob: f76440b07d613ef25584cbc8c2b4c010cca68e7a [file] [log] [blame]
"""Dummy transitions for testing basic behavior"""
load("//configs:platforms.bzl", "CPU_TO_DEFAULT_PLATFORM_NAME")
_PLATFORM_TYPE_TO_CPUS_FLAG = {
"ios": "//command_line_option:ios_multi_cpus",
"macos": "//command_line_option:macos_cpus",
"tvos": "//command_line_option:tvos_cpus",
"visionos": "//command_line_option:visionos_cpus",
"watchos": "//command_line_option:watchos_cpus",
}
_PLATFORM_TYPE_TO_DEFAULT_ARCH = {
"ios": "x86_64",
"macos": "x86_64",
"tvos": "x86_64",
"visionos": "x86_64",
"watchos": "x86_64",
}
_CPU_TO_DEFAULT_PLATFORM_FLAG = {
cpu: "//platforms:{}_platform".format(platform_name)
for cpu, platform_name in CPU_TO_DEFAULT_PLATFORM_NAME.items()
}
_supports_visionos = hasattr(apple_common.platform_type, "visionos")
def _cpu_string(*, environment_arch, platform_type, settings = {}):
if platform_type == "ios":
if environment_arch:
return "ios_{}".format(environment_arch)
ios_cpus = settings["//command_line_option:ios_multi_cpus"]
if ios_cpus:
return "ios_{}".format(ios_cpus[0])
cpu_value = settings["//command_line_option:cpu"]
if cpu_value.startswith("ios_"):
return cpu_value
if cpu_value == "darwin_arm64":
return "ios_sim_arm64"
return "ios_x86_64"
if platform_type == "macos":
if environment_arch:
return "darwin_{}".format(environment_arch)
macos_cpus = settings["//command_line_option:macos_cpus"]
if macos_cpus:
return "darwin_{}".format(macos_cpus[0])
cpu_value = settings["//command_line_option:cpu"]
if cpu_value.startswith("darwin_"):
return cpu_value
return "darwin_x86_64"
if platform_type == "tvos":
if environment_arch:
return "tvos_{}".format(environment_arch)
tvos_cpus = settings["//command_line_option:tvos_cpus"]
if tvos_cpus:
return "tvos_{}".format(tvos_cpus[0])
return "tvos_x86_64"
if platform_type == "watchos":
if environment_arch:
return "watchos_{}".format(environment_arch)
watchos_cpus = settings["//command_line_option:watchos_cpus"]
if watchos_cpus:
return "watchos_{}".format(watchos_cpus[0])
return "watchos_x86_64"
if platform_type == "visionos":
if environment_arch:
return "visionos_{}".format(environment_arch)
visionos_cpus = settings["//command_line_option:visionos_cpus"]
if visionos_cpus:
return "visionos_{}".format(visionos_cpus[0])
return "visionos_sim_arm64"
fail("ERROR: Unknown platform type: {}".format(platform_type))
def _min_os_version_or_none(*, minimum_os_version, platform, platform_type):
if platform_type == platform:
return minimum_os_version
return None
def _command_line_options(*, apple_platforms = [], environment_arch = None, minimum_os_version, platform_type, settings):
cpu = _cpu_string(
environment_arch = environment_arch,
platform_type = platform_type,
settings = settings,
)
output_dictionary = {
"//command_line_option:apple configuration distinguisher": "applebin_" + platform_type,
"//command_line_option:apple_platform_type": platform_type,
"//command_line_option:apple_platforms": apple_platforms,
# `apple_split_cpu` is used by the Bazel Apple configuration distinguisher to distinguish
# architecture and environment, therefore we set `environment_arch` when it is available.
"//command_line_option:apple_split_cpu": environment_arch if environment_arch else "",
"//command_line_option:compiler": None,
"//command_line_option:cpu": cpu,
"//command_line_option:fission": [],
"//command_line_option:grte_top": None,
"//command_line_option:platforms": (
[apple_platforms[0]] if apple_platforms else [settings[_CPU_TO_DEFAULT_PLATFORM_FLAG[cpu]]]
),
"//command_line_option:ios_minimum_os": _min_os_version_or_none(
minimum_os_version = minimum_os_version,
platform = "ios",
platform_type = platform_type,
),
"//command_line_option:macos_minimum_os": _min_os_version_or_none(
minimum_os_version = minimum_os_version,
platform = "macos",
platform_type = platform_type,
),
"//command_line_option:tvos_minimum_os": _min_os_version_or_none(
minimum_os_version = minimum_os_version,
platform = "tvos",
platform_type = platform_type,
),
"//command_line_option:watchos_minimum_os": _min_os_version_or_none(
minimum_os_version = minimum_os_version,
platform = "watchos",
platform_type = platform_type,
),
}
return output_dictionary
_apple_platform_transition_inputs = [
"//command_line_option:apple_platforms",
"//command_line_option:cpu",
"//command_line_option:incompatible_enable_apple_toolchain_resolution",
"//command_line_option:ios_multi_cpus",
"//command_line_option:macos_cpus",
"//command_line_option:platforms",
"//command_line_option:tvos_cpus",
"//command_line_option:watchos_cpus",
] + _CPU_TO_DEFAULT_PLATFORM_FLAG.values() + (
["//command_line_option:visionos_cpus"] if _supports_visionos else []
)
_apple_rule_base_transition_outputs = [
"//command_line_option:apple configuration distinguisher",
"//command_line_option:apple_platform_type",
"//command_line_option:apple_platforms",
"//command_line_option:apple_split_cpu",
"//command_line_option:compiler",
"//command_line_option:cpu",
"//command_line_option:fission",
"//command_line_option:grte_top",
"//command_line_option:ios_minimum_os",
"//command_line_option:macos_minimum_os",
"//command_line_option:platforms",
"//command_line_option:tvos_minimum_os",
"//command_line_option:watchos_minimum_os",
]
def _apple_platform_split_transition_impl(settings, attr):
output_dictionary = {}
if settings["//command_line_option:incompatible_enable_apple_toolchain_resolution"]:
platforms = (
settings["//command_line_option:apple_platforms"] or
settings["//command_line_option:platforms"]
)
# Currently there is no "default" platform for Apple-based platforms. If necessary, a
# default platform could be generated for the rule's underlying platform_type, but for now
# we work with the assumption that all users of the rules should set an appropriate set of
# platforms when building Apple targets with `apple_platforms`.
for index, platform in enumerate(platforms):
# Create a new, reordered list so that the platform we need to resolve is always first,
# and the other platforms will follow.
apple_platforms = list(platforms)
platform_to_resolve = apple_platforms.pop(index)
apple_platforms.insert(0, platform_to_resolve)
if str(platform) not in output_dictionary:
output_dictionary[str(platform)] = _command_line_options(
apple_platforms = apple_platforms,
minimum_os_version = attr.minimum_os_version,
platform_type = attr.platform_type,
settings = settings,
)
else:
platform_type = attr.platform_type
environment_archs = settings[_PLATFORM_TYPE_TO_CPUS_FLAG[platform_type]]
if not environment_archs:
environment_archs = [_PLATFORM_TYPE_TO_DEFAULT_ARCH[platform_type]]
for environment_arch in environment_archs:
found_cpu = _cpu_string(
environment_arch = environment_arch,
platform_type = platform_type,
settings = settings,
)
if found_cpu in output_dictionary:
continue
minimum_os_version = attr.minimum_os_version
output_dictionary[found_cpu] = _command_line_options(
environment_arch = environment_arch,
minimum_os_version = minimum_os_version,
platform_type = platform_type,
settings = settings,
)
return output_dictionary
apple_platform_split_transition = transition(
implementation = _apple_platform_split_transition_impl,
inputs = _apple_platform_transition_inputs,
outputs = _apple_rule_base_transition_outputs,
)