make/toolchain.sh

changeset 656
59dd1fb27639
parent 615
1ffc6fce045d
equal deleted inserted replaced
655:337cda289f34 656:59dd1fb27639
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__)
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()
80 {
81 # $1: filename
82 # $2: optional include
83 cat > "$TEMP_DIR/$1" << __EOF__
84 /* libtest file */
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 }
128
129 parse_toolchain_properties() 88 parse_toolchain_properties()
130 { 89 {
131 info_file="$1" 90 info_file="$1"
132 TOOLCHAIN=`grep '^toolchain:' "$info_file" | tail -c +11` 91 TOOLCHAIN=`grep '^toolchain:' "$info_file" | $TAIL -c +11`
133 TOOLCHAIN_NAME=`echo "$TOOLCHAIN" | cut -f1 -d' ' -` 92 TOOLCHAIN_NAME=`echo "$TOOLCHAIN" | cut -f1 -d' ' -`
134 TOOLCHAIN_WSIZE=`grep '^wsize:' "$info_file" | tail -c +7` 93 TOOLCHAIN_WSIZE=`grep '^wsize:' "$info_file" | $TAIL -c +7`
135 } 94 }
136 95
137 detect_c_compiler() 96 detect_c_compiler()
138 { 97 {
139 if [ -n "$TOOLCHAIN_CC" ]; then 98 if [ -n "$TOOLCHAIN_CC" ]; then
143 if [ -n "$CC" ]; then 102 if [ -n "$CC" ]; then
144 if check_c_compiler "$CC"; then 103 if check_c_compiler "$CC"; then
145 TOOLCHAIN_CC=$CC 104 TOOLCHAIN_CC=$CC
146 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out" 105 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out"
147 parse_toolchain_properties "$TEMP_DIR/checkcc_out" 106 parse_toolchain_properties "$TEMP_DIR/checkcc_out"
148 TOOLCHAIN_CSTD=`grep '^stdcversion:' "$TEMP_DIR/checkcc_out" | tail -c +13` 107 TOOLCHAIN_CSTD=`grep '^stdcversion:' "$TEMP_DIR/checkcc_out" | $TAIL -c +13`
149 echo "$CC" 108 echo "$CC"
150 return 0 109 return 0
151 else 110 else
152 echo "$CC is not a working C compiler" 111 echo "$CC is not a working C compiler"
153 return 1 112 return 1
157 do 116 do
158 if check_c_compiler "$COMP"; then 117 if check_c_compiler "$COMP"; then
159 TOOLCHAIN_CC=$COMP 118 TOOLCHAIN_CC=$COMP
160 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out" 119 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out"
161 parse_toolchain_properties "$TEMP_DIR/checkcc_out" 120 parse_toolchain_properties "$TEMP_DIR/checkcc_out"
162 TOOLCHAIN_CSTD=`grep '^stdcversion:' "$TEMP_DIR/checkcc_out" | tail -c +13` 121 TOOLCHAIN_CSTD=`grep '^stdcversion:' "$TEMP_DIR/checkcc_out" | $TAIL -c +13`
163 echo "$COMP" 122 echo "$COMP"
164 return 0 123 return 0
165 fi 124 fi
166 done 125 done
167 echo "not found" 126 echo "not found"

mercurial