diff options
author | Chris Johns <chrisj@rtems.org> | 2013-12-01 14:38:01 +1100 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2013-12-12 14:55:56 -0500 |
commit | 3a513694c8c289b3fa6ce8e31c93675eb389bd98 (patch) | |
tree | 510f295e6e40b6f9bac5b18d960072affa0a6ee0 /rtems_waf | |
parent | misc: Support building qemu_vfat with waf (diff) | |
download | rtems-examples-3a513694c8c289b3fa6ce8e31c93675eb389bd98.tar.bz2 |
Add checks for various CPU options.
Check the cpuopts.h header file for various options and provide an
API to test them from user wscript files.
Diffstat (limited to 'rtems_waf')
-rw-r--r-- | rtems_waf/rtems.py | 95 |
1 files changed, 87 insertions, 8 deletions
diff --git a/rtems_waf/rtems.py b/rtems_waf/rtems.py index a3a386f..e460ca5 100644 --- a/rtems_waf/rtems.py +++ b/rtems_waf/rtems.py @@ -181,10 +181,22 @@ def configure(conf): conf.env.LIB = flags['LIB'] # + # Checks for various RTEMS features. + # + conf.multicheck({ 'header_name': 'rtems.h'}, + { 'header_name': 'rtems/score/cpuopts.h'}, + msg = 'Checking for RTEMS headers', + mandatory = True) + load_cpuopts(conf, ab, conf.options.rtems_path) + + # # Add tweaks. # tweaks(conf, ab) + # + # Show commands support the user can supply. + # conf.env.SHOW_COMMANDS = show_commands conf.setenv('', env) @@ -199,6 +211,41 @@ def build(bld): if bld.env.SHOW_COMMANDS == 'yes': output_command_line() +def load_cpuopts(conf, arch_bsp, rtems_path): + options = ['RTEMS_DEBUG', + 'RTEMS_MULTIPROCESSING', + 'RTEMS_NEWLIB', + 'RTEMS_POSIX_API', + 'RTEMS_SMP', + 'RTEMS_NETWORKING', + 'RTEMS_ATOMIC'] + for opt in options: + enabled = check_opt(conf, opt, 'rtems/score/cpuopts.h', arch_bsp, rtems_path) + if enabled: + conf.env[opt] = 'Yes' + else: + conf.env[opt] = 'No' + +def check_opt(conf, opt, header, arch_bsp, rtems_path): + code = '#include <%s>%s' % (header, os.linesep) + code += '#ifndef %s%s' % (opt, os.linesep) + code += ' #error %s is not defined%s' % (opt, os.linesep) + code += '#endif%s' % (os.linesep) + code += '#if %s%s' % (opt, os.linesep) + code += ' /* %s is true */%s' % (opt, os.linesep) + code += '#else%s' % (os.linesep) + code += ' #error %s is false%s' % (opt, os.linesep) + code += '#endif%s' % (os.linesep) + code += 'int main() { return 0; }%s' % (os.linesep) + try: + conf.check_cc(fragment = code, + execute = False, + define_ret = False, + msg = 'Checking for %s' % (opt)) + except conf.errors.WafError: + return False; + return True + def tweaks(conf, arch_bsp): # # Hack to work around NIOS2 naming. @@ -296,6 +343,32 @@ def check_options(ctx, rtems_tools, rtems_path, rtems_version, rtems_archs, rtem return rtems_bin, tools, archs, arch_bsps +def check(ctx, option): + if option in ctx.env: + return ctx.env[option] == 'Yes' + 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 check_atomic(ctx): + return check(ctx, 'RTEMS_ATROMIC') + def arch(arch_bsp): """ Given an arch/bsp return the architecture.""" return _arch_from_arch_bsp(arch_bsp).split('-')[0] @@ -315,7 +388,8 @@ def filter(ctx, filter, items): if rtems_filters is None: return items if type(rtems_filters) is not dict: - ctx.fatal("Invalid RTEMS filter type, ie { 'tools': { 'in': [], 'out': [] }, 'arch': {}, 'bsps': {} }") + ctx.fatal("Invalid RTEMS filter type, " \ + "ie { 'tools': { 'in': [], 'out': [] }, 'arch': {}, 'bsps': {} }") if filter not in rtems_filters: return items items_in = [] @@ -436,8 +510,10 @@ def _find_tools(conf, arch, paths, tools): 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['RTEMS_LD'] = conf.find_program(['rtems-ld'], path_list = paths, mandatory = False) - arch_tools['RTEMS_BIN2C'] = conf.find_program(['rtems-bin2c'], path_list = paths, mandatory = False) + arch_tools['RTEMS_LD'] = conf.find_program(['rtems-ld'], 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 @@ -620,13 +696,16 @@ def _strip_cflags(cflags): def _log_header(conf): conf.to_log('-----------------------------------------') +from waflib import Task from waflib import TaskGen +from waflib import Utils +from waflib import Node from waflib.Tools.ccroot import link_task, USELIB_VARS USELIB_VARS['rap'] = set(['RTEMS_LINKFLAGS']) @TaskGen.extension('.c') 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'] - inst_to = '${BINDIR}' + "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'] + inst_to = '${BINDIR}' |