Hi Hesham, This is a great addition to rtems_waf, some comments below.
On 16/3/20 2:56 am, Hesham Almatary wrote: > --- > rtems.py | 85 +++++++++++++++++++++++++++++++++++++++++--------------- > 1 file changed, 62 insertions(+), 23 deletions(-) > > diff --git a/rtems.py b/rtems.py > index ffb386f..f1ef4de 100644 > --- a/rtems.py > +++ b/rtems.py > @@ -1,4 +1,5 @@ > > +# Copyright 2020 Hesham Almatary > # Copyright 2012-2016 Chris Johns (chr...@rtems.org) > # > # Redistribution and use in source and binary forms, with or without > @@ -63,6 +64,10 @@ def options(opt): > default = 'all', > dest = 'rtems_bsps', > help = 'List of BSPs to build.') > + opt.add_option('--rtems-compiler', > + default = 'gcc', > + dest = 'rtems_compiler', > + help = 'RTEMS compiler to use available options are clang > and gcc (defaults to gcc).') > opt.add_option('--show-commands', > action = 'store_true', > default = False, > @@ -104,15 +109,17 @@ def init(ctx, filters = None, version = None, > long_commands = False, bsp_init = > # > # Check the tools, architectures and bsps. > # > - rtems_version, rtems_path, rtems_tools, archs, arch_bsps = \ > + rtems_compiler, rtems_version, rtems_path, rtems_tools, archs, > arch_bsps = \ > check_options(ctx, > env.options['prefix'], > + env.options['rtems_compiler'], > env.options['rtems_tools'], > env.options['rtems_path'], > env.options['rtems_version'], > env.options['rtems_archs'], > env.options['rtems_bsps']) > > + print("RTEMS Compiler is " + rtems_compiler) Please use `conf.msg()`. See https://git.rtems.org/rtems_waf/tree/rtems.py#n248 > # > # Update the contexts for all the bsps. > # > @@ -176,9 +183,10 @@ def configure(conf, bsp_configure = None): > else: > long_commands = 'no' > > - rtems_version, rtems_path, rtems_tools, archs, arch_bsps = \ > + rtems_compiler, rtems_version, rtems_path, rtems_tools, archs, arch_bsps > = \ > check_options(conf, > conf.options.prefix, > + conf.options.rtems_compiler, > conf.options.rtems_tools, > conf.options.rtems_path, > conf.options.rtems_version, > @@ -222,13 +230,19 @@ def configure(conf, bsp_configure = None): > conf.env.RTEMS_ARCH_RTEMS = arch > conf.env.RTEMS_BSP = bsp > > - tools = _find_tools(conf, arch, rtems_tools, tools) > + tools = _find_tools(conf, arch, rtems_compiler, rtems_tools, tools) > for t in tools[arch]: > conf.env[t] = tools[arch][t] > > - conf.load('gcc') > - conf.load('g++') > - conf.load('gas') > + if rtems_compiler == 'gcc': > + conf.load('gcc') > + conf.load('g++') > + conf.load('gas') > + elif rtems_compiler == 'clang': > + conf.load('clang') > + conf.load('clang++') > + else: > + conf.fatal('Unknown RTEMS compiler: ' + rtems_compiler) > > # > # Get the version of the tools being used. > @@ -388,7 +402,7 @@ def tweaks(conf, arch_bsp): > if '-ffunction-sections' in conf.env.CFLAGS: > 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_compiler, rtems_tools, rtems_path, > rtems_version, rtems_archs, rtems_bsps): > # > # Set defaults > # > @@ -406,6 +420,12 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, > rtems_version, rtems_arc > if rtems_tools is None: > rtems_tools = rtems_path > > + # > + # Check the compiler option is valid. > + # > + if rtems_compiler not in ['gcc', 'clang']: Key in compiler dict? See below. > + ctx.fatal('Valid RTEMS compilers are gcc or clang') > + > # > # Check the paths are valid. > # > @@ -476,7 +496,7 @@ def check_options(ctx, prefix, rtems_tools, rtems_path, > rtems_version, rtems_arc > # > arch_bsps = filter(ctx, 'bsps', arch_bsps) > > - return rtems_version, rtems_path, tools, archs, arch_bsps > + return rtems_compiler, rtems_version, rtems_path, tools, archs, arch_bsps > > def check_env(ctx, var): > if var in ctx.env and len(ctx.env[var]) != 0: > @@ -682,22 +702,40 @@ def long_command_line(): > if hasattr(cls, 'hcode'): > derived_class.hcode = cls.hcode > > -def _find_tools(conf, arch, paths, tools): > +def _find_tools(conf, arch, rtems_compiler, 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) > + if rtems_compiler == 'gcc': > + 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) > + elif rtems_compiler == 'clang': > + arch_tools['CC'] = conf.find_program('clang') > + arch_tools['CXX'] = conf.find_program('clang++') > + arch_tools['LINK_CC'] = arch_tools['CC'] > + arch_tools['LINK_CXX'] = arch_tools['CXX'] > + arch_tools['AS'] = conf.find_program('clang') > + arch_tools['LD'] = conf.find_program('lld') > + arch_tools['AR'] = conf.find_program('llvm-ar') > + arch_tools['NM'] = conf.find_program('llvm-nm') > + arch_tools['OBJDUMP'] = conf.find_program('llvm-objdump') > + arch_tools['OBJCOPY'] = conf.find_program('llvm-objcopy') > + arch_tools['READELF'] = conf.find_program('llvm-readelf') > + arch_tools['STRIP'] = conf.find_program('llvm-strip') > + arch_tools['RANLIB'] = conf.find_program('llvm-ranlib') Could this be defined in a compile dict? Why does llvm not require a path_list? Chris > + else: > + conf.fatal('Unknown RTEMS Compiler') > + > 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, > @@ -837,7 +875,8 @@ def _filter_flags(label, flags, arch, rtems_path): > { 'key': 'includes', 'path': True, 'flags': { '-I': 1, > '-isystem': 2, '-sysroot': 2 } }, > { 'key': 'libpath', 'path': True, 'flags': { '-L': 1 } }, > { 'key': 'machines', 'path': True, 'flags': { '-O': 1, '-m': 1, > '-f': 1, '-G':1, '-E':1 } }, > - { 'key': 'specs', 'path': True, 'flags': { '-q': 1, '-B': 2, > '--specs': 2 } } ] > + { 'key': 'specs', 'path': True, 'flags': { '-q': 1, '-B': 2, > '--specs': 2 } }, > + { 'key': 'target', 'path': True, 'flags': { '--target': 1 } } ] > > flags = _strip_cflags(flags) > > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel