55# found in the LICENSE file.
66
77import argparse
8+ import subprocess
89import shutil
910import sys
1011import os
@@ -37,32 +38,57 @@ def main():
3738 if os .path .isabs (args .x64_out_dir ) else sky_utils .buildroot_relative_path (args .x64_out_dir )
3839 )
3940
41+ fat_framework_bundle = os .path .join (dst , 'FlutterMacOS.framework' )
4042 arm64_framework = os .path .join (arm64_out_dir , 'FlutterMacOS.framework' )
43+ x64_framework = os .path .join (x64_out_dir , 'FlutterMacOS.framework' )
44+
45+ arm64_dylib = os .path .join (arm64_framework , 'FlutterMacOS' )
46+ x64_dylib = os .path .join (x64_framework , 'FlutterMacOS' )
47+
4148 if not os .path .isdir (arm64_framework ):
4249 print ('Cannot find macOS arm64 Framework at %s' % arm64_framework )
4350 return 1
4451
45- x64_framework = os .path .join (x64_out_dir , 'FlutterMacOS.framework' )
4652 if not os .path .isdir (x64_framework ):
4753 print ('Cannot find macOS x64 Framework at %s' % x64_framework )
4854 return 1
4955
50- arm64_dylib = sky_utils .get_framework_dylib_path (arm64_framework )
5156 if not os .path .isfile (arm64_dylib ):
5257 print ('Cannot find macOS arm64 dylib at %s' % arm64_dylib )
5358 return 1
5459
55- x64_dylib = sky_utils .get_framework_dylib_path (x64_framework )
5660 if not os .path .isfile (x64_dylib ):
5761 print ('Cannot find macOS x64 dylib at %s' % x64_dylib )
5862 return 1
5963
60- fat_framework = os .path .join (dst , 'FlutterMacOS.framework' )
61- sky_utils .create_fat_macos_framework (fat_framework , arm64_framework , x64_framework )
62- process_framework (dst , args , fat_framework )
64+ sky_utils .copy_tree (arm64_framework , fat_framework_bundle , symlinks = True )
65+
66+ regenerate_symlinks (fat_framework_bundle )
67+
68+ fat_framework_binary = os .path .join (fat_framework_bundle , 'Versions' , 'A' , 'FlutterMacOS' )
69+
70+ # Create the arm64/x64 fat framework.
71+ sky_utils .lipo ([arm64_dylib , x64_dylib ], fat_framework_binary )
72+
73+ # Make the framework readable and executable: u=rwx,go=rx.
74+ subprocess .check_call (['chmod' , '755' , fat_framework_bundle ])
75+
76+ # Add group and other readability to all files.
77+ versions_path = os .path .join (fat_framework_bundle , 'Versions' )
78+ subprocess .check_call (['chmod' , '-R' , 'og+r' , versions_path ])
79+ # Find all the files below the target dir with owner execute permission
80+ find_subprocess = subprocess .Popen (['find' , versions_path , '-perm' , '-100' , '-print0' ],
81+ stdout = subprocess .PIPE )
82+ # Add execute permission for other and group for all files that had it for owner.
83+ xargs_subprocess = subprocess .Popen (['xargs' , '-0' , 'chmod' , 'og+x' ],
84+ stdin = find_subprocess .stdout )
85+ find_subprocess .wait ()
86+ xargs_subprocess .wait ()
87+
88+ process_framework (dst , args , fat_framework_bundle , fat_framework_binary )
6389
6490 # Create XCFramework from the arm64 and x64 fat framework.
65- xcframeworks = [fat_framework ]
91+ xcframeworks = [fat_framework_bundle ]
6692 create_xcframework (location = dst , name = 'FlutterMacOS' , frameworks = xcframeworks )
6793
6894 if args .zip :
@@ -71,26 +97,56 @@ def main():
7197 return 0
7298
7399
74- def process_framework (dst , args , framework_path ):
75- framework_binary = sky_utils .get_framework_dylib_path (framework_path )
100+ def regenerate_symlinks (fat_framework_bundle ):
101+ """Regenerates the symlinks structure.
102+
103+ Recipes V2 upload artifacts in CAS before integration and CAS follows symlinks.
104+ This logic regenerates the symlinks in the expected structure.
105+ """
106+ if os .path .islink (os .path .join (fat_framework_bundle , 'FlutterMacOS' )):
107+ return
108+ os .remove (os .path .join (fat_framework_bundle , 'FlutterMacOS' ))
109+ shutil .rmtree (os .path .join (fat_framework_bundle , 'Headers' ), True )
110+ shutil .rmtree (os .path .join (fat_framework_bundle , 'Modules' ), True )
111+ shutil .rmtree (os .path .join (fat_framework_bundle , 'Resources' ), True )
112+ current_version_path = os .path .join (fat_framework_bundle , 'Versions' , 'Current' )
113+ shutil .rmtree (current_version_path , True )
114+ os .symlink ('A' , current_version_path )
115+ os .symlink (
116+ os .path .join ('Versions' , 'Current' , 'FlutterMacOS' ),
117+ os .path .join (fat_framework_bundle , 'FlutterMacOS' )
118+ )
119+ os .symlink (
120+ os .path .join ('Versions' , 'Current' , 'Headers' ), os .path .join (fat_framework_bundle , 'Headers' )
121+ )
122+ os .symlink (
123+ os .path .join ('Versions' , 'Current' , 'Modules' ), os .path .join (fat_framework_bundle , 'Modules' )
124+ )
125+ os .symlink (
126+ os .path .join ('Versions' , 'Current' , 'Resources' ),
127+ os .path .join (fat_framework_bundle , 'Resources' )
128+ )
129+
76130
131+ def process_framework (dst , args , fat_framework_bundle , fat_framework_binary ):
77132 if args .dsym :
78- dsym_out = os .path .join ( dst , 'FlutterMacOS .dSYM')
79- sky_utils .extract_dsym (framework_binary , dsym_out )
133+ dsym_out = os .path .splitext ( fat_framework_bundle )[ 0 ] + ' .dSYM'
134+ sky_utils .extract_dsym (fat_framework_binary , dsym_out )
80135 if args .zip :
81- # Create a zip of just the contents of the dSYM, then create a zip of that zip.
136+ dsym_dst = os .path .join (dst , 'FlutterMacOS.dSYM' )
137+ sky_utils .create_zip (dsym_dst , 'FlutterMacOS.dSYM.zip' , ['.' ], symlinks = True )
138+ # Double zip to make it consistent with legacy artifacts.
82139 # TODO(fujino): remove this once https://github.com/flutter/flutter/issues/125067 is resolved
83- sky_utils .create_zip (dsym_out , 'FlutterMacOS.dSYM.zip' , ['.' ], symlinks = True )
84- sky_utils .create_zip (dsym_out , 'FlutterMacOS.dSYM_.zip' , ['FlutterMacOS.dSYM.zip' ])
140+ sky_utils .create_zip (dsym_dst , 'FlutterMacOS.dSYM_.zip' , ['FlutterMacOS.dSYM.zip' ])
85141
86142 # Overwrite the FlutterMacOS.dSYM.zip with the double-zipped archive.
87- dsym_final_src_path = os .path .join (dsym_out , 'FlutterMacOS.dSYM_.zip' )
143+ dsym_final_src_path = os .path .join (dsym_dst , 'FlutterMacOS.dSYM_.zip' )
88144 dsym_final_dst_path = os .path .join (dst , 'FlutterMacOS.dSYM.zip' )
89145 shutil .move (dsym_final_src_path , dsym_final_dst_path )
90146
91147 if args .strip :
92148 unstripped_out = os .path .join (dst , 'FlutterMacOS.unstripped' )
93- sky_utils .strip_binary (framework_binary , unstripped_out )
149+ sky_utils .strip_binary (fat_framework_binary , unstripped_out )
94150
95151
96152def zip_framework (dst ):
0 commit comments