diff options
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)) |