xref: /aosp_15_r20/external/libffi/generate-darwin-source-and-headers.py (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan#!/usr/bin/env python
2*1fd5a2e1SPrashanth Swaminathanimport subprocess
3*1fd5a2e1SPrashanth Swaminathanimport os
4*1fd5a2e1SPrashanth Swaminathanimport errno
5*1fd5a2e1SPrashanth Swaminathanimport collections
6*1fd5a2e1SPrashanth Swaminathanimport glob
7*1fd5a2e1SPrashanth Swaminathanimport argparse
8*1fd5a2e1SPrashanth Swaminathan
9*1fd5a2e1SPrashanth Swaminathanclass Platform(object):
10*1fd5a2e1SPrashanth Swaminathan    pass
11*1fd5a2e1SPrashanth Swaminathan
12*1fd5a2e1SPrashanth Swaminathanclass simulator_platform(Platform):
13*1fd5a2e1SPrashanth Swaminathan    directory = 'darwin_ios'
14*1fd5a2e1SPrashanth Swaminathan    sdk = 'iphonesimulator'
15*1fd5a2e1SPrashanth Swaminathan    arch = 'i386'
16*1fd5a2e1SPrashanth Swaminathan    triple = 'i386-apple-darwin11'
17*1fd5a2e1SPrashanth Swaminathan    version_min = '-miphoneos-version-min=7.0'
18*1fd5a2e1SPrashanth Swaminathan
19*1fd5a2e1SPrashanth Swaminathan    prefix = "#ifdef __i386__\n\n"
20*1fd5a2e1SPrashanth Swaminathan    suffix = "\n\n#endif"
21*1fd5a2e1SPrashanth Swaminathan    src_dir = 'x86'
22*1fd5a2e1SPrashanth Swaminathan    src_files = ['sysv.S', 'ffi.c', 'internal.h']
23*1fd5a2e1SPrashanth Swaminathan
24*1fd5a2e1SPrashanth Swaminathan
25*1fd5a2e1SPrashanth Swaminathanclass simulator64_platform(Platform):
26*1fd5a2e1SPrashanth Swaminathan    directory = 'darwin_ios'
27*1fd5a2e1SPrashanth Swaminathan    sdk = 'iphonesimulator'
28*1fd5a2e1SPrashanth Swaminathan    arch = 'x86_64'
29*1fd5a2e1SPrashanth Swaminathan    triple = 'x86_64-apple-darwin13'
30*1fd5a2e1SPrashanth Swaminathan    version_min = '-miphoneos-version-min=7.0'
31*1fd5a2e1SPrashanth Swaminathan
32*1fd5a2e1SPrashanth Swaminathan    prefix = "#ifdef __x86_64__\n\n"
33*1fd5a2e1SPrashanth Swaminathan    suffix = "\n\n#endif"
34*1fd5a2e1SPrashanth Swaminathan    src_dir = 'x86'
35*1fd5a2e1SPrashanth Swaminathan    src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h']
36*1fd5a2e1SPrashanth Swaminathan
37*1fd5a2e1SPrashanth Swaminathan
38*1fd5a2e1SPrashanth Swaminathanclass device_platform(Platform):
39*1fd5a2e1SPrashanth Swaminathan    directory = 'darwin_ios'
40*1fd5a2e1SPrashanth Swaminathan    sdk = 'iphoneos'
41*1fd5a2e1SPrashanth Swaminathan    arch = 'armv7'
42*1fd5a2e1SPrashanth Swaminathan    triple = 'arm-apple-darwin11'
43*1fd5a2e1SPrashanth Swaminathan    version_min = '-miphoneos-version-min=7.0'
44*1fd5a2e1SPrashanth Swaminathan
45*1fd5a2e1SPrashanth Swaminathan    prefix = "#ifdef __arm__\n\n"
46*1fd5a2e1SPrashanth Swaminathan    suffix = "\n\n#endif"
47*1fd5a2e1SPrashanth Swaminathan    src_dir = 'arm'
48*1fd5a2e1SPrashanth Swaminathan    src_files = ['sysv.S', 'ffi.c', 'internal.h']
49*1fd5a2e1SPrashanth Swaminathan
50*1fd5a2e1SPrashanth Swaminathan
51*1fd5a2e1SPrashanth Swaminathanclass device64_platform(Platform):
52*1fd5a2e1SPrashanth Swaminathan    directory = 'darwin_ios'
53*1fd5a2e1SPrashanth Swaminathan    sdk = 'iphoneos'
54*1fd5a2e1SPrashanth Swaminathan    arch = 'arm64'
55*1fd5a2e1SPrashanth Swaminathan    triple = 'aarch64-apple-darwin13'
56*1fd5a2e1SPrashanth Swaminathan    version_min = '-miphoneos-version-min=7.0'
57*1fd5a2e1SPrashanth Swaminathan
58*1fd5a2e1SPrashanth Swaminathan    prefix = "#ifdef __arm64__\n\n"
59*1fd5a2e1SPrashanth Swaminathan    suffix = "\n\n#endif"
60*1fd5a2e1SPrashanth Swaminathan    src_dir = 'aarch64'
61*1fd5a2e1SPrashanth Swaminathan    src_files = ['sysv.S', 'ffi.c', 'internal.h']
62*1fd5a2e1SPrashanth Swaminathan
63*1fd5a2e1SPrashanth Swaminathan
64*1fd5a2e1SPrashanth Swaminathanclass desktop32_platform(Platform):
65*1fd5a2e1SPrashanth Swaminathan    directory = 'darwin_osx'
66*1fd5a2e1SPrashanth Swaminathan    sdk = 'macosx'
67*1fd5a2e1SPrashanth Swaminathan    arch = 'i386'
68*1fd5a2e1SPrashanth Swaminathan    triple = 'i386-apple-darwin10'
69*1fd5a2e1SPrashanth Swaminathan    version_min = '-mmacosx-version-min=10.6'
70*1fd5a2e1SPrashanth Swaminathan    src_dir = 'x86'
71*1fd5a2e1SPrashanth Swaminathan    src_files = ['sysv.S', 'ffi.c', 'internal.h']
72*1fd5a2e1SPrashanth Swaminathan
73*1fd5a2e1SPrashanth Swaminathan    prefix = "#ifdef __i386__\n\n"
74*1fd5a2e1SPrashanth Swaminathan    suffix = "\n\n#endif"
75*1fd5a2e1SPrashanth Swaminathan
76*1fd5a2e1SPrashanth Swaminathan
77*1fd5a2e1SPrashanth Swaminathanclass desktop64_platform(Platform):
78*1fd5a2e1SPrashanth Swaminathan    directory = 'darwin_osx'
79*1fd5a2e1SPrashanth Swaminathan    sdk = 'macosx'
80*1fd5a2e1SPrashanth Swaminathan    arch = 'x86_64'
81*1fd5a2e1SPrashanth Swaminathan    triple = 'x86_64-apple-darwin10'
82*1fd5a2e1SPrashanth Swaminathan    version_min = '-mmacosx-version-min=10.6'
83*1fd5a2e1SPrashanth Swaminathan
84*1fd5a2e1SPrashanth Swaminathan    prefix = "#ifdef __x86_64__\n\n"
85*1fd5a2e1SPrashanth Swaminathan    suffix = "\n\n#endif"
86*1fd5a2e1SPrashanth Swaminathan    src_dir = 'x86'
87*1fd5a2e1SPrashanth Swaminathan    src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h']
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathan
90*1fd5a2e1SPrashanth Swaminathandef mkdir_p(path):
91*1fd5a2e1SPrashanth Swaminathan    try:
92*1fd5a2e1SPrashanth Swaminathan        os.makedirs(path)
93*1fd5a2e1SPrashanth Swaminathan    except OSError as exc:  # Python >2.5
94*1fd5a2e1SPrashanth Swaminathan        if exc.errno != errno.EEXIST:
95*1fd5a2e1SPrashanth Swaminathan            raise
96*1fd5a2e1SPrashanth Swaminathan
97*1fd5a2e1SPrashanth Swaminathan
98*1fd5a2e1SPrashanth Swaminathandef move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''):
99*1fd5a2e1SPrashanth Swaminathan    mkdir_p(dst_dir)
100*1fd5a2e1SPrashanth Swaminathan    out_filename = filename
101*1fd5a2e1SPrashanth Swaminathan
102*1fd5a2e1SPrashanth Swaminathan    if file_suffix:
103*1fd5a2e1SPrashanth Swaminathan        if filename in ['internal64.h', 'asmnames.h', 'internal.h']:
104*1fd5a2e1SPrashanth Swaminathan            out_filename = filename
105*1fd5a2e1SPrashanth Swaminathan        else:
106*1fd5a2e1SPrashanth Swaminathan            split_name = os.path.splitext(filename)
107*1fd5a2e1SPrashanth Swaminathan            out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1])
108*1fd5a2e1SPrashanth Swaminathan
109*1fd5a2e1SPrashanth Swaminathan    with open(os.path.join(src_dir, filename)) as in_file:
110*1fd5a2e1SPrashanth Swaminathan        with open(os.path.join(dst_dir, out_filename), 'w') as out_file:
111*1fd5a2e1SPrashanth Swaminathan            if prefix:
112*1fd5a2e1SPrashanth Swaminathan                out_file.write(prefix)
113*1fd5a2e1SPrashanth Swaminathan
114*1fd5a2e1SPrashanth Swaminathan            out_file.write(in_file.read())
115*1fd5a2e1SPrashanth Swaminathan
116*1fd5a2e1SPrashanth Swaminathan            if suffix:
117*1fd5a2e1SPrashanth Swaminathan                out_file.write(suffix)
118*1fd5a2e1SPrashanth Swaminathan
119*1fd5a2e1SPrashanth Swaminathan
120*1fd5a2e1SPrashanth Swaminathandef list_files(src_dir, pattern=None, filelist=None):
121*1fd5a2e1SPrashanth Swaminathan    if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern))
122*1fd5a2e1SPrashanth Swaminathan    for file in filelist:
123*1fd5a2e1SPrashanth Swaminathan        yield os.path.basename(file)
124*1fd5a2e1SPrashanth Swaminathan
125*1fd5a2e1SPrashanth Swaminathan
126*1fd5a2e1SPrashanth Swaminathandef copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None):
127*1fd5a2e1SPrashanth Swaminathan    for filename in list_files(src_dir, pattern=pattern, filelist=filelist):
128*1fd5a2e1SPrashanth Swaminathan        move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix)
129*1fd5a2e1SPrashanth Swaminathan
130*1fd5a2e1SPrashanth Swaminathan
131*1fd5a2e1SPrashanth Swaminathandef copy_src_platform_files(platform):
132*1fd5a2e1SPrashanth Swaminathan    src_dir = os.path.join('src', platform.src_dir)
133*1fd5a2e1SPrashanth Swaminathan    dst_dir = os.path.join(platform.directory, 'src', platform.src_dir)
134*1fd5a2e1SPrashanth Swaminathan    copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix)
135*1fd5a2e1SPrashanth Swaminathan
136*1fd5a2e1SPrashanth Swaminathan
137*1fd5a2e1SPrashanth Swaminathandef build_target(platform, platform_headers):
138*1fd5a2e1SPrashanth Swaminathan    def xcrun_cmd(cmd):
139*1fd5a2e1SPrashanth Swaminathan        return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch)
140*1fd5a2e1SPrashanth Swaminathan
141*1fd5a2e1SPrashanth Swaminathan    tag='%s-%s' % (platform.sdk, platform.arch)
142*1fd5a2e1SPrashanth Swaminathan    build_dir = 'build_%s' % tag
143*1fd5a2e1SPrashanth Swaminathan    mkdir_p(build_dir)
144*1fd5a2e1SPrashanth Swaminathan    env = dict(CC=xcrun_cmd('clang'),
145*1fd5a2e1SPrashanth Swaminathan               LD=xcrun_cmd('ld'),
146*1fd5a2e1SPrashanth Swaminathan               CFLAGS='%s' % (platform.version_min))
147*1fd5a2e1SPrashanth Swaminathan    working_dir = os.getcwd()
148*1fd5a2e1SPrashanth Swaminathan    try:
149*1fd5a2e1SPrashanth Swaminathan        os.chdir(build_dir)
150*1fd5a2e1SPrashanth Swaminathan        subprocess.check_call(['../configure', '-host', platform.triple], env=env)
151*1fd5a2e1SPrashanth Swaminathan    finally:
152*1fd5a2e1SPrashanth Swaminathan        os.chdir(working_dir)
153*1fd5a2e1SPrashanth Swaminathan
154*1fd5a2e1SPrashanth Swaminathan    for src_dir in [build_dir, os.path.join(build_dir, 'include')]:
155*1fd5a2e1SPrashanth Swaminathan        copy_files(src_dir,
156*1fd5a2e1SPrashanth Swaminathan                   os.path.join(platform.directory, 'include'),
157*1fd5a2e1SPrashanth Swaminathan                   pattern='*.h',
158*1fd5a2e1SPrashanth Swaminathan                   file_suffix=platform.arch,
159*1fd5a2e1SPrashanth Swaminathan                   prefix=platform.prefix,
160*1fd5a2e1SPrashanth Swaminathan                   suffix=platform.suffix)
161*1fd5a2e1SPrashanth Swaminathan
162*1fd5a2e1SPrashanth Swaminathan        for filename in list_files(src_dir, pattern='*.h'):
163*1fd5a2e1SPrashanth Swaminathan            platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix))
164*1fd5a2e1SPrashanth Swaminathan
165*1fd5a2e1SPrashanth Swaminathan
166*1fd5a2e1SPrashanth Swaminathandef generate_source_and_headers(generate_osx=True, generate_ios=True):
167*1fd5a2e1SPrashanth Swaminathan    copy_files('src', 'darwin_common/src', pattern='*.c')
168*1fd5a2e1SPrashanth Swaminathan    copy_files('include', 'darwin_common/include', pattern='*.h')
169*1fd5a2e1SPrashanth Swaminathan
170*1fd5a2e1SPrashanth Swaminathan    if generate_ios:
171*1fd5a2e1SPrashanth Swaminathan        copy_src_platform_files(simulator_platform)
172*1fd5a2e1SPrashanth Swaminathan        copy_src_platform_files(simulator64_platform)
173*1fd5a2e1SPrashanth Swaminathan        copy_src_platform_files(device_platform)
174*1fd5a2e1SPrashanth Swaminathan        copy_src_platform_files(device64_platform)
175*1fd5a2e1SPrashanth Swaminathan    if generate_osx:
176*1fd5a2e1SPrashanth Swaminathan        copy_src_platform_files(desktop32_platform)
177*1fd5a2e1SPrashanth Swaminathan        copy_src_platform_files(desktop64_platform)
178*1fd5a2e1SPrashanth Swaminathan
179*1fd5a2e1SPrashanth Swaminathan    platform_headers = collections.defaultdict(set)
180*1fd5a2e1SPrashanth Swaminathan
181*1fd5a2e1SPrashanth Swaminathan    if generate_ios:
182*1fd5a2e1SPrashanth Swaminathan        build_target(simulator_platform, platform_headers)
183*1fd5a2e1SPrashanth Swaminathan        build_target(simulator64_platform, platform_headers)
184*1fd5a2e1SPrashanth Swaminathan        build_target(device_platform, platform_headers)
185*1fd5a2e1SPrashanth Swaminathan        build_target(device64_platform, platform_headers)
186*1fd5a2e1SPrashanth Swaminathan    if generate_osx:
187*1fd5a2e1SPrashanth Swaminathan        build_target(desktop32_platform, platform_headers)
188*1fd5a2e1SPrashanth Swaminathan        build_target(desktop64_platform, platform_headers)
189*1fd5a2e1SPrashanth Swaminathan
190*1fd5a2e1SPrashanth Swaminathan    mkdir_p('darwin_common/include')
191*1fd5a2e1SPrashanth Swaminathan    for header_name, tag_tuples in platform_headers.iteritems():
192*1fd5a2e1SPrashanth Swaminathan        basename, suffix = os.path.splitext(header_name)
193*1fd5a2e1SPrashanth Swaminathan        with open(os.path.join('darwin_common/include', header_name), 'w') as header:
194*1fd5a2e1SPrashanth Swaminathan            for tag_tuple in tag_tuples:
195*1fd5a2e1SPrashanth Swaminathan                header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2]))
196*1fd5a2e1SPrashanth Swaminathan
197*1fd5a2e1SPrashanth Swaminathanif __name__ == '__main__':
198*1fd5a2e1SPrashanth Swaminathan    parser = argparse.ArgumentParser()
199*1fd5a2e1SPrashanth Swaminathan    parser.add_argument('--only-ios', action='store_true', default=False)
200*1fd5a2e1SPrashanth Swaminathan    parser.add_argument('--only-osx', action='store_true', default=False)
201*1fd5a2e1SPrashanth Swaminathan    args = parser.parse_args()
202*1fd5a2e1SPrashanth Swaminathan
203*1fd5a2e1SPrashanth Swaminathan    generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx)
204