make/toolchain.sh

changeset 158
4bde241c49b1
parent 156
62f1a55535e7
child 277
5099a34747c4
equal deleted inserted replaced
157:0b33b9396851 158:4bde241c49b1
1 #!/bin/sh 1 #!/bin/sh
2 # 2 #
3 # toolchain detection 3 # toolchain detection
4 # 4 #
5 5
6 COMPILERS="cc gcc clang suncc" 6 C_COMPILERS="cc gcc clang suncc"
7 CPP_COMPILERS="CC g++ clang++ sunCC"
7 unset CC_ARG_CHECKED 8 unset CC_ARG_CHECKED
8 unset TOOLCHAIN_DETECTION_ERROR 9 unset TOOLCHAIN_DETECTION_ERROR
9 unset TOOLCHAIN_NAME 10 unset TOOLCHAIN_NAME
10 11
11 check_compiler() 12 check_c_compiler()
12 { 13 {
13 cat > $TEMP_DIR/test.c << __EOF__ 14 cat > $TEMP_DIR/test.c << __EOF__
14 /* test file */ 15 /* test file */
15 #include <stdio.h> 16 #include <stdio.h>
16 int main(int argc, char **argv) { 17 int main(int argc, char **argv) {
17 #if defined(__GNUC__) 18 #if defined(__clang__)
18 printf("gcc\n"); 19 printf("clang\n");
19 #elif defined(__clang__) 20 #elif defined(__GNUC__)
20 printf("clang\n"); 21 printf("gcc\n");
21 #elif defined(__sun) 22 #elif defined(__sun)
22 printf("suncc\n"); 23 printf("suncc\n");
23 #else 24 #else
24 printf("unknown\n"); 25 printf("unknown\n");
25 #endif 26 #endif
26 return 0; 27 return 0;
27 } 28 }
28 __EOF__ 29 __EOF__
29 rm -f $TEMP_DIR/checkcc 30 rm -f $TEMP_DIR/checkcc
30 $1 -o $TEMP_DIR/checkcc $CFLAGS $LDFLAGS $TEMP_DIR/test.c 31 $1 -o $TEMP_DIR/checkcc $CFLAGS $LDFLAGS $TEMP_DIR/test.c 2> /dev/null
31 32
32 if [ $? -ne 0 ]; then 33 if [ $? -ne 0 ]; then
33 return 1 34 return 1
34 fi 35 fi
35 return 0 36 return 0
36 } 37 }
37 38
38 printf "detect toolchain... " 39 check_cpp_compiler()
40 {
41 cat > $TEMP_DIR/test.cpp << __EOF__
42 /* test file */
43 #include <iostream>
44 int main(int argc, char **argv) {
45 #if defined(__clang__)
46 std::cout << "clang" << std::endl;
47 #elif defined(__GNUC__)
48 std::cout << "gcc" << std::endl;
49 #elif defined(__sun)
50 std::cout << "suncc" << std::endl;
51 #else
52 std::cout << "unknown" << std::endl;
53 #endif
54 return 0;
55 }
56 __EOF__
57 rm -f $TEMP_DIR/checkcc
58 $1 -o $TEMP_DIR/checkcc $CXXFLAGS $LDFLAGS $TEMP_DIR/test.cpp 2> /dev/null
59
60 if [ $? -ne 0 ]; then
61 return 1
62 fi
63 return 0
64 }
39 65
40 for COMP in $COMPILERS 66 printf "detect C compiler... "
67
68 for COMP in $C_COMPILERS
41 do 69 do
42 check_compiler $COMP 70 check_c_compiler $COMP
43 if [ $? -ne 0 ]; then 71 if [ $? -ne 0 ]; then
44 if [ $COMP = $CC ]; then 72 if [ ! -z "$CC" ]; then
45 echo "$CC is not a working C Compiler" 73 if [ $COMP = $CC ]; then
46 TOOLCHAIN_DETECTION_ERROR="error" 74 echo "$CC is not a working C Compiler"
47 break 75 TOOLCHAIN_DETECTION_ERROR="error"
48 fi 76 break
49 else 77 fi
50 TOOLCHAIN_NAME=`$TEMP_DIR/checkcc` 78 fi
51 TOOLCHAIN_CC=$COMP 79 else
52 echo $TOOLCHAIN_NAME 80 TOOLCHAIN_NAME=`$TEMP_DIR/checkcc`
53 break 81 USE_TOOLCHAIN=$TOOLCHAIN_NAME
54 fi 82 if [ $COMP = "cc" ]; then
83 # we have found a working compiler, but in case
84 # the compiler is gcc or clang, we try to use
85 # these commands and not 'cc'
86 TOOLCHAIN_NAME=`$TEMP_DIR/checkcc`
87 if [ $TOOLCHAIN_NAME = "gcc" ]; then
88 check_c_compiler "gcc"
89 if [ $? -eq 0 ]; then
90 COMP=gcc
91 USE_TOOLCHAIN="gcc"
92 fi
93 fi
94 if [ $TOOLCHAIN_NAME = "clang" ]; then
95 check_c_compiler "clang"
96 if [ $? -eq 0 ]; then
97 COMP=clang
98 USE_TOOLCHAIN="clang"
99 fi
100 fi
101 fi
102
103 TOOLCHAIN_NAME=$USE_TOOLCHAIN
104 TOOLCHAIN_CC=$COMP
105 echo $COMP
106 break
107 fi
55 done 108 done
109 if [ -z $TOOLCHAIN_CC ]; then
110 echo "not found"
111 fi
112
113 printf "detect C++ compiler... "
114
115 for COMP in $CPP_COMPILERS
116 do
117 check_cpp_compiler $COMP
118 if [ $? -ne 0 ]; then
119 if [ ! -z "$CXX" ]; then
120 if [ $COMP = $CXX ]; then
121 echo "$CC is not a working C++ Compiler"
122 TOOLCHAIN_DETECTION_ERROR="error"
123 break
124 fi
125 fi
126 else
127 if [ $COMP = "CC" ]; then
128 # we have found a working compiler, but in case
129 # the compiler is gcc or clang, we try to use
130 # these commands and not 'cc'
131 TOOLCHAIN_NAME=`$TEMP_DIR/checkcc`
132 USE_TOOLCHAIN=$TOOLCHAIN_NAME
133 if [ $TOOLCHAIN_NAME = "gcc" ]; then
134 check_cpp_compiler "g++"
135 if [ $? -eq 0 ]; then
136 COMP=g++
137 USE_TOOLCHAIN="gcc"
138 fi
139 fi
140 if [ $TOOLCHAIN_NAME = "clang" ]; then
141 check_cpp_compiler "clang++"
142 if [ $? -eq 0 ]; then
143 COMP=clang++
144 USE_TOOLCHAIN="clang"
145 fi
146 fi
147 fi
148
149 TOOLCHAIN_NAME=$USE_TOOLCHAIN
150 TOOLCHAIN_CXX=$COMP
151 echo $COMP
152 break
153 fi
154 done
155 if [ -z $TOOLCHAIN_CXX ]; then
156 echo "not found"
157 fi
56 158
57 TOOLCHAIN_LD=$TOOLCHAIN_CC 159 TOOLCHAIN_LD=$TOOLCHAIN_CC
58 160
59 if [ -z TOOLCHAIN_NAME ]; then 161 if [ -z "$TOOLCHAIN_NAME" ]; then
60 TOOLCHAIN_DETECTION_ERROR="error" 162 TOOLCHAIN_DETECTION_ERROR="error"
61 else 163 else
62 echo "CC = ${TOOLCHAIN_CC}" >> $TEMP_DIR/config.mk 164 cat >> $TEMP_DIR/config.mk << __EOF__
63 echo "LD = ${TOOLCHAIN_LD}" >> $TEMP_DIR/config.mk 165 # toolchain
64 166 __EOF__
65 if [ -e "make/${TOOLCHAIN_NAME}.mk" ]; then 167 echo "CC = ${TOOLCHAIN_CC}" >> $TEMP_DIR/config.mk
66 echo "include \$(BUILD_ROOT)make/${TOOLCHAIN_NAME}.mk" >> $TEMP_DIR/config.mk 168 if [ ! -z "$TOOLCHAIN_CXX" ]; then
67 fi 169 echo "CXX = ${TOOLCHAIN_CXX}" >> $TEMP_DIR/config.mk
170 fi
171 echo "LD = ${TOOLCHAIN_LD}" >> $TEMP_DIR/config.mk
172 echo >> $TEMP_DIR/config.mk
173
174 cat "make/${TOOLCHAIN_NAME}.mk" > /dev/null 2>&1
175 if [ $? -eq 0 ]; then
176 echo "include \$(BUILD_ROOT)/make/${TOOLCHAIN_NAME}.mk" >> $TEMP_DIR/config.mk
177 else
178 echo "SHLIB_CFLAGS = -fPIC" >> $TEMP_DIR/config.mk
179 echo "SHLIB_LDFLAGS = -shared" >> $TEMP_DIR/config.mk
180 fi
68 fi 181 fi

mercurial