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 |