universe@72: #!/bin/sh universe@72: # universe@72: # toolchain detection universe@72: # universe@72: universe@72: C_COMPILERS="gcc clang suncc cc" universe@72: CPP_COMPILERS="g++ clang++ sunCC CC" universe@72: unset TOOLCHAIN_NAME universe@72: unset TOOLCHAIN_CC universe@72: unset TOOLCHAIN_CXX universe@72: universe@72: check_c_compiler() universe@72: { universe@72: cat > "$TEMP_DIR/test.c" << __EOF__ universe@72: /* test file */ universe@72: #include universe@72: int main(int argc, char **argv) { universe@72: #if defined(__clang__) universe@72: printf("clang\n"); universe@72: #elif defined(__GNUC__) universe@72: printf("gcc\n"); universe@72: #elif defined(__sun) universe@72: printf("suncc\n"); universe@72: #else universe@72: printf("unknown\n"); universe@72: #endif universe@72: return 0; universe@72: } universe@72: __EOF__ universe@72: rm -f "$TEMP_DIR/checkcc" universe@72: $1 -o "$TEMP_DIR/checkcc" $CFLAGS $LDFLAGS "$TEMP_DIR/test.c" 2> /dev/null universe@72: } universe@72: universe@72: check_cpp_compiler() universe@72: { universe@72: cat > "$TEMP_DIR/test.cpp" << __EOF__ universe@72: /* test file */ universe@72: #include universe@72: int main(int argc, char **argv) { universe@72: #if defined(__clang__) universe@72: std::cout << "clang" << std::endl; universe@72: #elif defined(__GNUC__) universe@72: std::cout << "gcc" << std::endl; universe@72: #elif defined(__sun) universe@72: std::cout << "suncc" << std::endl; universe@72: #else universe@72: std::cout << "cc" << std::endl; universe@72: #endif universe@72: return 0; universe@72: } universe@72: __EOF__ universe@72: rm -f "$TEMP_DIR/checkcc" universe@72: $1 -o "$TEMP_DIR/checkcc" $CXXFLAGS $LDFLAGS "$TEMP_DIR/test.cpp" 2> /dev/null universe@72: } universe@72: universe@72: create_libtest_source() universe@72: { universe@72: # $1: filename universe@72: # $2: optional include universe@72: cat > "$TEMP_DIR/$1" << __EOF__ universe@72: /* libtest file */ universe@72: int main(int argc, char **argv) { universe@72: return 0; universe@72: } universe@72: __EOF__ universe@72: if [ -n "$2" ]; then universe@72: echo "#include <$2>" >> "$TEMP_DIR/$1" universe@72: fi universe@72: } universe@72: universe@72: check_c_lib() universe@72: { universe@72: # $1: libname universe@72: # $2: optional include universe@72: if [ -z "$TOOLCHAIN_CC" ]; then universe@72: return 1 universe@72: fi universe@72: create_libtest_source "test.c" "$2" universe@72: rm -f "$TEMP_DIR/checklib" universe@72: $TOOLCHAIN_CC -o "$TEMP_DIR/checklib" $CFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.c" 2> /dev/null universe@72: } universe@72: universe@72: check_cpp_lib() universe@72: { universe@72: # $1: libname universe@72: # $2: optional include universe@72: if [ -z "$TOOLCHAIN_CXX" ]; then universe@72: return 1 universe@72: fi universe@72: create_libtest_source "test.cpp" "$2" universe@72: rm -f "$TEMP_DIR/checklib" universe@72: $TOOLCHAIN_CXX -o "$TEMP_DIR/checklib" $CXXFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.cpp" 2> /dev/null universe@72: } universe@72: universe@72: check_lib() universe@72: { universe@72: # $1: libname universe@72: # $2: optional include universe@72: if [ -n "$TOOLCHAIN_CC" ]; then universe@72: check_c_lib "$1" "$2" universe@72: elif [ -n "$TOOLCHAIN_CXX" ]; then universe@72: check_cpp_lib "$1" "$2" universe@72: fi universe@72: } universe@72: universe@72: detect_c_compiler() universe@72: { universe@72: if [ -n "$TOOLCHAIN_CC" ]; then universe@72: return 0 universe@72: fi universe@72: printf "detect C compiler... " universe@72: if [ -n "$CC" ]; then universe@72: if check_c_compiler "$CC"; then universe@72: TOOLCHAIN_CC=$CC universe@72: TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` universe@72: echo "$CC" universe@72: return 0 universe@72: else universe@72: echo "$CC is not a working C compiler" universe@72: return 1 universe@72: fi universe@72: else universe@72: for COMP in $C_COMPILERS universe@72: do universe@72: if check_c_compiler "$COMP"; then universe@72: TOOLCHAIN_CC=$COMP universe@72: TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` universe@72: echo "$COMP" universe@72: return 0 universe@72: fi universe@72: done universe@72: echo "not found" universe@72: return 1 universe@72: fi universe@72: } universe@72: universe@72: detect_cpp_compiler() universe@72: { universe@72: if [ -n "$TOOLCHAIN_CXX" ]; then universe@72: return 0 universe@72: fi universe@72: printf "detect C++ compiler... " universe@72: universe@72: if [ -n "$CXX" ]; then universe@72: if check_cpp_compiler "$CXX"; then universe@72: TOOLCHAIN_CXX=$CXX universe@72: TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` universe@72: echo "$CXX" universe@72: return 0 universe@72: else universe@72: echo "$CXX is not a working C++ compiler" universe@72: return 1 universe@72: fi universe@72: else universe@72: for COMP in $CPP_COMPILERS universe@72: do universe@72: if check_cpp_compiler "$COMP"; then universe@72: TOOLCHAIN_CXX=$COMP universe@72: TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` universe@72: echo "$COMP" universe@72: return 0 universe@72: fi universe@72: done universe@72: echo "${TOOLCHAIN_CXX:-"not found"}" universe@72: return 1 universe@72: fi universe@72: } universe@72: universe@72: write_toolchain_defaults() universe@72: { universe@72: echo "# toolchain" >> "$1" universe@72: if [ -n "$TOOLCHAIN_CC" ]; then universe@72: echo "CC = ${TOOLCHAIN_CC}" >> "$1" universe@72: fi universe@72: if [ -n "$TOOLCHAIN_CXX" ]; then universe@72: echo "CXX = ${TOOLCHAIN_CXX}" >> "$1" universe@72: fi universe@72: echo >> "$1" universe@72: if [ -f "make/${TOOLCHAIN_NAME}.mk" ]; then universe@72: cat "make/${TOOLCHAIN_NAME}.mk" >> "$1" universe@72: elif [ -f "make/cc.mk" ]; then universe@72: cat "make/cc.mk" >> "$1" universe@72: else universe@72: echo "!!! WARNING !!! Default toolchain flags not found. Configuration might be incomplete." universe@72: fi universe@72: }