make/toolchain.sh

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

mercurial