make/toolchain.sh

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

mercurial