Skip to content

Commit

Permalink
Add support for apple platform command line options (#816)
Browse files Browse the repository at this point in the history
Add support for apple platform command line options.
Works towards #795
  • Loading branch information
karim-alweheshy authored Mar 4, 2024
1 parent b62d139 commit 349ca62
Show file tree
Hide file tree
Showing 15 changed files with 189 additions and 148 deletions.
2 changes: 1 addition & 1 deletion rules/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ bzl_library(
srcs = ["transition_support.bzl"],
visibility = ["//visibility:public"],
deps = [
"@build_bazel_apple_support//lib:apple_support",
"@build_bazel_apple_support//configs:platforms",
],
)

Expand Down
107 changes: 74 additions & 33 deletions rules/transition_support.bzl
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
"""Starlark transition support for Apple rules."""

load(
"@build_bazel_apple_support//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",
}

_CPU_TO_DEFAULT_PLATFORM_FLAG = {
cpu: "@build_bazel_apple_support//platforms:{}_platform".format(
platform_name,
)
for cpu, platform_name in CPU_TO_DEFAULT_PLATFORM_NAME.items()
}

def _current_apple_platform(apple_fragment, xcode_config):
"""Returns a struct containing the platform and target os version"""
platform = apple_fragment.single_arch_platform
Expand All @@ -26,32 +46,40 @@ def _cpu_string(environment_arch, platform_type, settings):
return "ios_{}".format(environment_arch)
ios_cpus = settings["//command_line_option:ios_multi_cpus"]
if ios_cpus:
return "ios_%s" % ios_cpus[0]
if settings["//command_line_option:cpu"] == "darwin_arm64":
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"
else:
return "ios_x86_64"
return "ios_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])
cpu_value = settings["//command_line_option:cpu"]
if cpu_value.startswith("visionos_"):
return cpu_value
return "visionos_sim_arm64"
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_%s" % macos_cpus[0]
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_%s" % tvos_cpus[0]
return "tvos_{}".format(tvos_cpus[0])
return "tvos_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_x86_64"
if platform_type == "watchos":
if environment_arch:
return "watchos_{}".format(environment_arch)
Expand All @@ -60,7 +88,7 @@ def _cpu_string(environment_arch, platform_type, settings):
return "watchos_{}".format(watchos_cpus[0])
return "watchos_x86_64"

fail("ERROR: Unknown platform type: %s" % platform_type)
fail("ERROR: Unknown platform type: {}".format(platform_type))

def _min_os_version_or_none(attr, attr_platforms, platform, attr_platform_type):
if attr_platform_type != platform:
Expand All @@ -74,6 +102,19 @@ def _min_os_version_or_none(attr, attr_platforms, platform, attr_platform_type):

return None

def _apple_platforms_base_values(settings, platform_type):
cpu = _cpu_string(
environment_arch = None,
platform_type = platform_type,
settings = settings,
)
apple_platforms_value = settings["//command_line_option:apple_platforms"]
apple_platforms = apple_platforms_value if apple_platforms_value else []
return {
"//command_line_option:apple_platforms": apple_platforms,
"//command_line_option:platforms": [apple_platforms[0]] if apple_platforms else [settings[_CPU_TO_DEFAULT_PLATFORM_FLAG[cpu]]],
}

def _apple_rule_transition_impl(settings, attr):
"""Rule transition for Apple rules."""
platform_type = str(settings["//command_line_option:apple_platform_type"])
Expand All @@ -95,6 +136,7 @@ def _apple_rule_transition_impl(settings, attr):
# Transition ios_multi_cpus to to a single cpu when building for iOS.
# Rules using this transition (e.g., apple_framework_packaging, precompiled_apple_resource_bundle) don't need any artifacts from other archs.
ios_multi_cpus = cpu_string[4:] if platform_type == "ios" else settings["//command_line_option:ios_multi_cpus"]

ret = {
"//command_line_option:apple configuration distinguisher": "applebin_" + platform_type,
"//command_line_option:apple_platform_type": platform_type,
Expand All @@ -112,6 +154,7 @@ def _apple_rule_transition_impl(settings, attr):
"//command_line_option:tvos_minimum_os": _min_os_version_or_none(attr, attr_platforms, "tvos", platform_type),
"//command_line_option:watchos_minimum_os": _min_os_version_or_none(attr, attr_platforms, "watchos", platform_type),
}
ret.update(_apple_platforms_base_values(settings, platform_type))
return ret

_supports_visionos = hasattr(apple_common.platform_type, "visionos")
Expand All @@ -132,9 +175,10 @@ _apple_rule_transition = transition(
"//command_line_option:watchos_cpus",
"//command_line_option:apple_split_cpu",
"//command_line_option:macos_minimum_os",
"//command_line_option:apple_platforms",
] + (
["//command_line_option:visionos_cpus"] if _supports_visionos else []
),
) + _CPU_TO_DEFAULT_PLATFORM_FLAG.values(),
outputs = [
"//command_line_option:apple configuration distinguisher",
"//command_line_option:apple_platform_type",
Expand All @@ -149,6 +193,8 @@ _apple_rule_transition = transition(
"//command_line_option:macos_minimum_os",
"//command_line_option:tvos_minimum_os",
"//command_line_option:watchos_minimum_os",
"//command_line_option:apple_platforms",
"//command_line_option:platforms",
],
)

Expand All @@ -162,14 +208,6 @@ def _is_arch_supported_for_target_tuple(*, environment_arch, minimum_os_version,
return False
return True

_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",
}

def _platform_specific_cpu_setting_name(platform_type):
"""Returns the name of a platform-specific CPU setting."""
flag = _PLATFORM_TYPE_TO_CPUS_FLAG.get(platform_type, None)
Expand Down Expand Up @@ -270,6 +308,7 @@ def _split_transition_impl(settings, attr):
"//command_line_option:watchos_minimum_os": _min_os_version_or_none(attr, attr_platforms, "watchos", platform_type),
"//command_line_option:minimum_os_version": minimum_os_version,
}
output_dictionary.update(_apple_platforms_base_values(settings, platform_type))
output_dictionary["@build_bazel_rules_swift//swift:emit_swiftinterface"] = emit_swiftinterface
split_output_dictionary[found_cpu] = output_dictionary

Expand All @@ -293,16 +332,16 @@ def _split_transition_impl(settings, attr):
_split_transition = transition(
implementation = _split_transition_impl,
inputs = [
"//command_line_option:apple_platforms",
"//command_line_option:platforms",
"//command_line_option:cpu",
"//command_line_option:apple_crosstool_top",
"//command_line_option:ios_multi_cpus",
"//command_line_option:macos_cpus",
"//command_line_option:tvos_cpus",
"//command_line_option:watchos_cpus",
"//command_line_option:minimum_os_version",
] + (["//command_line_option:visionos_cpus"] if _supports_visionos else []),
"//command_line_option:cpu",
"//command_line_option:apple_crosstool_top",
"//command_line_option:ios_multi_cpus",
"//command_line_option:macos_cpus",
"//command_line_option:tvos_cpus",
"//command_line_option:watchos_cpus",
"//command_line_option:minimum_os_version",
"//command_line_option:apple_platforms",
] + (["//command_line_option:visionos_cpus"] if _supports_visionos else []) +
_CPU_TO_DEFAULT_PLATFORM_FLAG.values(),
outputs = [
"//command_line_option:apple configuration distinguisher",
"//command_line_option:apple_platform_type",
Expand All @@ -318,6 +357,8 @@ _split_transition = transition(
"//command_line_option:minimum_os_version",
"//command_line_option:tvos_minimum_os",
"//command_line_option:watchos_minimum_os",
"//command_line_option:apple_platforms",
"//command_line_option:platforms",
"@build_bazel_rules_swift//swift:emit_swiftinterface",
],
)
Expand Down
Loading

0 comments on commit 349ca62

Please sign in to comment.