Sun, 17 Dec 2023 14:25:34 +0100
[Makefile] fix missing rules preventing dry-runs
We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.
Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.
#!/bin/sh # # toolchain detection # C_COMPILERS="cc gcc clang suncc" CPP_COMPILERS="CC g++ clang++ sunCC" unset CC_ARG_CHECKED unset TOOLCHAIN_DETECTION_ERROR unset TOOLCHAIN_NAME check_c_compiler() { cat > $TEMP_DIR/test.c << __EOF__ /* test file */ #include <stdio.h> int main(int argc, char **argv) { #if defined(__clang__) printf("clang\n"); #elif defined(__GNUC__) printf("gcc\n"); #elif defined(__sun) printf("suncc\n"); #else printf("unknown\n"); #endif return 0; } __EOF__ rm -f $TEMP_DIR/checkcc $1 -o $TEMP_DIR/checkcc $CFLAGS $LDFLAGS $TEMP_DIR/test.c 2> /dev/null if [ $? -ne 0 ]; then return 1 fi return 0 } check_cpp_compiler() { cat > $TEMP_DIR/test.cpp << __EOF__ /* test file */ #include <iostream> int main(int argc, char **argv) { #if defined(__clang__) std::cout << "clang" << std::endl; #elif defined(__GNUC__) std::cout << "gcc" << std::endl; #elif defined(__sun) std::cout << "suncc" << std::endl; #else std::cout << "unknown" << std::endl; #endif return 0; } __EOF__ rm -f $TEMP_DIR/checkcc $1 -o $TEMP_DIR/checkcc $CXXFLAGS $LDFLAGS $TEMP_DIR/test.cpp 2> /dev/null if [ $? -ne 0 ]; then return 1 fi return 0 } printf "detect C compiler... " for COMP in $C_COMPILERS do check_c_compiler $COMP if [ $? -ne 0 ]; then if [ ! -z "$CC" ]; then if [ $COMP = $CC ]; then echo "$CC is not a working C Compiler" TOOLCHAIN_DETECTION_ERROR="error" break fi fi else TOOLCHAIN_NAME=`$TEMP_DIR/checkcc` USE_TOOLCHAIN=$TOOLCHAIN_NAME if [ $COMP = "cc" ]; then # we have found a working compiler, but in case # the compiler is gcc or clang, we try to use # these commands and not 'cc' TOOLCHAIN_NAME=`$TEMP_DIR/checkcc` if [ $TOOLCHAIN_NAME = "gcc" ]; then check_c_compiler "gcc" if [ $? -eq 0 ]; then COMP=gcc USE_TOOLCHAIN="gcc" fi fi if [ $TOOLCHAIN_NAME = "clang" ]; then check_c_compiler "clang" if [ $? -eq 0 ]; then COMP=clang USE_TOOLCHAIN="clang" fi fi fi TOOLCHAIN_NAME=$USE_TOOLCHAIN TOOLCHAIN_CC=$COMP echo $COMP break fi done if [ -z $TOOLCHAIN_CC ]; then echo "not found" fi printf "detect C++ compiler... " for COMP in $CPP_COMPILERS do check_cpp_compiler $COMP if [ $? -ne 0 ]; then if [ ! -z "$CXX" ]; then if [ $COMP = $CXX ]; then echo "$CC is not a working C++ Compiler" TOOLCHAIN_DETECTION_ERROR="error" break fi fi else if [ $COMP = "CC" ]; then # we have found a working compiler, but in case # the compiler is gcc or clang, we try to use # these commands and not 'cc' TOOLCHAIN_NAME=`$TEMP_DIR/checkcc` USE_TOOLCHAIN=$TOOLCHAIN_NAME if [ $TOOLCHAIN_NAME = "gcc" ]; then check_cpp_compiler "g++" if [ $? -eq 0 ]; then COMP=g++ USE_TOOLCHAIN="gcc" fi fi if [ $TOOLCHAIN_NAME = "clang" ]; then check_cpp_compiler "clang++" if [ $? -eq 0 ]; then COMP=clang++ USE_TOOLCHAIN="clang" fi fi fi TOOLCHAIN_NAME=$USE_TOOLCHAIN TOOLCHAIN_CXX=$COMP echo $COMP break fi done if [ -z $TOOLCHAIN_CXX ]; then echo "not found" fi TOOLCHAIN_LD=$TOOLCHAIN_CC if [ -z "$TOOLCHAIN_NAME" ]; then TOOLCHAIN_DETECTION_ERROR="error" else cat >> $TEMP_DIR/config.mk << __EOF__ # toolchain __EOF__ echo "CC = ${TOOLCHAIN_CC}" >> $TEMP_DIR/config.mk if [ ! -z "$TOOLCHAIN_CXX" ]; then echo "CXX = ${TOOLCHAIN_CXX}" >> $TEMP_DIR/config.mk fi echo "LD = ${TOOLCHAIN_LD}" >> $TEMP_DIR/config.mk echo >> $TEMP_DIR/config.mk cat "make/${TOOLCHAIN_NAME}.mk" > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "include \$(BUILD_ROOT)/make/${TOOLCHAIN_NAME}.mk" >> $TEMP_DIR/config.mk else echo "SHLIB_CFLAGS = -fPIC" >> $TEMP_DIR/config.mk echo "SHLIB_LDFLAGS = -shared" >> $TEMP_DIR/config.mk fi fi