1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/make/toolchain.sh Fri Sep 22 23:26:23 2023 +0200 1.3 @@ -0,0 +1,186 @@ 1.4 +#!/bin/sh 1.5 +# 1.6 +# toolchain detection 1.7 +# 1.8 + 1.9 +C_COMPILERS="gcc clang suncc cc" 1.10 +CPP_COMPILERS="g++ clang++ sunCC CC" 1.11 +unset TOOLCHAIN_NAME 1.12 +unset TOOLCHAIN_CC 1.13 +unset TOOLCHAIN_CXX 1.14 + 1.15 +check_c_compiler() 1.16 +{ 1.17 + cat > "$TEMP_DIR/test.c" << __EOF__ 1.18 +/* test file */ 1.19 +#include <stdio.h> 1.20 +int main(int argc, char **argv) { 1.21 +#if defined(__clang__) 1.22 + printf("clang\n"); 1.23 +#elif defined(__GNUC__) 1.24 + printf("gcc\n"); 1.25 +#elif defined(__sun) 1.26 + printf("suncc\n"); 1.27 +#else 1.28 + printf("unknown\n"); 1.29 +#endif 1.30 + return 0; 1.31 +} 1.32 +__EOF__ 1.33 + rm -f "$TEMP_DIR/checkcc" 1.34 + $1 -o "$TEMP_DIR/checkcc" $CFLAGS $LDFLAGS "$TEMP_DIR/test.c" 2> /dev/null 1.35 +} 1.36 + 1.37 +check_cpp_compiler() 1.38 +{ 1.39 + cat > "$TEMP_DIR/test.cpp" << __EOF__ 1.40 +/* test file */ 1.41 +#include <iostream> 1.42 +int main(int argc, char **argv) { 1.43 +#if defined(__clang__) 1.44 + std::cout << "clang" << std::endl; 1.45 +#elif defined(__GNUC__) 1.46 + std::cout << "gcc" << std::endl; 1.47 +#elif defined(__sun) 1.48 + std::cout << "suncc" << std::endl; 1.49 +#else 1.50 + std::cout << "cc" << std::endl; 1.51 +#endif 1.52 + return 0; 1.53 +} 1.54 +__EOF__ 1.55 + rm -f "$TEMP_DIR/checkcc" 1.56 + $1 -o "$TEMP_DIR/checkcc" $CXXFLAGS $LDFLAGS "$TEMP_DIR/test.cpp" 2> /dev/null 1.57 +} 1.58 + 1.59 +create_libtest_source() 1.60 +{ 1.61 + # $1: filename 1.62 + # $2: optional include 1.63 + cat > "$TEMP_DIR/$1" << __EOF__ 1.64 +/* libtest file */ 1.65 +int main(int argc, char **argv) { 1.66 + return 0; 1.67 +} 1.68 +__EOF__ 1.69 + if [ -n "$2" ]; then 1.70 + echo "#include <$2>" >> "$TEMP_DIR/$1" 1.71 + fi 1.72 +} 1.73 + 1.74 +check_c_lib() 1.75 +{ 1.76 + # $1: libname 1.77 + # $2: optional include 1.78 + if [ -z "$TOOLCHAIN_CC" ]; then 1.79 + return 1 1.80 + fi 1.81 + create_libtest_source "test.c" "$2" 1.82 + rm -f "$TEMP_DIR/checklib" 1.83 + $TOOLCHAIN_CC -o "$TEMP_DIR/checklib" $CFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.c" 2> /dev/null 1.84 +} 1.85 + 1.86 +check_cpp_lib() 1.87 +{ 1.88 + # $1: libname 1.89 + # $2: optional include 1.90 + if [ -z "$TOOLCHAIN_CXX" ]; then 1.91 + return 1 1.92 + fi 1.93 + create_libtest_source "test.cpp" "$2" 1.94 + rm -f "$TEMP_DIR/checklib" 1.95 + $TOOLCHAIN_CXX -o "$TEMP_DIR/checklib" $CXXFLAGS $LDFLAGS "-l$1" "$TEMP_DIR/test.cpp" 2> /dev/null 1.96 +} 1.97 + 1.98 +check_lib() 1.99 +{ 1.100 + # $1: libname 1.101 + # $2: optional include 1.102 + if [ -n "$TOOLCHAIN_CC" ]; then 1.103 + check_c_lib "$1" "$2" 1.104 + elif [ -n "$TOOLCHAIN_CXX" ]; then 1.105 + check_cpp_lib "$1" "$2" 1.106 + fi 1.107 +} 1.108 + 1.109 +detect_c_compiler() 1.110 +{ 1.111 + if [ -n "$TOOLCHAIN_CC" ]; then 1.112 + return 0 1.113 + fi 1.114 + printf "detect C compiler... " 1.115 + if [ -n "$CC" ]; then 1.116 + if check_c_compiler "$CC"; then 1.117 + TOOLCHAIN_CC=$CC 1.118 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 1.119 + echo "$CC" 1.120 + return 0 1.121 + else 1.122 + echo "$CC is not a working C compiler" 1.123 + return 1 1.124 + fi 1.125 + else 1.126 + for COMP in $C_COMPILERS 1.127 + do 1.128 + if check_c_compiler "$COMP"; then 1.129 + TOOLCHAIN_CC=$COMP 1.130 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 1.131 + echo "$COMP" 1.132 + return 0 1.133 + fi 1.134 + done 1.135 + echo "not found" 1.136 + return 1 1.137 + fi 1.138 +} 1.139 + 1.140 +detect_cpp_compiler() 1.141 +{ 1.142 + if [ -n "$TOOLCHAIN_CXX" ]; then 1.143 + return 0 1.144 + fi 1.145 + printf "detect C++ compiler... " 1.146 + 1.147 + if [ -n "$CXX" ]; then 1.148 + if check_cpp_compiler "$CXX"; then 1.149 + TOOLCHAIN_CXX=$CXX 1.150 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 1.151 + echo "$CXX" 1.152 + return 0 1.153 + else 1.154 + echo "$CXX is not a working C++ compiler" 1.155 + return 1 1.156 + fi 1.157 + else 1.158 + for COMP in $CPP_COMPILERS 1.159 + do 1.160 + if check_cpp_compiler "$COMP"; then 1.161 + TOOLCHAIN_CXX=$COMP 1.162 + TOOLCHAIN_NAME=`"$TEMP_DIR/checkcc"` 1.163 + echo "$COMP" 1.164 + return 0 1.165 + fi 1.166 + done 1.167 + echo "${TOOLCHAIN_CXX:-"not found"}" 1.168 + return 1 1.169 + fi 1.170 +} 1.171 + 1.172 +write_toolchain_defaults() 1.173 +{ 1.174 + echo "# toolchain" >> "$1" 1.175 + if [ -n "$TOOLCHAIN_CC" ]; then 1.176 + echo "CC = ${TOOLCHAIN_CC}" >> "$1" 1.177 + fi 1.178 + if [ -n "$TOOLCHAIN_CXX" ]; then 1.179 + echo "CXX = ${TOOLCHAIN_CXX}" >> "$1" 1.180 + fi 1.181 + echo >> "$1" 1.182 + if [ -f "make/${TOOLCHAIN_NAME}.mk" ]; then 1.183 + cat "make/${TOOLCHAIN_NAME}.mk" >> "$1" 1.184 + elif [ -f "make/cc.mk" ]; then 1.185 + cat "make/cc.mk" >> "$1" 1.186 + else 1.187 + echo "!!! WARNING !!! Default toolchain flags not found. Configuration might be incomplete." 1.188 + fi 1.189 +}