Skip to content

Commit 84075ff

Browse files
committed
fixed libffi building
1 parent 0098c55 commit 84075ff

3 files changed

Lines changed: 154 additions & 90 deletions

File tree

build-llvm.sh

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,12 @@ build_libffi() {
5151
echo "Build libffi for $targetPlatformArch"
5252

5353
cd $REPO_ROOT
54-
local libffiReleaseSrcArchiveUrl=https://github.com/libffi/libffi/archive/refs/tags/v3.4.4.tar.gz
55-
local libffiReleaseUrl=https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz
54+
# local libffiReleaseSrcArchiveUrl=https://github.com/libffi/libffi/archive/refs/tags/v3.5.2.tar.gz
55+
# local libffiReleaseUrl=https://github.com/libffi/libffi/releases/download/v3.5.2/libffi-3.5.2.tar.gz
5656
# test -d libffi || git clone https://github.com/libffi/libffi.git
5757
# curl -L -o libffi.tar.gz $libffiReleaseSrcArchive
58-
curl -L -o libffi.tar.gz $libffiReleaseUrl
59-
tar xzf libffi.tar.gz
60-
mv libffi-3.4.4 libffi
58+
#curl -L -o libffi.tar.gz $libffiReleaseUrl
59+
tar xzf libffi.tar
6160
cd libffi
6261

6362
# Imitate libffi continuous integration .ci/build.sh script
@@ -67,55 +66,16 @@ build_libffi() {
6766
# or when we build on the source repo.
6867
# ./autogen.sh
6968

70-
# Removing that garbage
71-
rm generate-darwin-source-and-headers.py
72-
7369
# Getting the new and better python script
7470
cp $REPO_ROOT/fix.py generate-darwin-source-and-headers.py
7571
chmod +x generate-darwin-source-and-headers.py
7672

7773
# Fixup execution permitives
78-
chmod +x generate-darwin-source-and-headers.py
74+
# chmod +x generate-darwin-source-and-headers.py
7975

8076
# Do generate!
8177
./generate-darwin-source-and-headers.py --only-ios
8278

83-
# Creating stubs so it shuts up and stops crying
84-
mkdir -p darwin_ios/src/arm
85-
mkdir -p darwin_ios/src/x86
86-
87-
# armv7 and x86 stubs
88-
cat > darwin_ios/src/arm/sysv_armv7.S << 'EOF'
89-
#ifdef __armv7__
90-
/* armv7 not supported */
91-
#endif
92-
EOF
93-
94-
cat > darwin_ios/src/arm/ffi_armv7.c << 'EOF'
95-
/* armv7 not supported - stub file */
96-
EOF
97-
98-
# Create empty x86_64 files (with _x86_64 suffix)
99-
cat > darwin_ios/src/x86/unix64_x86_64.S << 'EOF'
100-
#ifdef __x86_64__
101-
/* x86_64 not supported */
102-
#endif
103-
EOF
104-
105-
cat > darwin_ios/src/x86/ffi64_x86_64.c << 'EOF'
106-
/* x86_64 not supported - stub file */
107-
EOF
108-
109-
cat > darwin_ios/src/x86/ffiw64_x86_64.c << 'EOF'
110-
/* x86_64 not supported - stub file */
111-
EOF
112-
113-
cat > darwin_ios/src/x86/win64_x86_64.S << 'EOF'
114-
#ifdef __x86_64__
115-
/* x86_64 not supported */
116-
#endif
117-
EOF
118-
11979
case $targetPlatformArch in
12080
"iphoneos")
12181
xcodeSdkArgs=(-sdk $targetBasePlatform);;

fix.py

100644100755
Lines changed: 149 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,114 @@
1-
#!/usr/bin/env python3
1+
#!/usr/bin/env python
22
import subprocess
33
import os
44
import errno
55
import collections
66
import glob
7+
import argparse
78

89

910
class 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+
1323
class 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+
2845
class 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

35108
def 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

63138
def 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

81155
def 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-
150242
if __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+
)

libffi.tar

8.46 MB
Binary file not shown.

0 commit comments

Comments
 (0)