make/toolchain.sh

Sun, 17 Dec 2023 14:25:34 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 14:25:34 +0100
changeset 797
edbb20b1438d
parent 742
7e67689241fd
child 802
16e5b9d32754
permissions
-rw-r--r--

[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

mercurial