make/toolchain.sh

branch
dav-2
changeset 890
e77ccf1c4bb3
parent 867
7247b0a586bd
equal deleted inserted replaced
889:42cdbf9bbd49 890:e77ccf1c4bb3
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"}"

mercurial