Skip to content

Commit

Permalink
kbuild/make.cross: move some functions to kbuild.sh
Browse files Browse the repository at this point in the history
Signed-off-by: Yujie Liu <[email protected]>
Signed-off-by: Philip Li <[email protected]>
  • Loading branch information
Yujie-Liu authored and rli9 committed Nov 21, 2023
1 parent 0dd3d2d commit c1e940a
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 46 deletions.
62 changes: 62 additions & 0 deletions kbuild/kbuild.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#!/bin/bash

is_supported_compiler_option()
{
local compiler_bin=$1
local option=$2

# $ gcc-7 -finvalid -Winvalid -xc /dev/null 2>&1
# gcc-7: error: unrecognized command line option '-finvalid'; did you mean '-finline'?
# gcc-7: error: unrecognized command line option '-Winvalid'; did you mean '-Winline'?
#
# $ gcc-7 -Werror=attribute-alias -xc /dev/null
# cc1: error: -Werror=attribute-alias: no option -Wattribute-alias
# $ gcc-7 -Wno-error=attribute-alias -xc /dev/null
# cc1: error: -Werror=attribute-alias: no option -Wattribute-alias
#
# $ gcc-11 -Winvalid-option -xc /dev/null
# gcc-11: error: unrecognized command-line option ‘-Winvalid-option’; did you mean ‘-Winvalid-pch’?
#
# $ clang-15 -Winvalid-option -finvalid -xc /dev/null
# warning: unknown warning option '-Winvalid-option' [-Wunknown-warning-option]
#
# $ clang-15 -finvalid -xc /dev/null 2>&1
# clang-15: error: unknown argument: '-fstrict-flex-arrays=3'

# if an option is "-Wno-<diagnostic-type>", need to remove "no" and check the the remaining flag.
#
# $ gcc-7 -Wno-attribute-alias -xc /dev/null
# /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
# (.text+0x17): undefined reference to `main'
# collect2: error: ld returned 1 exit status
#
# $ gcc-7 -Wattribute-alias -xc /dev/null
# gcc-7: error: unrecognized command line option '-Wattribute-alias'; did you mean '-Wattributes'?

# delete the "no-" prefix only for warning options
echo $option | grep -q -e "Werror" -e "Wno-error" || option=${option//-Wno-/-W}

$compiler_bin $option -xc /dev/null 2>&1 | grep -q \
-e "unrecognized command.line option" \
-e "no option" \
-e "unknown warning option" \
-e "unknown argument" \
&& return 1

return 0
}

add_kcflag()
{
local flag=$1
is_supported_compiler_option "$compiler_bin" "$flag" && kcflags="$kcflags $flag"
}

add_kbuild_kcflags()
{
local kcflags_file=$1
while read flag
do
add_kcflag "$flag"
done < <(grep -v -e "^#" -e "^$" $kcflags_file)
}
59 changes: 13 additions & 46 deletions kbuild/make.cross
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
# Author: Fengguang Wu <[email protected]>
# Credit: Tony Breeds <[email protected]> for crosstool

lkp_src_kbuild=$(dirname $0)

source $lkp_src_kbuild/kbuild.sh

check_install_path()
{
if [[ $COMPILER_INSTALL_PATH ]]; then
Expand Down Expand Up @@ -483,50 +487,12 @@ setup_crosstool()

setup_kcflags()
{
local compiler_binary=$1

local kcflags=(
# [v6.6-rc1] 26030cb984dd ("extrawarn: move -Wrestrict into W=1 warnings")
-Wrestrict
# [v5.18-rc1] e6148767825c ("Makefile: Enable -Warray-bounds")
-Warray-bounds
# [v6.6-rc1] 6d4ab2e97dcf ("extrawarn: enable format and stringop overflow warnings in W=1")
-Wformat-overflow
-Wformat-truncation
-Wstringop-overflow
# [v6.2-rc1] 80b6093b55e3 ("kbuild: add -Wundef to KBUILD_CPPFLAGS for W=1 builds")
-Wundef
# [v6.5-rc1] df8fc4e934c1 ("kbuild: Enable -fstrict-flex-arrays=3")
-fstrict-flex-arrays=3
# [v6.2-rc1] 3bc753c06dd0 ("kbuild: treat char as always unsigned")
-funsigned-char
# [v6.6-rc1] e88ca24319e4 ("kbuild: consolidate warning flags in scripts/Makefile.extrawarn")
-Wenum-conversion
)

opt_kcflags=()
for flag in "${kcflags[@]}"
do
is_supported_compiler_option "$compiler_binary" "$flag" && opt_kcflags+=("$flag")
done

[[ ${#opt_kcflags[@]} -gt 0 ]] && opt_kcflags="KCFLAGS=${opt_kcflags[@]}"
}

is_supported_compiler_option()
{
local compiler=$1
local option=$2

# $ gcc -Winvalid-option -xc /dev/null
# gcc: error: unrecognized command-line option ‘-Winvalid-option’; did you mean ‘-Winvalid-pch’?
local compiler_bin=$1
local kcflags=

# $ clang-15 -Winvalid-option -xc /dev/null
# warning: unknown warning option '-Winvalid-option' [-Wunknown-warning-option]
add_kbuild_kcflags $lkp_src_kbuild/etc/kbuild-kcflags

$compiler $option -xc /dev/null 2>&1 | grep -q -e "unrecognized command.line option" -e "unknown warning option" && return 1

return 0
[[ $kcflags ]] && opt_kbuild_cflags+=(KCFLAGS="$kcflags")
}

make_cross_main()
Expand Down Expand Up @@ -613,6 +579,7 @@ make_cross_main()
exit 1
}

local opt_kbuild_cflags=()
setup_crosstool || {
echo "setup_crosstool failed"
exit 1
Expand All @@ -632,11 +599,11 @@ make_cross_main()
[[ -f .make-env ]] && source ./.make-env

if [[ -d source && -L source ]]; then
echo make --keep-going -C source O=$PWD $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$opt_kcflags" "$@"
exec make --keep-going -C source O=$PWD $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$opt_kcflags" "$@"
echo make --keep-going -C source O=$PWD $make_dts $opt_arch $opt_cross $subarch $opt_jobs "${opt_kbuild_cflags[@]}" "$@"
exec make --keep-going -C source O=$PWD $make_dts $opt_arch $opt_cross $subarch $opt_jobs "${opt_kbuild_cflags[@]}" "$@"
else
echo make --keep-going $O $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$opt_kcflags" "$@"
exec make --keep-going $O $make_dts $opt_arch $opt_cross $subarch $opt_jobs "$opt_kcflags" "$@"
echo make --keep-going $O $make_dts $opt_arch $opt_cross $subarch $opt_jobs "${opt_kbuild_cflags[@]}" "$@"
exec make --keep-going $O $make_dts $opt_arch $opt_cross $subarch $opt_jobs "${opt_kbuild_cflags[@]}" "$@"
fi
}

Expand Down

0 comments on commit c1e940a

Please sign in to comment.