xref: /openbmc/linux/scripts/cc-version.sh (revision 1a261a6e)
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(__GNUC__)
16aec6c60aSMasahiro Yamada	GCC	__GNUC__  __GNUC_MINOR__  __GNUC_PATCHLEVEL__
17aec6c60aSMasahiro Yamada	#else
18aec6c60aSMasahiro Yamada	unknown
19aec6c60aSMasahiro Yamada	#endif
20aec6c60aSMasahiro Yamada	EOF
21aec6c60aSMasahiro Yamada}
22aec6c60aSMasahiro Yamada
23aec6c60aSMasahiro Yamada# Convert the version string x.y.z to a canonical 5 or 6-digit form.
24aec6c60aSMasahiro Yamadaget_canonical_version()
25aec6c60aSMasahiro Yamada{
26aec6c60aSMasahiro Yamada	IFS=.
27aec6c60aSMasahiro Yamada	set -- $1
28aec6c60aSMasahiro Yamada	echo $((10000 * $1 + 100 * $2 + $3))
29aec6c60aSMasahiro Yamada}
30aec6c60aSMasahiro Yamada
31aec6c60aSMasahiro Yamada# $@ instead of $1 because multiple words might be given, e.g. CC="ccache gcc".
32aec6c60aSMasahiro Yamadaorig_args="$@"
33*2f7ab126SMiguel Ojedaset -- $(get_c_compiler_info "$@")
34aec6c60aSMasahiro Yamada
35aec6c60aSMasahiro Yamadaname=$1
36aec6c60aSMasahiro Yamada
37e24b3ffcSMasahiro Yamadamin_tool_version=$(dirname $0)/min-tool-version.sh
38e24b3ffcSMasahiro Yamada
39aec6c60aSMasahiro Yamadacase "$name" in
40aec6c60aSMasahiro YamadaGCC)
41aec6c60aSMasahiro Yamada	version=$2.$3.$4
42e24b3ffcSMasahiro Yamada	min_version=$($min_tool_version gcc)
43aec6c60aSMasahiro Yamada	;;
44aec6c60aSMasahiro YamadaClang)
45aec6c60aSMasahiro Yamada	version=$2.$3.$4
46e24b3ffcSMasahiro Yamada	min_version=$($min_tool_version llvm)
47aec6c60aSMasahiro Yamada	;;
48aec6c60aSMasahiro Yamada*)
49*2f7ab126SMiguel Ojeda	echo "$orig_args: unknown C compiler" >&2
50aec6c60aSMasahiro Yamada	exit 1
51aec6c60aSMasahiro Yamada	;;
52aec6c60aSMasahiro Yamadaesac
53aec6c60aSMasahiro Yamada
54aec6c60aSMasahiro Yamadacversion=$(get_canonical_version $version)
55aec6c60aSMasahiro Yamadamin_cversion=$(get_canonical_version $min_version)
56aec6c60aSMasahiro Yamada
57aec6c60aSMasahiro Yamadaif [ "$cversion" -lt "$min_cversion" ]; then
58aec6c60aSMasahiro Yamada	echo >&2 "***"
59*2f7ab126SMiguel Ojeda	echo >&2 "*** C compiler is too old."
60aec6c60aSMasahiro Yamada	echo >&2 "***   Your $name version:    $version"
61aec6c60aSMasahiro Yamada	echo >&2 "***   Minimum $name version: $min_version"
62aec6c60aSMasahiro Yamada	echo >&2 "***"
63aec6c60aSMasahiro Yamada	exit 1
64aec6c60aSMasahiro Yamadafi
65aec6c60aSMasahiro Yamada
66aec6c60aSMasahiro Yamadaecho $name $cversion
67