blob: a11846de1bd56aa0be8dbdbd907cf542c83f785c [file] [log] [blame]
#!/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('}')