diff options
author | Chris Johns <chrisj@rtems.org> | 2015-06-15 17:42:23 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2015-06-15 17:42:23 +1000 |
commit | 8440506ee8945ad57f5e20e9962084d67808eb22 (patch) | |
tree | 38f567b1c56846b88f5f0828bd244b05519998ba /waf_generator.py | |
parent | 4517fa337e0c2695ad64a406201883c7a22ee637 (diff) |
Add tcpdump and libpcap.
- Update the file builder generator to handle generator specific cflags and
includes. The tcpdump and libpcap have localised headers and need specific
headers paths to see them. There are also module specific flags and these
need to be passed to the lex and yacc generators.
- Add the tcpdump support.
Diffstat (limited to 'waf_generator.py')
-rwxr-xr-x | waf_generator.py | 140 |
1 files changed, 109 insertions, 31 deletions
diff --git a/waf_generator.py b/waf_generator.py index 4c9be070..800f8a47 100755 --- a/waf_generator.py +++ b/waf_generator.py @@ -48,13 +48,29 @@ def _add_files(name, files): data[name] = [] data[name] += files +def _clfags_includes(cflags, includes): + if type(cflags) is not list: + if cflags is not None: + _cflags = cflags.split(' ') + else: + _cflags = [None] + else: + _cflags = cflags + if type(includes) is not list: + _includes = [includes] + else: + _includes = includes + return _cflags, _includes + class SourceFileFragmentComposer(builder.BuildSystemFragmentComposer): - def __init__(self, cflags = "default"): - self.cflags = cflags + def __init__(self, cflags = "default", includes = None): + self.cflags, self.includes = _clfags_includes(cflags, includes) def compose(self, path): - return ['sources', self.cflags], [path] + if None in self.includes: + return ['sources', self.cflags], [path], self.cflags, self.includes + return ['sources', self.cflags + self.includes], [path], self.cflags, self.includes class TestFragementComposer(builder.BuildSystemFragmentComposer): @@ -72,7 +88,7 @@ class TestFragementComposer(builder.BuildSystemFragmentComposer): class KVMSymbolsFragmentComposer(builder.BuildSystemFragmentComposer): def compose(self, path): - return ['KVMSymbols', 'files'], [path] + return ['KVMSymbols', 'files'], [path], self.includes class RPCGENFragmentComposer(builder.BuildSystemFragmentComposer): @@ -86,25 +102,37 @@ class RouteKeywordsFragmentComposer(builder.BuildSystemFragmentComposer): class LexFragmentComposer(builder.BuildSystemFragmentComposer): - def __init__(self, sym, dep): + def __init__(self, sym, dep, cflags = None, includes = None): self.sym = sym self.dep = dep + self.cflags, self.includes = _clfags_includes(cflags, includes) def compose(self, path): - return ['lex', path], { 'file': path, - 'sym': self.sym, - 'dep': self.dep } + d = { 'file': path, + 'sym': self.sym, + 'dep': self.dep } + if None not in self.cflags: + d['cflags'] = self.cflags + if None not in self.includes: + d['includes'] = self.includes + return ['lex', path], d class YaccFragmentComposer(builder.BuildSystemFragmentComposer): - def __init__(self, sym, header): + def __init__(self, sym, header, cflags = None, includes = None): self.sym = sym self.header = header + self.cflags, self.includes = _clfags_includes(cflags, includes) def compose(self, path): - return ['yacc', path], { 'file': path, - 'sym': self.sym, - 'header': self.header } + d = { 'file': path, + 'sym': self.sym, + 'header': self.header } + if None not in self.cflags: + d['cflags'] = self.cflags + if None not in self.includes: + d['includes'] = self.includes + return ['yacc', path], d # Module Manager - Collection of Modules class ModuleManager(builder.ModuleManager): @@ -174,17 +202,35 @@ class ModuleManager(builder.ModuleManager): # The default handler returns an empty string. Skip it. # if type(frag) is not str: + # Start at the top of the tree d = data - for p in frag[0]: - if p not in d: - d[p] = {} - d = d[p] + path = frag[0] + if path[0] not in d: + d[path[0]] = {} + # Select the sub-part of the tree as the compile options + # specialise how files are built. + d = d[path[0]] + if type(path[1]) is list: + p = ' '.join(path[1]) + else: + p = path[1] + if p not in d: + d[p] = {} + d = d[p] + if cpu not in d: + d[cpu] = [] if type(frag[1]) is list: - if cpu not in d: - d[cpu] = [] d[cpu] += frag[1] else: d[cpu] = frag[1] + if len(frag) > 3: + if 'cflags' not in d[cpu]: + d['cflags'] = [] + d['cflags'] += frag[2] + if len(frag) >= 3 and None not in frag[-1]: + if 'includes' not in d[cpu]: + d['includes'] = [] + d['includes'] += frag[-1] data = { } @@ -273,7 +319,7 @@ class ModuleManager(builder.ModuleManager): self.add(' cxxflags = %r + common_flags' % (builder.cxxflags())) self.add('') self.add(' # Include paths') - self.add(' includes = []') + self.add(' includes = ["."]') for i in builder.includes(): self.add(' includes += ["%s"]' % (i[2:])) self.add(' for i in %r:' % (builder.cpu_includes())) @@ -338,6 +384,10 @@ class ModuleManager(builder.ModuleManager): # if 'KVMSymbols' in data: kvmsymbols = data['KVMSymbols'] + if 'includes' in kvmsymbols['files']: + includes = kvmsymbols['files']['includes'] + else: + includes = [] self.add(' # KVM Symbols') self.add(' bld(target = "%s",' % (kvmsymbols['files']['all'][0])) self.add(' source = "rtemsbsd/rtems/generate_kvm_symbols",') @@ -346,7 +396,7 @@ class ModuleManager(builder.ModuleManager): self.add(' bld.objects(target = "kvmsymbols",') self.add(' features = "c",') self.add(' cflags = cflags,') - self.add(' includes = includes + ["rtemsbsd/rtems"],') + self.add(' includes = %r + includes,' % (includes)) self.add(' source = "%s")' % (kvmsymbols['files']['all'][0])) self.add(' libbsd_use += ["kvmsymbols"]') self.add('') @@ -382,6 +432,14 @@ class ModuleManager(builder.ModuleManager): self.add(' # Lex') for l in lexes: lex = lexes[l]['all'] + if 'cflags' in lex: + lex_defines = [d[2:] for d in lex['cflags']] + else: + lex_defines = [] + if 'includes' in lex: + lex_includes = lex['includes'] + else: + lex_includes = [] self.add(' if bld.env.AUTO_REGEN:') self.add(' bld(target = "%s.c",' % (lex['file'][:-2])) self.add(' source = "%s",' % (lex['file'])) @@ -390,7 +448,8 @@ class ModuleManager(builder.ModuleManager): self.add(' bld.objects(target = "lex_%s",' % (lex['sym'])) self.add(' features = "c",') self.add(' cflags = cflags,') - self.add(' includes = includes,') + self.add(' includes = %r + includes,' % (lex_includes)) + self.add(' defines = %r,' % (lex_defines)) self.add(' source = "%s.c")' % (lex['file'][:-2])) self.add(' libbsd_use += ["lex_%s"]' % (lex['sym'])) self.add('') @@ -401,8 +460,19 @@ class ModuleManager(builder.ModuleManager): for y in yaccs: yacc = yaccs[y]['all'] yacc_file = yacc['file'] - yacc_sym = yacc['sym'] + if yacc['sym'] is not None: + yacc_sym = yacc['sym'] + else: + yacc_sym = os.path.basename(yacc_file)[:-2] yacc_header = '%s/%s' % (os.path.dirname(yacc_file), yacc['header']) + if 'cflags' in yacc: + yacc_defines = [d[2:] for d in yacc['cflags']] + else: + yacc_defines = [] + if 'includes' in yacc: + yacc_includes = yacc['includes'] + else: + yacc_includes = [] self.add(' if bld.env.AUTO_REGEN:') self.add(' bld(target = "%s.c",' % (yacc_file[:-2])) self.add(' source = "%s",' % (yacc_file)) @@ -412,7 +482,8 @@ class ModuleManager(builder.ModuleManager): self.add(' bld.objects(target = "yacc_%s",' % (yacc_sym)) self.add(' features = "c",') self.add(' cflags = cflags,') - self.add(' includes = includes,') + self.add(' includes = %r + includes,' % (yacc_includes)) + self.add(' defines = %r,' % (yacc_defines)) self.add(' source = "%s.c")' % (yacc_file[:-2])) self.add(' libbsd_use += ["yacc_%s"]' % (yacc_sym)) self.add('') @@ -423,22 +494,29 @@ class ModuleManager(builder.ModuleManager): # objs = 0 self.add(' # Objects built with different CFLAGS') - for cflags in sorted(data['sources']): - if cflags is not 'default': + for flags in sorted(data['sources']): + if flags is not 'default': objs += 1 - _source_list(' objs%02d_source' % objs, sorted(data['sources'][cflags]['all'])) - archs = sorted(data['sources'][cflags]) + _source_list(' objs%02d_source' % objs, sorted(data['sources'][flags]['all'])) + archs = sorted(data['sources'][flags]) for arch in archs: - if arch is not 'all': + if arch not in ['all', 'cflags', 'includes']: self.add(' if bld.get_env()["RTEMS_ARCH"] == "%s":' % arch) _source_list(' objs%02d_source' % objs, - sorted(data['sources'][cflags][arch]), + sorted(data['sources'][flags][arch]), append = True) - defines = [d[2:] for d in cflags.split(' ')] + if 'cflags' in data['sources'][flags]: + defines = [d[2:] for d in data['sources'][flags]['cflags']] + else: + defines = [] + if 'includes' in data['sources'][flags]: + includes = data['sources'][flags]['includes'] + else: + includes = [] self.add(' bld.objects(target = "objs%02d",' % (objs)) self.add(' features = "c",') self.add(' cflags = cflags,') - self.add(' includes = includes,') + self.add(' includes = %r + includes,' % (includes)) self.add(' defines = %r,' % (defines)) self.add(' source = objs%02d_source)' % objs) self.add(' libbsd_use += ["objs%02d"]' % (objs)) |