Changeset f7a4107 in rtems-libbsd for waf_generator.py


Ignore:
Timestamp:
Nov 28, 2016, 3:23:15 AM (3 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
afda2c7
Parents:
269b559
git-author:
Chris Johns <chrisj@…> (11/28/16 03:23:15)
git-committer:
Chris Johns <chrisj@…> (11/29/16 04:27:23)
Message:

Add a RTEMS Debugger TCP remote transport.

The patch also adds support to libbsd's build system making source
conditional on a configure check. The debugger support is not
available on all architectures and this feature lets us test if
is avaliable.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • waf_generator.py

    r269b559 rf7a4107  
    4141import builder
    4242
     43#
     44# Dump the data created from the fragments returned from the builder composers.
     45#
    4346trace = False
    4447
     
    7376    def compose(self, path):
    7477        if None in self.includes:
    75             return ['sources', self.cflags], [path], self.cflags, self.includes
    76         return ['sources', self.cflags + self.includes], [path], self.cflags, self.includes
     78            flags = self.cflags
     79        else:
     80            flags = self.cflags + self.includes
     81        return ['sources', flags, ('default', None)], [path], self.cflags, self.includes
     82
     83class SourceFileIfHeaderComposer(SourceFileFragmentComposer):
     84
     85    def __init__(self, headers, cflags = "default", includes = None):
     86        if headers is not list:
     87            headers = [headers]
     88        self.headers = headers
     89        super(SourceFileIfHeaderComposer, self).__init__(cflags = cflags, includes = includes)
     90
     91    def compose(self, path):
     92        r = SourceFileFragmentComposer.compose(self, path)
     93        define_keys = ''
     94        for h in self.headers:
     95            h = h.upper()
     96            for c in '\/-.':
     97                h = h.replace(c, '_')
     98            define_keys += ' ' + h
     99        r[0][2] = (define_keys.strip(), self.headers)
     100        return r
    77101
    78102class TestFragementComposer(builder.BuildSystemFragmentComposer):
     
    85109
    86110    def compose(self, path):
    87         return ['tests', self.testName], { 'files': self.fileFragments,
    88                                            'run': self.runTest,
    89                                            'net': self.netTest }
     111        return ['tests', self.testName, ('default', None)], { 'files': self.fileFragments,
     112                                                              'run': self.runTest,
     113                                                              'net': self.netTest }
     114
     115class TestIfHeaderComposer(TestFragementComposer):
     116
     117    def __init__(self, testName, headers, fileFragments, runTest = True, netTest = False):
     118        if headers is not list:
     119            headers = [headers]
     120        self.headers = headers
     121        super(TestIfHeaderComposer, self).__init__(testName, fileFragments,
     122                                                   runTest = runTest, netTest = netTest)
     123
     124    def compose(self, path):
     125        r = TestFragementComposer.compose(self, path)
     126        define_keys = ''
     127        for h in self.headers:
     128            h = h.upper()
     129            for c in '\/-.':
     130                h = h.replace(c, '_')
     131            define_keys += ' ' + h
     132        r[0][2] = (define_keys.strip(), self.headers)
     133        return r
    90134
    91135class KVMSymbolsFragmentComposer(builder.BuildSystemFragmentComposer):
    92136
    93137    def compose(self, path):
    94         return ['KVMSymbols', 'files'], [path], self.includes
     138        return ['KVMSymbols', 'files', ('default', None)], [path], self.includes
    95139
    96140class RPCGENFragmentComposer(builder.BuildSystemFragmentComposer):
    97141
    98142    def compose(self, path):
    99         return ['RPCGen', 'files'], [path]
     143        return ['RPCGen', 'files', ('default', None)], [path]
    100144
    101145class RouteKeywordsFragmentComposer(builder.BuildSystemFragmentComposer):
    102146
    103147    def compose(self, path):
    104         return ['RouteKeywords', 'files'], [path]
     148        return ['RouteKeywords', 'files', ('default', None)], [path]
    105149
    106150class LexFragmentComposer(builder.BuildSystemFragmentComposer):
     
    119163        if None not in self.includes:
    120164            d['includes'] = self.includes
    121         return ['lex', path], d
     165        return ['lex', path, ('default', None)], d
    122166
    123167class YaccFragmentComposer(builder.BuildSystemFragmentComposer):
     
    136180        if None not in self.includes:
    137181            d['includes'] = self.includes
    138         return ['yacc', path], d
     182        return ['yacc', path, ('default', None)], d
    139183
    140184# Module Manager - Collection of Modules
     
    172216        self.generator['yacc'] = YaccFragmentComposer
    173217
     218        self.generator['source-if-header'] = SourceFileIfHeaderComposer
     219        self.generator['test-if-header'] = TestIfHeaderComposer
     220
    174221    def generate(self, rtems_version):
    175222
    176         def _sourceList(lhs, files, append = False):
     223        def _sourceListSources(lhs, sources, append = False, block = 0):
     224            indent = block * 4
    177225            if append:
    178226                adder = '+'
     
    182230                adderSpace = ''
    183231            ll = len(lhs)
    184             if len(files) == 1:
    185                 self.add('%s %s= [%r]' % (lhs, adder, files[0]))
    186             elif len(files) == 2:
    187                 self.add('%s %s= [%r,' % (lhs, adder, files[0]))
    188                 self.add('%s %s   %r]' % (' ' * ll, adderSpace, files[-1]))
    189             elif len(files) > 0:
    190                 self.add('%s %s= [%r,' % (lhs, adder, files[0]))
    191                 for f in files[1:-1]:
    192                     self.add('%s %s   %r,' % (' ' * ll, adderSpace, f))
    193                 self.add('%s %s   %r]' % (' ' * ll, adderSpace, files[-1]))
     232            if len(sources) == 1:
     233                self.add('%s%s %s= [%r]' % (' ' * indent, lhs, adder, sources[0]))
     234            elif len(sources) == 2:
     235                self.add('%s%s %s= [%r,' % (' ' * indent, lhs, adder, sources[0]))
     236                self.add('%s%s %s   %r]' % (' ' * indent, ' ' * ll, adderSpace, sources[-1]))
     237            elif len(sources) > 0:
     238                self.add('%s%s %s= [%r,' % (' ' * indent, lhs, adder, sources[0]))
     239                for f in sources[1:-1]:
     240                    self.add('%s%s %s   %r,' % (' ' * indent, ' ' * ll, adderSpace, f))
     241                self.add('%s%s %s   %r]' % (' ' * indent, ' ' * ll, adderSpace, sources[-1]))
     242
     243        def _sourceList(lhs, files, append = False):
     244            if type(files) is dict:
     245                appending = False
     246                for cfg in files:
     247                    if cfg in ['cflags', 'includes']:
     248                        continue
     249                    if cfg != 'default':
     250                        cs = ''
     251                        ors = ''
     252                        for c in cfg.split(' '):
     253                            cs += '%s bld.env["HAVE_%s"]' % (ors, c)
     254                            ors = ' and'
     255                        self.add('    if%s:' % (cs))
     256                        _sourceListSources(lhs, sorted(files[cfg]), append = appending, block = 1)
     257                    else:
     258                        _sourceListSources(lhs, sorted(files[cfg]), append)
     259                    appending = True
     260            else:
     261                _sourceListSources(lhs, sorted(files), append)
    194262
    195263        def _dataInsert(data, cpu, frag):
     
    214282                d = d[p]
    215283                if cpu not in d:
    216                     d[cpu] = []
     284                    d[cpu] = { }
     285                config = frag[0][2][0]
     286                if config != 'default':
     287                    if 'configure' not in data:
     288                        data['configure'] = { }
     289                    data['configure'][config] = frag[0][2][1]
    217290                if type(frag[1]) is list:
    218                     d[cpu] += frag[1]
     291                    if config not in d[cpu]:
     292                        d[cpu][config] = []
     293                    d[cpu][config] += frag[1]
    219294                else:
    220                     d[cpu] = frag[1]
     295                    d[cpu][config] = frag[1]
     296                #
     297                # The CPU is for files and the flags and includes are common.
     298                #
    221299                if len(frag) > 3:
    222                     if 'cflags' not in d[cpu]:
     300                    if 'cflags' not in d:
    223301                        d['cflags'] = []
    224302                    d['cflags'] += frag[2]
     303                    d['cflags'] = list(set(d['cflags']))
    225304                if len(frag) >= 3 and None not in frag[-1]:
    226                     if 'includes' not in d[cpu]:
     305                    if 'includes' not in d:
    227306                        d['includes'] = []
    228307                    d['includes'] += frag[-1]
     308                    d['includes'] = list(set(d['includes']))
    229309
    230310        data = { }
     
    274354        self.add('')
    275355        self.add('def bsp_configure(conf, arch_bsp):')
    276         self.add('    pass')
     356
     357        if 'configure' in data:
     358            for cfg in data['configure']:
     359                for h in data['configure'][cfg]:
     360                    self.add('    conf.check(header_name = "%s", features = "c", includes = conf.env.IFLAGS, mandatory = False)' % h)
     361        else:
     362            self.add('    pass')
     363
    277364        self.add('')
    278365        self.add('def configure(conf):')
    279         self.add('    pass')
     366        self.add('    rtems.configure(conf, bsp_configure)')
    280367        self.add('')
    281368        self.add('def build(bld):')
     
    368455                includes = []
    369456            self.add('    # KVM Symbols')
    370             self.add('    bld(target = "%s",' % (kvmsymbols['files']['all'][0]))
     457            self.add('    bld(target = "%s",' % (kvmsymbols['files']['all']['default'][0]))
    371458            self.add('        source = "rtemsbsd/rtems/generate_kvm_symbols",')
    372459            self.add('        rule = host_shell + "./${SRC} > ${TGT}",')
     
    376463            self.add('                cflags = cflags,')
    377464            self.add('                includes = %r + includes,' % (includes))
    378             self.add('                source = "%s")' % (kvmsymbols['files']['all'][0]))
     465            self.add('                source = "%s")' % (kvmsymbols['files']['all']['default'][0]))
    379466            self.add('    libbsd_use += ["kvmsymbols"]')
    380467            self.add('')
     
    384471        if 'RPCGen' in data:
    385472            rpcgen = data['RPCGen']
    386             rpcname = rpcgen['files']['all'][0][:-2]
     473            rpcname = rpcgen['files']['all']['default'][0][:-2]
    387474            self.add('    # RPC Generation')
    388475            self.add('    if bld.env.AUTO_REGEN:')
     
    394481        if 'RouteKeywords' in data:
    395482            routekw = data['RouteKeywords']
    396             rkwname = routekw['files']['all'][0]
     483            rkwname = routekw['files']['all']['default'][0]
    397484            self.add('    # Route keywords')
    398485            self.add('    if bld.env.AUTO_REGEN:')
     
    410497            self.add('    # Lex')
    411498            for l in sorted(lexes.keys()):
    412                 lex = lexes[l]['all']
     499                lex = lexes[l]['all']['default']
    413500                if 'cflags' in lex:
    414501                    lexDefines = [d[2:] for d in lex['cflags']]
     
    437524            self.add('    # Yacc')
    438525            for y in sorted(yaccs.keys()):
    439                 yacc = yaccs[y]['all']
     526                yacc = yaccs[y]['all']['default']
    440527                yaccFile = yacc['file']
    441528                if yacc['sym'] is not None:
     
    474561        objs = 0
    475562        self.add('    # Objects built with different CFLAGS')
    476         for flags in sorted(data['sources']):
    477             if flags is not 'default':
    478                 objs += 1
    479                 _sourceList('    objs%02d_source' % objs, sorted(data['sources'][flags]['all']))
    480                 archs = sorted(data['sources'][flags])
    481                 for arch in archs:
    482                     if arch not in ['all', 'cflags', 'includes']:
    483                         self.add('    if bld.get_env()["RTEMS_ARCH"] == "%s":' % arch)
    484                         _sourceList('        objs%02d_source' % objs,
    485                                     sorted(data['sources'][flags][arch]),
    486                                     append = True)
    487                 if 'cflags' in data['sources'][flags]:
    488                     defines = [d[2:] for d in data['sources'][flags]['cflags']]
    489                 else:
    490                     defines = []
    491                 if 'includes' in data['sources'][flags]:
    492                     includes = data['sources'][flags]['includes']
    493                 else:
    494                     includes = []
    495                 self.add('    bld.objects(target = "objs%02d",' % (objs))
    496                 self.add('                features = "c",')
    497                 self.add('                cflags = cflags,')
    498                 self.add('                includes = %r + includes,' % (includes))
    499                 self.add('                defines = defines + %r,' % (defines))
    500                 self.add('                source = objs%02d_source)' % objs)
    501                 self.add('    libbsd_use += ["objs%02d"]' % (objs))
    502                 self.add('')
     563        sources = sorted(data['sources'])
     564        if 'default' in sources:
     565            sources.remove('default')
     566        for flags in sources:
     567            objs += 1
     568            build = data['sources'][flags]
     569            _sourceList('    objs%02d_source' % objs, build['all'])
     570            archs = sorted(build)
     571            for i in ['all', 'cflags', 'includes']:
     572                if i in archs:
     573                    archs.remove(i)
     574            for arch in archs:
     575                self.add('    if bld.get_env()["RTEMS_ARCH"] == "%s":' % arch)
     576                _sourceList('        objs%02d_source' % objs, build[arch], append = True)
     577            if 'cflags' in build:
     578                defines = [d[2:] for d in build['cflags']]
     579            else:
     580                defines = []
     581            if 'includes' in build:
     582                includes = build['includes']
     583            else:
     584                includes = []
     585            self.add('    bld.objects(target = "objs%02d",' % (objs))
     586            self.add('                features = "c",')
     587            self.add('                cflags = cflags,')
     588            self.add('                includes = %r + includes,' % (sorted(includes)))
     589            self.add('                defines = defines + %r,' % (sorted(defines)))
     590            self.add('                source = objs%02d_source)' % objs)
     591            self.add('    libbsd_use += ["objs%02d"]' % (objs))
     592            self.add('')
    503593
    504594        #
     
    506596        # static library with.
    507597        #
    508         _sourceList('    source', sorted(data['sources']['default']['all']))
    509         archs = sorted(data['sources']['default'])
     598        build = data['sources']['default']
     599        _sourceList('    source', build['all'])
     600        archs = sorted(build)
     601        archs.remove('all')
    510602        for arch in archs:
    511             if arch is not 'all':
    512                 self.add('    if bld.get_env()["RTEMS_ARCH"] == "%s":' % arch)
    513                 _sourceList('        source',
    514                             sorted(data['sources']['default'][arch]),
    515                             append = True)
     603            self.add('    if bld.get_env()["RTEMS_ARCH"] == "%s":' % arch)
     604            _sourceList('        source', build[arch], append = True)
    516605        self.add('    bld.stlib(target = "bsd",')
    517606        self.add('              features = "c cxx",')
     
    525614
    526615        #
    527         # Head file collector.
     616        # Header file collector.
    528617        #
    529618        self.add('    # Installs.    ')
     
    546635        tests = data['tests']
    547636        for testName in sorted(tests):
    548             files = ['testsuite/%s/%s.c' % (testName, f) for f in  data['tests'][testName]['all']['files']]
    549             _sourceList('    test_%s' % (testName), sorted(files))
    550             self.add('    bld.program(target = "%s.exe",' % (testName))
    551             self.add('                features = "cprogram",')
    552             self.add('                cflags = cflags,')
    553             self.add('                includes = includes,')
    554             self.add('                source = test_%s,' % (testName))
    555             self.add('                use = ["bsd"],')
    556             self.add('                lib = ["m", "z"],')
    557             self.add('                install_path = None)')
     637            test = data['tests'][testName]['all']
     638            block = 0
     639            files = []
     640            for cfg in test:
     641                if cfg != 'default':
     642                    cs = ''
     643                    ors = ''
     644                    for c in cfg.split(' '):
     645                        cs += '%s bld.env["HAVE_%s"]' % (ors, c)
     646                        ors = ' and'
     647                    self.add('    if%s:' % (cs))
     648                    block = 1
     649                files = ['testsuite/%s/%s.c' % (testName, f) \
     650                         for f in test[cfg]['files']]
     651            indent = ' ' * block * 4
     652            _sourceList('%s    test_%s' % (indent, testName), files)
     653            self.add('%s    bld.program(target = "%s.exe",' % (indent, testName))
     654            self.add('%s                features = "cprogram",' % (indent))
     655            self.add('%s                cflags = cflags,' % (indent))
     656            self.add('%s                includes = includes,' % (indent))
     657            self.add('%s                source = test_%s,' % (indent, testName))
     658            self.add('%s                use = ["bsd"],' % (indent))
     659            self.add('%s                lib = ["m", "z"],' % (indent))
     660            self.add('%s                install_path = None)' % (indent))
    558661            self.add('')
    559662
Note: See TracChangeset for help on using the changeset viewer.