Changeset 845e92f in rtems-source-builder


Ignore:
Timestamp:
Sep 2, 2013, 10:30:26 PM (6 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, master
Children:
18b01e8
Parents:
72f89c5
Message:

sb: Fix nesting if statements.

Nesting if statements did not correctly process the contents of
the nested if script. This change makes the processing uniform
across all the logic stages.

File:
1 edited

Legend:

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

    r72f89c5 r845e92f  
    526526                log.warning("macro '%s' not defined" % (mn))
    527527
    528     def _ifs(self, config, ls, label, iftrue, isvalid):
    529         text = []
     528    def _ifs(self, config, ls, label, iftrue, isvalid, dir, info):
    530529        in_iftrue = True
     530        data = []
    531531        while True:
    532532            if isvalid and \
     
    535535            else:
    536536                this_isvalid = False
    537             r = self._parse(config, roc = True, isvalid = this_isvalid)
    538             if r[0] == 'control':
     537            r = self._parse(config, dir, info, data, roc = True, isvalid = this_isvalid)
     538            if r[0] == 'package':
     539                if this_isvalid:
     540                    dir, info, data = self._process_package(r, dir, info, data)
     541            elif r[0] == 'control':
    539542                if r[1] == '%end':
    540543                    self._error(label + ' without %endif')
    541544                    raise error.general('terminating build')
    542545                if r[1] == '%endif':
    543                     return text
     546                    log.trace('config: %s: _ifs: %s %s' % (self.init_name, r[1], this_isvalid))
     547                    return data
    544548                if r[1] == '%else':
    545549                    in_iftrue = False
    546550            elif r[0] == 'directive':
    547                 if r[1] == '%include':
    548                     self.load(r[2][0])
    549                 else:
    550                     log.warning("directive not supported in if: '%s'" % (' '.join(r[2])))
     551                if this_isvalid:
     552                    if r[1] == '%include':
     553                        self.load(r[2][0])
     554                        continue
     555                    dir, info, data = self._process_directive(r, dir, info, data)
    551556            elif r[0] == 'data':
    552557                if this_isvalid:
    553                     text.extend(r[1])
    554 
    555     def _if(self, config, ls, isvalid, invert = False):
     558                    dir, info, data = self._process_data(r, dir, info, data)
     559        # @note is a directive extend missing
     560
     561    def _if(self, config, ls, isvalid, dir, info, invert = False):
    556562
    557563        def add(x, y):
     
    638644                istrue = not istrue
    639645            log.trace('config: %s: _if:  %s %s' % (self.init_name, ifls, str(istrue)))
    640         return self._ifs(config, ls, '%if', istrue, isvalid)
    641 
    642     def _ifos(self, config, ls, isvalid):
     646        return self._ifs(config, ls, '%if', istrue, isvalid, dir, info)
     647
     648    def _ifos(self, config, ls, isvalid, dir, info):
    643649        isos = False
    644650        if isvalid:
     
    648654                    isos = True
    649655                    break
    650         return self._ifs(config, ls, '%ifos', isos, isvalid)
    651 
    652     def _ifarch(self, config, positive, ls, isvalid):
     656        return self._ifs(config, ls, '%ifos', isos, isvalid, dir, info)
     657
     658    def _ifarch(self, config, positive, ls, isvalid, dir, info):
    653659        isarch = False
    654660        if isvalid:
     
    660666        if not positive:
    661667            isarch = not isarch
    662         return self._ifs(config, ls, '%ifarch', isarch, isvalid)
    663 
    664     def _parse(self, config, roc = False, isvalid = True):
     668        return self._ifs(config, ls, '%ifarch', isarch, isvalid, dir, info)
     669
     670    def _parse(self, config, dir, info, roc = False, isvalid = True):
    665671        # roc = return on control
    666672
     
    719725                        self._undefine(config, ls)
    720726                elif ls[0] == '%if':
    721                     d = self._if(config, ls, isvalid)
     727                    d = self._if(config, ls, isvalid, dir, info)
    722728                    if len(d):
     729                        log.trace('config: %s: %%if: %s' % (self.init_name, d))
    723730                        return ('data', d)
    724731                elif ls[0] == '%ifn':
    725                     d = self._if(config, ls, isvalid, True)
     732                    d = self._if(config, ls, isvalid, dir, info, True)
    726733                    if len(d):
     734                        log.trace('config: %s: %%ifn: %s' % (self.init_name, d))
    727735                        return ('data', d)
    728736                elif ls[0] == '%ifos':
    729                     d = self._ifos(config, ls, isvalid)
     737                    d = self._ifos(config, ls, isvalid, dir, info)
    730738                    if len(d):
    731739                        return ('data', d)
    732740                elif ls[0] == '%ifarch':
    733                     d = self._ifarch(config, True, ls, isvalid)
     741                    d = self._ifarch(config, True, ls, isvalid, dir, info)
    734742                    if len(d):
    735743                        return ('data', d)
    736744                elif ls[0] == '%ifnarch':
    737                     d = self._ifarch(config, False, ls, isvalid)
     745                    d = self._ifarch(config, False, ls, isvalid, dir, info)
    738746                    if len(d):
    739747                        return ('data', d)
     
    774782        return ('control', '%end', '%end')
    775783
     784    def _process_package(self, results, directive, info, data):
     785        self._set_package(results[1])
     786        directive = None
     787        return (directive, info, data)
     788
     789    def _process_directive(self, results, directive, info, data):
     790        new_data = []
     791        if results[1] == '%description':
     792            new_data = [' '.join(results[2])]
     793            if len(results[2]) == 0:
     794                _package = 'main'
     795            elif len(results[2]) == 1:
     796                _package = results[2][0]
     797            else:
     798                if results[2][0].strip() != '-n':
     799                    log.warning("unknown directive option: '%s'" % (' '.join(results[2])))
     800                _package = results[2][1].strip()
     801            self._set_package(_package)
     802        if directive and directive != results[1]:
     803            self._directive_extend(directive, data)
     804        directive = results[1]
     805        data = new_data
     806        return (directive, info, data)
     807
     808    def _process_data(self, results, directive, info, data):
     809        new_data = []
     810        for l in results[1]:
     811            if l.startswith('%error'):
     812                l = self._expand(l)
     813                raise error.general('config error: %s' % (l[7:]))
     814            elif l.startswith('%warning'):
     815                l = self._expand(l)
     816                log.stderr('warning: %s' % (l[9:]))
     817                log.warning(l[9:])
     818            if not directive:
     819                l = self._expand(l)
     820                ls = self.tags.split(l, 1)
     821                log.trace('config: %s: _tag: %s %s' % (self.init_name, l, ls))
     822                if len(ls) > 1:
     823                    info = ls[0].lower()
     824                    if info[-1] == ':':
     825                        info = info[:-1]
     826                    info_data = ls[1].strip()
     827                else:
     828                    info_data = ls[0].strip()
     829                if info is not None:
     830                    self._info_append(info, info_data)
     831                else:
     832                    log.warning("invalid format: '%s'" % (info_data[:-1]))
     833            else:
     834                log.trace('config: %s: _data: %s %s' % (self.init_name, l, new_data))
     835                new_data.append(l)
     836        return (directive, info, data + new_data)
     837
    776838    def _set_package(self, _package):
    777839        if self.package == 'main' and \
     
    873935            data = []
    874936            while True:
    875                 r = self._parse(config)
     937                r = self._parse(config, dir, info)
    876938                if r[0] == 'package':
    877                     self._set_package(r[1])
    878                     dir = None
     939                    dir, info, data = self._process_package(r, dir, info, data)
    879940                elif r[0] == 'control':
    880941                    if r[1] == '%end':
     
    882943                    log.warning("unexpected '%s'" % (r[1]))
    883944                elif r[0] == 'directive':
    884                     new_data = []
    885                     if r[1] == '%description':
    886                         new_data = [' '.join(r[2])]
    887                     elif r[1] == '%include':
     945                    if r[1] == '%include':
    888946                        self.load(r[2][0])
    889947                        continue
    890                     else:
    891                         if len(r[2]) == 0:
    892                             _package = 'main'
    893                         elif len(r[2]) == 1:
    894                             _package = r[2][0]
    895                         else:
    896                             if r[2][0].strip() != '-n':
    897                                 log.warning("unknown directive option: '%s'" % (' '.join(r[2])))
    898                             _package = r[2][1].strip()
    899                         self._set_package(_package)
    900                     if dir and dir != r[1]:
    901                         self._directive_extend(dir, data)
    902                     dir = r[1]
    903                     data = new_data
     948                    dir, info, data = self._process_directive(r, dir, info, data)
    904949                elif r[0] == 'data':
    905                     for l in r[1]:
    906                         if l.startswith('%error'):
    907                             l = self._expand(l)
    908                             raise error.general('config error: %s' % (l[7:]))
    909                         elif l.startswith('%warning'):
    910                             l = self._expand(l)
    911                             log.stderr('warning: %s' % (l[9:]))
    912                             log.warning(l[9:])
    913                         if not dir:
    914                             l = self._expand(l)
    915                             ls = self.tags.split(l, 1)
    916                             log.trace('config: %s: _tag: %s %s' % (self.init_name, l, ls))
    917                             if len(ls) > 1:
    918                                 info = ls[0].lower()
    919                                 if info[-1] == ':':
    920                                     info = info[:-1]
    921                                 info_data = ls[1].strip()
    922                             else:
    923                                 info_data = ls[0].strip()
    924                             if info is not None:
    925                                 self._info_append(info, info_data)
    926                             else:
    927                                 log.warning("invalid format: '%s'" % (info_data[:-1]))
    928                         else:
    929                             data.append(l)
     950                    dir, info, data = self._process_data(r, dir, info, data)
    930951                else:
    931952                    self._error("%d: invalid parse state: '%s" % (self.lc, r[0]))
Note: See TracChangeset for help on using the changeset viewer.