Use the x64 toolchain when building host artifacts on arm64 mac (#39279)
diff --git a/tools/gn b/tools/gn index b680b83..1132d28 100755 --- a/tools/gn +++ b/tools/gn
@@ -342,23 +342,22 @@ gn_args['host_cpu'] = 'x86' gn_args['current_cpu'] = 'x86' - if is_host_build(args) and gn_args['host_os'] == 'mac': - # macOS host builds (whether x64 or arm64) must currently be built under - # Rosetta on Apple Silicon Macs. - # TODO(cbracken): https://github.com/flutter/flutter/issues/103386 + # When building binaries to run on a macOS host (like gen_snapshot), always + # use the clang_x64 toolchain, which will run under Rosetta. This is done for + # two reasons: + # 1. goma currently only supports the clang_x64 toolchain. + # 2. gen_snapshot cannot crossbuild from arm64 to x64. Its host architecture + # must be x64 to target x64. + # TODO(cbracken): https://github.com/flutter/flutter/issues/103386 + if get_host_os() == 'mac' and not args.force_mac_arm64: gn_args['host_cpu'] = 'x64' + if is_host_build(args) and gn_args['host_os'] == 'mac': # macOS unit tests include Vulkan headers which reference Metal types # introduced in macOS 10.14. gn_args['mac_sdk_min'] = '10.14' gn_args['mac_deployment_target'] = '10.14.0' - # macOS target builds (whether x64 or arm64) must currently be built under - # Rosetta on Apple Silicon Macs. - # TODO(cbracken): https://github.com/flutter/flutter/issues/103386 - if 'target_os' in gn_args and gn_args['target_os'] == 'mac': - gn_args['host_cpu'] = 'x64' - if gn_args['target_os'] == 'ios': gn_args['use_ios_simulator'] = args.simulator elif get_host_os() == 'mac': @@ -729,6 +728,13 @@ parser.add_argument( '--mac-cpu', type=str, choices=['x64', 'arm64'], default='x64' ) + parser.add_argument( + '--force-mac-arm64', + action='store_true', + default=False, + help='Force use of the clang_arm64 toolchain on an arm64 mac host when ' + 'building host binaries.' + ) parser.add_argument('--simulator', action='store_true', default=False) parser.add_argument( '--linux', dest='target_os', action='store_const', const='linux'