xref: /aosp_15_r20/external/webrtc/android_tools/generate_bp.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*d9f75844SAndroid Build Coastguard Worker
3*d9f75844SAndroid Build Coastguard Workerimport json
4*d9f75844SAndroid Build Coastguard Workerimport os
5*d9f75844SAndroid Build Coastguard Workerimport sys
6*d9f75844SAndroid Build Coastguard Worker
7*d9f75844SAndroid Build Coastguard WorkerPRINT_ORIGINAL_FULL = False
8*d9f75844SAndroid Build Coastguard Worker
9*d9f75844SAndroid Build Coastguard Worker# This flags are augmented with flags added to the json files but not present in .gn or .gni files
10*d9f75844SAndroid Build Coastguard WorkerIGNORED_FLAGS = [
11*d9f75844SAndroid Build Coastguard Worker    '-D_DEBUG',
12*d9f75844SAndroid Build Coastguard Worker    '-Werror',
13*d9f75844SAndroid Build Coastguard Worker    '-Xclang',
14*d9f75844SAndroid Build Coastguard Worker    '-target-feature',
15*d9f75844SAndroid Build Coastguard Worker    '+crc',
16*d9f75844SAndroid Build Coastguard Worker    '+crypto',
17*d9f75844SAndroid Build Coastguard Worker]
18*d9f75844SAndroid Build Coastguard WorkerIGNORED_DEFINES = [
19*d9f75844SAndroid Build Coastguard Worker    'HAVE_ARM64_CRC32C=1'
20*d9f75844SAndroid Build Coastguard Worker]
21*d9f75844SAndroid Build Coastguard WorkerDEFAULT_CFLAGS = [
22*d9f75844SAndroid Build Coastguard Worker    '-DHAVE_ARM64_CRC32C=0',
23*d9f75844SAndroid Build Coastguard Worker    '-DUSE_AURA=1',
24*d9f75844SAndroid Build Coastguard Worker    '-DUSE_GLIB=1',
25*d9f75844SAndroid Build Coastguard Worker    '-DUSE_NSS_CERTS=1',
26*d9f75844SAndroid Build Coastguard Worker    '-DUSE_UDEV',
27*d9f75844SAndroid Build Coastguard Worker    '-DUSE_X11=1',
28*d9f75844SAndroid Build Coastguard Worker    '-DWEBRTC_ANDROID_PLATFORM_BUILD=1',
29*d9f75844SAndroid Build Coastguard Worker    '-DWEBRTC_APM_DEBUG_DUMP=0',
30*d9f75844SAndroid Build Coastguard Worker    '-D_FILE_OFFSET_BITS=64',
31*d9f75844SAndroid Build Coastguard Worker    '-D_GNU_SOURCE',
32*d9f75844SAndroid Build Coastguard Worker    '-D_LARGEFILE64_SOURCE',
33*d9f75844SAndroid Build Coastguard Worker    '-D_LARGEFILE_SOURCE',
34*d9f75844SAndroid Build Coastguard Worker    '-Wno-global-constructors',
35*d9f75844SAndroid Build Coastguard Worker    '-Wno-implicit-const-int-float-conversion',
36*d9f75844SAndroid Build Coastguard Worker    '-Wno-missing-field-initializers',
37*d9f75844SAndroid Build Coastguard Worker    '-Wno-unreachable-code-aggressive',
38*d9f75844SAndroid Build Coastguard Worker    '-Wno-unreachable-code-break',
39*d9f75844SAndroid Build Coastguard Worker]
40*d9f75844SAndroid Build Coastguard Worker
41*d9f75844SAndroid Build Coastguard WorkerDEFAULT_CFLAGS_BY_ARCH = {
42*d9f75844SAndroid Build Coastguard Worker        'x86': ['-mavx2', '-mfma', '-msse2', '-msse3'],
43*d9f75844SAndroid Build Coastguard Worker        'x64': ['-mavx2', '-mfma', '-msse2', '-msse3'],
44*d9f75844SAndroid Build Coastguard Worker        'arm': ['-mthumb'],
45*d9f75844SAndroid Build Coastguard Worker        'arm64': [],
46*d9f75844SAndroid Build Coastguard Worker        'riscv64': [],
47*d9f75844SAndroid Build Coastguard Worker        }
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard WorkerFLAGS = ['cflags', 'cflags_c', 'cflags_cc', 'asmflags']
50*d9f75844SAndroid Build Coastguard WorkerFLAG_NAME_MAP = {
51*d9f75844SAndroid Build Coastguard Worker    'cflags': 'cflags',
52*d9f75844SAndroid Build Coastguard Worker    'asmflags': 'asflags',
53*d9f75844SAndroid Build Coastguard Worker    'cflags_cc': 'cppflags',
54*d9f75844SAndroid Build Coastguard Worker    'cflags_c': 'conlyflags',
55*d9f75844SAndroid Build Coastguard Worker}
56*d9f75844SAndroid Build Coastguard Worker
57*d9f75844SAndroid Build Coastguard WorkerARCH_NAME_MAP = {n: n for n in DEFAULT_CFLAGS_BY_ARCH.keys()}
58*d9f75844SAndroid Build Coastguard WorkerARCH_NAME_MAP['x64'] = 'x86_64'
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard WorkerARCHS = sorted(ARCH_NAME_MAP.keys())
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Workerdef FormatList(l):
63*d9f75844SAndroid Build Coastguard Worker    return json.dumps(sorted(list(l)))
64*d9f75844SAndroid Build Coastguard Worker
65*d9f75844SAndroid Build Coastguard Workerdef IsInclude(name):
66*d9f75844SAndroid Build Coastguard Worker    return name.endswith('.h') or name.endswith('.inc')
67*d9f75844SAndroid Build Coastguard Worker
68*d9f75844SAndroid Build Coastguard Workerdef FilterIncludes(l):
69*d9f75844SAndroid Build Coastguard Worker    return filter(lambda x: not IsInclude(x), l)
70*d9f75844SAndroid Build Coastguard Worker
71*d9f75844SAndroid Build Coastguard Workerdef PrintOrigin(target):
72*d9f75844SAndroid Build Coastguard Worker    print('/* From target:')
73*d9f75844SAndroid Build Coastguard Worker    if PRINT_ORIGINAL_FULL:
74*d9f75844SAndroid Build Coastguard Worker        print(json.dumps(target, sort_keys = True, indent = 4))
75*d9f75844SAndroid Build Coastguard Worker    else:
76*d9f75844SAndroid Build Coastguard Worker        print(target['original_name'])
77*d9f75844SAndroid Build Coastguard Worker    print('*/')
78*d9f75844SAndroid Build Coastguard Worker
79*d9f75844SAndroid Build Coastguard Workerdef MakeRelatives(l):
80*d9f75844SAndroid Build Coastguard Worker    return map(lambda x: x.split('//').pop(), l)
81*d9f75844SAndroid Build Coastguard Worker
82*d9f75844SAndroid Build Coastguard Workerdef FormatName(name):
83*d9f75844SAndroid Build Coastguard Worker    return 'webrtc_' + name.split('/').pop().replace(':', '__')
84*d9f75844SAndroid Build Coastguard Worker
85*d9f75844SAndroid Build Coastguard Workerdef FormatNames(target):
86*d9f75844SAndroid Build Coastguard Worker    target['original_name'] = target['name']
87*d9f75844SAndroid Build Coastguard Worker    target['name'] = FormatName(target['name'])
88*d9f75844SAndroid Build Coastguard Worker    target['deps'] = sorted([FormatName(d) for d in target['deps']])
89*d9f75844SAndroid Build Coastguard Worker    return target
90*d9f75844SAndroid Build Coastguard Worker
91*d9f75844SAndroid Build Coastguard Workerdef FilterFlags(flags, to_skip = set()):
92*d9f75844SAndroid Build Coastguard Worker    skipped_opts = set(IGNORED_FLAGS).union(to_skip)
93*d9f75844SAndroid Build Coastguard Worker    return [x for x in flags if not any([x.startswith(y) for y in skipped_opts])]
94*d9f75844SAndroid Build Coastguard Worker
95*d9f75844SAndroid Build Coastguard Workerdef PrintHeader():
96*d9f75844SAndroid Build Coastguard Worker    print('package {')
97*d9f75844SAndroid Build Coastguard Worker    print('    default_applicable_licenses: ["external_webrtc_license"],')
98*d9f75844SAndroid Build Coastguard Worker    print('}')
99*d9f75844SAndroid Build Coastguard Worker    print('')
100*d9f75844SAndroid Build Coastguard Worker    print('// Added automatically by a large-scale-change that took the approach of')
101*d9f75844SAndroid Build Coastguard Worker    print('// \'apply every license found to every target\'. While this makes sure we respect')
102*d9f75844SAndroid Build Coastguard Worker    print('// every license restriction, it may not be entirely correct.')
103*d9f75844SAndroid Build Coastguard Worker    print('//')
104*d9f75844SAndroid Build Coastguard Worker    print('// e.g. GPL in an MIT project might only apply to the contrib/ directory.')
105*d9f75844SAndroid Build Coastguard Worker    print('//')
106*d9f75844SAndroid Build Coastguard Worker    print('// Please consider splitting the single license below into multiple licenses,')
107*d9f75844SAndroid Build Coastguard Worker    print('// taking care not to lose any license_kind information, and overriding the')
108*d9f75844SAndroid Build Coastguard Worker    print('// default license using the \'licenses: [...]\' property on targets as needed.')
109*d9f75844SAndroid Build Coastguard Worker    print('//')
110*d9f75844SAndroid Build Coastguard Worker    print('// For unused files, consider creating a \'fileGroup\' with "//visibility:private"')
111*d9f75844SAndroid Build Coastguard Worker    print('// to attach the license to, and including a comment whether the files may be')
112*d9f75844SAndroid Build Coastguard Worker    print('// used in the current project.')
113*d9f75844SAndroid Build Coastguard Worker    print('//')
114*d9f75844SAndroid Build Coastguard Worker    print('// large-scale-change included anything that looked like it might be a license')
115*d9f75844SAndroid Build Coastguard Worker    print('// text as a license_text. e.g. LICENSE, NOTICE, COPYING etc.')
116*d9f75844SAndroid Build Coastguard Worker    print('//')
117*d9f75844SAndroid Build Coastguard Worker    print('// Please consider removing redundant or irrelevant files from \'license_text:\'.')
118*d9f75844SAndroid Build Coastguard Worker    print('// See: http://go/android-license-faq')
119*d9f75844SAndroid Build Coastguard Worker    print('')
120*d9f75844SAndroid Build Coastguard Worker    print('///////////////////////////////////////////////////////////////////////////////')
121*d9f75844SAndroid Build Coastguard Worker    print('// Do not edit this file directly, it\'s automatically generated by a script. //')
122*d9f75844SAndroid Build Coastguard Worker    print('// Modify android_tools/generate_android_bp.py and run that instead.         //')
123*d9f75844SAndroid Build Coastguard Worker    print('///////////////////////////////////////////////////////////////////////////////')
124*d9f75844SAndroid Build Coastguard Worker    print('')
125*d9f75844SAndroid Build Coastguard Worker    print('license {')
126*d9f75844SAndroid Build Coastguard Worker    print('    name: "external_webrtc_license",')
127*d9f75844SAndroid Build Coastguard Worker    print('    visibility: [":__subpackages__"],')
128*d9f75844SAndroid Build Coastguard Worker    print('    license_kinds: [')
129*d9f75844SAndroid Build Coastguard Worker    print('        "SPDX-license-identifier-Apache-2.0",')
130*d9f75844SAndroid Build Coastguard Worker    print('        "SPDX-license-identifier-BSD",')
131*d9f75844SAndroid Build Coastguard Worker    print('        "SPDX-license-identifier-MIT",')
132*d9f75844SAndroid Build Coastguard Worker    print('        "SPDX-license-identifier-Zlib",')
133*d9f75844SAndroid Build Coastguard Worker    print('        "legacy_notice",')
134*d9f75844SAndroid Build Coastguard Worker    print('        "legacy_unencumbered",')
135*d9f75844SAndroid Build Coastguard Worker    print('    ],')
136*d9f75844SAndroid Build Coastguard Worker    print('    license_text: [')
137*d9f75844SAndroid Build Coastguard Worker    print('        "LICENSE",')
138*d9f75844SAndroid Build Coastguard Worker    print('        "PATENTS",')
139*d9f75844SAndroid Build Coastguard Worker    print('        "license_template.txt",')
140*d9f75844SAndroid Build Coastguard Worker    print('    ],')
141*d9f75844SAndroid Build Coastguard Worker    print('}')
142*d9f75844SAndroid Build Coastguard Worker
143*d9f75844SAndroid Build Coastguard Worker
144*d9f75844SAndroid Build Coastguard Worker
145*d9f75844SAndroid Build Coastguard Workerdef GatherDefaultFlags(targets_by_arch):
146*d9f75844SAndroid Build Coastguard Worker    # Iterate through all of the targets for each architecture collecting the flags that
147*d9f75844SAndroid Build Coastguard Worker    # are the same for all targets in that architecture.  Use a list instead of a set
148*d9f75844SAndroid Build Coastguard Worker    # to maintain the flag ordering, which may be significant (e.g. -Wno-shadow has to
149*d9f75844SAndroid Build Coastguard Worker    # come after -Wshadow).
150*d9f75844SAndroid Build Coastguard Worker    arch_default_flags = {}
151*d9f75844SAndroid Build Coastguard Worker    for arch, targets in targets_by_arch.items():
152*d9f75844SAndroid Build Coastguard Worker        arch_default_flags[arch] = {}
153*d9f75844SAndroid Build Coastguard Worker        for target in targets.values():
154*d9f75844SAndroid Build Coastguard Worker            typ = target['type']
155*d9f75844SAndroid Build Coastguard Worker            if typ != 'static_library':
156*d9f75844SAndroid Build Coastguard Worker                continue
157*d9f75844SAndroid Build Coastguard Worker            for flag_type in FLAGS:
158*d9f75844SAndroid Build Coastguard Worker                if not flag_type in arch_default_flags:
159*d9f75844SAndroid Build Coastguard Worker                    arch_default_flags[arch][flag_type] = target[flag_type]
160*d9f75844SAndroid Build Coastguard Worker                else:
161*d9f75844SAndroid Build Coastguard Worker                    target_flags = set(target[flag_type])
162*d9f75844SAndroid Build Coastguard Worker                    flags = arch_default_flags[arch][flag_type]
163*d9f75844SAndroid Build Coastguard Worker                    flags[:]  = [ x for x in flags if x in target_flags ]
164*d9f75844SAndroid Build Coastguard Worker        for flag_type, flags in arch_default_flags[arch].items():
165*d9f75844SAndroid Build Coastguard Worker            arch_default_flags[arch][flag_type] = FilterFlags(flags)
166*d9f75844SAndroid Build Coastguard Worker        # Add in the hardcoded extra default cflags
167*d9f75844SAndroid Build Coastguard Worker        arch_default_flags[arch]['cflags'] += DEFAULT_CFLAGS_BY_ARCH.get(arch, [])
168*d9f75844SAndroid Build Coastguard Worker
169*d9f75844SAndroid Build Coastguard Worker    # Iterate through all of the architectures collecting the flags that are the same
170*d9f75844SAndroid Build Coastguard Worker    # for all targets in all architectures.
171*d9f75844SAndroid Build Coastguard Worker    default_flags = {}
172*d9f75844SAndroid Build Coastguard Worker    for arch, flagset in arch_default_flags.items():
173*d9f75844SAndroid Build Coastguard Worker        for flag_type, arch_flags in flagset.items():
174*d9f75844SAndroid Build Coastguard Worker            if not flag_type in default_flags:
175*d9f75844SAndroid Build Coastguard Worker                default_flags[flag_type] = arch_flags.copy()
176*d9f75844SAndroid Build Coastguard Worker            else:
177*d9f75844SAndroid Build Coastguard Worker                flags = default_flags[flag_type]
178*d9f75844SAndroid Build Coastguard Worker                flags[:] = [ x for x in flags if x in arch_flags ]
179*d9f75844SAndroid Build Coastguard Worker    # Add in the hardcoded extra default cflags
180*d9f75844SAndroid Build Coastguard Worker    default_flags['cflags'] += DEFAULT_CFLAGS
181*d9f75844SAndroid Build Coastguard Worker
182*d9f75844SAndroid Build Coastguard Worker    # Remove the global default flags from the per-architecture default flags
183*d9f75844SAndroid Build Coastguard Worker    for arch, flagset in arch_default_flags.items():
184*d9f75844SAndroid Build Coastguard Worker        for flag_type in flagset.keys():
185*d9f75844SAndroid Build Coastguard Worker            flags = flagset[flag_type]
186*d9f75844SAndroid Build Coastguard Worker            flags[:] = [ x for x in flags if x not in default_flags[flag_type] ]
187*d9f75844SAndroid Build Coastguard Worker
188*d9f75844SAndroid Build Coastguard Worker    default_flags['arch'] = arch_default_flags
189*d9f75844SAndroid Build Coastguard Worker    return default_flags
190*d9f75844SAndroid Build Coastguard Worker
191*d9f75844SAndroid Build Coastguard Workerdef GenerateDefault(targets_by_arch):
192*d9f75844SAndroid Build Coastguard Worker    in_default = GatherDefaultFlags(targets_by_arch)
193*d9f75844SAndroid Build Coastguard Worker    print('cc_defaults {')
194*d9f75844SAndroid Build Coastguard Worker    print('    name: "webrtc_defaults",')
195*d9f75844SAndroid Build Coastguard Worker    print('    local_include_dirs: [')
196*d9f75844SAndroid Build Coastguard Worker    print('      ".",')
197*d9f75844SAndroid Build Coastguard Worker    print('      "webrtc",')
198*d9f75844SAndroid Build Coastguard Worker    print('      "third_party/crc32c/src/include",')
199*d9f75844SAndroid Build Coastguard Worker    print('    ],')
200*d9f75844SAndroid Build Coastguard Worker    for typ in sorted(in_default.keys() - {'arch'}):
201*d9f75844SAndroid Build Coastguard Worker        flags = in_default[typ]
202*d9f75844SAndroid Build Coastguard Worker        if len(flags) > 0:
203*d9f75844SAndroid Build Coastguard Worker            print('    {0}: ['.format(FLAG_NAME_MAP[typ]))
204*d9f75844SAndroid Build Coastguard Worker            for flag in flags:
205*d9f75844SAndroid Build Coastguard Worker                print('        "{0}",'.format(flag.replace('"', '\\"')))
206*d9f75844SAndroid Build Coastguard Worker            print('    ],')
207*d9f75844SAndroid Build Coastguard Worker    print('    static_libs: [')
208*d9f75844SAndroid Build Coastguard Worker    print('        "libabsl",')
209*d9f75844SAndroid Build Coastguard Worker    print('        "libaom",')
210*d9f75844SAndroid Build Coastguard Worker    print('        "libevent",')
211*d9f75844SAndroid Build Coastguard Worker    print('        "libopus",')
212*d9f75844SAndroid Build Coastguard Worker    print('        "libsrtp2",')
213*d9f75844SAndroid Build Coastguard Worker    print('        "libvpx",')
214*d9f75844SAndroid Build Coastguard Worker    print('        "libyuv",')
215*d9f75844SAndroid Build Coastguard Worker    print('        "libpffft",')
216*d9f75844SAndroid Build Coastguard Worker    print('        "rnnoise_rnn_vad",')
217*d9f75844SAndroid Build Coastguard Worker    print('    ],')
218*d9f75844SAndroid Build Coastguard Worker    print('    shared_libs: [')
219*d9f75844SAndroid Build Coastguard Worker    print('        "libcrypto",')
220*d9f75844SAndroid Build Coastguard Worker    print('        "libprotobuf-cpp-full",')
221*d9f75844SAndroid Build Coastguard Worker    print('        "libprotobuf-cpp-lite",')
222*d9f75844SAndroid Build Coastguard Worker    print('        "libssl",')
223*d9f75844SAndroid Build Coastguard Worker    print('    ],')
224*d9f75844SAndroid Build Coastguard Worker    print('    host_supported: true,')
225*d9f75844SAndroid Build Coastguard Worker    print('    // vendor needed for libpreprocessing effects.')
226*d9f75844SAndroid Build Coastguard Worker    print('    vendor: true,')
227*d9f75844SAndroid Build Coastguard Worker    print('    target: {')
228*d9f75844SAndroid Build Coastguard Worker    print('        darwin: {')
229*d9f75844SAndroid Build Coastguard Worker    print('            enabled: false,')
230*d9f75844SAndroid Build Coastguard Worker    print('        },')
231*d9f75844SAndroid Build Coastguard Worker    print('    },')
232*d9f75844SAndroid Build Coastguard Worker    print('    arch: {')
233*d9f75844SAndroid Build Coastguard Worker    for a in ARCHS:
234*d9f75844SAndroid Build Coastguard Worker        print('        {0}: {{'.format(ARCH_NAME_MAP[a]))
235*d9f75844SAndroid Build Coastguard Worker        for typ in FLAGS:
236*d9f75844SAndroid Build Coastguard Worker            flags = in_default['arch'].get(a, {}).get(typ, [])
237*d9f75844SAndroid Build Coastguard Worker            if len(flags) > 0:
238*d9f75844SAndroid Build Coastguard Worker                print('            {0}: ['.format(FLAG_NAME_MAP[typ]))
239*d9f75844SAndroid Build Coastguard Worker                for flag in flags:
240*d9f75844SAndroid Build Coastguard Worker                    print('                "{0}",'.format(flag.replace('"', '\\"')))
241*d9f75844SAndroid Build Coastguard Worker                print('            ],')
242*d9f75844SAndroid Build Coastguard Worker        print('        },')
243*d9f75844SAndroid Build Coastguard Worker    print('    },')
244*d9f75844SAndroid Build Coastguard Worker    print('    visibility: [')
245*d9f75844SAndroid Build Coastguard Worker    print('        "//frameworks/av/media/libeffects/preprocessing:__subpackages__",')
246*d9f75844SAndroid Build Coastguard Worker    print('        "//device/google/cuttlefish/host/frontend/webrtc:__subpackages__",')
247*d9f75844SAndroid Build Coastguard Worker    print('    ],')
248*d9f75844SAndroid Build Coastguard Worker    print('}')
249*d9f75844SAndroid Build Coastguard Worker
250*d9f75844SAndroid Build Coastguard Worker    # The flags in the default entry can be safely removed from the targets
251*d9f75844SAndroid Build Coastguard Worker    for arch, targets in targets_by_arch.items():
252*d9f75844SAndroid Build Coastguard Worker        for flag_type in FLAGS:
253*d9f75844SAndroid Build Coastguard Worker            default_flags = set(in_default[flag_type]) | set(in_default['arch'][arch][flag_type])
254*d9f75844SAndroid Build Coastguard Worker            for target in targets.values():
255*d9f75844SAndroid Build Coastguard Worker                target[flag_type] = FilterFlags(target.get(flag_type, []), default_flags)
256*d9f75844SAndroid Build Coastguard Worker                if len(target[flag_type]) == 0:
257*d9f75844SAndroid Build Coastguard Worker                    target.pop(flag_type)
258*d9f75844SAndroid Build Coastguard Worker
259*d9f75844SAndroid Build Coastguard Worker    return in_default
260*d9f75844SAndroid Build Coastguard Worker
261*d9f75844SAndroid Build Coastguard Worker
262*d9f75844SAndroid Build Coastguard Workerdef TransitiveDependencies(name, dep_type, targets):
263*d9f75844SAndroid Build Coastguard Worker    target = targets[name]
264*d9f75844SAndroid Build Coastguard Worker    field = 'transitive_' + dep_type
265*d9f75844SAndroid Build Coastguard Worker    if field in target.keys():
266*d9f75844SAndroid Build Coastguard Worker        return target[field]
267*d9f75844SAndroid Build Coastguard Worker    target[field] = {'global': set()}
268*d9f75844SAndroid Build Coastguard Worker    for a in ARCHS:
269*d9f75844SAndroid Build Coastguard Worker        target[field][a] = set()
270*d9f75844SAndroid Build Coastguard Worker    if target['type'] == dep_type:
271*d9f75844SAndroid Build Coastguard Worker        target[field]['global'].add(name)
272*d9f75844SAndroid Build Coastguard Worker    for d in target.get('deps', []):
273*d9f75844SAndroid Build Coastguard Worker        if targets[d]['type'] == dep_type:
274*d9f75844SAndroid Build Coastguard Worker            target[field]['global'].add(d)
275*d9f75844SAndroid Build Coastguard Worker        tDeps = TransitiveDependencies(d, dep_type, targets)
276*d9f75844SAndroid Build Coastguard Worker        target[field]['global'] |= tDeps['global']
277*d9f75844SAndroid Build Coastguard Worker        for a in ARCHS:
278*d9f75844SAndroid Build Coastguard Worker            target[field][a] |= tDeps[a]
279*d9f75844SAndroid Build Coastguard Worker    if 'arch' in target:
280*d9f75844SAndroid Build Coastguard Worker        for a, x in target['arch'].items():
281*d9f75844SAndroid Build Coastguard Worker            for d in x.get('deps', []):
282*d9f75844SAndroid Build Coastguard Worker                tDeps = TransitiveDependencies(d, dep_type, targets)
283*d9f75844SAndroid Build Coastguard Worker                target[field][a] |= tDeps['global'] | tDeps[a]
284*d9f75844SAndroid Build Coastguard Worker            target[field][a] -= target[field]['global']
285*d9f75844SAndroid Build Coastguard Worker
286*d9f75844SAndroid Build Coastguard Worker    return target[field]
287*d9f75844SAndroid Build Coastguard Worker
288*d9f75844SAndroid Build Coastguard Workerdef GenerateGroup(target):
289*d9f75844SAndroid Build Coastguard Worker    # PrintOrigin(target)
290*d9f75844SAndroid Build Coastguard Worker    pass
291*d9f75844SAndroid Build Coastguard Worker
292*d9f75844SAndroid Build Coastguard Workerdef GenerateStaticLib(target, targets):
293*d9f75844SAndroid Build Coastguard Worker    PrintOrigin(target)
294*d9f75844SAndroid Build Coastguard Worker    name = target['name']
295*d9f75844SAndroid Build Coastguard Worker    print('cc_library_static {')
296*d9f75844SAndroid Build Coastguard Worker    print('    name: "{0}",'.format(name))
297*d9f75844SAndroid Build Coastguard Worker    print('    defaults: ["webrtc_defaults"],')
298*d9f75844SAndroid Build Coastguard Worker    sources = target.get('sources', [])
299*d9f75844SAndroid Build Coastguard Worker    print('    srcs: {0},'.format(FormatList(sources)))
300*d9f75844SAndroid Build Coastguard Worker    print('    host_supported: true,')
301*d9f75844SAndroid Build Coastguard Worker    if 'asmflags' in target.keys():
302*d9f75844SAndroid Build Coastguard Worker        asmflags = target['asmflags']
303*d9f75844SAndroid Build Coastguard Worker        if len(asmflags) > 0:
304*d9f75844SAndroid Build Coastguard Worker            print('    asflags: {0},'.format(FormatList(asmflags)))
305*d9f75844SAndroid Build Coastguard Worker    if 'cflags' in target.keys():
306*d9f75844SAndroid Build Coastguard Worker        cflags = target['cflags']
307*d9f75844SAndroid Build Coastguard Worker        print('    cflags: {0},'.format(FormatList(cflags)))
308*d9f75844SAndroid Build Coastguard Worker    if 'cflags_c' in target.keys():
309*d9f75844SAndroid Build Coastguard Worker        cflags_c = target['cflags_c']
310*d9f75844SAndroid Build Coastguard Worker        if len(cflags_c) > 0:
311*d9f75844SAndroid Build Coastguard Worker            print('    conlyflags: {0},'.format(FormatList(cflags_c)))
312*d9f75844SAndroid Build Coastguard Worker    if 'cflags_cc' in target.keys():
313*d9f75844SAndroid Build Coastguard Worker        cflags_cc = target['cflags_cc']
314*d9f75844SAndroid Build Coastguard Worker        if len(cflags_cc) > 0:
315*d9f75844SAndroid Build Coastguard Worker            print('    cppflags: {0},'.format(FormatList(cflags_cc)))
316*d9f75844SAndroid Build Coastguard Worker    if 'arch' in target:
317*d9f75844SAndroid Build Coastguard Worker        print('   arch: {')
318*d9f75844SAndroid Build Coastguard Worker        for arch_name in ARCHS:
319*d9f75844SAndroid Build Coastguard Worker            if arch_name not in target['arch'].keys():
320*d9f75844SAndroid Build Coastguard Worker                continue
321*d9f75844SAndroid Build Coastguard Worker            arch = target['arch'][arch_name]
322*d9f75844SAndroid Build Coastguard Worker            print('       ' + ARCH_NAME_MAP[arch_name] + ': {')
323*d9f75844SAndroid Build Coastguard Worker            if 'cflags' in arch.keys():
324*d9f75844SAndroid Build Coastguard Worker                cflags = arch['cflags']
325*d9f75844SAndroid Build Coastguard Worker                print('            cflags: {0},'.format(FormatList(cflags)))
326*d9f75844SAndroid Build Coastguard Worker            if 'cflags_c' in arch.keys():
327*d9f75844SAndroid Build Coastguard Worker                cflags_c = arch['cflags_c']
328*d9f75844SAndroid Build Coastguard Worker                if len(cflags_c) > 0:
329*d9f75844SAndroid Build Coastguard Worker                    print('            conlyflags: {0},'.format(FormatList(cflags_c)))
330*d9f75844SAndroid Build Coastguard Worker            if 'cflags_cc' in arch.keys():
331*d9f75844SAndroid Build Coastguard Worker                cflags_cc = arch['cflags_cc']
332*d9f75844SAndroid Build Coastguard Worker                if len(cflags_cc) > 0:
333*d9f75844SAndroid Build Coastguard Worker                    print('            cppflags: {0},'.format(FormatList(cflags_cc)))
334*d9f75844SAndroid Build Coastguard Worker            if 'sources' in arch:
335*d9f75844SAndroid Build Coastguard Worker                  sources = arch['sources']
336*d9f75844SAndroid Build Coastguard Worker                  print('            srcs: {0},'.format(FormatList(sources)))
337*d9f75844SAndroid Build Coastguard Worker            if 'enabled' in arch:
338*d9f75844SAndroid Build Coastguard Worker                print('            enabled: {0},'.format(arch['enabled']))
339*d9f75844SAndroid Build Coastguard Worker            print('        },')
340*d9f75844SAndroid Build Coastguard Worker        print('   },')
341*d9f75844SAndroid Build Coastguard Worker    print('}')
342*d9f75844SAndroid Build Coastguard Worker    return name
343*d9f75844SAndroid Build Coastguard Worker
344*d9f75844SAndroid Build Coastguard Workerdef DFS(seed, targets):
345*d9f75844SAndroid Build Coastguard Worker    visited = set()
346*d9f75844SAndroid Build Coastguard Worker    stack = [seed]
347*d9f75844SAndroid Build Coastguard Worker    while len(stack) > 0:
348*d9f75844SAndroid Build Coastguard Worker        nxt = stack.pop()
349*d9f75844SAndroid Build Coastguard Worker        if nxt in visited:
350*d9f75844SAndroid Build Coastguard Worker            continue
351*d9f75844SAndroid Build Coastguard Worker        visited.add(nxt)
352*d9f75844SAndroid Build Coastguard Worker        stack += targets[nxt]['deps']
353*d9f75844SAndroid Build Coastguard Worker        if 'arch' not in targets[nxt]:
354*d9f75844SAndroid Build Coastguard Worker            continue
355*d9f75844SAndroid Build Coastguard Worker        for arch in targets[nxt]['arch']:
356*d9f75844SAndroid Build Coastguard Worker            if 'deps' in arch:
357*d9f75844SAndroid Build Coastguard Worker                stack += arch['deps']
358*d9f75844SAndroid Build Coastguard Worker    return visited
359*d9f75844SAndroid Build Coastguard Worker
360*d9f75844SAndroid Build Coastguard Workerdef Preprocess(project):
361*d9f75844SAndroid Build Coastguard Worker    targets = {}
362*d9f75844SAndroid Build Coastguard Worker    for name, target in project['targets'].items():
363*d9f75844SAndroid Build Coastguard Worker        target['name'] = name
364*d9f75844SAndroid Build Coastguard Worker        targets[name] = target
365*d9f75844SAndroid Build Coastguard Worker        if target['type'] == 'shared_library':
366*d9f75844SAndroid Build Coastguard Worker            # Don't bother creating shared libraries
367*d9f75844SAndroid Build Coastguard Worker            target['type'] = 'static_library'
368*d9f75844SAndroid Build Coastguard Worker        if target['type'] == 'source_set':
369*d9f75844SAndroid Build Coastguard Worker            # Convert source_sets to static libraires to avoid recompiling sources multiple times.
370*d9f75844SAndroid Build Coastguard Worker            target['type'] = 'static_library'
371*d9f75844SAndroid Build Coastguard Worker        if 'defines' in target:
372*d9f75844SAndroid Build Coastguard Worker            target['cflags'] = target.get('cflags', []) + ['-D{0}'.format(d) for d in target['defines'] if d not in IGNORED_DEFINES]
373*d9f75844SAndroid Build Coastguard Worker            target.pop('defines')
374*d9f75844SAndroid Build Coastguard Worker        if 'sources' not in target:
375*d9f75844SAndroid Build Coastguard Worker            continue
376*d9f75844SAndroid Build Coastguard Worker        sources = list(MakeRelatives(FilterIncludes(target['sources'])))
377*d9f75844SAndroid Build Coastguard Worker        if len(sources) > 0:
378*d9f75844SAndroid Build Coastguard Worker            target['sources'] = sources
379*d9f75844SAndroid Build Coastguard Worker        else:
380*d9f75844SAndroid Build Coastguard Worker            target.pop('sources')
381*d9f75844SAndroid Build Coastguard Worker
382*d9f75844SAndroid Build Coastguard Worker    # These dependencies are provided by aosp
383*d9f75844SAndroid Build Coastguard Worker    ignored_targets = {
384*d9f75844SAndroid Build Coastguard Worker            '//third_party/libaom:libaom',
385*d9f75844SAndroid Build Coastguard Worker            '//third_party/libevent:libevent',
386*d9f75844SAndroid Build Coastguard Worker            '//third_party/opus:opus',
387*d9f75844SAndroid Build Coastguard Worker            '//third_party/libsrtp:libsrtp',
388*d9f75844SAndroid Build Coastguard Worker            '//third_party/libvpx:libvpx',
389*d9f75844SAndroid Build Coastguard Worker            '//third_party/libyuv:libyuv',
390*d9f75844SAndroid Build Coastguard Worker            '//third_party/pffft:pffft',
391*d9f75844SAndroid Build Coastguard Worker            '//third_party/rnnoise:rnn_vad',
392*d9f75844SAndroid Build Coastguard Worker            '//third_party/boringssl:boringssl',
393*d9f75844SAndroid Build Coastguard Worker            '//third_party/android_ndk:cpu_features',
394*d9f75844SAndroid Build Coastguard Worker            '//buildtools/third_party/libunwind:libunwind',
395*d9f75844SAndroid Build Coastguard Worker            '//buildtools/third_party/libc++:libc++',
396*d9f75844SAndroid Build Coastguard Worker        }
397*d9f75844SAndroid Build Coastguard Worker    for name, target in targets.items():
398*d9f75844SAndroid Build Coastguard Worker        # Skip all "action" targets
399*d9f75844SAndroid Build Coastguard Worker        if target['type'] in {'action', 'action_foreach'}:
400*d9f75844SAndroid Build Coastguard Worker            ignored_targets.add(name)
401*d9f75844SAndroid Build Coastguard Worker
402*d9f75844SAndroid Build Coastguard Worker    def is_ignored(target):
403*d9f75844SAndroid Build Coastguard Worker        if target.startswith('//third_party/abseil-cpp'):
404*d9f75844SAndroid Build Coastguard Worker            return True
405*d9f75844SAndroid Build Coastguard Worker        return target in ignored_targets
406*d9f75844SAndroid Build Coastguard Worker
407*d9f75844SAndroid Build Coastguard Worker    targets = {name: target for name, target in targets.items() if not is_ignored(name)}
408*d9f75844SAndroid Build Coastguard Worker
409*d9f75844SAndroid Build Coastguard Worker    for target in targets.values():
410*d9f75844SAndroid Build Coastguard Worker        # Don't depend on ignored targets
411*d9f75844SAndroid Build Coastguard Worker        target['deps'] = [d for d in target['deps'] if not is_ignored(d) ]
412*d9f75844SAndroid Build Coastguard Worker
413*d9f75844SAndroid Build Coastguard Worker    # Ignore empty static libraries
414*d9f75844SAndroid Build Coastguard Worker    empty_libs = set()
415*d9f75844SAndroid Build Coastguard Worker    for name, target in targets.items():
416*d9f75844SAndroid Build Coastguard Worker        if target['type'] == 'static_library' and 'sources' not in target and name != '//:webrtc':
417*d9f75844SAndroid Build Coastguard Worker            empty_libs.add(name)
418*d9f75844SAndroid Build Coastguard Worker    for empty_lib in empty_libs:
419*d9f75844SAndroid Build Coastguard Worker        empty_lib_deps = targets[empty_lib].get('deps', [])
420*d9f75844SAndroid Build Coastguard Worker        for target in targets.values():
421*d9f75844SAndroid Build Coastguard Worker            target['deps'] = FlattenEmptyLibs(target['deps'], empty_lib, empty_lib_deps)
422*d9f75844SAndroid Build Coastguard Worker    for s in empty_libs:
423*d9f75844SAndroid Build Coastguard Worker        targets.pop(s)
424*d9f75844SAndroid Build Coastguard Worker
425*d9f75844SAndroid Build Coastguard Worker    # Select libwebrtc, libaudio_processing and its dependencies
426*d9f75844SAndroid Build Coastguard Worker    selected = set()
427*d9f75844SAndroid Build Coastguard Worker    selected |= DFS('//:webrtc', targets)
428*d9f75844SAndroid Build Coastguard Worker    selected |= DFS('//modules/audio_processing:audio_processing', targets)
429*d9f75844SAndroid Build Coastguard Worker
430*d9f75844SAndroid Build Coastguard Worker    return {FormatName(n): FormatNames(targets[n]) for n in selected}
431*d9f75844SAndroid Build Coastguard Worker
432*d9f75844SAndroid Build Coastguard Workerdef _FlattenEmptyLibs(deps, empty_lib, empty_lib_deps):
433*d9f75844SAndroid Build Coastguard Worker    for x in deps:
434*d9f75844SAndroid Build Coastguard Worker        if x == empty_lib:
435*d9f75844SAndroid Build Coastguard Worker            yield from empty_lib_deps
436*d9f75844SAndroid Build Coastguard Worker        else:
437*d9f75844SAndroid Build Coastguard Worker            yield x
438*d9f75844SAndroid Build Coastguard Worker
439*d9f75844SAndroid Build Coastguard Workerdef FlattenEmptyLibs(deps, empty_lib, empty_lib_deps):
440*d9f75844SAndroid Build Coastguard Worker    return list(_FlattenEmptyLibs(deps, empty_lib, empty_lib_deps))
441*d9f75844SAndroid Build Coastguard Worker
442*d9f75844SAndroid Build Coastguard Workerdef NonNoneFrom(l):
443*d9f75844SAndroid Build Coastguard Worker    for a in l:
444*d9f75844SAndroid Build Coastguard Worker        if a is not None:
445*d9f75844SAndroid Build Coastguard Worker            return a
446*d9f75844SAndroid Build Coastguard Worker    return None
447*d9f75844SAndroid Build Coastguard Worker
448*d9f75844SAndroid Build Coastguard Workerdef MergeListField(target, f, target_by_arch):
449*d9f75844SAndroid Build Coastguard Worker    set_by_arch = {}
450*d9f75844SAndroid Build Coastguard Worker    for a, t in target_by_arch.items():
451*d9f75844SAndroid Build Coastguard Worker        if len(t) == 0:
452*d9f75844SAndroid Build Coastguard Worker            # We only care about enabled archs
453*d9f75844SAndroid Build Coastguard Worker            continue
454*d9f75844SAndroid Build Coastguard Worker        set_by_arch[a] = set(t.get(f, []))
455*d9f75844SAndroid Build Coastguard Worker
456*d9f75844SAndroid Build Coastguard Worker    union = set()
457*d9f75844SAndroid Build Coastguard Worker    for _, s in set_by_arch.items():
458*d9f75844SAndroid Build Coastguard Worker        union |= s
459*d9f75844SAndroid Build Coastguard Worker
460*d9f75844SAndroid Build Coastguard Worker    common = union
461*d9f75844SAndroid Build Coastguard Worker    for a, s in set_by_arch.items():
462*d9f75844SAndroid Build Coastguard Worker        common &= s
463*d9f75844SAndroid Build Coastguard Worker
464*d9f75844SAndroid Build Coastguard Worker    not_common = {a: s - common for a,s in set_by_arch.items()}
465*d9f75844SAndroid Build Coastguard Worker
466*d9f75844SAndroid Build Coastguard Worker    if len(common) > 0:
467*d9f75844SAndroid Build Coastguard Worker        target[f] = list(common)
468*d9f75844SAndroid Build Coastguard Worker    for a, s in not_common.items():
469*d9f75844SAndroid Build Coastguard Worker        if len(s) > 0:
470*d9f75844SAndroid Build Coastguard Worker            target['arch'][a][f] = sorted(list(s))
471*d9f75844SAndroid Build Coastguard Worker
472*d9f75844SAndroid Build Coastguard Workerdef Merge(target_by_arch):
473*d9f75844SAndroid Build Coastguard Worker    # The new target shouldn't have the transitive dependencies memoization fields
474*d9f75844SAndroid Build Coastguard Worker    # or have the union of those fields from all 4 input targets.
475*d9f75844SAndroid Build Coastguard Worker    target = {}
476*d9f75844SAndroid Build Coastguard Worker    for f in ['original_name', 'name', 'type']:
477*d9f75844SAndroid Build Coastguard Worker        target[f] = NonNoneFrom([t.get(f) for _,t in target_by_arch.items()])
478*d9f75844SAndroid Build Coastguard Worker
479*d9f75844SAndroid Build Coastguard Worker    target['arch'] = {}
480*d9f75844SAndroid Build Coastguard Worker    for a, t in target_by_arch.items():
481*d9f75844SAndroid Build Coastguard Worker        target['arch'][a] = {}
482*d9f75844SAndroid Build Coastguard Worker        if len(t) == 0:
483*d9f75844SAndroid Build Coastguard Worker            target['arch'][a]['enabled'] = 'false'
484*d9f75844SAndroid Build Coastguard Worker
485*d9f75844SAndroid Build Coastguard Worker    list_fields = ['sources',
486*d9f75844SAndroid Build Coastguard Worker                   'deps',
487*d9f75844SAndroid Build Coastguard Worker                   'cflags',
488*d9f75844SAndroid Build Coastguard Worker                   'cflags_c',
489*d9f75844SAndroid Build Coastguard Worker                   'cflags_cc',
490*d9f75844SAndroid Build Coastguard Worker                   'asmflags']
491*d9f75844SAndroid Build Coastguard Worker    for lf in list_fields:
492*d9f75844SAndroid Build Coastguard Worker        MergeListField(target, lf, target_by_arch)
493*d9f75844SAndroid Build Coastguard Worker
494*d9f75844SAndroid Build Coastguard Worker    # Static libraries should be depended on at the root level and disabled for
495*d9f75844SAndroid Build Coastguard Worker    # the corresponding architectures.
496*d9f75844SAndroid Build Coastguard Worker    for arch in target['arch'].values():
497*d9f75844SAndroid Build Coastguard Worker        if 'deps' not in arch:
498*d9f75844SAndroid Build Coastguard Worker            continue
499*d9f75844SAndroid Build Coastguard Worker        deps = arch['deps']
500*d9f75844SAndroid Build Coastguard Worker        if 'deps' not in target:
501*d9f75844SAndroid Build Coastguard Worker            target['deps'] = []
502*d9f75844SAndroid Build Coastguard Worker        target['deps'] += deps
503*d9f75844SAndroid Build Coastguard Worker        arch.pop('deps')
504*d9f75844SAndroid Build Coastguard Worker    if 'deps' in target:
505*d9f75844SAndroid Build Coastguard Worker        target['deps'] = sorted(target['deps'])
506*d9f75844SAndroid Build Coastguard Worker
507*d9f75844SAndroid Build Coastguard Worker    # Remove empty sets
508*d9f75844SAndroid Build Coastguard Worker    for a in ARCHS:
509*d9f75844SAndroid Build Coastguard Worker        if len(target['arch'][a]) == 0:
510*d9f75844SAndroid Build Coastguard Worker            target['arch'].pop(a)
511*d9f75844SAndroid Build Coastguard Worker    if len(target['arch']) == 0:
512*d9f75844SAndroid Build Coastguard Worker        target.pop('arch')
513*d9f75844SAndroid Build Coastguard Worker
514*d9f75844SAndroid Build Coastguard Worker    return target
515*d9f75844SAndroid Build Coastguard Worker
516*d9f75844SAndroid Build Coastguard Workerdef DisabledArchs4Target(target):
517*d9f75844SAndroid Build Coastguard Worker    ret = set()
518*d9f75844SAndroid Build Coastguard Worker    for a in ARCHS:
519*d9f75844SAndroid Build Coastguard Worker        if a not in target.get('arch', {}):
520*d9f75844SAndroid Build Coastguard Worker            continue
521*d9f75844SAndroid Build Coastguard Worker        if target['arch'][a].get('enabled', 'true') == 'false':
522*d9f75844SAndroid Build Coastguard Worker            ret.add(a)
523*d9f75844SAndroid Build Coastguard Worker    return ret
524*d9f75844SAndroid Build Coastguard Worker
525*d9f75844SAndroid Build Coastguard Worker
526*d9f75844SAndroid Build Coastguard Workerdef HandleDisabledArchs(targets):
527*d9f75844SAndroid Build Coastguard Worker    for n, t in targets.items():
528*d9f75844SAndroid Build Coastguard Worker        if 'arch' not in t:
529*d9f75844SAndroid Build Coastguard Worker            continue
530*d9f75844SAndroid Build Coastguard Worker        disabledArchs = DisabledArchs4Target(t)
531*d9f75844SAndroid Build Coastguard Worker        if len(disabledArchs) == 0:
532*d9f75844SAndroid Build Coastguard Worker            continue
533*d9f75844SAndroid Build Coastguard Worker        # Fix targets that depend on this one
534*d9f75844SAndroid Build Coastguard Worker        for t in targets.values():
535*d9f75844SAndroid Build Coastguard Worker            if DisabledArchs4Target(t) == disabledArchs:
536*d9f75844SAndroid Build Coastguard Worker                # With the same disabled archs there is no need to move dependencies
537*d9f75844SAndroid Build Coastguard Worker                continue
538*d9f75844SAndroid Build Coastguard Worker            if 'deps' in t and n in t['deps']:
539*d9f75844SAndroid Build Coastguard Worker                # Remove the dependency from the high level list
540*d9f75844SAndroid Build Coastguard Worker                t['deps'] = sorted(set(t['deps']) - {n})
541*d9f75844SAndroid Build Coastguard Worker                if 'arch' not in t:
542*d9f75844SAndroid Build Coastguard Worker                    t['arch'] = {}
543*d9f75844SAndroid Build Coastguard Worker                for a in ARCHS:
544*d9f75844SAndroid Build Coastguard Worker                    if a in disabledArchs:
545*d9f75844SAndroid Build Coastguard Worker                        continue
546*d9f75844SAndroid Build Coastguard Worker                    if a not in t['arch']:
547*d9f75844SAndroid Build Coastguard Worker                        t['arch'][a] = {}
548*d9f75844SAndroid Build Coastguard Worker                    if 'deps' not in t['arch'][a]:
549*d9f75844SAndroid Build Coastguard Worker                        t['arch'][a]['deps'] = []
550*d9f75844SAndroid Build Coastguard Worker                    t['arch'][a]['deps'] += [n]
551*d9f75844SAndroid Build Coastguard Worker
552*d9f75844SAndroid Build Coastguard Workerdef MergeAll(targets_by_arch):
553*d9f75844SAndroid Build Coastguard Worker    names = set()
554*d9f75844SAndroid Build Coastguard Worker    for t in targets_by_arch.values():
555*d9f75844SAndroid Build Coastguard Worker        names |= t.keys()
556*d9f75844SAndroid Build Coastguard Worker    targets = {}
557*d9f75844SAndroid Build Coastguard Worker    for name in names:
558*d9f75844SAndroid Build Coastguard Worker        targets[name] = Merge({a: t.get(name, {}) for a,t in targets_by_arch.items()})
559*d9f75844SAndroid Build Coastguard Worker
560*d9f75844SAndroid Build Coastguard Worker    HandleDisabledArchs(targets)
561*d9f75844SAndroid Build Coastguard Worker
562*d9f75844SAndroid Build Coastguard Worker    return targets
563*d9f75844SAndroid Build Coastguard Worker
564*d9f75844SAndroid Build Coastguard Workerdef GatherAllFlags(obj):
565*d9f75844SAndroid Build Coastguard Worker    if type(obj) != type({}):
566*d9f75844SAndroid Build Coastguard Worker        # not a dictionary
567*d9f75844SAndroid Build Coastguard Worker        return set()
568*d9f75844SAndroid Build Coastguard Worker    ret = set()
569*d9f75844SAndroid Build Coastguard Worker    for f in FLAGS:
570*d9f75844SAndroid Build Coastguard Worker        ret |= set(obj.get(f, []))
571*d9f75844SAndroid Build Coastguard Worker    for v in obj.values():
572*d9f75844SAndroid Build Coastguard Worker        ret |= GatherAllFlags(v)
573*d9f75844SAndroid Build Coastguard Worker    return ret
574*d9f75844SAndroid Build Coastguard Worker
575*d9f75844SAndroid Build Coastguard Workerdef FilterFlagsInUse(flags, directory):
576*d9f75844SAndroid Build Coastguard Worker    unused = []
577*d9f75844SAndroid Build Coastguard Worker    for f in flags:
578*d9f75844SAndroid Build Coastguard Worker        nf = f
579*d9f75844SAndroid Build Coastguard Worker        if nf.startswith("-D"):
580*d9f75844SAndroid Build Coastguard Worker            nf = nf[2:]
581*d9f75844SAndroid Build Coastguard Worker            i = nf.find('=')
582*d9f75844SAndroid Build Coastguard Worker            if i > 0:
583*d9f75844SAndroid Build Coastguard Worker                nf = nf[:i]
584*d9f75844SAndroid Build Coastguard Worker        c = os.system(f"find {directory} -name '*.gn*' | xargs grep -q -s -e '{nf}'")
585*d9f75844SAndroid Build Coastguard Worker        if c != 0:
586*d9f75844SAndroid Build Coastguard Worker            # couldn't find the flag in *.gn or *.gni
587*d9f75844SAndroid Build Coastguard Worker            unused.append(f)
588*d9f75844SAndroid Build Coastguard Worker    return unused
589*d9f75844SAndroid Build Coastguard Worker
590*d9f75844SAndroid Build Coastguard Workerif len(sys.argv) != 2:
591*d9f75844SAndroid Build Coastguard Worker    print('wrong number of arguments', file = sys.stderr)
592*d9f75844SAndroid Build Coastguard Worker    exit(1)
593*d9f75844SAndroid Build Coastguard Worker
594*d9f75844SAndroid Build Coastguard Workerdir = sys.argv[1]
595*d9f75844SAndroid Build Coastguard Worker
596*d9f75844SAndroid Build Coastguard Workertargets_by_arch = {}
597*d9f75844SAndroid Build Coastguard Workerflags = set()
598*d9f75844SAndroid Build Coastguard Workerfor arch in ARCHS:
599*d9f75844SAndroid Build Coastguard Worker    path = "{0}/project_{1}.json".format(dir, arch)
600*d9f75844SAndroid Build Coastguard Worker    json_file = open(path, 'r')
601*d9f75844SAndroid Build Coastguard Worker    targets_by_arch[arch] = Preprocess(json.load(json_file))
602*d9f75844SAndroid Build Coastguard Worker    flags |= GatherAllFlags(targets_by_arch[arch])
603*d9f75844SAndroid Build Coastguard Worker
604*d9f75844SAndroid Build Coastguard WorkerunusedFlags = FilterFlagsInUse(flags, f"{dir}/..")
605*d9f75844SAndroid Build Coastguard WorkerIGNORED_FLAGS = sorted(set(IGNORED_FLAGS) | set(unusedFlags))
606*d9f75844SAndroid Build Coastguard Worker
607*d9f75844SAndroid Build Coastguard WorkerPrintHeader()
608*d9f75844SAndroid Build Coastguard Worker
609*d9f75844SAndroid Build Coastguard WorkerGenerateDefault(targets_by_arch)
610*d9f75844SAndroid Build Coastguard Worker
611*d9f75844SAndroid Build Coastguard Workertargets = MergeAll(targets_by_arch)
612*d9f75844SAndroid Build Coastguard Worker
613*d9f75844SAndroid Build Coastguard Workerprint('\n\n')
614*d9f75844SAndroid Build Coastguard Worker
615*d9f75844SAndroid Build Coastguard Workerfor name, target in sorted(targets.items()):
616*d9f75844SAndroid Build Coastguard Worker    typ = target['type']
617*d9f75844SAndroid Build Coastguard Worker    if typ == 'static_library':
618*d9f75844SAndroid Build Coastguard Worker        GenerateStaticLib(target, targets)
619*d9f75844SAndroid Build Coastguard Worker    elif typ == 'group':
620*d9f75844SAndroid Build Coastguard Worker        GenerateGroup(target)
621*d9f75844SAndroid Build Coastguard Worker    else:
622*d9f75844SAndroid Build Coastguard Worker        print('Unknown type: {0} ({1})'.format(typ, target['name']), file = sys.stderr)
623*d9f75844SAndroid Build Coastguard Worker        exit(1)
624*d9f75844SAndroid Build Coastguard Worker    print('\n\n')
625*d9f75844SAndroid Build Coastguard Worker
626*d9f75844SAndroid Build Coastguard Workerwebrtc_libs = TransitiveDependencies(FormatName('//:webrtc'), 'static_library', targets)
627*d9f75844SAndroid Build Coastguard Workerprint('cc_library_static {')
628*d9f75844SAndroid Build Coastguard Workerprint('    name: "libwebrtc",')
629*d9f75844SAndroid Build Coastguard Workerprint('    defaults: ["webrtc_defaults"],')
630*d9f75844SAndroid Build Coastguard Workerprint('    export_include_dirs: ["."],')
631*d9f75844SAndroid Build Coastguard Workerprint('    whole_static_libs: {0},'.format(FormatList(sorted(webrtc_libs['global']) + ['libpffft', 'rnnoise_rnn_vad'])))
632*d9f75844SAndroid Build Coastguard Workerprint('    arch: {')
633*d9f75844SAndroid Build Coastguard Workerfor a in ARCHS:
634*d9f75844SAndroid Build Coastguard Worker    if len(webrtc_libs[a]) > 0:
635*d9f75844SAndroid Build Coastguard Worker        print('        {0}: {{'.format(ARCH_NAME_MAP[a]))
636*d9f75844SAndroid Build Coastguard Worker        print('            whole_static_libs: {0},'.format(FormatList(sorted(webrtc_libs[a]))))
637*d9f75844SAndroid Build Coastguard Worker        print('        },')
638*d9f75844SAndroid Build Coastguard Workerprint('    },')
639*d9f75844SAndroid Build Coastguard Workerprint('}')
640*d9f75844SAndroid Build Coastguard Worker
641*d9f75844SAndroid Build Coastguard Workerprint('\n\n')
642*d9f75844SAndroid Build Coastguard Worker
643*d9f75844SAndroid Build Coastguard Workeraudio_proc_libs = TransitiveDependencies(FormatName('//modules/audio_processing:audio_processing'), 'static_library', targets)
644*d9f75844SAndroid Build Coastguard Workerprint('cc_library_static {')
645*d9f75844SAndroid Build Coastguard Workerprint('    name: "webrtc_audio_processing",')
646*d9f75844SAndroid Build Coastguard Workerprint('    defaults: ["webrtc_defaults"],')
647*d9f75844SAndroid Build Coastguard Workerprint('    export_include_dirs: [')
648*d9f75844SAndroid Build Coastguard Workerprint('        ".",')
649*d9f75844SAndroid Build Coastguard Workerprint('        "modules/include",')
650*d9f75844SAndroid Build Coastguard Workerprint('        "modules/audio_processing/include",')
651*d9f75844SAndroid Build Coastguard Workerprint('    ],')
652*d9f75844SAndroid Build Coastguard Workerprint('    whole_static_libs: {0},'.format(FormatList(sorted(audio_proc_libs['global']) + ['libpffft', 'rnnoise_rnn_vad'])))
653*d9f75844SAndroid Build Coastguard Workerprint('    arch: {')
654*d9f75844SAndroid Build Coastguard Workerfor a in ARCHS:
655*d9f75844SAndroid Build Coastguard Worker    if len(audio_proc_libs[a]) > 0:
656*d9f75844SAndroid Build Coastguard Worker        print('        {0}: {{'.format(ARCH_NAME_MAP[a]))
657*d9f75844SAndroid Build Coastguard Worker        print('            whole_static_libs: {0},'.format(FormatList(sorted(audio_proc_libs[a]))))
658*d9f75844SAndroid Build Coastguard Worker        print('        },')
659*d9f75844SAndroid Build Coastguard Workerprint('    },')
660*d9f75844SAndroid Build Coastguard Workerprint('}')
661