diff options
Diffstat (limited to 'rtems.py')
-rw-r--r-- | rtems.py | 389 |
1 files changed, 254 insertions, 135 deletions
@@ -1,4 +1,3 @@ - # Copyright 2012-2016 Chris Johns (chrisj@rtems.org) # # Redistribution and use in source and binary forms, with or without @@ -42,34 +41,38 @@ rtems_long_commands = False windows = os.name == 'nt' or sys.platform in ['msys', 'cygwin'] + def options(opt): - opt.add_option('--rtems', - default = None, - dest = 'rtems_path', - help = 'Path to an installed RTEMS (defaults to prefix).') - opt.add_option('--rtems-tools', - default = None, - dest = 'rtems_tools', - help = 'Path to RTEMS tools (defaults to path to installed RTEMS).') - opt.add_option('--rtems-version', - default = None, - dest = 'rtems_version', - help = 'RTEMS version (default is derived from prefix).') - opt.add_option('--rtems-archs', - default = 'all', - dest = 'rtems_archs', - help = 'List of RTEMS architectures to build.') - opt.add_option('--rtems-bsps', - default = 'all', - dest = 'rtems_bsps', - help = 'List of BSPs to build.') - opt.add_option('--show-commands', - action = 'store_true', - default = False, - dest = 'show_commands', - help = 'Print the commands as strings.') - -def init(ctx, filters = None, version = None, long_commands = False, bsp_init = None): + copts = opt.option_groups['configure options'] + copts.add_option('--rtems', + default=None, + dest='rtems_path', + help='Path to an installed RTEMS (defaults to prefix).') + copts.add_option( + '--rtems-tools', + default=None, + dest='rtems_tools', + help='Path to RTEMS tools (defaults to path to installed RTEMS).') + copts.add_option('--rtems-version', + default=None, + dest='rtems_version', + help='RTEMS version (default is derived from prefix).') + copts.add_option('--rtems-archs', + default='all', + dest='rtems_archs', + help='List of RTEMS architectures to build.') + copts.add_option('--rtems-bsps', + default='all', + dest='rtems_bsps', + help='List of BSPs to build.') + copts.add_option('--show-commands', + action='store_true', + default=False, + dest='show_commands', + help='Print the commands as strings.') + + +def init(ctx, filters=None, version=None, long_commands=False, bsp_init=None): global rtems_filters global rtems_default_version global rtems_long_commands @@ -119,11 +122,14 @@ def init(ctx, filters = None, version = None, long_commands = False, bsp_init = from waflib.Build import BuildContext, CleanContext, \ InstallContext, UninstallContext for x in arch_bsps: - for y in (BuildContext, CleanContext, InstallContext, UninstallContext): - name = y.__name__.replace('Context','').lower() + for y in (BuildContext, CleanContext, InstallContext, + UninstallContext): + name = y.__name__.replace('Context', '').lower() + class context(y): cmd = name + '-' + x variant = x + contexts += [context] # @@ -143,8 +149,9 @@ def init(ctx, filters = None, version = None, long_commands = False, bsp_init = if bsp_init: bsp_init(ctx, env, contexts) -def test_application(more = []): - code = ['#include <rtems.h>'] + +def test_application(more=[]): + code = ['#include <rtems.h>'] code += more code += ['void Init(rtems_task_argument arg) { (void)arg; }'] code += ['#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER'] @@ -154,15 +161,18 @@ def test_application(more = []): code += ['#include <rtems/confdefs.h>'] return os.linesep.join(code) -def configure(conf, bsp_configure = None): + +def configure(conf, bsp_configure=None): # # Check the environment for any flags. # - for f in ['CC', 'CXX', 'AS', 'LD', 'AR', 'LINK_CC', 'LINK_CXX', - 'CPPFLAGS', 'CFLAGS', 'CXXFLAGS', 'ASFLAGS', 'LINKFLAGS', 'LIB' - 'WFLAGS', 'RFLAGS', 'MFLAGS', 'IFLAGS']: + for f in [ + 'CC', 'CXX', 'AS', 'LD', 'AR', 'LINK_CC', 'LINK_CXX', 'CPPFLAGS', + 'CFLAGS', 'CXXFLAGS', 'ASFLAGS', 'LINKFLAGS', 'LIB' + 'WFLAGS', 'RFLAGS', 'MFLAGS', 'IFLAGS' + ]: if f in os.environ: - conf.msg('Environment variable set', f, color = 'RED') + conf.msg('Environment variable set', f, color='RED') # # Handle the configurable commands options. @@ -195,6 +205,7 @@ def configure(conf, bsp_configure = None): tools = {} env = conf.env.derive() + conf.env.RTEMS_ARCH_BSP_LIST = arch_bsps for ab in arch_bsps: conf.setenv(ab, env) @@ -211,7 +222,7 @@ def configure(conf, bsp_configure = None): conf.msg('Long commands', long_commands) arch = _arch_from_arch_bsp(ab) - bsp = _bsp_from_arch_bsp(ab) + bsp = _bsp_from_arch_bsp(ab) conf.env.ARCH_BSP = '%s/%s' % (arch.split('-')[0], bsp) @@ -229,7 +240,7 @@ def configure(conf, bsp_configure = None): conf.load('gcc') conf.load('g++') conf.load('gas') - conf.load('gccdeps', tooldir = os.path.dirname(__file__)) + conf.load('gccdeps', tooldir=os.path.dirname(__file__)) # # Get the version of the tools being used. @@ -238,7 +249,7 @@ def configure(conf, bsp_configure = None): try: import waflib.Context out = conf.cmd_and_log([rtems_cc, '--version'], - output = waflib.Context.STDOUT) + output=waflib.Context.STDOUT) except Exception as e: conf.fatal('CC version not found: %s' % (e.stderr)) # @@ -246,34 +257,34 @@ def configure(conf, bsp_configure = None): # vline = out.split('\n')[0] conf.msg('Compiler version (%s)' % (os.path.basename(rtems_cc)), - ' '.join(vline.split()[2:])) + ' '.join(vline.split()[2:])) flags = _load_flags(conf, ab, rtems_path) - cflags = _filter_flags('cflags', flags['CFLAGS'], - arch, rtems_path) - ldflags = _filter_flags('ldflags', flags['LDFLAGS'], - arch, rtems_path) - - conf.env.CFLAGS = cflags['cflags'] - conf.env.CXXFLAGS = cflags['cflags'] - conf.env.ASFLAGS = cflags['cflags'] - conf.env.WFLAGS = cflags['warnings'] - conf.env.RFLAGS = cflags['specs'] - conf.env.MFLAGS = cflags['machines'] - conf.env.IFLAGS = cflags['includes'] + cflags = _filter_flags('cflags', flags['CFLAGS'], arch, rtems_path) + ldflags = _filter_flags('ldflags', flags['LDFLAGS'], arch, rtems_path) + + conf.env.CFLAGS = cflags['cflags'] + conf.env.CXXFLAGS = cflags['cflags'] + conf.env.ASFLAGS = cflags['cflags'] + conf.env.WFLAGS = cflags['warnings'] + conf.env.RFLAGS = cflags['specs'] + conf.env.MFLAGS = cflags['machines'] + conf.env.IFLAGS = _filter_inc_opts(cflags['includes'], '-I') + conf.env.ISYSTEM = _filter_inc_opts(cflags['includes'], '-isystem') + conf.env.ISYSROOT = _filter_inc_opts(cflags['includes'], '-sysroot') conf.env.LINKFLAGS = cflags['cflags'] + ldflags['ldflags'] - conf.env.LIB = flags['LIB'] - conf.env.LIBPATH = ldflags['libpath'] + conf.env.LIB = flags['LIB'] + conf.env.LIBPATH = ldflags['libpath'] conf.env.RTRACE_WRAPPER_ST = '-W %s' # # Checks for various RTEMS features. # - conf.check_cc(fragment = test_application(), - execute = False, - msg = 'Checking for a valid RTEMS BSP installation') + conf.check_cc(fragment=test_application(), + execute=False, + msg='Checking for a valid RTEMS BSP installation') load_cpuopts(conf) # @@ -297,19 +308,19 @@ def configure(conf, bsp_configure = None): conf.env.SHOW_COMMANDS = show_commands conf.env.LONG_COMMANDS = long_commands + def build(bld): if bld.env.SHOW_COMMANDS == 'yes': output_command_line() if bld.env.LONG_COMMANDS == 'yes': long_command_line() + def load_cpuopts(conf): - options = ['RTEMS_DEBUG', - 'RTEMS_MULTIPROCESSING', - 'RTEMS_NEWLIB', - 'RTEMS_POSIX_API', - 'RTEMS_SMP', - 'RTEMS_NETWORKING'] + options = [ + 'RTEMS_DEBUG', 'RTEMS_MULTIPROCESSING', 'RTEMS_NEWLIB', + 'RTEMS_POSIX_API', 'RTEMS_SMP', 'RTEMS_NETWORKING' + ] for opt in options: enabled = check_cpuopt(conf, opt) if enabled: @@ -317,23 +328,24 @@ def load_cpuopts(conf): else: conf.env[opt] = 'No' + def check(conf, *k, **kw): if 'fragment' not in kw: kw['fragment'] = test_application() conf.check(k, kw) + def check_cc(conf, *k, **kw): if 'fragment' not in kw: kw['fragment'] = test_application() conf.check_cc(*k, **kw) -def check_lib_path(ctx, lib, libpath = [], mandatory = True): + +def check_lib_path(ctx, lib, libpath=[], mandatory=True): lib_lib = 'lib%s.a' % (lib) ctx.start_msg('Library %s' % (lib_lib)) - cmd = '%s %s %s -print-file-name=%s' % (' '.join(ctx.env.CC), - ' '.join(ctx.env.CFLAGS), - ' '.join(['-B' + l for l in libpath]), - lib_lib) + cmd = '%s %s %s -print-file-name=%s' % (' '.join(ctx.env.CC), ' '.join( + ctx.env.CFLAGS), ' '.join(['-B' + l for l in libpath]), lib_lib) out = ctx.cmd_and_log(cmd) out = os.path.normpath(out.strip()) if out == lib_lib: @@ -341,9 +353,11 @@ def check_lib_path(ctx, lib, libpath = [], mandatory = True): ctx.fatal('The library %s not found' % (lib_lib)) ctx.end_msg('not found') else: - ctx.env['LIBPATH_lib%s' % (lib)] = '..' + '/..' * (ctx.path.height() - 1) + out + ctx.env['LIBPATH_lib%s' % + (lib)] = '..' + '/..' * (ctx.path.height() - 1) + out ctx.end_msg('found') + def check_lib(ctx, libs): if not isinstance(libs, list): lib = [libs] @@ -352,8 +366,9 @@ def check_lib(ctx, libs): return False return True + def check_cpuopt(conf, opt): - code = ['#ifndef %s' % (opt)] + code = ['#ifndef %s' % (opt)] code += [' #error %s is not defined' % (opt)] code += ['#endif'] code += ['#if %s' % (opt)] @@ -362,13 +377,14 @@ def check_cpuopt(conf, opt): code += [' #error %s is false' % (opt)] code += ['#endif'] try: - conf.check_cc(fragment = test_application(code), - execute = False, - msg = 'Checking for %s' % (opt)) + conf.check_cc(fragment=test_application(code), + execute=False, + msg='Checking for %s' % (opt)) except conf.errors.WafError: - return False; + return False return True + def tweaks(conf, arch_bsp): # # Hack to work around NIOS2 naming. @@ -387,9 +403,11 @@ def tweaks(conf, arch_bsp): conf.env.LINKFLAGS += ['-Wl,-Ttext,0x00100000'] if '-ffunction-sections' in conf.env.CFLAGS: - conf.env.LINKFLAGS += ['-Wl,--gc-sections'] + conf.env.LINKFLAGS += ['-Wl,--gc-sections'] + -def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_archs, rtems_bsps): +def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, + rtems_archs, rtems_bsps): # # Set defaults # @@ -399,7 +417,8 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_arc if m: rtems_version = m.group(1) else: - ctx.fatal('RTEMS version cannot derived from prefix: ' + prefix) + ctx.fatal('RTEMS version cannot derived from prefix: ' + + prefix) else: rtems_version = rtems_default_version if rtems_path is None: @@ -417,10 +436,13 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_arc elif os.path.exists(os.path.join(rtems_path, 'rtems-config')): rtems_config = os.path.join(rtems_path, 'rtems-config') else: - ctx.fatal('RTEMS path is not valid. No lib/pkgconfig or rtems-config found.') - rtems_share_rtems_version = os.path.join(rtems_path, 'share', 'rtems' + rtems_version) + ctx.fatal( + 'RTEMS path is not valid. No lib/pkgconfig or rtems-config found.') + rtems_share_rtems_version = os.path.join(rtems_path, 'share', + 'rtems' + rtems_version) if not os.path.exists(os.path.join(rtems_share_rtems_version)): - ctx.fatal('RTEMS path is not valid, "%s" not found.' % (rtems_share_rtems_version)) + ctx.fatal('RTEMS path is not valid, "%s" not found.' % + (rtems_share_rtems_version)) # # We can more than one path to tools. This happens when testing different @@ -432,7 +454,9 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_arc if not os.path.exists(path): ctx.fatal('RTEMS tools path not found: ' + path) if not os.path.exists(os.path.join(path, 'bin')): - ctx.fatal('RTEMS tools path does not contain a \'bin\' directory: ' + path) + ctx.fatal( + 'RTEMS tools path does not contain a \'bin\' directory: ' + + path) tools += [os.path.join(path, 'bin')] # @@ -447,7 +471,8 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_arc if rtems_archs == 'all': archs = _find_installed_archs(rtems_config, rtems_path, rtems_version) else: - archs = _check_archs(rtems_config, rtems_archs, rtems_path, rtems_version) + archs = _check_archs(rtems_config, rtems_archs, rtems_path, + rtems_version) # # Filter the architectures. @@ -465,9 +490,11 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_arc # to those referenced by the BSPs. # if rtems_bsps == 'all': - arch_bsps = _find_installed_arch_bsps(rtems_config, rtems_path, archs, rtems_version) + arch_bsps = _find_installed_arch_bsps(rtems_config, rtems_path, archs, + rtems_version) else: - arch_bsps = _check_arch_bsps(rtems_bsps, rtems_config, rtems_path, archs, rtems_version) + arch_bsps = _check_arch_bsps(rtems_bsps, rtems_config, rtems_path, + archs, rtems_version) if len(arch_bsps) == 0: ctx.fatal('No valid arch/bsps found') @@ -479,52 +506,69 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, rtems_version, rtems_arc return rtems_version, rtems_path, tools, archs, arch_bsps + def check_env(ctx, *env_vars): for v in env_vars: if v not in ctx.env or len(ctx.env[v]) == 0: return False return True -def check(ctx, option, setting = 'Yes'): + +def check(ctx, option, setting='Yes'): if option in ctx.env: if isinstance(setting, bool): return True return ctx.env[option] == setting return False + def check_debug(ctx): return check(ctx, 'RTEMS_DEBUG') + def check_multiprocessing(ctx): return check(ctx, 'RTEMS_MULTIPROCESSING') + def check_newlib(ctx): return check(ctx, 'RTEMS_NEWLIB') + def check_posix(ctx): return check(ctx, 'RTEMS_POSIX_API') + def check_smp(ctx): return check(ctx, 'RTEMS_SMP') + def check_networking(ctx): return check(ctx, 'RTEMS_NETWORKING') + def arch(arch_bsp): """ Given an arch/bsp return the architecture.""" return _arch_from_arch_bsp(arch_bsp).split('-')[0] + def bsp(arch_bsp): """ Given an arch/bsp return the BSP.""" return _bsp_from_arch_bsp(arch_bsp) + +def arch_bsp_name(arch_bsp): + return arch(arch_bsp) + '/' + bsp(arch_bsp) + + def arch_bsps(ctx): """ Return the list of arch/bsps we are building.""" return ctx.env.ARCH_BSPS + def arch_bsp_env(ctx, arch_bsp): return ctx.env_of_name(arch_bsp).derive() + def filter(ctx, filter, items): if rtems_filters is None: return items @@ -560,22 +604,28 @@ def filter(ctx, filter, items): ctx.fatal('Following %s not found: %s' % (filter, ', '.join(items_in))) return sorted(filtered_items) + def arch_rtems_version(version, arch): """ Return the RTEMS architecture path, ie sparc-rtems4.11.""" return '%s-rtems%s' % (arch, version) + def arch_bsp_path(version, arch_bsp): """ Return the BSP path.""" - return '%s/%s' % (arch_rtems_version(version, arch(arch_bsp)), bsp(arch_bsp)) + return '%s/%s' % (arch_rtems_version(version, + arch(arch_bsp)), bsp(arch_bsp)) + def arch_bsp_include_path(version, arch_bsp): """ Return the BSP include path.""" return '%s/lib/include' % (arch_bsp_path(version, arch_bsp)) + def arch_bsp_lib_path(version, arch_bsp): """ Return the BSP library path. """ return '%s/lib' % (arch_bsp_path(version, arch_bsp)) + def library_path(library, cc, cflags): cmd = cc + cflags + ['-print-file-name=%s' % library] a = subprocess.check_output(cmd) @@ -584,18 +634,19 @@ def library_path(library, cc, cflags): return os.path.dirname(lib) return None + def root_filesystem(bld, name, files, tar, obj): tar_rule = 'tar -cf ${TGT} --format=ustar -C ../.. $(echo "${SRC}" | sed -e \'s/\.\.\/\.\.\///g\')' if windows: tar_rule = 'sh -c "%s"' % (tar_rule) - bld(name = name + '_tar', - target = tar, - source = files, - rule = tar_rule) - bld.objects(name = name, - target = obj, - source = tar, - rule = '${OBJCOPY} -I binary -B ${RTEMS_ARCH} ${OBJCOPY_FLAGS} ${SRC} ${TGT}') + bld(name=name + '_tar', target=tar, source=files, rule=tar_rule) + bld.objects( + name=name, + target=obj, + source=tar, + rule= + '${OBJCOPY} -I binary -B ${RTEMS_ARCH} ${OBJCOPY_FLAGS} ${SRC} ${TGT}') + def clone_tasks(bld): if bld.cmd == 'build': @@ -607,6 +658,7 @@ def clone_tasks(bld): cloned_obj.posted = True obj.posted = True + # # From the demos. Use this to get the command to cut+paste to play. # @@ -614,6 +666,7 @@ def output_command_line(): # first, display strings, people like them from waflib import Utils, Logs from waflib.Context import Context + def exec_command(self, cmd, **kw): subprocess = Utils.subprocess kw['shell'] = isinstance(cmd, str) @@ -621,7 +674,7 @@ def output_command_line(): Logs.info('%s' % cmd) else: cmdstr = ' '.join(cmd) - Logs.info('(%d) %s' % (len(cmdstr), cmdstr)) # here is the change + Logs.info('(%d) %s' % (len(cmdstr), cmdstr)) # here is the change if not isinstance(kw['cwd'], str): kw['cwd'] = str(kw['cwd']) Logs.debug('runner_env: kw=%s' % kw) @@ -632,28 +685,36 @@ def output_command_line(): p = subprocess.Popen(cmd, **kw) (out, err) = p.communicate() if out: - self.logger.debug('out: %s' % out.decode(sys.stdout.encoding or 'iso8859-1')) + self.logger.debug( + 'out: %s' % + out.decode(sys.stdout.encoding or 'iso8859-1')) if err: - self.logger.error('err: %s' % err.decode(sys.stdout.encoding or 'iso8859-1')) + self.logger.error( + 'err: %s' % + err.decode(sys.stdout.encoding or 'iso8859-1')) return p.returncode else: p = subprocess.Popen(cmd, **kw) return p.wait() except OSError: return -1 + Context.exec_command = exec_command # Change the outputs for tasks too from waflib.Task import Task + def display(self): - return '' # no output on empty strings + return '' # no output on empty strings Task.__str__ = display + # # From the extras. Use this to support long command lines. # def long_command_line(): + def exec_command(self, cmd, **kw): # workaround for command line length limit: # http://support.microsoft.com/kb/830473 @@ -661,8 +722,12 @@ def long_command_line(): tmp = None try: if not isinstance(cmd, str) and len(str(cmd)) > 8192: - (fd, tmp) = tempfile.mkstemp(dir=self.generator.bld.bldnode.abspath()) - flat = ['"%s"' % x.replace('\\', '\\\\').replace('"', '\\"') for x in cmd[1:]] + (fd, tmp) = tempfile.mkstemp( + dir=self.generator.bld.bldnode.abspath()) + flat = [ + '"%s"' % x.replace('\\', '\\\\').replace('"', '\\"') + for x in cmd[1:] + ] try: os.write(fd, ' '.join(flat).encode()) finally: @@ -676,42 +741,55 @@ def long_command_line(): if tmp: os.remove(tmp) return ret - for k in 'c cxx cprogram cxxprogram cshlib cxxshlib cstlib cxxstlib'.split(): + + for k in 'c cxx cprogram cxxprogram cshlib cxxshlib cstlib cxxstlib'.split( + ): cls = Task.classes.get(k) if cls: - derived_class = type(k, (cls,), {}) + derived_class = type(k, (cls, ), {}) derived_class.exec_command = exec_command if hasattr(cls, 'hcode'): derived_class.hcode = cls.hcode + def _find_tools(conf, arch, paths, tools): if arch not in tools: arch_tools = {} - arch_tools['CC'] = conf.find_program([arch + '-gcc'], path_list = paths) - arch_tools['CXX'] = conf.find_program([arch + '-g++'], path_list = paths) - arch_tools['LINK_CC'] = arch_tools['CC'] - arch_tools['LINK_CXX'] = arch_tools['CXX'] - arch_tools['AS'] = conf.find_program([arch + '-gcc'], path_list = paths) - arch_tools['LD'] = conf.find_program([arch + '-ld'], path_list = paths) - arch_tools['AR'] = conf.find_program([arch + '-ar'], path_list = paths) - arch_tools['NM'] = conf.find_program([arch + '-nm'], path_list = paths) - arch_tools['OBJDUMP'] = conf.find_program([arch + '-objdump'], path_list = paths) - arch_tools['OBJCOPY'] = conf.find_program([arch + '-objcopy'], path_list = paths) - arch_tools['READELF'] = conf.find_program([arch + '-readelf'], path_list = paths) - arch_tools['STRIP'] = conf.find_program([arch + '-strip'], path_list = paths) - arch_tools['RANLIB'] = conf.find_program([arch + '-ranlib'], path_list = paths) - arch_tools['RTEMS_LD'] = conf.find_program(['rtems-ld'], path_list = paths, - mandatory = False) - arch_tools['RTEMS_TLD'] = conf.find_program(['rtems-tld'], path_list = paths, - mandatory = False) - arch_tools['RTEMS_SYMS'] = conf.find_program(['rtems-syms'], path_list = paths, - mandatory = False) - arch_tools['RTEMS_BIN2C'] = conf.find_program(['rtems-bin2c'], path_list = paths, - mandatory = False) - arch_tools['TAR'] = conf.find_program(['tar'], mandatory = False) + arch_tools['CC'] = conf.find_program([arch + '-gcc'], path_list=paths) + arch_tools['CXX'] = conf.find_program([arch + '-g++'], path_list=paths) + arch_tools['LINK_CC'] = arch_tools['CC'] + arch_tools['LINK_CXX'] = arch_tools['CXX'] + arch_tools['AS'] = conf.find_program([arch + '-gcc'], path_list=paths) + arch_tools['LD'] = conf.find_program([arch + '-ld'], path_list=paths) + arch_tools['AR'] = conf.find_program([arch + '-ar'], path_list=paths) + arch_tools['NM'] = conf.find_program([arch + '-nm'], path_list=paths) + arch_tools['OBJDUMP'] = conf.find_program([arch + '-objdump'], + path_list=paths) + arch_tools['OBJCOPY'] = conf.find_program([arch + '-objcopy'], + path_list=paths) + arch_tools['READELF'] = conf.find_program([arch + '-readelf'], + path_list=paths) + arch_tools['STRIP'] = conf.find_program([arch + '-strip'], + path_list=paths) + arch_tools['RANLIB'] = conf.find_program([arch + '-ranlib'], + path_list=paths) + arch_tools['RTEMS_LD'] = conf.find_program(['rtems-ld'], + path_list=paths, + mandatory=False) + arch_tools['RTEMS_TLD'] = conf.find_program(['rtems-tld'], + path_list=paths, + mandatory=False) + arch_tools['RTEMS_SYMS'] = conf.find_program(['rtems-syms'], + path_list=paths, + mandatory=False) + arch_tools['RTEMS_BIN2C'] = conf.find_program(['rtems-bin2c'], + path_list=paths, + mandatory=False) + arch_tools['TAR'] = conf.find_program(['tar'], mandatory=False) tools[arch] = arch_tools return tools + def _find_installed_archs(config, path, version): archs = [] if config is None: @@ -726,6 +804,7 @@ def _find_installed_archs(config, path, version): archs.sort() return archs + def _check_archs(config, req, path, version): installed = _find_installed_archs(config, path, version) archs = [] @@ -736,6 +815,7 @@ def _check_archs(config, req, path, version): archs.sort() return archs + def _find_installed_arch_bsps(config, path, archs, version): arch_bsps = [] if config is None: @@ -751,6 +831,7 @@ def _find_installed_arch_bsps(config, path, archs, version): arch_bsps.sort() return arch_bsps + def _check_arch_bsps(req, config, path, archs, version): archs_bsps = [] for ab in req.split(','): @@ -776,15 +857,27 @@ def _check_arch_bsps(req, config, path, archs, version): bsps.sort() return bsps + def _arch_from_arch_bsp(arch_bsp): - return '-'.join(arch_bsp.split('-')[:2]) + fields = arch_bsp.split('-') + for i, field in enumerate(fields): + if field.startswith('rtems') and fields[:(i + 1)] is not None: + return '-'.join(fields[:(i + 1)]) + return None + def _bsp_from_arch_bsp(arch_bsp): - return '-'.join(arch_bsp.split('-')[2:]) + fields = arch_bsp.split('-') + for i, field in enumerate(fields): + if field.startswith('rtems') and fields[(i + 1):] is not None: + return '-'.join(fields[(i + 1):]) + return None + def _pkgconfig_path(path): return os.path.join(path, 'lib', 'pkgconfig') + def _load_flags(conf, arch_bsp, path): if not os.path.exists(path): ctx.fatal('RTEMS path not found.') @@ -808,6 +901,7 @@ def _load_flags(conf, arch_bsp, path): flags['CFLAGS'] += ['-MMD'] return flags + def _load_flags_set(flags, arch_bsp, conf, config, pkg): conf.to_log('%s ->' % flags) if pkg is not None: @@ -818,9 +912,11 @@ def _load_flags_set(flags, arch_bsp, conf, config, pkg): conf.to_log('pkconfig warning: ' + e.msg) conf.to_log(' ' + flagstr) else: - flags_map = { 'CFLAGS': '--cflags', - 'LDFLAGS': '--ldflags', - 'LIB': '--libs' } + flags_map = { + 'CFLAGS': '--cflags', + 'LDFLAGS': '--ldflags', + 'LIB': '--libs' + } ab = arch_bsp.split('-') #conf.check_cfg(path = config, # package = '', @@ -829,7 +925,9 @@ def _load_flags_set(flags, arch_bsp, conf, config, pkg): #print conf.env #print '%r' % conf #flagstr = '-l -c' - flagstr = subprocess.check_output([config, '--bsp', '%s/%s' % (ab[0], ab[2]), flags_map[flags]]) + flagstr = subprocess.check_output( + [config, '--bsp', + '%s/%s' % (ab[0], ab[2]), flags_map[flags]]) #print flags, ">>>>", flagstr if flags == 'CFLAGS': flagstr += ' -DWAF_BUILD=1' @@ -837,6 +935,16 @@ def _load_flags_set(flags, arch_bsp, conf, config, pkg): flagstr = 'rtemscpu rtemsbsp c rtemscpu rtemsbsp' return flagstr.split() + +def _filter_inc_opts(incpaths, incopt): + paths = [] + for ip in incpaths: + if ip.startswith(incopt): + paths += [ip[len(incopt):]] + break + return paths + + def _filter_flags(label, flags, arch, rtems_path): flag_groups = \ @@ -849,7 +957,7 @@ def _filter_flags(label, flags, arch, rtems_path): flags = _strip_cflags(flags) - _flags = { label: [] } + _flags = {label: []} for fg in flag_groups: _flags[fg['key']] = [] @@ -883,6 +991,7 @@ def _filter_flags(label, flags, arch, rtems_path): _flags[label] += opts return _flags + def _strip_cflags(cflags): _cflags = [] for o in cflags: @@ -894,9 +1003,11 @@ def _strip_cflags(cflags): _cflags += [o] return _cflags + def _log_header(conf): conf.to_log('-----------------------------------------') + def _get_dir_hash(bld): from waflib import ConfigSet, Options import hashlib @@ -923,6 +1034,7 @@ def _get_dir_hash(bld): f1.close() return shahash.hexdigest() + def test_uninstall(bld): from os import sys @@ -943,6 +1055,7 @@ def test_uninstall(bld): else: print("Test failed") + from waflib import Task from waflib import TaskGen from waflib import Utils @@ -950,19 +1063,25 @@ from waflib import Node from waflib.Tools.ccroot import link_task, USELIB_VARS USELIB_VARS['rap'] = set(['RTEMS_LINKFLAGS']) -USELIB_VARS['rtrace'] = set(['RTRACE_FLAGS', 'RTRACE_CFG', 'RTRACE_WRAPPER', 'RTRACE_LINKCMDS']) +USELIB_VARS['rtrace'] = set( + ['RTRACE_FLAGS', 'RTRACE_CFG', 'RTRACE_WRAPPER', 'RTRACE_LINKCMDS']) + class rap(link_task): "Link object files into a RTEMS application" run_str = '${RTEMS_LD} ${RTEMS_LINKFLAGS} --cc ${CC} ${SRC} -o ${TGT[0].abspath()} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB}' ext_out = ['.rap'] - vars = ['RTEMS_LINKFLAGS', 'LINKDEPS'] + vars = ['RTEMS_LINKFLAGS', 'LINKDEPS'] inst_to = '${BINDIR}' + class rtrace(link_task): "Link object files into a RTEMS trace application" run_str = '${RTEMS_TLD} ${RTACE_FLAGS} ${RTRACE_WRAPPER_ST:RTRACE_WRAPPER} -C ${RTRACE_CFG} -r ${RTEMS_PATH} -B ${ARCH_BSP} -c ${CC} -l ${CC} -- ${SRC} ${LINKFLAGS} ${RTRACE_LINKFLAGS} -o ${TGT[0].abspath()} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB}' ext_out = ['.texe'] - vars = ['RTRACE_FLAGS', 'RTRACE_CFG', 'RTRACE_WRAPER', 'RTRACE_LINKFLAGS', 'LINKDEPS'] + vars = [ + 'RTRACE_FLAGS', 'RTRACE_CFG', 'RTRACE_WRAPER', 'RTRACE_LINKFLAGS', + 'LINKDEPS' + ] inst_to = '${BINDIR}' color = 'PINK' |