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