Changeset 5416cfa in rtems-tools


Ignore:
Timestamp:
Oct 2, 2018, 6:49:54 AM (7 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
3bd8def
Parents:
5075e8e
Message:

config: Create a config directory and move the RTEMS arch/bsp data to it.

Closes #3536

Files:
2 added
4 edited
21 moved

Legend:

Unmodified
Added
Removed
  • rtemstoolkit/__init__.py

    r5075e8e r5416cfa  
    11#
    22# RTEMS Tools Project (http://www.rtems.org/)
    3 # Copyright 2010-2016 Chris Johns (chrisj@rtems.org)
     3# Copyright 2010-2018 Chris Johns (chrisj@rtems.org)
    44# All rights reserved.
    55#
     
    3131all = ['check',
    3232       'config',
     33       'configuration',
    3334       'error',
    3435       'execute',
    3536       'git',
     37       'host',
    3638       'log',
    3739       'macros',
     
    4042       'path',
    4143       'reraise',
     44       'rtems',
     45       'stacktraces',
     46       'textbox',
    4247       'version']
    4348
    4449from . import check
    4550from . import config
     51from . import configuration
    4652from . import error
    4753from . import execute
    4854from . import git
     55from . import host
    4956from . import log
    5057from . import macros
     
    5360from . import path
    5461from . import reraise
     62from . import rtems
     63from . import stacktraces
     64from . import textbox
    5565from . import version
  • rtemstoolkit/wscript

    r5075e8e r5416cfa  
    149149                  'path.py',
    150150                  'reraise.py',
     151                  'rtems.py',
    151152                  'stacktraces.py',
    152153                  'textbox.py',
  • tester/rt/check.py

    r5075e8e r5416cfa  
    4545import pprint
    4646
    47 from rtemstoolkit import configuration
    4847from rtemstoolkit import execute
    4948from rtemstoolkit import error
     
    5251from rtemstoolkit import mailer
    5352from rtemstoolkit import path
     53from rtemstoolkit import rtems
    5454from rtemstoolkit import textbox
    5555from rtemstoolkit import version
     
    881881            path.removeall(self._build_dir())
    882882
    883 class configuration_:
    884 
    885     def __init__(self):
    886         self.config = configuration.configuration()
    887         self.archs = { }
    888         self.builds_ = { }
    889         self.profiles = { }
    890 
    891     def __str__(self):
    892         s = self.name + os.linesep
    893         s += 'Archs:' + os.linesep + \
    894              pprint.pformat(self.archs, indent = 1, width = 80) + os.linesep
    895         s += 'Builds:' + os.linesep + \
    896              pprint.pformat(self.builds_, indent = 1, width = 80) + os.linesep
    897         s += 'Profiles:' + os.linesep + \
    898              pprint.pformat(self.profiles, indent = 1, width = 80) + os.linesep
    899         return s
    900 
    901     def _build_options(self, build, nesting = 0):
    902         if ':' in build:
    903             section, name = build.split(':', 1)
    904             opts = [self.config.get_item(section, name)]
    905             return opts
    906         builds = self.builds_['builds']
    907         if build not in builds:
    908             raise error.general('build %s not found' % (build))
    909         if nesting > 20:
    910             raise error.general('nesting build %s' % (build))
    911         options = []
    912         for option in self.builds_['builds'][build]:
    913             if ':' in option:
    914                 section, name = option.split(':', 1)
    915                 opts = [self.config.get_item(section, name)]
    916             else:
    917                 opts = self._build_options(option, nesting + 1)
    918             for opt in opts:
    919                 if opt not in options:
    920                     options += [opt]
    921         return options
    922 
    923     def load(self, name, build):
    924         self.config.load(name)
    925         archs = []
    926         self.profiles['profiles'] = \
    927             self.config.comma_list('profiles', 'profiles', err = False)
    928         if len(self.profiles['profiles']) == 0:
    929             self.profiles['profiles'] = ['tier-%d' % (t) for t in range(1,4)]
    930         for p in self.profiles['profiles']:
    931             profile = {}
    932             profile['name'] = p
    933             profile['archs'] = self.config.comma_list(profile['name'], 'archs', err = False)
    934             archs += profile['archs']
    935             for arch in profile['archs']:
    936                 bsps = 'bsps_%s' % (arch)
    937                 profile[bsps] = self.config.comma_list(profile['name'], bsps)
    938             self.profiles[profile['name']] = profile
    939         invalid_chars = re.compile(r'[^a-zA-Z0-9_-]')
    940         for a in set(archs):
    941             if len(invalid_chars.findall(a)) != 0:
    942                 raise error.general('invalid character(s) in arch name: %s' % (a))
    943             arch = {}
    944             arch['excludes'] = {}
    945             for exclude in self.config.comma_list(a, 'exclude', err = False):
    946                 arch['excludes'][exclude] = ['all']
    947             for i in self.config.get_items(a, False):
    948                 if i[0].startswith('exclude-'):
    949                     exclude = i[0][len('exclude-'):]
    950                     if exclude not in arch['excludes']:
    951                         arch['excludes'][exclude] = []
    952                     arch['excludes'][exclude] += \
    953                         sorted(set([b.strip() for b in i[1].split(',')]))
    954             arch['bsps'] = self.config.comma_list(a, 'bsps', err = False)
    955             for b in arch['bsps']:
    956                 if len(invalid_chars.findall(b)) != 0:
    957                     raise error.general('invalid character(s) in BSP name: %s' % (b))
    958                 arch[b] = {}
    959                 arch[b]['bspopts'] = \
    960                     self.config.comma_list(a, 'bspopts_%s' % (b), err = False)
    961             self.archs[a] = arch
    962         builds = {}
    963         builds['default'] = self.config.get_item('builds', 'default')
    964         if build is None:
    965             build = builds['default']
    966         builds['config'] = { }
    967         for config in self.config.get_items('config'):
    968             builds['config'][config[0]] = config[1]
    969         builds['build'] = build
    970         builds_ = self.config.get_item_names('builds')
    971         builds['builds'] = {}
    972         for build in builds_:
    973             build_builds = self.config.comma_list('builds', build)
    974             has_config = False
    975             has_build = False
    976             for b in build_builds:
    977                 if ':' in b:
    978                     if has_build:
    979                         raise error.general('config and build in build: %s' % (build))
    980                     has_config = True
    981                 else:
    982                     if has_config:
    983                         raise error.general('config and build in build: %s' % (build))
    984                     has_build = True
    985             builds['builds'][build] = build_builds
    986         self.builds_ = builds
    987 
    988     def configs(self):
    989         return sorted(list(self.builds_['config'].keys()))
    990 
    991     def config_flags(self, config):
    992         if config not in self.builds_['config']:
    993             raise error.general('config entry not found: %s' % (config))
    994         return self.builds_['config'][config]
    995 
    996     def build(self):
    997         return self.builds_['build']
    998 
    999     def builds(self):
    1000         if self.builds_['build'] in self.builds_['builds']:
    1001             build = copy.copy(self.builds_['builds'][self.builds_['build']])
    1002             if ':' in build[0]:
    1003                 return [self.builds_['build']]
    1004             return build
    1005         return None
    1006 
    1007     def build_options(self, build):
    1008         return ' '.join(self._build_options(build))
    1009 
    1010     def excludes(self, arch, bsp):
    1011         return list(set(self.arch_excludes(arch) + self.bsp_excludes(arch, bsp)))
    1012 
    1013     def exclude_options(self, arch, bsp):
    1014         return ' '.join([self.config_flags('no-' + e) for e in self.excludes(arch, bsp)])
    1015 
    1016     def archs(self):
    1017         return sorted(self.archs.keys())
    1018 
    1019     def arch_present(self, arch):
    1020         return arch in self.archs
    1021 
    1022     def arch_excludes(self, arch):
    1023         excludes = self.archs[arch]['excludes'].keys()
    1024         for exclude in self.archs[arch]['excludes']:
    1025             if 'all' not in self.archs[arch]['excludes'][exclude]:
    1026                 excludes.remove(exclude)
    1027         return sorted(excludes)
    1028 
    1029     def arch_bsps(self, arch):
    1030         return sorted(self.archs[arch]['bsps'])
    1031 
    1032     def bsp_present(self, arch, bsp):
    1033         return bsp in self.archs[arch]['bsps']
    1034 
    1035     def bsp_excludes(self, arch, bsp):
    1036         excludes = self.archs[arch]['excludes'].keys()
    1037         for exclude in self.archs[arch]['excludes']:
    1038             if 'all' not in self.archs[arch]['excludes'][exclude] and \
    1039                bsp not in self.archs[arch]['excludes'][exclude]:
    1040                 excludes.remove(exclude)
    1041         return sorted(excludes)
    1042 
    1043     def bspopts(self, arch, bsp):
    1044         if arch not in self.archs:
    1045             raise error.general('invalid architecture: %s' % (arch))
    1046         if bsp not in self.archs[arch]:
    1047             raise error.general('invalid BSP: %s' % (bsp))
    1048         return self.archs[arch][bsp]['bspopts']
    1049 
    1050     def profile_present(self, profile):
    1051         return profile in self.profiles
    1052 
    1053     def profile_archs(self, profile):
    1054         if profile not in self.profiles:
    1055             raise error.general('invalid profile: %s' % (profile))
    1056         return self.profiles[profile]['archs']
    1057 
    1058     def profile_arch_bsps(self, profile, arch):
    1059         if profile not in self.profiles:
    1060             raise error.general('invalid profile: %s' % (profile))
    1061         if 'bsps_%s' % (arch) not in self.profiles[profile]:
    1062             raise error.general('invalid profile arch: %s' % (arch))
    1063         return ['%s/%s' % (arch, bsp) for bsp in self.profiles[profile]['bsps_%s' % (arch)]]
    1064 
    1065     def report(self, profiles = True, builds = True, architectures = True):
    1066         width = 70
    1067         cols_1 = [width]
    1068         cols_2 = [10, width - 10]
    1069         s = textbox.line(cols_1, line = '=', marker = '+', indent = 1)
    1070         s1 = ' File(s)'
    1071         for f in self.config.files():
    1072             colon = ':'
    1073             for l in textwrap.wrap(f, width = cols_2[1] - 3):
    1074                 s += textbox.row(cols_2, [s1, ' ' + l], marker = colon, indent = 1)
    1075                 colon = ' '
    1076                 s1 = ' ' * len(s1)
    1077         s += textbox.line(cols_1, marker = '+', indent = 1)
    1078         s += os.linesep
    1079         if profiles:
    1080             s += textbox.line(cols_1, line = '=', marker = '+', indent = 1)
    1081             profiles = sorted(self.profiles['profiles'])
    1082             archs = []
    1083             bsps = []
    1084             for profile in profiles:
    1085                 archs += self.profiles[profile]['archs']
    1086                 for arch in sorted(self.profiles[profile]['archs']):
    1087                     bsps += self.profiles[profile]['bsps_%s' % (arch)]
    1088             archs = len(set(archs))
    1089             bsps = len(set(bsps))
    1090             s += textbox.row(cols_1,
    1091                              [' Profiles : %d (archs:%d, bsps:%d)' % \
    1092                               (len(profiles), archs, bsps)],
    1093                              indent = 1)
    1094             for profile in profiles:
    1095                 textbox.row(cols_2,
    1096                             [profile, self.profiles[profile]['name']],
    1097                             indent = 1)
    1098             s += textbox.line(cols_1, marker = '+', indent = 1)
    1099             for profile in profiles:
    1100                 s += textbox.row(cols_1, [' %s' % (profile)], indent = 1)
    1101                 profile = self.profiles[profile]
    1102                 archs = sorted(profile['archs'])
    1103                 for arch in archs:
    1104                     arch_bsps = ', '.join(profile['bsps_%s' % (arch)])
    1105                     if len(arch_bsps) > 0:
    1106                         s += textbox.line(cols_2, marker = '+', indent = 1)
    1107                         s1 = ' ' + arch
    1108                         for l in textwrap.wrap(arch_bsps,
    1109                                                width = cols_2[1] - 3):
    1110                             s += textbox.row(cols_2, [s1, ' ' + l], indent = 1)
    1111                             s1 = ' ' * len(s1)
    1112                 s += textbox.line(cols_2, marker = '+', indent = 1)
    1113             s += os.linesep
    1114         if builds:
    1115             s += textbox.line(cols_1, line = '=', marker = '+', indent = 1)
    1116             s += textbox.row(cols_1,
    1117                              [' Builds:  %s (default)' % (self.builds_['default'])],
    1118                              indent = 1)
    1119             builds = self.builds_['builds']
    1120             bsize = 0
    1121             for build in builds:
    1122                 if len(build) > bsize:
    1123                     bsize = len(build)
    1124             cols_b = [bsize + 2, width - bsize - 2]
    1125             s += textbox.line(cols_b, marker = '+', indent = 1)
    1126             for build in builds:
    1127                 s1 = ' ' + build
    1128                 for l in textwrap.wrap(', '.join(builds[build]),
    1129                                        width = cols_b[1] - 3):
    1130                     s += textbox.row(cols_b, [s1, ' ' + l], indent = 1)
    1131                     s1 = ' ' * len(s1)
    1132                 s += textbox.line(cols_b, marker = '+', indent = 1)
    1133             configs = self.builds_['config']
    1134             s += textbox.row(cols_1,
    1135                              [' Configure Options: %d' % (len(configs))],
    1136                              indent = 1)
    1137             csize = 0
    1138             for config in configs:
    1139                 if len(config) > csize:
    1140                     csize = len(config)
    1141             cols_c = [csize + 3, width - csize - 3]
    1142             s += textbox.line(cols_c, marker = '+', indent = 1)
    1143             for config in configs:
    1144                 s1 = ' ' + config
    1145                 for l in textwrap.wrap(configs[config], width = cols_c[1] - 3):
    1146                     s += textbox.row(cols_c, [s1, ' ' + l], indent = 1)
    1147                     s1 = ' ' * len(s1)
    1148                 s += textbox.line(cols_c, marker = '+', indent = 1)
    1149             s += os.linesep
    1150         if architectures:
    1151             s += textbox.line(cols_1, line = '=', marker = '+', indent = 1)
    1152             archs = sorted(self.archs.keys())
    1153             bsps = 0
    1154             asize = 0
    1155             for arch in archs:
    1156                 if len(arch) > asize:
    1157                     asize = len(arch)
    1158                 bsps += len(self.archs[arch]['bsps'])
    1159             s += textbox.row(cols_1,
    1160                              [' Architectures : %d (bsps: %d)' % (len(archs), bsps)],
    1161                              indent = 1)
    1162             cols_a = [asize + 2, width - asize - 2]
    1163             s += textbox.line(cols_a, marker = '+', indent = 1)
    1164             for arch in archs:
    1165                 s += textbox.row(cols_a,
    1166                                  [' ' + arch, ' %d' % (len(self.archs[arch]['bsps']))],
    1167                                  indent = 1)
    1168             s += textbox.line(cols_a, marker = '+', indent = 1)
    1169             for archn in archs:
    1170                 arch = self.archs[archn]
    1171                 if len(arch['bsps']) > 0:
    1172                     bsize = 0
    1173                     for bsp in arch['bsps']:
    1174                         if len(bsp) > bsize:
    1175                             bsize = len(bsp)
    1176                     cols_b = [bsize + 3, width - bsize - 3]
    1177                     s += textbox.row(cols_1, [' ' + archn + ':'], indent = 1)
    1178                     s += textbox.line(cols_b, marker = '+', indent = 1)
    1179                     for bsp in arch['bsps']:
    1180                         s1 = ' ' + bsp
    1181                         bspopts = ' '.join(arch[bsp]['bspopts'])
    1182                         if len(bspopts):
    1183                             for l in textwrap.wrap('bopt: ' + bspopts,
    1184                                                    width = cols_b[1] - 3):
    1185                                 s += textbox.row(cols_b, [s1, ' ' + l], indent = 1)
    1186                                 s1 = ' ' * len(s1)
    1187                         excludes = []
    1188                         for exclude in arch['excludes']:
    1189                             if 'all' in arch['excludes'][exclude] or \
    1190                                bsp in arch['excludes'][exclude]:
    1191                                 excludes += [exclude]
    1192                         excludes = ', '.join(excludes)
    1193                         if len(excludes):
    1194                             for l in textwrap.wrap('ex: ' + excludes,
    1195                                                    width = cols_b[1] - 3):
    1196                                 s += textbox.row(cols_b, [s1, ' ' + l], indent = 1)
    1197                                 s1 = ' ' * len(s1)
    1198                         if len(bspopts) == 0 and len(excludes) == 0:
    1199                             s += textbox.row(cols_b, [s1, ' '], indent = 1)
    1200                     s += textbox.line(cols_b, marker = '+', indent = 1)
    1201             s += os.linesep
    1202         return s
    1203 
    1204883class build_jobs:
    1205884
     
    14431122    ec = 0
    14441123    try:
    1445         #
    1446         # On Windows MSYS2 prepends a path to itself to the environment
    1447         # path. This means the RTEMS specific automake is not found and which
    1448         # breaks the bootstrap. We need to remove the prepended path. Also
    1449         # remove any ACLOCAL paths from the environment.
    1450         #
    1451         if os.name == 'nt':
    1452             cspath = os.environ['PATH'].split(os.pathsep)
    1453             if 'msys' in cspath[0] and cspath[0].endswith('bin'):
    1454                 os.environ['PATH'] = os.pathsep.join(cspath[1:])
     1124        rtems.clean_windows_path()
    14551125
    14561126        start = datetime.datetime.now()
     
    14611131        logf = 'bsp-build-%s.txt' % \
    14621132               (datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
    1463         config_file = path.join(top, 'share', 'rtems', 'tester',
    1464                                 'rtems', 'rtems-bsps.ini')
     1133        config_file = path.join(top, 'config', 'rtems-bsps.ini')
    14651134        if not path.exists(config_file):
    1466             config_file = path.join(top, 'tester', 'rtems', 'rtems-bsps.ini')
     1135            config_file = path.join(top, 'share', 'rtems', 'config', 'rtems-bsps.ini')
    14671136
    14681137        argsp = argparse.ArgumentParser()
     
    15221191                                                        smtp_host))
    15231192
    1524         config = configuration_()
     1193        config = rtems.configuration()
    15251194        config.load(config_file, opts.build)
    15261195
  • wscript

    r5075e8e r5416cfa  
    3434
    3535subdirs = ['rtemstoolkit',
     36           'config',
    3637           'linkers',
    3738           'misc',
Note: See TracChangeset for help on using the changeset viewer.