summaryrefslogtreecommitdiffstats
path: root/waf_generator.py
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2015-06-15 17:42:23 +1000
committerChris Johns <chrisj@rtems.org>2015-06-15 17:42:23 +1000
commit8440506ee8945ad57f5e20e9962084d67808eb22 (patch)
tree38f567b1c56846b88f5f0828bd244b05519998ba /waf_generator.py
parentUpdate LibBSD doco. (diff)
downloadrtems-libbsd-8440506ee8945ad57f5e20e9962084d67808eb22.tar.bz2
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-xwaf_generator.py140
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))