summaryrefslogtreecommitdiff
path: root/classes/icecc.bbclass
blob: 7dfcfc29a43885d932366cf6c4451f885198ffc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# 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
}