-
Notifications
You must be signed in to change notification settings - Fork 6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[macOS] Generate universal gen_snapshots
This reverts commit ac4c31a. (#52913) This relands commit 4e33c10. (#52885) Previously, the `gen_snapshot_arm64` and `gen_snapshot_x64` binaries used by the tool were all built for x64 architecture. As such, developers building apps with Flutter rely on Rosetta translation with every build. This refactors the gen_snapshot build rules on macOS hosts to consistently produce `gen_snapshot_arm64` and `gen_snapshot_x64` binaries with the target architecture of the build but with as universal binaries with both host architectures. Prior to this patch we emitted: * gen_snapshot_arm64 (arch: x64, target_arch: simarm64) After this patch, we emit: * artifacts_x64/gen_snapshot_arm64 (arch: x64, target_arch: simarm64) * artifacts_arm64/gen_snapshot_arm64 (arch: arm64, target_arch: arm64) * gen_snapshot_arm64 (universal binary composed of both of the above) Prior to this patch we emitted: * gen_snapshot_x64 (arch: x64, target_arch: x64) After this patch, we emit: * artifacts_x64/gen_snapshot_x64 (arch: x64, target_arch: x64) * artifacts_arm64/gen_snapshot_x64 (arch: arm64, target_arch: simx64) * gen_snapshot_x64 (universal binary composed of both of the above) Note that host builds on macOS currently default to a host architecture of x64 (can be overridden via `--force-mac-arm64`) regardless of host architecture and thus, the build itself relies on Rosetta translation when invoked on Apple Silicon arm64 hardware. This is to ensure a consistent build in CI regardless of bot architecture. See: https://github.com/flutter/engine/blob/6fa734d686888a39add026a2a98d6ec311c23efb/tools/gn#L502-L505 Issue: flutter/flutter#101138 Issue: flutter/flutter#69157 Related issue: flutter/flutter#103386
- Loading branch information
Showing
4 changed files
with
103 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#!/usr/bin/env python3 | ||
# | ||
# Copyright 2013 The Flutter Authors. All rights reserved. | ||
# Use of this source code is governed by a BSD-style license that can be | ||
# found in the LICENSE file. | ||
|
||
import argparse | ||
import os | ||
import subprocess | ||
import sys | ||
|
||
|
||
def canonical_path(path): | ||
"""Returns the canonical path for the input path. | ||
If the input path is not absolute, it is treated as relative to the engine | ||
source tree's buildroot directory.""" | ||
if os.path.isabs(path): | ||
return path | ||
buildroot_dir = os.path.abspath(os.path.join(os.path.realpath(__file__), '..', '..', '..', '..')) | ||
return os.path.join(buildroot_dir, path) | ||
|
||
|
||
def assert_file_exists(binary_path, arch): | ||
if not os.path.isfile(binary_path): | ||
print('Cannot find macOS %s binary at %s' % (arch, binary_path)) | ||
sys.exit(1) | ||
|
||
|
||
def create_universal_binary(in_arm64, in_x64, out): | ||
subprocess.check_call(['lipo', in_arm64, in_x64, '-create', '-output', out]) | ||
|
||
|
||
def main(): | ||
parser = argparse.ArgumentParser( | ||
description='Creates a universal binary from input arm64, x64 binaries' | ||
) | ||
parser.add_argument('--in-arm64', type=str, required=True) | ||
parser.add_argument('--in-x64', type=str, required=True) | ||
parser.add_argument('--out', type=str, required=True) | ||
args = parser.parse_args() | ||
|
||
in_arm64 = canonical_path(args.in_arm64) | ||
in_x64 = canonical_path(args.in_x64) | ||
out = canonical_path(args.out) | ||
|
||
assert_file_exists(in_arm64, 'arm64') | ||
assert_file_exists(in_x64, 'x64') | ||
create_universal_binary(in_arm64, in_x64, out) | ||
|
||
return 0 | ||
|
||
|
||
if __name__ == '__main__': | ||
sys.exit(main()) |