xref: /spdk/scripts/detect_cc.sh (revision 95a2dcb321bc73db4e7074c1c5ad96ce24919a68)
1#!/usr/bin/env bash
2
3set -e
4
5function err()
6{
7	echo "$@" >&2
8}
9
10function usage()
11{
12	err "Detect compiler and linker versions, generate mk/cc.mk"
13	err ""
14	err "Usage: ./detect_cc.sh [OPTION]..."
15	err ""
16	err "Defaults for the options are specified in brackets."
17	err ""
18	err "General:"
19	err " -h, --help                Display this help and exit"
20	err " --cc=path                 C compiler to use"
21	err " --cxx=path                C++ compiler to use"
22	err " --lto=[y|n]               Attempt to configure for LTO"
23
24}
25
26CC=cc
27CXX=c++
28LTO=n
29
30for i in "$@"; do
31	case "$i" in
32		-h|--help)
33			usage
34			exit 0
35			;;
36		--cc=*)
37			CC="${i#*=}"
38			;;
39		--cxx=*)
40			CXX="${i#*=}"
41			;;
42		--lto=*)
43			LTO="${i#*=}"
44			;;
45		--)
46			break
47			;;
48		*)
49			err "Unrecognized option $i"
50			usage
51			exit 1
52	esac
53done
54
55CC_TYPE=$($CC -v 2>&1 | grep -o -E '\w+ version' | awk '{ print $1 }')
56CXX_TYPE=$($CXX -v 2>&1 | grep -o -E '\w+ version' | awk '{ print $1 }')
57LD_TYPE=$(ld -v 2>&1 | awk '{print $2}')
58
59if [ "$CC_TYPE" != "$CXX_TYPE" ]; then
60	err "C compiler is $CC_TYPE but C++ compiler is $CXX_TYPE"
61	err "This may result in errors"
62fi
63
64CCAR="ar"
65if [ "$LTO" = "y" ]; then
66	if [ "$CC_TYPE" = "clang" ]; then
67		if [ "$LD_TYPE" != "gold" ]; then
68			err "Using LTO with clang requires the gold linker."
69			exit 1
70		fi
71		 CCAR="llvm-ar"
72	else
73		CCAR="gcc-ar"
74	fi
75fi
76
77echo "CC=$CC"
78echo "CXX=$CXX"
79echo "CCAR=$CCAR"
80echo "CC_TYPE=$CC_TYPE"
81