blob: 0d58b68f55f4a6b27f4d890f05f9b50edbf8eca4 [file] [log] [blame]
#!/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 shutil
import sys
import os
from create_xcframework import create_xcframework # pylint: disable=import-error
import sky_utils # pylint: disable=import-error
def main():
parser = argparse.ArgumentParser(
description='Creates FlutterMacOS.framework and FlutterMacOS.xcframework for macOS'
)
parser.add_argument('--dst', type=str, required=True)
parser.add_argument('--arm64-out-dir', type=str, required=True)
parser.add_argument('--x64-out-dir', type=str, required=True)
parser.add_argument('--strip', action='store_true', default=False)
parser.add_argument('--dsym', action='store_true', default=False)
parser.add_argument('--zip', action='store_true', default=False)
args = parser.parse_args()
dst = args.dst if os.path.isabs(args.dst) else sky_utils.buildroot_relative_path(args.dst)
arm64_out_dir = (
args.arm64_out_dir if os.path.isabs(args.arm64_out_dir) else
sky_utils.buildroot_relative_path(args.arm64_out_dir)
)
x64_out_dir = (
args.x64_out_dir
if os.path.isabs(args.x64_out_dir) else sky_utils.buildroot_relative_path(args.x64_out_dir)
)
arm64_framework = os.path.join(arm64_out_dir, 'FlutterMacOS.framework')
if not os.path.isdir(arm64_framework):
print('Cannot find macOS arm64 Framework at %s' % arm64_framework)
return 1
x64_framework = os.path.join(x64_out_dir, 'FlutterMacOS.framework')
if not os.path.isdir(x64_framework):
print('Cannot find macOS x64 Framework at %s' % x64_framework)
return 1
arm64_dylib = sky_utils.get_mac_framework_dylib_path(arm64_framework)
if not os.path.isfile(arm64_dylib):
print('Cannot find macOS arm64 dylib at %s' % arm64_dylib)
return 1
x64_dylib = sky_utils.get_mac_framework_dylib_path(x64_framework)
if not os.path.isfile(x64_dylib):
print('Cannot find macOS x64 dylib at %s' % x64_dylib)
return 1
fat_framework = os.path.join(dst, 'FlutterMacOS.framework')
sky_utils.create_fat_macos_framework(args, dst, fat_framework, arm64_framework, x64_framework)
# Create XCFramework from the arm64 and x64 fat framework.
xcframeworks = [fat_framework]
dsyms = {fat_framework: fat_framework + '.dSYM'} if args.dsym else None
create_xcframework(location=dst, name='FlutterMacOS', frameworks=xcframeworks, dsyms=dsyms)
if args.zip:
zip_framework(dst, args)
return 0
def zip_framework(dst, args):
# pylint: disable=line-too-long
# When updating with_entitlements and without_entitlements,
# `binariesWithoutEntitlements` and `signedXcframeworks` should be updated in
# the framework's `verifyCodeSignedTestRunner`.
#
# See: https://github.com/flutter/flutter/blob/62382c7b83a16b3f48dc06c19a47f6b8667005a5/dev/bots/suite_runners/run_verify_binaries_codesigned_tests.dart#L82-L130
framework_dst = os.path.join(dst, 'FlutterMacOS.framework')
sky_utils.write_codesign_config(os.path.join(framework_dst, 'entitlements.txt'), [])
sky_utils.write_codesign_config(
os.path.join(framework_dst, 'without_entitlements.txt'),
[
# TODO(cbracken): Remove the zip file from the path when outer zip is removed.
'FlutterMacOS.framework.zip/Versions/A/FlutterMacOS'
]
)
sky_utils.create_zip(framework_dst, 'FlutterMacOS.framework.zip', ['.'])
# pylint: enable=line-too-long
# Double zip to make it consistent with legacy artifacts.
# TODO(fujino): remove this once https://github.com/flutter/flutter/issues/125067 is resolved
sky_utils.create_zip(
framework_dst,
'FlutterMacOS.framework_.zip',
[
'FlutterMacOS.framework.zip',
# TODO(cbracken): Move these files to inner zip before removing the outer zip.
'entitlements.txt',
'without_entitlements.txt',
]
)
# Overwrite the FlutterMacOS.framework.zip with the double-zipped archive.
final_src_path = os.path.join(framework_dst, 'FlutterMacOS.framework_.zip')
final_dst_path = os.path.join(dst, 'FlutterMacOS.framework.zip')
shutil.move(final_src_path, final_dst_path)
zip_xcframework_archive(dst, args)
def zip_xcframework_archive(dst, args):
# pylint: disable=line-too-long
# When updating with_entitlements and without_entitlements,
# `binariesWithoutEntitlements` and `signedXcframeworks` should be updated in
# the framework's `verifyCodeSignedTestRunner`.
#
# See: https://github.com/flutter/flutter/blob/62382c7b83a16b3f48dc06c19a47f6b8667005a5/dev/bots/suite_runners/run_verify_binaries_codesigned_tests.dart#L82-L130
# Binaries that must be codesigned and require entitlements for particular APIs.
with_entitlements = []
with_entitlements_file = os.path.join(dst, 'entitlements.txt')
sky_utils.write_codesign_config(with_entitlements_file, with_entitlements)
# Binaries that must be codesigned and DO NOT require entitlements.
without_entitlements = [
'FlutterMacOS.xcframework/macos-arm64_x86_64/FlutterMacOS.framework/Versions/A/FlutterMacOS',
]
without_entitlements_file = os.path.join(dst, 'without_entitlements.txt')
sky_utils.write_codesign_config(without_entitlements_file, without_entitlements)
# Binaries that will not be codesigned.
unsigned_binaries = []
if args.dsym:
unsigned_binaries.extend([
'FlutterMacOS.xcframework/macos-arm64_x86_64/dSYMs/FlutterMacOS.framework.dSYM/Contents/Resources/DWARF/FlutterMacOS',
])
unsigned_binaries_file = os.path.join(dst, 'unsigned_binaries.txt')
sky_utils.write_codesign_config(unsigned_binaries_file, unsigned_binaries)
# pylint: enable=line-too-long
zip_contents = [
'FlutterMacOS.xcframework',
'entitlements.txt',
'without_entitlements.txt',
'unsigned_binaries.txt',
]
sky_utils.assert_valid_codesign_config(
dst, zip_contents, with_entitlements, without_entitlements, unsigned_binaries
)
sky_utils.create_zip(dst, 'framework.zip', zip_contents)
if __name__ == '__main__':
sys.exit(main())