5
5
# found in the LICENSE file.
6
6
7
7
import argparse
8
+ import subprocess
8
9
import shutil
9
10
import sys
10
11
import os
@@ -37,32 +38,57 @@ def main():
37
38
if os .path .isabs (args .x64_out_dir ) else sky_utils .buildroot_relative_path (args .x64_out_dir )
38
39
)
39
40
41
+ fat_framework_bundle = os .path .join (dst , 'FlutterMacOS.framework' )
40
42
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
+
41
48
if not os .path .isdir (arm64_framework ):
42
49
print ('Cannot find macOS arm64 Framework at %s' % arm64_framework )
43
50
return 1
44
51
45
- x64_framework = os .path .join (x64_out_dir , 'FlutterMacOS.framework' )
46
52
if not os .path .isdir (x64_framework ):
47
53
print ('Cannot find macOS x64 Framework at %s' % x64_framework )
48
54
return 1
49
55
50
- arm64_dylib = sky_utils .get_framework_dylib_path (arm64_framework )
51
56
if not os .path .isfile (arm64_dylib ):
52
57
print ('Cannot find macOS arm64 dylib at %s' % arm64_dylib )
53
58
return 1
54
59
55
- x64_dylib = sky_utils .get_framework_dylib_path (x64_framework )
56
60
if not os .path .isfile (x64_dylib ):
57
61
print ('Cannot find macOS x64 dylib at %s' % x64_dylib )
58
62
return 1
59
63
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 )
63
89
64
90
# Create XCFramework from the arm64 and x64 fat framework.
65
- xcframeworks = [fat_framework ]
91
+ xcframeworks = [fat_framework_bundle ]
66
92
create_xcframework (location = dst , name = 'FlutterMacOS' , frameworks = xcframeworks )
67
93
68
94
if args .zip :
@@ -71,26 +97,56 @@ def main():
71
97
return 0
72
98
73
99
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
+
76
130
131
+ def process_framework (dst , args , fat_framework_bundle , fat_framework_binary ):
77
132
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 )
80
135
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.
82
139
# 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' ])
85
141
86
142
# 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' )
88
144
dsym_final_dst_path = os .path .join (dst , 'FlutterMacOS.dSYM.zip' )
89
145
shutil .move (dsym_final_src_path , dsym_final_dst_path )
90
146
91
147
if args .strip :
92
148
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 )
94
150
95
151
96
152
def zip_framework (dst ):
0 commit comments