make/toolchain.sh

changeset 76
c2a4fb5024b4
parent 71
0bdb910478cc
equal deleted inserted replaced
75:b0b8bf3c536e 76:c2a4fb5024b4
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
127 }
128
129 parse_toolchain_properties()
130 {
131 info_file="$1"
132 TOOLCHAIN=`grep '^toolchain:' "$info_file" | tail -c +11`
133 TOOLCHAIN_NAME=`echo "$TOOLCHAIN" | cut -f1 -d' ' -`
134 TOOLCHAIN_WSIZE=`grep '^wsize:' "$info_file" | tail -c +7`
104 } 135 }
105 136
106 detect_c_compiler() 137 detect_c_compiler()
107 { 138 {
108 if [ -n "$TOOLCHAIN_CC" ]; then 139 if [ -n "$TOOLCHAIN_CC" ]; then
110 fi 141 fi
111 printf "detect C compiler... " 142 printf "detect C compiler... "
112 if [ -n "$CC" ]; then 143 if [ -n "$CC" ]; then
113 if check_c_compiler "$CC"; then 144 if check_c_compiler "$CC"; then
114 TOOLCHAIN_CC=$CC 145 TOOLCHAIN_CC=$CC
115 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 146 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out"
147 parse_toolchain_properties "$TEMP_DIR/checkcc_out"
148 TOOLCHAIN_CSTD=`grep '^stdcversion:' "$TEMP_DIR/checkcc_out" | tail -c +13`
116 echo "$CC" 149 echo "$CC"
117 return 0 150 return 0
118 else 151 else
119 echo "$CC is not a working C compiler" 152 echo "$CC is not a working C compiler"
120 return 1 153 return 1
122 else 155 else
123 for COMP in $C_COMPILERS 156 for COMP in $C_COMPILERS
124 do 157 do
125 if check_c_compiler "$COMP"; then 158 if check_c_compiler "$COMP"; then
126 TOOLCHAIN_CC=$COMP 159 TOOLCHAIN_CC=$COMP
127 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 160 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out"
161 parse_toolchain_properties "$TEMP_DIR/checkcc_out"
162 TOOLCHAIN_CSTD=`grep '^stdcversion:' "$TEMP_DIR/checkcc_out" | tail -c +13`
128 echo "$COMP" 163 echo "$COMP"
129 return 0 164 return 0
130 fi 165 fi
131 done 166 done
132 echo "not found" 167 echo "not found"
142 printf "detect C++ compiler... " 177 printf "detect C++ compiler... "
143 178
144 if [ -n "$CXX" ]; then 179 if [ -n "$CXX" ]; then
145 if check_cpp_compiler "$CXX"; then 180 if check_cpp_compiler "$CXX"; then
146 TOOLCHAIN_CXX=$CXX 181 TOOLCHAIN_CXX=$CXX
147 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 182 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out"
183 parse_toolchain_properties "$TEMP_DIR/checkcc_out"
148 echo "$CXX" 184 echo "$CXX"
149 return 0 185 return 0
150 else 186 else
151 echo "$CXX is not a working C++ compiler" 187 echo "$CXX is not a working C++ compiler"
152 return 1 188 return 1
154 else 190 else
155 for COMP in $CPP_COMPILERS 191 for COMP in $CPP_COMPILERS
156 do 192 do
157 if check_cpp_compiler "$COMP"; then 193 if check_cpp_compiler "$COMP"; then
158 TOOLCHAIN_CXX=$COMP 194 TOOLCHAIN_CXX=$COMP
159 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 195 "$TEMP_DIR/checkcc" > "$TEMP_DIR/checkcc_out"
196 parse_toolchain_properties "$TEMP_DIR/checkcc_out"
160 echo "$COMP" 197 echo "$COMP"
161 return 0 198 return 0
162 fi 199 fi
163 done 200 done
164 echo "${TOOLCHAIN_CXX:-"not found"}" 201 echo "${TOOLCHAIN_CXX:-"not found"}"

mercurial