make/toolchain.sh

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

mercurial