@@ -60,6 +60,18 @@ _CPU_TO_DEFAULT_PLATFORM_FLAG = {
6060 for cpu , platform_name in CPU_TO_DEFAULT_PLATFORM_NAME .items ()
6161}
6262
63+ _IOS_ARCH_TO_EARLIEST_WATCHOS = {
64+ "x86_64" : "x86_64" ,
65+ "sim_arm64" : "arm64" ,
66+ "arm64" : "armv7k" ,
67+ }
68+
69+ _IOS_ARCH_TO_64_BIT_WATCHOS = {
70+ "x86_64" : "x86_64" ,
71+ "sim_arm64" : "arm64" ,
72+ "arm64" : "arm64_32" ,
73+ }
74+
6375def _platform_specific_cpu_setting_name (platform_type ):
6476 """Returns the name of a platform-specific CPU setting.
6577
@@ -77,12 +89,63 @@ def _platform_specific_cpu_setting_name(platform_type):
7789 fail ("ERROR: Unknown platform type: {}" .format (platform_type ))
7890 return flag
7991
80- def _environment_archs (platform_type , settings ):
92+ def _environment_arch_from_cpu (* , cpu_value , platform_prefix ):
93+ """Returns a specific platform's environment arch if found from the `--cpu` command line option.
94+
95+ Args:
96+ cpu_value: String found from an incoming `--cpu` value.
97+ platform_prefix: The platform prefix to search for within the incoming `--cpu` string.
98+
99+ Returns:
100+ The value following the platform_prefix if it was found in the incoming `--cpu` value, which
101+ is expected to be a valid environment arch, or `None`.
102+ """
103+ if cpu_value .startswith (platform_prefix ):
104+ return cpu_value [len (platform_prefix ):]
105+ return None
106+
107+ def _watchos_environment_archs_from_ios (* , cpu_value , minimum_os_version , settings ):
108+ """Returns a set of watchOS environment archs based on incoming iOS archs.
109+
110+ Args:
111+ cpu_value: String found from an incoming `--cpu` value.
112+ minimum_os_version: A string coming directly from a rule's `minimum_os_version` attribute.
113+ settings: A dictionary whose set of keys is defined by the inputs parameter, typically from
114+ the settings argument found on the implementation function of the current Starlark
115+ transition.
116+
117+ Returns:
118+ A list of watchOS environment archs if any were found from the iOS environment archs, or an
119+ empty list if none were found.
120+ """
121+ environment_archs = []
122+ ios_archs = settings [_platform_specific_cpu_setting_name ("ios" )]
123+ if not ios_archs :
124+ ios_arch = _environment_arch_from_cpu (
125+ cpu_value = cpu_value ,
126+ platform_prefix = "ios_" ,
127+ )
128+ if ios_arch :
129+ ios_archs = [ios_arch ]
130+ if ios_archs :
131+ # Make sure to return a fallback compatible with the rule's assigned minimum OS.
132+ ios_to_watchos_arch_dict = _IOS_ARCH_TO_64_BIT_WATCHOS
133+ if apple_common .dotted_version (minimum_os_version ) < apple_common .dotted_version ("9.0" ):
134+ ios_to_watchos_arch_dict = _IOS_ARCH_TO_EARLIEST_WATCHOS
135+ environment_archs = [
136+ ios_to_watchos_arch_dict [arch ]
137+ for arch in ios_archs
138+ if ios_to_watchos_arch_dict .get (arch )
139+ ]
140+ return environment_archs
141+
142+ def _environment_archs (platform_type , minimum_os_version , settings ):
81143 """Returns a full set of environment archs from the incoming command line options.
82144
83145 Args:
84146 platform_type: A string denoting the platform type; `"ios"`, `"macos"`,
85147 `"tvos"`, `"visionos"`, or `"watchos"`.
148+ minimum_os_version: A string coming directly from a rule's `minimum_os_version` attribute.
86149 settings: A dictionary whose set of keys is defined by the inputs parameter, typically from
87150 the settings argument found on the implementation function of the current Starlark
88151 transition.
@@ -93,11 +156,30 @@ def _environment_archs(platform_type, settings):
93156 """
94157 environment_archs = settings [_platform_specific_cpu_setting_name (platform_type )]
95158 if not environment_archs :
159+ cpu_value = settings ["//command_line_option:cpu" ]
96160 if platform_type == "ios" :
97- # Legacy exception to interpret the --cpu as an iOS arch.
98- cpu_value = settings ["//command_line_option:cpu" ]
99- if cpu_value .startswith ("ios_" ):
100- environment_archs = [cpu_value [4 :]]
161+ # Legacy handling to interpret the --cpu as an iOS environment arch.
162+ ios_arch = _environment_arch_from_cpu (
163+ cpu_value = cpu_value ,
164+ platform_prefix = "ios_" ,
165+ )
166+ if ios_arch :
167+ environment_archs = [ios_arch ]
168+ if platform_type == "watchos" :
169+ # Interpret the --cpu as a watchOS environment arch; often will be set by a transition.
170+ watchos_arch = _environment_arch_from_cpu (
171+ cpu_value = cpu_value ,
172+ platform_prefix = "watchos_" ,
173+ )
174+ if watchos_arch :
175+ environment_archs = [watchos_arch ]
176+ else :
177+ # If not found, generate watchOS archs via incoming iOS environment arch(s).
178+ environment_archs = _watchos_environment_archs_from_ios (
179+ cpu_value = cpu_value ,
180+ minimum_os_version = minimum_os_version ,
181+ settings = settings ,
182+ )
101183 if not environment_archs :
102184 environment_archs = [
103185 _cpu_string (
@@ -366,10 +448,11 @@ def _command_line_options_for_xcframework_platform(
366448
367449def _apple_rule_base_transition_impl (settings , attr ):
368450 """Rule transition for Apple rules using Bazel CPUs and a valid Apple split transition."""
451+ minimum_os_version = attr .minimum_os_version
369452 platform_type = attr .platform_type
370453 return _command_line_options (
371- environment_arch = _environment_archs (platform_type , settings )[0 ],
372- minimum_os_version = attr . minimum_os_version ,
454+ environment_arch = _environment_archs (platform_type , minimum_os_version , settings )[0 ],
455+ minimum_os_version = minimum_os_version ,
373456 platform_type = platform_type ,
374457 settings = settings ,
375458 )
@@ -425,13 +508,13 @@ _apple_rule_base_transition = transition(
425508)
426509
427510def _apple_platforms_rule_base_transition_impl (settings , attr ):
428- """Rule transition for Apple rules using Bazel platforms."""
511+ """Rule transition for Apple rules using Bazel platforms and the Starlark split transition ."""
429512 minimum_os_version = attr .minimum_os_version
430513 platform_type = attr .platform_type
431514 environment_arch = None
432515 if not settings ["//command_line_option:incompatible_enable_apple_toolchain_resolution" ]:
433516 # Add fallback to match an anticipated split of Apple cpu-based resolution
434- environment_arch = _environment_archs (platform_type , settings )[0 ]
517+ environment_arch = _environment_archs (platform_type , minimum_os_version , settings )[0 ]
435518 return _command_line_options (
436519 apple_platforms = settings ["//command_line_option:apple_platforms" ],
437520 environment_arch = environment_arch ,
@@ -453,10 +536,14 @@ def _apple_platforms_rule_bundle_output_base_transition_impl(settings, attr):
453536 environment_arch = None
454537 if not settings ["//command_line_option:incompatible_enable_apple_toolchain_resolution" ]:
455538 # Add fallback to match an anticipated split of Apple cpu-based resolution
456- environment_arch = _environment_archs (platform_type , settings )[0 ]
539+ environment_arch = _environment_archs (
540+ platform_type = platform_type ,
541+ settings = settings ,
542+ minimum_os_version = minimum_os_version ,
543+ )
457544 return _command_line_options (
458545 apple_platforms = settings ["//command_line_option:apple_platforms" ],
459- environment_arch = environment_arch ,
546+ environment_arch = environment_arch [ 0 ] ,
460547 force_bundle_outputs = True ,
461548 minimum_os_version = minimum_os_version ,
462549 platform_type = platform_type ,
@@ -558,8 +645,9 @@ def _apple_platform_split_transition_impl(settings, attr):
558645 )
559646
560647 else :
648+ minimum_os_version = attr .minimum_os_version
561649 platform_type = attr .platform_type
562- for environment_arch in _environment_archs (platform_type , settings ):
650+ for environment_arch in _environment_archs (platform_type , minimum_os_version , settings ):
563651 found_cpu = _cpu_string (
564652 environment_arch = environment_arch ,
565653 platform_type = platform_type ,
@@ -568,7 +656,6 @@ def _apple_platform_split_transition_impl(settings, attr):
568656 if found_cpu in output_dictionary :
569657 continue
570658
571- minimum_os_version = attr .minimum_os_version
572659 environment_arch_is_supported = _is_arch_supported_for_target_tuple (
573660 environment_arch = environment_arch ,
574661 minimum_os_version = minimum_os_version ,
0 commit comments