xref: /spdk/scripts/detect_cc.sh (revision b78e763c1af2ace4c19d2932065a43357e3f5d3e)
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 " --ld=path                 Linker to use"
23	err " --lto=[y|n]               Attempt to configure for LTO"
24}
25
26CC=cc
27CXX=c++
28LD=ld
29LTO=n
30
31for i in "$@"; do
32	case "$i" in
33		-h|--help)
34			usage
35			exit 0
36			;;
37		--cc=*)
38			CC="${i#*=}"
39			;;
40		--cxx=*)
41			CXX="${i#*=}"
42			;;
43		--lto=*)
44			LTO="${i#*=}"
45			;;
46		--ld=*)
47			LD="${i#*=}"
48			;;
49		--)
50			break
51			;;
52		*)
53			err "Unrecognized option $i"
54			usage
55			exit 1
56	esac
57done
58
59CC_TYPE=$($CC -v 2>&1 | grep -o -E '\w+ version' | head -1 | awk '{ print $1 }')
60CXX_TYPE=$($CXX -v 2>&1 | grep -o -E '\w+ version' | head -1 | awk '{ print $1 }')
61if [ "$CC_TYPE" != "$CXX_TYPE" ]; then
62	err "C compiler is $CC_TYPE but C++ compiler is $CXX_TYPE"
63	err "This may result in errors"
64fi
65
66LD_TYPE=$($LD --version 2>&1 | head -n1 | awk '{print $1, $2}')
67case "$LD_TYPE" in
68	"GNU ld"*)
69		LD_TYPE=bfd
70		;;
71	"GNU gold"*)
72		LD_TYPE=gold
73		;;
74	"LLD"*)
75		LD_TYPE=lld
76		;;
77	*)
78		err "Unsupported linker: $LD"
79		exit 1
80esac
81
82CCAR="ar"
83if [ "$LTO" = "y" ]; then
84	if [ "$CC_TYPE" = "clang" ]; then
85		if [ "$LD_TYPE" != "gold" ]; then
86			err "Using LTO with clang requires the gold linker."
87			exit 1
88		fi
89		CCAR="llvm-ar"
90	else
91		CCAR="gcc-ar"
92	fi
93fi
94
95function set_default() {
96	echo "ifeq (\$(origin $1),default)"
97	echo "$1 = $2"
98	echo "endif"
99	echo ""
100}
101
102set_default CC $CC
103set_default CXX $CXX
104set_default LD $LD
105
106echo "CCAR=$CCAR"
107echo "CC_TYPE=$CC_TYPE"
108echo "LD_TYPE=$LD_TYPE"
109