From 230441f0c85e6b46fa0814c7be20057107f75fc7 Mon Sep 17 00:00:00 2001 From: Martin Jansa Date: Mon, 18 Mar 2013 10:10:08 +0000 Subject: [PATCH] icecc: Allow to use this bbclass together with external toolchains * original implementation by Antti Harju (From OE-Core rev: abb5bd9f2d3583808b61a0832378e4db45022be6) Signed-off-by: Martin Jansa Signed-off-by: Richard Purdie --- meta/classes/icecc.bbclass | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/meta/classes/icecc.bbclass b/meta/classes/icecc.bbclass index f3e89a9747..cf3f23d93a 100644 --- a/meta/classes/icecc.bbclass +++ b/meta/classes/icecc.bbclass @@ -47,6 +47,9 @@ def get_cross_kernel_cc(bb,d): kernel_cc = kernel_cc.strip() return kernel_cc +def get_icecc(d): + return d.getVar('ICECC_PATH') or os.popen("which icecc").read()[:-1] + def create_path(compilers, bb, d): """ Create Symlinks for the icecc in the staging directory @@ -56,7 +59,7 @@ def create_path(compilers, bb, d): staging += "-kernel" #check if the icecc path is set by the user - icecc = d.getVar('ICECC_PATH') or os.popen("which icecc").read()[:-1] + icecc = get_icecc(d) # Create the dir if necessary try: @@ -151,6 +154,11 @@ def icc_path(bb,d): prefix = d.expand('${HOST_PREFIX}') return create_path( [prefix+"gcc", prefix+"g++"], bb, d) +def icc_get_external_tool(bb, d, tool): + external_toolchain_bindir = d.expand('${EXTERNAL_TOOLCHAIN}${bindir_cross}') + target_prefix = d.expand('${TARGET_PREFIX}') + return os.path.join(external_toolchain_bindir, '%s%s' % (target_prefix, tool)) + def icc_get_tool(bb, d, tool): if icc_is_native(bb, d): return os.popen("which %s" % tool).read()[:-1] @@ -159,7 +167,26 @@ def icc_get_tool(bb, d, tool): else: ice_dir = d.expand('${STAGING_BINDIR_TOOLCHAIN}') target_sys = d.expand('${TARGET_SYS}') - return os.path.join(ice_dir, "%s-%s" % (target_sys, tool)) + tool_bin = os.path.join(ice_dir, "%s-%s" % (target_sys, tool)) + if os.path.isfile(tool_bin): + return tool_bin + else: + external_tool_bin = icc_get_external_tool(bb, d, tool) + if os.path.isfile(external_tool_bin): + return external_tool_bin + else: + return "" + +def icc_get_and_check_tool(bb, d, tool): + # Check that g++ or gcc is not a symbolic link to icecc binary in + # PATH or icecc-create-env script will silently create an invalid + # compiler environment package. + t = icc_get_tool(bb, d, tool) + if t and os.popen("readlink -f %s" % t).read()[:-1] == get_icecc(d): + bb.error("%s is a symlink to %s in PATH and this prevents icecc from working" % (t, get_icecc(d))) + return "" + else: + return t set_icecc_env() { if [ "x${ICECC_DISABLED}" != "x" ] @@ -178,8 +205,8 @@ set_icecc_env() { return fi - ICECC_CC="${@icc_get_tool(bb,d, "gcc")}" - ICECC_CXX="${@icc_get_tool(bb,d, "g++")}" + ICECC_CC="${@icc_get_and_check_tool(bb, d, "gcc")}" + ICECC_CXX="${@icc_get_and_check_tool(bb, d, "g++")}" if [ ! -x "${ICECC_CC}" -o ! -x "${ICECC_CXX}" ] then return @@ -207,6 +234,8 @@ set_icecc_env() { export ICECC_VERSION ICECC_CC ICECC_CXX export PATH="$ICE_PATH:$PATH" export CCACHE_PATH="$PATH" + + bbnote "Using icecc" } do_configure_prepend() {