forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 431
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kbuild: check the minimum compiler version in Kconfig
Paul Gortmaker reported a regression in the GCC version check. [1] If you use GCC 4.8, the build breaks before showing the error message "error Sorry, your version of GCC is too old - please use 4.9 or newer." I do not want to apply his fix-up since it implies we would not be able to remove any cc-option test. Anyway, I admit checking the GCC version in <linux/compiler-gcc.h> is too late. Almost at the same time, Linus also suggested to move the compiler version error to Kconfig time. [2] I unified the two similar scripts, gcc-version.sh and clang-version.sh into cc-version.sh. The old scripts invoked the compiler multiple times (3 times for gcc-version.sh, 4 times for clang-version.sh). I refactored the code so the new one invokes the compiler just once, and also tried my best to use shell-builtin commands where possible. The new script runs faster. $ time ./scripts/clang-version.sh clang 120000 real 0m0.029s user 0m0.012s sys 0m0.021s $ time ./scripts/cc-version.sh clang Clang 120000 real 0m0.009s user 0m0.006s sys 0m0.004s cc-version.sh also shows an error message if the compiler is too old: $ make defconfig CC=clang-9 *** Default configuration is based on 'x86_64_defconfig' *** *** Compiler is too old. *** Your Clang version: 9.0.1 *** Minimum Clang version: 10.0.1 *** scripts/Kconfig.include:46: Sorry, this compiler is not supported. make[1]: *** [scripts/kconfig/Makefile:81: defconfig] Error 1 make: *** [Makefile:602: defconfig] Error 2 The new script takes care of ICC because we have <linux/compiler-intel.h> although I am not sure if building the kernel with ICC is well-supported. [1]: https://lore.kernel.org/r/[email protected] [2]: https://lore.kernel.org/r/CAHk-=wh-+TMHPTFo1qs-MYyK7tZh-OQovA=pP3=e06aCVp6_kA@mail.gmail.com Fixes: 87de84c ("kbuild: remove cc-option test of -Werror=date-time") Reported-by: Paul Gortmaker <[email protected]> Suggested-by: Linus Torvalds <[email protected]> Reviewed-by: Nick Desaulniers <[email protected]> Tested-by: Nick Desaulniers <[email protected]> Reviewed-by: Nathan Chancellor <[email protected]> Tested-by: Nathan Chancellor <[email protected]> Reviewed-by: Miguel Ojeda <[email protected]> Tested-by: Miguel Ojeda <[email protected]> Tested-by: Sedat Dilek <[email protected]> Signed-off-by: Masahiro Yamada <[email protected]>
- Loading branch information
Showing
8 changed files
with
93 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,17 +10,6 @@ | |
+ __GNUC_MINOR__ * 100 \ | ||
+ __GNUC_PATCHLEVEL__) | ||
|
||
/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 */ | ||
#if GCC_VERSION < 40900 | ||
# error Sorry, your version of GCC is too old - please use 4.9 or newer. | ||
#elif defined(CONFIG_ARM64) && GCC_VERSION < 50100 | ||
/* | ||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293 | ||
* https://lore.kernel.org/r/[email protected] | ||
*/ | ||
# error Sorry, your version of GCC is too old - please use 5.1 or newer. | ||
#endif | ||
|
||
/* | ||
* This macro obfuscates arithmetic on a variable address so that gcc | ||
* shouldn't recognize the original var, and make assumptions about it. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# | ||
# Print the compiler name and its version in a 5 or 6-digit form. | ||
# Also, perform the minimum version check. | ||
|
||
set -e | ||
|
||
# When you raise the minimum compiler version, please update | ||
# Documentation/process/changes.rst as well. | ||
gcc_min_version=4.9.0 | ||
clang_min_version=10.0.1 | ||
icc_min_version=16.0.3 # temporary | ||
|
||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293 | ||
# https://lore.kernel.org/r/[email protected] | ||
if [ "$SRCARCH" = arm64 ]; then | ||
gcc_min_version=5.1.0 | ||
fi | ||
|
||
# Print the compiler name and some version components. | ||
get_compiler_info() | ||
{ | ||
cat <<- EOF | "$@" -E -P -x c - 2>/dev/null | ||
#if defined(__clang__) | ||
Clang __clang_major__ __clang_minor__ __clang_patchlevel__ | ||
#elif defined(__INTEL_COMPILER) | ||
ICC __INTEL_COMPILER __INTEL_COMPILER_UPDATE | ||
#elif defined(__GNUC__) | ||
GCC __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ | ||
#else | ||
unknown | ||
#endif | ||
EOF | ||
} | ||
|
||
# Convert the version string x.y.z to a canonical 5 or 6-digit form. | ||
get_canonical_version() | ||
{ | ||
IFS=. | ||
set -- $1 | ||
echo $((10000 * $1 + 100 * $2 + $3)) | ||
} | ||
|
||
# $@ instead of $1 because multiple words might be given, e.g. CC="ccache gcc". | ||
orig_args="$@" | ||
set -- $(get_compiler_info "$@") | ||
|
||
name=$1 | ||
|
||
case "$name" in | ||
GCC) | ||
version=$2.$3.$4 | ||
min_version=$gcc_min_version | ||
;; | ||
Clang) | ||
version=$2.$3.$4 | ||
min_version=$clang_min_version | ||
;; | ||
ICC) | ||
version=$(($2 / 100)).$(($2 % 100)).$3 | ||
min_version=$icc_min_version | ||
;; | ||
*) | ||
echo "$orig_args: unknown compiler" >&2 | ||
exit 1 | ||
;; | ||
esac | ||
|
||
cversion=$(get_canonical_version $version) | ||
min_cversion=$(get_canonical_version $min_version) | ||
|
||
if [ "$cversion" -lt "$min_cversion" ]; then | ||
echo >&2 "***" | ||
echo >&2 "*** Compiler is too old." | ||
echo >&2 "*** Your $name version: $version" | ||
echo >&2 "*** Minimum $name version: $min_version" | ||
echo >&2 "***" | ||
exit 1 | ||
fi | ||
|
||
echo $name $cversion |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.