# IceCream distributed compiling support
# 
# We need to create a tar.bz2 of our toolchain and set
# ICECC_VERSION, ICECC_CXX and ICEC_CC
#

def create_env(bb,d):
    """
    Create a tar.bz of the current toolchain
    """

    # Constin native-native compilation no environment needed if
    # host prefix is empty (let us duplicate the query for ease)
    prefix = bb.data.expand('${HOST_PREFIX}', d)
    if len(prefix) == 0:
    	return ""

    import tarfile
    import socket
    import time
    import os
    ice_dir = bb.data.expand('${CROSS_DIR}', d)
    prefix  = bb.data.expand('${HOST_PREFIX}' , d)
    distro  = bb.data.expand('${DISTRO}', d)
    target_sys = bb.data.expand('${TARGET_SYS}',  d)
    #float   = bb.data.getVar('${TARGET_FPU}', d)
    float   = "anyfloat"
    name    = socket.gethostname()

    try:
	os.stat(ice_dir + '/' + target_sys + '/lib/ld-linux.so.2')
	os.stat(ice_dir + '/' + target_sys + '/bin/g++')
    except:
	return ""

    VERSION = '3.4.3'    
    cross_name = prefix + distro + target_sys + float +VERSION+ name
    tar_file = ice_dir + '/ice/' + cross_name + '.tar.bz2'

    try:
        os.stat(tar_file)
        return tar_file
    except:
	try:
	    os.makedirs(ice_dir+'/ice')
	except:
	    pass

    # FIXME find out the version of the compiler
    tar = tarfile.open(tar_file, 'w:bz2')
    tar.add(ice_dir + '/' + target_sys + '/lib/ld-linux.so.2', 
            target_sys + 'cross/lib/ld-linux.so.2')
    tar.add(ice_dir + '/' + target_sys + '/lib/ld-linux.so.2',
            target_sys + 'cross/lib/ld-2.3.3.so')
    tar.add(ice_dir + '/' + target_sys + '/lib/libc-2.3.3.so',
            target_sys + 'cross/lib/libc-2.3.3.so')
    tar.add(ice_dir + '/' + target_sys + '/lib/libc.so.6',
           target_sys + 'cross/lib/libc.so.6')
    tar.add(ice_dir + '/' + target_sys + '/bin/gcc',
            target_sys + 'cross/usr/bin/gcc')
    tar.add(ice_dir + '/' + target_sys + '/bin/g++',
            target_sys + 'cross/usr/bin/g++')
    tar.add(ice_dir + '/' + target_sys + '/bin/as',
            target_sys + 'cross/usr/bin/as')
    tar.add(ice_dir + '/lib/gcc/' + target_sys +'/'+ VERSION + '/specs',
            target_sys+'cross/usr/lib/gcc/'+target_sys+'/'+VERSION+'/lib/specs')
    tar.add(ice_dir + '/libexec/gcc/'+target_sys+'/' + VERSION + '/cc1',
            target_sys + 'cross/usr/lib/gcc/'+target_sys+'/'+VERSION+'/lib/cc1')
    tar.add(ice_dir + '/libexec/gcc/arm-linux/' + VERSION + '/cc1plus',
            target_sys+'cross/usr/lib/gcc/'+target_sys+'/'+VERSION+'/lib/cc1plus')
    tar.close()
    return tar_file


def create_path(compilers, type, bb, d):
    """
    Create Symlinks for the icecc in the staging directory
    """
    import os

    staging = bb.data.expand('${STAGING_DIR}', d) + "/ice/" + type
    icecc   = bb.data.getVar('ICECC_PATH', d)

    # Create the dir if necessary
    try:
        os.stat(staging)
    except:
        os.makedirs(staging)


    for compiler in compilers:
        gcc_path = staging + "/" + compiler
        try:
            os.stat(gcc_path)
        except:
            os.symlink(icecc, gcc_path)

    return staging + ":"


def use_icc_version(bb,d):
    # Constin native native
    prefix = bb.data.expand('${HOST_PREFIX}', d)
    if len(prefix) == 0:
	return "no"
	
	
    native = bb.data.expand('${PN}', d)	
    blacklist = [ "-cross", "-native" ]

    for black in blacklist:
        if black in native:
	    return "no"

    return "yes"

def icc_path(bb,d,compile):
    native = bb.data.expand('${PN}', d)
    blacklist = [ "ulibc", "glibc", "ncurses" ]
    for black in blacklist:
    	if black in native:
    	    return ""

    if "-native" in native:
	compile = False
    if "-cross"  in native:
    	compile = False

    prefix = bb.data.expand('${HOST_PREFIX}', d)
    if compile and len(prefix) != 0:
        return create_path( [prefix+"gcc", prefix+"g++"], "cross", bb, d )
    elif not compile or len(prefix) == 0:
        return create_path( ["gcc", "g++"], "native", bb, d)


def icc_version(bb,d):
    return create_env(bb,d)


#
# set the IceCream  environment variables
do_configure_prepend() {
    export PATH=${@icc_path(bb,d,False)}$PATH
    export ICECC_CC="gcc"
    export ICECC_CXX="g++"
}

do_compile_prepend() {
    export PATH=${@icc_path(bb,d,True)}$PATH
    export ICECC_CC="${HOST_PREFIX}gcc"
    export ICECC_CXX="${HOST_PREFIX}g++"

    if [ "${@use_icc_version(bb,d)}" = "yes" ]; then
    	export ICECC_VERSION="${@icc_version(bb,d)}"
    fi
}