Changeset 624954b in rtems-source-builder for source-builder/sb/macros.py


Ignore:
Timestamp:
Apr 26, 2013, 2:05:53 AM (6 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, master
Children:
dbede73
Parents:
8f30997
Message:

Add macro include support. Use it for building from head.

This change provides a simple way to build all parts of the tools from
version control.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source-builder/sb/macros.py

    r8f30997 r624954b  
    187187
    188188    def parse(self, lines):
     189
     190        def _clean(l):
     191            if '#' in l:
     192                l = l[:l.index('#')]
     193            if '\r' in l:
     194                l = l[:l.index('r')]
     195            if '\n' in l:
     196                l = l[:l.index('\n')]
     197            return l.strip()
     198
     199        trace_me = False
     200        if trace_me:
     201            print '[[[[]]]] parsing macros'
    189202        macros = { 'global': {} }
    190203        map = 'global'
     
    198211            if len(l) == 0:
    199212                continue
     213            l_remaining = l
    200214            for c in l:
    201                 #print ']]]]]]]] c:%s(%d) s:%s t:"%s" m:%r M:%s' % (c, ord(c), state, token, macro, map)
     215                if trace_me:
     216                    print ']]]]]]]] c:%s(%d) s:%s t:"%s" m:%r M:%s' % \
     217                        (c, ord(c), state, token, macro, map)
     218                l_remaining = l_remaining[1:]
    202219                if c is '#' and not state.startswith('value'):
    203220                    break
     
    210227                        if c is '[':
    211228                            state = 'map'
     229                        elif c is '%':
     230                            state = 'directive'
    212231                        elif c is ':':
    213232                            macro += [token]
     
    229248                    else:
    230249                        raise error.general('invalid macro map:%d: %s' % (lc, l))
     250                elif state is 'directive':
     251                    if c in string.whitespace:
     252                        if token == 'include':
     253                            self.load(_clean(l_remaining))
     254                            token = ''
     255                            state = 'key'
     256                            break
     257                    elif c in string.printable and c not in string.whitespace:
     258                        token += c
     259                    else:
     260                        raise error.general('invalid macro directive:%d: %s' % (lc, l))
     261                elif state is 'include':
     262                    if c is string.whitespace:
     263                        if token == 'include':
     264                            state = 'include'
     265                    elif c in string.printable and c not in string.whitespace:
     266                        token += c
     267                    else:
     268                        raise error.general('invalid macro directive:%d: %s' % (lc, l))
    231269                elif state is 'attribs':
    232270                    if c not in string.whitespace:
     
    291329
    292330    def load(self, name):
    293         try:
    294             name = self.expand(name)
    295             mc = open(name, 'r')
    296         except IOError, err:
    297             raise error.general('opening macro file: %s' % (path.host(name)))
    298         macros = self.parse(mc)
    299         mc.close()
    300         self.files += [name]
     331        names = self.expand(name).split(':')
     332        for n in names:
     333            if path.exists(n):
     334                try:
     335                    mc = open(n, 'r')
     336                    macros = self.parse(mc)
     337                    mc.close()
     338                    self.files += [n]
     339                    return
     340                except IOError, err:
     341                    pass
     342        raise error.general('opening macro file: %s' % (path.host(name)))
    301343
    302344    def get(self, key):
Note: See TracChangeset for help on using the changeset viewer.