xref: /openbmc/linux/scripts/cc-version.sh (revision 2f7ab126)
1aec6c60aSMasahiro Yamada#!/bin/sh
2aec6c60aSMasahiro Yamada# SPDX-License-Identifier: GPL-2.0
3aec6c60aSMasahiro Yamada#
4*2f7ab126SMiguel Ojeda# Print the C compiler name and its version in a 5 or 6-digit form.
5aec6c60aSMasahiro Yamada# Also, perform the minimum version check.
6aec6c60aSMasahiro Yamada
7aec6c60aSMasahiro Yamadaset -e
8aec6c60aSMasahiro Yamada
9*2f7ab126SMiguel Ojeda# Print the C compiler name and some version components.
10*2f7ab126SMiguel Ojedaget_c_compiler_info()
11aec6c60aSMasahiro Yamada{
12aec6c60aSMasahiro Yamada	cat <<- EOF | "$@" -E -P -x c - 2>/dev/null
13aec6c60aSMasahiro Yamada	#if defined(__clang__)
14aec6c60aSMasahiro Yamada	Clang	__clang_major__  __clang_minor__  __clang_patchlevel__
15aec6c60aSMasahiro Yamada	#elif defined(__INTEL_COMPILER)
16aec6c60aSMasahiro Yamada	ICC	__INTEL_COMPILER  __INTEL_COMPILER_UPDATE
17aec6c60aSMasahiro Yamada	#elif defined(__GNUC__)
18aec6c60aSMasahiro Yamada	GCC	__GNUC__  __GNUC_MINOR__  __GNUC_PATCHLEVEL__
19aec6c60aSMasahiro Yamada	#else
20aec6c60aSMasahiro Yamada	unknown
21aec6c60aSMasahiro Yamada	#endif
22aec6c60aSMasahiro Yamada	EOF
23aec6c60aSMasahiro Yamada}
24aec6c60aSMasahiro Yamada
25aec6c60aSMasahiro Yamada# Convert the version string x.y.z to a canonical 5 or 6-digit form.
26aec6c60aSMasahiro Yamadaget_canonical_version()
27aec6c60aSMasahiro Yamada{
28aec6c60aSMasahiro Yamada	IFS=.
29aec6c60aSMasahiro Yamada	set -- $1
30aec6c60aSMasahiro Yamada	echo $((10000 * $1 + 100 * $2 + $3))
31aec6c60aSMasahiro Yamada}
32aec6c60aSMasahiro Yamada
33aec6c60aSMasahiro Yamada# $@ instead of $1 because multiple words might be given, e.g. CC="ccache gcc".
34aec6c60aSMasahiro Yamadaorig_args="$@"
35*2f7ab126SMiguel Ojedaset -- $(get_c_compiler_info "$@")
36aec6c60aSMasahiro Yamada
37aec6c60aSMasahiro Yamadaname=$1
38aec6c60aSMasahiro Yamada
39e24b3ffcSMasahiro Yamadamin_tool_version=$(dirname $0)/min-tool-version.sh
40e24b3ffcSMasahiro Yamada
41aec6c60aSMasahiro Yamadacase "$name" in
42aec6c60aSMasahiro YamadaGCC)
43aec6c60aSMasahiro Yamada	version=$2.$3.$4
44e24b3ffcSMasahiro Yamada	min_version=$($min_tool_version gcc)
45aec6c60aSMasahiro Yamada	;;
46aec6c60aSMasahiro YamadaClang)
47aec6c60aSMasahiro Yamada	version=$2.$3.$4
48e24b3ffcSMasahiro Yamada	min_version=$($min_tool_version llvm)
49aec6c60aSMasahiro Yamada	;;
50aec6c60aSMasahiro YamadaICC)
51aec6c60aSMasahiro Yamada	version=$(($2 / 100)).$(($2 % 100)).$3
52e24b3ffcSMasahiro Yamada	min_version=$($min_tool_version icc)
53aec6c60aSMasahiro Yamada	;;
54aec6c60aSMasahiro Yamada*)
55*2f7ab126SMiguel Ojeda	echo "$orig_args: unknown C compiler" >&2
56aec6c60aSMasahiro Yamada	exit 1
57aec6c60aSMasahiro Yamada	;;
58aec6c60aSMasahiro Yamadaesac
59aec6c60aSMasahiro Yamada
60aec6c60aSMasahiro Yamadacversion=$(get_canonical_version $version)
61aec6c60aSMasahiro Yamadamin_cversion=$(get_canonical_version $min_version)
62aec6c60aSMasahiro Yamada
63aec6c60aSMasahiro Yamadaif [ "$cversion" -lt "$min_cversion" ]; then
64aec6c60aSMasahiro Yamada	echo >&2 "***"
65*2f7ab126SMiguel Ojeda	echo >&2 "*** C compiler is too old."
66aec6c60aSMasahiro Yamada	echo >&2 "***   Your $name version:    $version"
67aec6c60aSMasahiro Yamada	echo >&2 "***   Minimum $name version: $min_version"
68aec6c60aSMasahiro Yamada	echo >&2 "***"
69aec6c60aSMasahiro Yamada	exit 1
70aec6c60aSMasahiro Yamadafi
71aec6c60aSMasahiro Yamada
72aec6c60aSMasahiro Yamadaecho $name $cversion
73