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