You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
9.8 KiB
278 lines
9.8 KiB
#!/usr/bin/env python
|
|
|
|
import json
|
|
import sys
|
|
|
|
# Set this to True to generate a default entry with all the flags and defines
|
|
# common to all the modules that needs to be curated by hand after it's
|
|
# generated. When set to False it prints the last curated version of the
|
|
# default, which could be incomplete.
|
|
GENERATE_FULL_DEFAULT = False
|
|
PRINT_ORIGINALS = False
|
|
GENERATE_ALL_FLAGS = False
|
|
|
|
if len(sys.argv) != 2:
|
|
print('wrong number of arguments')
|
|
exit()
|
|
|
|
def FormatList(l):
|
|
return json.dumps(l)
|
|
|
|
def FilterHeaders(l):
|
|
return [x for x in l if not x.endswith('.h')]
|
|
|
|
def PrintOriginCommentedOut(target):
|
|
if PRINT_ORIGINALS:
|
|
print('/* From target:')
|
|
print(json.dumps(target, sort_keys = True, indent = 4))
|
|
print('*/')
|
|
|
|
def MakeRelatives(l):
|
|
return [x.split('//').pop() for x in l]
|
|
|
|
def FormatName(name):
|
|
return 'webrtc_' + name.split('/').pop().replace(':', '__')# .replace('/', '_').replace(':', '_')
|
|
|
|
def FilterFlags(flags, to_skip = set([])):
|
|
if GENERATE_ALL_FLAGS:
|
|
skip = set([
|
|
'-L',
|
|
'-isystem',
|
|
'-Xclang',
|
|
'-B',
|
|
'--sysroot',
|
|
'-fcrash-diagnostics-dir',
|
|
'.',
|
|
'-fdebug-compilation-dir',
|
|
'-instcombine-lower-dbg-declare=0',
|
|
'-Wno-non-c-typedef-for-linkage',
|
|
'-Werror',
|
|
'-fcomplete-member-pointers',
|
|
'-m64',
|
|
'-march=x86-64'
|
|
]).union(to_skip)
|
|
return [x for x in flags if not any([x.startswith(y) for y in skip])]
|
|
else:
|
|
return [x for x in flags if x == '-msse2']
|
|
|
|
def GenerateDefault(targets):
|
|
in_default = {
|
|
'cflags' : [],
|
|
'cflags_c' : [],
|
|
'cflags_cc' : [],
|
|
'ldflags' : [],
|
|
'asmflags' : [],
|
|
'defines' : []
|
|
}
|
|
first = True
|
|
for target in targets:
|
|
typ = target['type']
|
|
if typ == 'static_library':
|
|
if first:
|
|
first = False
|
|
# Add all the flags to the default, we'll remove some later
|
|
for flag_type in in_default.keys():
|
|
in_default[flag_type] = []
|
|
for flag in target[flag_type]:
|
|
in_default[flag_type].append(flag)
|
|
else:
|
|
for flag_type in in_default.keys():
|
|
flags_to_remove = []
|
|
for flag in in_default[flag_type]:
|
|
if flag not in target[flag_type]:
|
|
flags_to_remove.append[flag_type]
|
|
for flag in flags_to_remove:
|
|
in_default[flag_type].remove(flag)
|
|
defines = in_default['defines']
|
|
in_default.pop('defines')
|
|
in_default['cflags'].extend(['-D{0}'.format(x) for x in defines])
|
|
if GENERATE_FULL_DEFAULT:
|
|
print('cc_defaults {')
|
|
print(' name: "webrtc_defaults",')
|
|
print(' local_include_dirs: ["."],')
|
|
for typ in in_default.keys():
|
|
print(' {0}: ['.format(typ.replace('asmflags', 'asflags')
|
|
.replace('cflags_cc', 'cppflags')
|
|
.replace('cflags_c', 'conlyflags')))
|
|
for flag in FilterFlags(in_default[typ]):
|
|
print(' "{0}",'.format(flag.replace('"', '\\"')))
|
|
print(' ],')
|
|
print('}')
|
|
else:
|
|
print('cc_defaults {')
|
|
print(' name: "webrtc_defaults",')
|
|
print(' local_include_dirs: [')
|
|
print(' ".",')
|
|
print(' ],')
|
|
print(' cflags: [')
|
|
print(' "-Wno-unused-parameter",')
|
|
print(' "-Wno-missing-field-initializers",')
|
|
print(' "-DUSE_UDEV",')
|
|
print(' "-DUSE_AURA=1",')
|
|
print(' "-DUSE_GLIB=1",')
|
|
print(' "-DUSE_NSS_CERTS=1",')
|
|
print(' "-DUSE_X11=1",')
|
|
print(' "-D_FILE_OFFSET_BITS=64",')
|
|
print(' "-D_LARGEFILE_SOURCE",')
|
|
print(' "-D_LARGEFILE64_SOURCE",')
|
|
print(' "-D_GNU_SOURCE",')
|
|
print(' "-DWEBRTC_ENABLE_PROTOBUF=0",')
|
|
print(' "-DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE",')
|
|
print(' "-DRTC_ENABLE_VP9",')
|
|
print(' "-DHAVE_SCTP",')
|
|
print(' "-DWEBRTC_LIBRARY_IMPL",')
|
|
print(' "-DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=1",')
|
|
print(' "-DWEBRTC_POSIX",')
|
|
print(' "-DWEBRTC_LINUX",')
|
|
print(' ],')
|
|
print(' header_libs: [')
|
|
print(' "libwebrtc_absl_headers",')
|
|
print(' ],')
|
|
print(' static_libs: [')
|
|
print(' "libaom",')
|
|
print(' "libevent",')
|
|
print(' "libopus",')
|
|
print(' "libsrtp2",')
|
|
print(' "libvpx",')
|
|
print(' "libyuv",')
|
|
print(' "libpffft",')
|
|
print(' "rnnoise_rnn_vad",')
|
|
print(' "usrsctplib",')
|
|
print(' ],')
|
|
print(' shared_libs: [')
|
|
print(' "libcrypto",')
|
|
print(' "libssl",')
|
|
print(' ],')
|
|
print(' host_supported: true,')
|
|
print(' device_supported: false,')
|
|
print(' arch: {')
|
|
print(' arm: {')
|
|
print(' enabled: false,')
|
|
print(' },')
|
|
print(' },')
|
|
print(' target: {')
|
|
print(' darwin: {')
|
|
print(' enabled: false,')
|
|
print(' },')
|
|
print(' },')
|
|
print('}')
|
|
in_default['cflags'].extend([
|
|
"-Wno-unused-parameter",
|
|
"-Wno-missing-field-initializers",
|
|
"-DUSE_UDEV",
|
|
"-DUSE_AURA=1",
|
|
"-DUSE_GLIB=1",
|
|
"-DUSE_NSS_CERTS=1",
|
|
"-DUSE_X11=1",
|
|
"-D_FILE_OFFSET_BITS=64",
|
|
"-D_LARGEFILE_SOURCE",
|
|
"-D_LARGEFILE64_SOURCE",
|
|
"-D_GNU_SOURCE",
|
|
"-DWEBRTC_ENABLE_PROTOBUF=0",
|
|
"-DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE",
|
|
"-DRTC_ENABLE_VP9",
|
|
"-DHAVE_SCTP",
|
|
"-DWEBRTC_LIBRARY_IMPL",
|
|
"-DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=1",
|
|
"-DWEBRTC_POSIX",
|
|
"-DWEBRTC_LINUX"
|
|
])
|
|
return in_default
|
|
|
|
def GenerateGroup(target):
|
|
PrintOriginCommentedOut(target)
|
|
|
|
def GenerateSourceSet(target):
|
|
PrintOriginCommentedOut(target)
|
|
if target.has_key('sources'):
|
|
name = FormatName(target['name'])
|
|
print('filegroup {')
|
|
print(' name: "{0}",'.format(name))
|
|
print(' srcs: {0},'.format(FormatList(MakeRelatives(FilterHeaders(target['sources'])))))
|
|
print('}')
|
|
return name
|
|
return ""
|
|
|
|
def GenerateStaticLib(target, targets, flags_in_default):
|
|
PrintOriginCommentedOut(target)
|
|
name = FormatName(target['name'])
|
|
print('cc_library_static {')
|
|
print(' name: "{0}",'.format(name))
|
|
print(' defaults: ["webrtc_defaults"],')
|
|
sources = []
|
|
sources.extend(MakeRelatives(FilterHeaders(target['sources'])))
|
|
for trg in targets:
|
|
if trg['type'] == 'source_set' and trg['name'] in target['deps']:
|
|
sources.append(':' + FormatName(trg['name']))
|
|
print(' srcs: {0},'.format(FormatList(sources)))
|
|
print(' host_supported: true,')
|
|
if target.has_key('asmflags'):
|
|
asmflags = FilterFlags(target['asmflags'], set(flags_in_default['asmflags']))
|
|
if len(asmflags) > 0:
|
|
print(' asflags: {0},'.format(FormatList(asmflags)))
|
|
cflags = []
|
|
if target.has_key('cflags'):
|
|
cflags.extend(target['cflags'])
|
|
cflags = FilterFlags(cflags, set(flags_in_default['cflags']))
|
|
if target.has_key('defines'):
|
|
cflags.extend(['-D' + x for x in target['defines']])
|
|
cflags = [x for x in cflags if x not in flags_in_default['cflags']]
|
|
if len(cflags) > 0:
|
|
print(' cflags: {0},'.format(FormatList(cflags)))
|
|
if target.has_key('cflags_c'):
|
|
cflags_c = FilterFlags(target['cflags_c'], set(flags_in_default['cflags_c']))
|
|
if len(cflags_c) > 0:
|
|
print(' conlyflags: {0},'.format(FormatList(cflags_c)))
|
|
if target.has_key('cflags_cc'):
|
|
cflags_cc = FilterFlags(target['cflags_cc'], set(flags_in_default['cflags_cc']))
|
|
if len(cflags_cc) > 0:
|
|
print(' cppflags: {0},'.format(FormatList(cflags_cc)))
|
|
if target.has_key('ldflags'):
|
|
ldflags = FilterFlags(target['ldflags'], set(flags_in_default['ldflags']))
|
|
if len(ldflags) > 0:
|
|
print(' ldflags: {0},'.format(FormatList(ldflags)))
|
|
static_libs = []
|
|
for trg in targets:
|
|
if trg['type'] == 'static_library' and target['deps'].count(trg['name']) > 0:
|
|
static_libs.append(FormatName(trg['name']))
|
|
if len(static_libs) > 0:
|
|
print(' static_libs: {0},'.format(FormatList(static_libs)))
|
|
for dep in target['deps']:
|
|
if FormatName(dep) not in static_libs:
|
|
#print(' // omitted dep: {0}'.format(dep))
|
|
pass
|
|
print('}')
|
|
return name
|
|
|
|
json_file = open(sys.argv[1], "r")
|
|
targets = json.load(json_file)
|
|
|
|
flags_in_default = GenerateDefault(targets)
|
|
print("\n\n")
|
|
|
|
static_libs = []
|
|
file_groups = []
|
|
|
|
for target in targets:
|
|
typ = target['type']
|
|
if typ == 'static_library':
|
|
lib_name = GenerateStaticLib(target, targets, flags_in_default)
|
|
static_libs.append(lib_name)
|
|
elif typ == 'source_set':
|
|
group_name = GenerateSourceSet(target)
|
|
if len(group_name) > 0:
|
|
file_groups.append(group_name)
|
|
elif typ == 'group':
|
|
GenerateGroup(target)
|
|
else:
|
|
print('Unknown type: {0}'.format(typ))
|
|
print("\n\n")
|
|
|
|
print('cc_library_static {')
|
|
print(' name: "libwebrtc",')
|
|
print(' defaults: ["webrtc_defaults"],')
|
|
print(' export_include_dirs: ["."],')
|
|
print(' whole_static_libs: {0},'.format(FormatList(static_libs + ['libpffft', 'rnnoise_rnn_vad', 'usrsctplib'])))
|
|
print(' srcs: {0},').format(FormatList([':{0}'.format(x) for x in file_groups]))
|
|
print('}')
|