Changeset 8440506 in rtems-libbsd for waf_generator.py


Ignore:
Timestamp:
Jun 15, 2015, 7:42:23 AM (4 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
7c8c0eb
Parents:
4517fa3
Message:

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.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • waf_generator.py

    r4517fa3 r8440506  
    4949    data[name] += files
    5050
     51def _clfags_includes(cflags, includes):
     52    if type(cflags) is not list:
     53        if cflags is not None:
     54            _cflags = cflags.split(' ')
     55        else:
     56            _cflags = [None]
     57    else:
     58        _cflags = cflags
     59    if type(includes) is not list:
     60        _includes = [includes]
     61    else:
     62        _includes = includes
     63    return _cflags, _includes
     64
    5165class SourceFileFragmentComposer(builder.BuildSystemFragmentComposer):
    5266
    53     def __init__(self, cflags = "default"):
    54         self.cflags = cflags
    55 
    56     def compose(self, path):
    57         return ['sources', self.cflags], [path]
     67    def __init__(self, cflags = "default", includes = None):
     68        self.cflags, self.includes = _clfags_includes(cflags, includes)
     69
     70    def compose(self, path):
     71        if None in self.includes:
     72            return ['sources', self.cflags], [path], self.cflags, self.includes
     73        return ['sources', self.cflags + self.includes], [path], self.cflags, self.includes
    5874
    5975class TestFragementComposer(builder.BuildSystemFragmentComposer):
     
    7389
    7490    def compose(self, path):
    75         return ['KVMSymbols', 'files'], [path]
     91        return ['KVMSymbols', 'files'], [path], self.includes
    7692
    7793class RPCGENFragmentComposer(builder.BuildSystemFragmentComposer):
     
    87103class LexFragmentComposer(builder.BuildSystemFragmentComposer):
    88104
    89     def __init__(self, sym, dep):
     105    def __init__(self, sym, dep, cflags = None, includes = None):
    90106        self.sym = sym
    91107        self.dep = dep
    92 
    93     def compose(self, path):
    94         return ['lex', path], { 'file': path,
    95                                 'sym': self.sym,
    96                                 'dep': self.dep }
     108        self.cflags, self.includes = _clfags_includes(cflags, includes)
     109
     110    def compose(self, path):
     111        d = { 'file': path,
     112              'sym': self.sym,
     113              'dep': self.dep }
     114        if None not in self.cflags:
     115            d['cflags'] = self.cflags
     116        if None not in self.includes:
     117            d['includes'] = self.includes
     118        return ['lex', path], d
    97119
    98120class YaccFragmentComposer(builder.BuildSystemFragmentComposer):
    99121
    100     def __init__(self, sym, header):
     122    def __init__(self, sym, header, cflags = None, includes = None):
    101123        self.sym = sym
    102124        self.header = header
    103 
    104     def compose(self, path):
    105         return ['yacc', path], { 'file': path,
    106                                  'sym': self.sym,
    107                                  'header': self.header }
     125        self.cflags, self.includes = _clfags_includes(cflags, includes)
     126
     127    def compose(self, path):
     128        d = { 'file': path,
     129              'sym': self.sym,
     130              'header': self.header }
     131        if None not in self.cflags:
     132            d['cflags'] = self.cflags
     133        if None not in self.includes:
     134            d['includes'] = self.includes
     135        return ['yacc', path], d
    108136
    109137# Module Manager - Collection of Modules
     
    175203            #
    176204            if type(frag) is not str:
     205                # Start at the top of the tree
    177206                d = data
    178                 for p in frag[0]:
    179                     if p not in d:
    180                         d[p] = {}
    181                     d = d[p]
     207                path = frag[0]
     208                if path[0] not in d:
     209                    d[path[0]] = {}
     210                # Select the sub-part of the tree as the compile options
     211                # specialise how files are built.
     212                d = d[path[0]]
     213                if type(path[1]) is list:
     214                    p = ' '.join(path[1])
     215                else:
     216                    p = path[1]
     217                if p not in d:
     218                    d[p] = {}
     219                d = d[p]
     220                if cpu not in d:
     221                    d[cpu] = []
    182222                if type(frag[1]) is list:
    183                     if cpu not in d:
    184                         d[cpu] = []
    185223                    d[cpu] += frag[1]
    186224                else:
    187225                    d[cpu] = frag[1]
     226                if len(frag) > 3:
     227                    if 'cflags' not in d[cpu]:
     228                        d['cflags'] = []
     229                    d['cflags'] += frag[2]
     230                if len(frag) >= 3 and None not in frag[-1]:
     231                    if 'includes' not in d[cpu]:
     232                        d['includes'] = []
     233                    d['includes'] += frag[-1]
    188234
    189235        data = { }
     
    274320        self.add('')
    275321        self.add('    # Include paths')
    276         self.add('    includes = []')
     322        self.add('    includes = ["."]')
    277323        for i in builder.includes():
    278324            self.add('    includes += ["%s"]' % (i[2:]))
     
    339385        if 'KVMSymbols' in data:
    340386            kvmsymbols = data['KVMSymbols']
     387            if 'includes' in kvmsymbols['files']:
     388                includes = kvmsymbols['files']['includes']
     389            else:
     390                includes = []
    341391            self.add('    # KVM Symbols')
    342392            self.add('    bld(target = "%s",' % (kvmsymbols['files']['all'][0]))
     
    347397            self.add('                features = "c",')
    348398            self.add('                cflags = cflags,')
    349             self.add('                includes = includes + ["rtemsbsd/rtems"],')
     399            self.add('                includes = %r + includes,' % (includes))
    350400            self.add('                source = "%s")' % (kvmsymbols['files']['all'][0]))
    351401            self.add('    libbsd_use += ["kvmsymbols"]')
     
    383433            for l in lexes:
    384434                lex = lexes[l]['all']
     435                if 'cflags' in lex:
     436                    lex_defines = [d[2:] for d in lex['cflags']]
     437                else:
     438                    lex_defines = []
     439                if 'includes' in lex:
     440                    lex_includes = lex['includes']
     441                else:
     442                    lex_includes = []
    385443                self.add('    if bld.env.AUTO_REGEN:')
    386444                self.add('        bld(target = "%s.c",' % (lex['file'][:-2]))
     
    391449                self.add('                features = "c",')
    392450                self.add('                cflags = cflags,')
    393                 self.add('                includes = includes,')
     451                self.add('                includes = %r + includes,' % (lex_includes))
     452                self.add('                defines = %r,' % (lex_defines))
    394453                self.add('                source = "%s.c")' % (lex['file'][:-2]))
    395454                self.add('    libbsd_use += ["lex_%s"]' % (lex['sym']))
     
    402461                yacc = yaccs[y]['all']
    403462                yacc_file = yacc['file']
    404                 yacc_sym = yacc['sym']
     463                if yacc['sym'] is not None:
     464                    yacc_sym = yacc['sym']
     465                else:
     466                    yacc_sym = os.path.basename(yacc_file)[:-2]
    405467                yacc_header = '%s/%s' % (os.path.dirname(yacc_file), yacc['header'])
     468                if 'cflags' in yacc:
     469                    yacc_defines = [d[2:] for d in yacc['cflags']]
     470                else:
     471                    yacc_defines = []
     472                if 'includes' in yacc:
     473                    yacc_includes = yacc['includes']
     474                else:
     475                    yacc_includes = []
    406476                self.add('    if bld.env.AUTO_REGEN:')
    407477                self.add('        bld(target = "%s.c",' % (yacc_file[:-2]))
     
    413483                self.add('                features = "c",')
    414484                self.add('                cflags = cflags,')
    415                 self.add('                includes = includes,')
     485                self.add('                includes = %r + includes,' % (yacc_includes))
     486                self.add('                defines = %r,' % (yacc_defines))
    416487                self.add('                source = "%s.c")' % (yacc_file[:-2]))
    417488                self.add('    libbsd_use += ["yacc_%s"]' % (yacc_sym))
     
    424495        objs = 0
    425496        self.add('    # Objects built with different CFLAGS')
    426         for cflags in sorted(data['sources']):
    427             if cflags is not 'default':
     497        for flags in sorted(data['sources']):
     498            if flags is not 'default':
    428499                objs += 1
    429                 _source_list('    objs%02d_source' % objs, sorted(data['sources'][cflags]['all']))
    430                 archs = sorted(data['sources'][cflags])
     500                _source_list('    objs%02d_source' % objs, sorted(data['sources'][flags]['all']))
     501                archs = sorted(data['sources'][flags])
    431502                for arch in archs:
    432                     if arch is not 'all':
     503                    if arch not in ['all', 'cflags', 'includes']:
    433504                        self.add('    if bld.get_env()["RTEMS_ARCH"] == "%s":' % arch)
    434505                        _source_list('        objs%02d_source' % objs,
    435                                      sorted(data['sources'][cflags][arch]),
     506                                     sorted(data['sources'][flags][arch]),
    436507                                     append = True)
    437                 defines = [d[2:] for d in cflags.split(' ')]
     508                if 'cflags' in data['sources'][flags]:
     509                    defines = [d[2:] for d in data['sources'][flags]['cflags']]
     510                else:
     511                    defines = []
     512                if 'includes' in data['sources'][flags]:
     513                    includes = data['sources'][flags]['includes']
     514                else:
     515                    includes = []
    438516                self.add('    bld.objects(target = "objs%02d",' % (objs))
    439517                self.add('                features = "c",')
    440518                self.add('                cflags = cflags,')
    441                 self.add('                includes = includes,')
     519                self.add('                includes = %r + includes,' % (includes))
    442520                self.add('                defines = %r,' % (defines))
    443521                self.add('                source = objs%02d_source)' % objs)
Note: See TracChangeset for help on using the changeset viewer.