1- #!/usr/bin/env python3
1+ #!/usr/bin/env python
22import subprocess
33import os
44import errno
55import collections
66import glob
7+ import argparse
78
89
910class Platform (object ):
1011 pass
1112
1213
14+ class x86_64_platform (Platform ):
15+ arch = 'x86_64'
16+
17+ prefix = "#ifdef __x86_64__\n \n "
18+ suffix = "\n \n #endif"
19+ src_dir = 'x86'
20+ src_files = ['unix64.S' , 'ffi64.c' , 'ffiw64.c' , 'win64.S' , 'internal64.h' , 'asmnames.h' ]
21+
22+
1323class arm64_platform (Platform ):
1424 arch = 'arm64'
25+
1526 prefix = "#ifdef __arm64__\n \n "
1627 suffix = "\n \n #endif"
1728 src_dir = 'aarch64'
1829 src_files = ['sysv.S' , 'ffi.c' , 'internal.h' ]
1930
2031
21- class ios_simulator_arm64_platform ( arm64_platform ):
22- target = 'aarch64 -apple-darwin '
32+ class ios_simulator_x86_64_platform ( x86_64_platform ):
33+ target = 'x86_64 -apple-ios-simulator '
2334 directory = 'darwin_ios'
2435 sdk = 'iphonesimulator'
25- version_min = '-miphoneos-version-min=12 .0'
36+ version_min = '-miphoneos-version-min=7 .0'
2637
2738
39+ class ios_simulator_arm64_platform (arm64_platform ):
40+ target = 'arm64-apple-ios-simulator'
41+ directory = 'darwin_ios'
42+ sdk = 'iphonesimulator'
43+ version_min = '-miphoneos-version-min=7.0'
44+
2845class ios_device_arm64_platform (arm64_platform ):
29- target = 'aarch64 -apple-darwin '
46+ target = 'arm64 -apple-ios '
3047 directory = 'darwin_ios'
3148 sdk = 'iphoneos'
32- version_min = '-miphoneos-version-min=12.0'
49+ version_min = '-miphoneos-version-min=7.0'
50+
51+
52+ class desktop_x86_64_platform (x86_64_platform ):
53+ target = 'x86_64-apple-macos'
54+ directory = 'darwin_osx'
55+ sdk = 'macosx'
56+ version_min = '-mmacosx-version-min=10.6'
57+
58+
59+ class desktop_arm64_platform (arm64_platform ):
60+ target = 'arm64-apple-macos'
61+ directory = 'darwin_osx'
62+ sdk = 'macosx'
63+ version_min = '-mmacosx-version-min=11.0'
64+
65+
66+ class tvos_simulator_x86_64_platform (x86_64_platform ):
67+ target = 'x86_64-apple-tvos-simulator'
68+ directory = 'darwin_tvos'
69+ sdk = 'appletvsimulator'
70+ version_min = '-mtvos-version-min=9.0'
71+
72+
73+ class tvos_simulator_arm64_platform (arm64_platform ):
74+ target = 'arm64-apple-tvos-simulator'
75+ directory = 'darwin_tvos'
76+ sdk = 'appletvsimulator'
77+ version_min = '-mtvos-version-min=9.0'
78+
79+
80+ class tvos_device_arm64_platform (arm64_platform ):
81+ target = 'arm64-apple-tvos'
82+ directory = 'darwin_tvos'
83+ sdk = 'appletvos'
84+ version_min = '-mtvos-version-min=9.0'
85+
86+
87+ class watchos_simulator_x86_64_platform (x86_64_platform ):
88+ target = 'x86_64-apple-watchos-simulator'
89+ directory = 'darwin_watchos'
90+ sdk = 'watchsimulator'
91+ version_min = '-mwatchos-version-min=4.0'
92+
93+
94+ class watchos_simulator_arm64_platform (arm64_platform ):
95+ target = 'arm64-apple-watchos-simulator'
96+ directory = 'darwin_watchos'
97+ sdk = 'watchsimulator'
98+ version_min = '-mwatchos-version-min=4.0'
99+
100+ class watchos_device_arm64_32_platform (arm64_platform ):
101+ target = 'arm64_32-apple-watchos'
102+ directory = 'darwin_watchos'
103+ sdk = 'watchos'
104+ arch = 'arm64_32'
105+ version_min = '-mwatchos-version-min=4.0'
33106
34107
35108def mkdir_p (path ):
36109 try :
37110 os .makedirs (path )
38- except OSError as exc :
111+ except OSError as exc : # Python >2.5
39112 if exc .errno != errno .EEXIST :
40113 raise
41114
@@ -55,14 +128,15 @@ def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''
55128 with open (os .path .join (dst_dir , out_filename ), 'w' ) as out_file :
56129 if prefix :
57130 out_file .write (prefix )
131+
58132 out_file .write (in_file .read ())
133+
59134 if suffix :
60135 out_file .write (suffix )
61136
62137
63138def list_files (src_dir , pattern = None , filelist = None ):
64- if pattern :
65- filelist = glob .iglob (os .path .join (src_dir , pattern ))
139+ if pattern : filelist = glob .iglob (os .path .join (src_dir , pattern ))
66140 for file in filelist :
67141 yield os .path .basename (file )
68142
@@ -80,72 +154,102 @@ def copy_src_platform_files(platform):
80154
81155def build_target (platform , platform_headers ):
82156 def xcrun_cmd (cmd ):
83- return 'xcrun -sdk %s %s' % (platform .sdk , cmd )
157+ return 'xcrun -sdk %s %s -target %s ' % (platform .sdk , cmd , platform . target )
84158
85- tag = '%s-%s' % (platform .sdk , platform .arch )
159+ tag = '%s-%s' % (platform .sdk , platform .arch )
86160 build_dir = 'build_%s' % tag
87161 mkdir_p (build_dir )
88- env = dict (
89- CC = xcrun_cmd ('clang' ),
90- LD = xcrun_cmd ('ld' ),
91- CFLAGS = '%s -arch arm64' % (platform .version_min )
92- )
162+ env = dict (CC = xcrun_cmd ('clang' ),
163+ LD = xcrun_cmd ('ld' ),
164+ CFLAGS = '%s' % (platform .version_min ))
93165 working_dir = os .getcwd ()
94166 try :
95167 os .chdir (build_dir )
96168 subprocess .check_call (
97- ["../configure" , "--host=aarch64-apple-darwin" ],
169+ [
170+ "../configure" ,
171+ f"--host={ platform .target } " ,
172+ ] + (
173+ [] if platform .sdk == "macosx" else [f"--build={ os .uname ().machine } -apple-darwin" ]
174+ ),
98175 env = env
99176 )
100177 finally :
101178 os .chdir (working_dir )
102179
103180 for src_dir in [build_dir , os .path .join (build_dir , 'include' )]:
104- copy_files (
105- src_dir ,
106- os .path .join (platform .directory , 'include' ),
107- pattern = '*.h' ,
108- file_suffix = platform .arch ,
109- prefix = platform .prefix ,
110- suffix = platform .suffix
111- )
181+ copy_files (src_dir ,
182+ os .path .join (platform .directory , 'include' ),
183+ pattern = '*.h' ,
184+ file_suffix = platform .arch ,
185+ prefix = platform .prefix ,
186+ suffix = platform .suffix )
112187
113188 for filename in list_files (src_dir , pattern = '*.h' ):
114189 platform_headers [filename ].add ((platform .prefix , platform .arch , platform .suffix ))
115190
116191
117- def generate_source_and_headers ():
118- print ("Generating source and headers for ARM64 iOS only..." )
119-
120- # Copy common files
192+ def generate_source_and_headers (
193+ generate_osx = True ,
194+ generate_ios = True ,
195+ generate_tvos = True ,
196+ generate_watchos = True ,
197+ ):
121198 copy_files ('src' , 'darwin_common/src' , pattern = '*.c' )
122199 copy_files ('include' , 'darwin_common/include' , pattern = '*.h' )
123200
124- # Copy platform-specific source files (ARM64 only)
125- print ("Copying platform source files..." )
126- copy_src_platform_files (ios_simulator_arm64_platform )
127- copy_src_platform_files (ios_device_arm64_platform )
201+ if generate_ios :
202+ copy_src_platform_files (ios_simulator_x86_64_platform )
203+ copy_src_platform_files (ios_simulator_arm64_platform )
204+ copy_src_platform_files (ios_device_arm64_platform )
205+ if generate_osx :
206+ copy_src_platform_files (desktop_x86_64_platform )
207+ copy_src_platform_files (desktop_arm64_platform )
208+ if generate_tvos :
209+ copy_src_platform_files (tvos_simulator_x86_64_platform )
210+ copy_src_platform_files (tvos_simulator_arm64_platform )
211+ copy_src_platform_files (tvos_device_arm64_platform )
212+ if generate_watchos :
213+ copy_src_platform_files (watchos_simulator_x86_64_platform )
214+ copy_src_platform_files (watchos_simulator_arm64_platform )
215+ copy_src_platform_files (watchos_device_arm64_32_platform )
128216
129217 platform_headers = collections .defaultdict (set )
130218
131- # Build targets (ARM64 only)
132- print ("Building iOS Simulator ARM64..." )
133- build_target (ios_simulator_arm64_platform , platform_headers )
134-
135- print ("Building iOS Device ARM64..." )
136- build_target (ios_device_arm64_platform , platform_headers )
219+ if generate_ios :
220+ build_target (ios_simulator_x86_64_platform , platform_headers )
221+ build_target (ios_simulator_arm64_platform , platform_headers )
222+ build_target (ios_device_arm64_platform , platform_headers )
223+ if generate_osx :
224+ build_target (desktop_x86_64_platform , platform_headers )
225+ build_target (desktop_arm64_platform , platform_headers )
226+ if generate_tvos :
227+ build_target (tvos_simulator_x86_64_platform , platform_headers )
228+ build_target (tvos_simulator_arm64_platform , platform_headers )
229+ build_target (tvos_device_arm64_platform , platform_headers )
230+ if generate_watchos :
231+ build_target (watchos_simulator_x86_64_platform , platform_headers )
232+ build_target (watchos_simulator_arm64_platform , platform_headers )
233+ build_target (watchos_device_arm64_32_platform , platform_headers )
137234
138- # Generate combined headers
139- print ("Generating combined headers..." )
140235 mkdir_p ('darwin_common/include' )
141236 for header_name , tag_tuples in platform_headers .items ():
142237 basename , suffix = os .path .splitext (header_name )
143238 with open (os .path .join ('darwin_common/include' , header_name ), 'w' ) as header :
144239 for tag_tuple in tag_tuples :
145240 header .write ('%s#include <%s_%s%s>\n %s\n ' % (tag_tuple [0 ], basename , tag_tuple [1 ], suffix , tag_tuple [2 ]))
146241
147- print ("Done! Generated ARM64-only iOS libffi headers and sources." )
148-
149-
150242if __name__ == '__main__' :
151- generate_source_and_headers ()
243+ parser = argparse .ArgumentParser ()
244+ parser .add_argument ('--only-ios' , action = 'store_true' , default = False )
245+ parser .add_argument ('--only-osx' , action = 'store_true' , default = False )
246+ parser .add_argument ('--only-tvos' , action = 'store_true' , default = False )
247+ parser .add_argument ('--only-watchos' , action = 'store_true' , default = False )
248+ args = parser .parse_args ()
249+
250+ generate_source_and_headers (
251+ generate_osx = not args .only_ios and not args .only_tvos and not args .only_watchos ,
252+ generate_ios = not args .only_osx and not args .only_tvos and not args .only_watchos ,
253+ generate_tvos = not args .only_ios and not args .only_osx and not args .only_watchos ,
254+ generate_watchos = not args .only_ios and not args .only_osx and not args .only_tvos ,
255+ )
0 commit comments