test/make/toolchain.sh

changeset 66
dc758dcd4645
parent 54
2b8f40c58944
child 69
96d8badffe58
equal deleted inserted replaced
65:6db50c6df6e3 66:dc758dcd4645
3 # toolchain detection 3 # toolchain detection
4 # 4 #
5 5
6 C_COMPILERS="gcc clang suncc cc" 6 C_COMPILERS="gcc clang suncc cc"
7 CPP_COMPILERS="g++ clang++ sunCC CC" 7 CPP_COMPILERS="g++ clang++ sunCC CC"
8 unset TOOLCHAIN_ERROR
9 unset TOOLCHAIN_NAME 8 unset TOOLCHAIN_NAME
10 unset TOOLCHAIN_CC 9 unset TOOLCHAIN_CC
11 unset TOOLCHAIN_CXX 10 unset TOOLCHAIN_CXX
12 unset TOOLCHAIN_LD
13 11
14 check_c_compiler() 12 check_c_compiler()
15 { 13 {
16 cat > "$TEMP_DIR/test.c" << __EOF__ 14 cat > "$TEMP_DIR/test.c" << __EOF__
17 /* test file */ 15 /* test file */
44 #elif defined(__GNUC__) 42 #elif defined(__GNUC__)
45 std::cout << "gcc" << std::endl; 43 std::cout << "gcc" << std::endl;
46 #elif defined(__sun) 44 #elif defined(__sun)
47 std::cout << "suncc" << std::endl; 45 std::cout << "suncc" << std::endl;
48 #else 46 #else
49 std::cout << "unknown" << std::endl; 47 std::cout << "cc" << std::endl;
50 #endif 48 #endif
51 return 0; 49 return 0;
52 } 50 }
53 __EOF__ 51 __EOF__
54 rm -f "$TEMP_DIR/checkcc" 52 rm -f "$TEMP_DIR/checkcc"
55 $1 -o "$TEMP_DIR/checkcc" $CXXFLAGS $LDFLAGS "$TEMP_DIR/test.cpp" 2> /dev/null 53 $1 -o "$TEMP_DIR/checkcc" $CXXFLAGS $LDFLAGS "$TEMP_DIR/test.cpp" 2> /dev/null
56 } 54 }
57 55
58 check_lib() 56 check_c_lib()
59 { 57 {
60 if [ -z "$TOOLCHAIN_LD" ]; then 58 if [ -z "$TOOLCHAIN_CC" ]; then
61 return 1 59 return 1
62 fi 60 fi
63 cat > "$TEMP_DIR/test.c" << __EOF__ 61 cat > "$TEMP_DIR/test.c" << __EOF__
64 /* libtest file */ 62 /* libtest file */
65 int main(int argc, char **argv) { 63 int main(int argc, char **argv) {
66 return 0; 64 return 0;
67 } 65 }
68 __EOF__ 66 __EOF__
69 rm -f "$TEMP_DIR/checklib" 67 rm -f "$TEMP_DIR/checklib"
70 $TOOLCHAIN_LD -o "$TEMP_DIR/checklib" $CFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.c" 2> /dev/null 68 $TOOLCHAIN_CC -o "$TEMP_DIR/checklib" $CFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.c" 2> /dev/null
71 } 69 }
72 70
73 printf "detect C compiler... " 71 check_cpp_lib()
72 {
73 if [ -z "$TOOLCHAIN_CXX" ]; then
74 return 1
75 fi
76 cat > "$TEMP_DIR/test.cpp" << __EOF__
77 /* libtest file */
78 int main(int argc, char **argv) {
79 return 0;
80 }
81 __EOF__
82 rm -f "$TEMP_DIR/checklib"
83 $TOOLCHAIN_CXX -o "$TEMP_DIR/checklib" $CXXFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.cpp" 2> /dev/null
84 }
74 85
75 if [ -n "$CC" ]; then 86 check_lib()
76 if check_c_compiler "$CC"; then 87 {
77 TOOLCHAIN_CC=$CC 88 if [ -n "$TOOLCHAIN_CC" ]; then
78 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 89 check_c_lib "$1"
79 echo $CC 90 elif [ -n "$TOOLCHAIN_CXX" ]; then
91 check_cpp_lib "$1"
92 fi
93 }
94
95 detect_c_compiler()
96 {
97 if [ -n "$TOOLCHAIN_CC" ]; then
98 return 0
99 fi
100 printf "detect C compiler... "
101 if [ -n "$CC" ]; then
102 if check_c_compiler "$CC"; then
103 TOOLCHAIN_CC=$CC
104 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
105 echo "$CC"
106 return 0
107 else
108 echo "$CC is not a working C compiler"
109 return 1
110 fi
80 else 111 else
81 echo "$CC is not a working C compiler" 112 for COMP in $C_COMPILERS
82 TOOLCHAIN_ERROR="required C compiler not found" 113 do
114 if check_c_compiler "$COMP"; then
115 TOOLCHAIN_CC=$COMP
116 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
117 echo "$COMP"
118 return 0
119 fi
120 done
121 echo "not found"
122 return 1
83 fi 123 fi
84 else 124 }
85 for COMP in $C_COMPILERS 125
86 do 126 detect_cpp_compiler()
87 if check_c_compiler "$COMP"; then 127 {
128 if [ -n "$TOOLCHAIN_CXX" ]; then
129 return 0
130 fi
131 printf "detect C++ compiler... "
132
133 if [ -n "$CXX" ]; then
134 if check_cpp_compiler "$CXX"; then
135 TOOLCHAIN_CXX=$CXX
88 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 136 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
89 TOOLCHAIN_CC=$COMP 137 echo "$CXX"
90 break 138 return 0
139 else
140 echo "$CXX is not a working C++ compiler"
141 return 1
91 fi 142 fi
92 done 143 else
93 echo ${TOOLCHAIN_CC:-"not found"} 144 for COMP in $CPP_COMPILERS
94 fi 145 do
146 if check_cpp_compiler "$COMP"; then
147 TOOLCHAIN_CXX=$COMP
148 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
149 echo "$COMP"
150 return 0
151 fi
152 done
153 echo "${TOOLCHAIN_CXX:-"not found"}"
154 return 1
155 fi
156 }
95 157
96 printf "detect C++ compiler... " 158 write_toolchain_defaults()
97 159 {
98 if [ -n "$CXX" ]; then 160 echo "# toolchain" >> "$1"
99 if check_cpp_compiler "$CXX"; then 161 if [ -n "$TOOLCHAIN_CC" ]; then
100 TOOLCHAIN_CXX=$CXX 162 echo "CC = ${TOOLCHAIN_CC}" >> "$1"
101 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 163 fi
102 echo $CXX 164 if [ -n "$TOOLCHAIN_CXX" ]; then
165 echo "CXX = ${TOOLCHAIN_CXX}" >> "$1"
166 fi
167 echo >> "$1"
168 if [ -f "make/${TOOLCHAIN_NAME}.mk" ]; then
169 cat "make/${TOOLCHAIN_NAME}.mk" >> "$1"
103 else 170 else
104 echo "$CXX is not a working C++ compiler" 171 echo "!!! WARNING !!! Default toolchain flags not found. Configuration might be incomplete."
105 TOOLCHAIN_ERROR="required C++ compiler not found"
106 fi 172 fi
107 else 173 }
108 for COMP in $CPP_COMPILERS
109 do
110 if check_cpp_compiler "$COMP"; then
111 TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"`
112 TOOLCHAIN_CXX=$COMP
113 break
114 fi
115 done
116 echo ${TOOLCHAIN_CXX:-"not found"}
117 fi
118
119 printf "detect linker... "
120 TOOLCHAIN_LD=$TOOLCHAIN_CC
121 echo "$TOOLCHAIN_LD"
122
123 if [ -z "$TOOLCHAIN_NAME" ]; then
124 TOOLCHAIN_ERROR="no build tools detected"
125 else
126 cat >> "$TEMP_DIR/config.mk" << __EOF__
127
128 # toolchain
129 __EOF__
130 echo "CC = ${TOOLCHAIN_CC}" >> "$TEMP_DIR/config.mk"
131 if [ -n "$TOOLCHAIN_CXX" ]; then
132 echo "CXX = ${TOOLCHAIN_CXX}" >> "$TEMP_DIR/config.mk"
133 fi
134 echo "LD = ${TOOLCHAIN_LD}" >> "$TEMP_DIR/config.mk"
135 echo >> "$TEMP_DIR/config.mk"
136
137 if [ -f "make/${TOOLCHAIN_NAME}.mk" ]; then
138 cat "make/${TOOLCHAIN_NAME}.mk" >> "$TEMP_DIR/config.mk"
139 else
140 cat >> "$TEMP_DIR/config.mk" << __EOF__
141 CFLAGS =
142 DEBUG_FLAGS = -g
143 RELEASE_FLAGS = -O3 -DNDEBUG
144 LDFLAGS =
145
146 SHLIB_CFLAGS = -fPIC
147 SHLIB_LDFLAGS = -shared
148 __EOF__
149 fi
150 fi

mercurial