From 02af9b6ab1d99ff0438af29757020c1ca778a98a Mon Sep 17 00:00:00 2001 From: Francisco Ferreira Date: Wed, 9 Mar 2016 00:11:09 +0000 Subject: [PATCH] waf: toolchain: support Clang in toolchain for cross-compilation Define function to help find the toolchain path --- Tools/ardupilotwaf/toolchain.py | 82 +++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/Tools/ardupilotwaf/toolchain.py b/Tools/ardupilotwaf/toolchain.py index 1501637ce4..acd012ecd9 100644 --- a/Tools/ardupilotwaf/toolchain.py +++ b/Tools/ardupilotwaf/toolchain.py @@ -12,11 +12,11 @@ Example:: cfg.load('cxx_compiler') """ -from waflib import Utils +from waflib import Utils, Context + +import os suffixes = dict( - CXX='g++', - CC='gcc', AS='gcc', AR='ar', LD='g++', @@ -24,14 +24,70 @@ suffixes = dict( OBJCOPY='objcopy', ) -def configure(cfg): - if not cfg.env.TOOLCHAIN: - cfg.env.TOOLCHAIN = 'native' - prefix = '' - else: - cfg.env.TOOLCHAIN = Utils.to_list(cfg.env.TOOLCHAIN)[0] - cfg.msg('Using toolchain prefix', cfg.env.TOOLCHAIN) - prefix = cfg.env.TOOLCHAIN + '-' +def find_realexec_path(cfg, filename, path_list=[]): + if not filename: + return '' - for k in suffixes: - cfg.env.append_value(k, prefix + suffixes[k]) + if not path_list: + path_list = cfg.environ.get('PATH','').split(os.pathsep) + + for dir in path_list: + path = os.path.abspath(os.path.expanduser(os.path.join(dir, filename))) + + if os.path.isfile(path): + if os.path.islink(path): + realpath = os.path.realpath(path) + + if filename not in os.path.basename(realpath): + continue + else: + return os.path.dirname(realpath) + + else: + return os.path.dirname(path) + + cfg.fatal('Could not find real exec path to %s in path_list %s:' % (filename, path_list)) + +def configure(cfg): + toolchain = cfg.env.TOOLCHAIN + + if toolchain != 'native': + cfg.msg('Using toolchain prefix', toolchain) + prefix = toolchain + '-' + + c_compiler = cfg.options.check_c_compiler or 'gcc' + cxx_compiler = cfg.options.check_cxx_compiler or 'g++' + + if 'gcc' == c_compiler or 'g++' == cxx_compiler or 'clang' == c_compiler or 'clang++' == cxx_compiler: + toolchain_path = os.path.abspath(os.path.join(find_realexec_path(cfg, prefix + suffixes['AR']), '..')) + cfg.msg('Using toolchain path', toolchain_path) + + if 'gcc' == c_compiler or 'g++' == cxx_compiler: + for k in suffixes: + cfg.env[k] = [prefix + suffixes[k]] + + if 'clang' == c_compiler or 'clang++' == cxx_compiler: + sysroot = cfg.cmd_and_log([prefix + 'gcc', '--print-sysroot'], quiet=Context.BOTH)[:-1] + clang_flags = [ + '--target=' + toolchain, + '--gcc-toolchain=' + toolchain_path, + '--sysroot=' + sysroot, + '-B' + os.path.join(toolchain_path, 'bin') + ] + cfg.env.LINKFLAGS += clang_flags + + if 'gcc' == c_compiler: + cfg.env['CC'] = [prefix + 'gcc'] + + elif 'clang' == c_compiler: + cfg.env['CC'] = [c_compiler] + cfg.env['AR'] = [prefix + suffixes['AR']] + cfg.env.CFLAGS += clang_flags + + if 'g++' == cxx_compiler: + cfg.env['CXX'] = [prefix + 'g++'] + + elif 'clang++' == cxx_compiler: + cfg.env['CXX'] = [cxx_compiler] + cfg.env['AR'] = [prefix + suffixes['AR']] + cfg.env.CXXFLAGS += clang_flags \ No newline at end of file