[OE-core] [RFC] icecc: Allow to use this bbclass together with external toolchains

Martin Jansa martin.jansa at gmail.com
Thu Apr 4 06:21:47 UTC 2013


On Mon, Mar 18, 2013 at 11:10:08AM +0100, Martin Jansa wrote:
> * original implementation by Antti Harju

Nobody using external TC, interested in icecc?

> Signed-off-by: Martin Jansa <Martin.Jansa at gmail.com>
> ---
>  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 f3e89a9..cf3f23d 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() {
> -- 
> 1.8.1.5
> 

-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20130404/e8ff4680/attachment-0002.sig>


More information about the Openembedded-core mailing list