make/toolchain.sh

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

mercurial