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