2021-02-28 09:10:27 +03:00
# SPDX-License-Identifier: GPL-2.0-only
# cc-cross-prefix
# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
# Return first <prefix> where a <prefix>gcc is found in PATH.
# If no gcc found in PATH with listed prefixes return nothing
#
# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it
# would try to directly execute the shell builtin 'command'. This workaround
# should be kept for a long time since this issue was fixed only after the
# GNU Make 4.2.1 release.
cc-cross-prefix = $( firstword $( foreach c, $( 1) , \
$( if $( shell command -v -- $( c) gcc 2>/dev/null) , $( c) ) ) )
# output directory for tests below
TMPOUT = $( if $( KBUILD_EXTMOD) ,$( firstword $( KBUILD_EXTMOD) ) /) .tmp_$$ $$
# try-run
# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
# Exit code chooses option. "$$TMP" serves as a temporary file and is
# automatically cleaned up.
try-run = $( shell set -e; \
TMP = $( TMPOUT) /tmp; \
trap " rm -rf $( TMPOUT) " EXIT; \
2022-07-28 06:14:33 +03:00
mkdir -p $( TMPOUT) ; \
2021-02-28 09:10:27 +03:00
if ( $( 1) ) >/dev/null 2>& 1; \
then echo " $( 2) " ; \
else echo " $( 3) " ; \
fi )
# as-option
2023-01-12 06:05:01 +03:00
# Usage: aflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
2021-02-28 09:10:27 +03:00
as-option = $( call try-run,\
2023-06-07 01:40:35 +03:00
$( CC) -Werror $( KBUILD_CPPFLAGS) $( KBUILD_AFLAGS) $( 1) -c -x assembler-with-cpp /dev/null -o " $$ TMP " ,$( 1) ,$( 2) )
2021-02-28 09:10:27 +03:00
# as-instr
2023-01-12 06:05:01 +03:00
# Usage: aflags-y += $(call as-instr,instr,option1,option2)
2021-02-28 09:10:27 +03:00
as-instr = $( call try-run,\
2023-06-01 22:50:39 +03:00
printf "%b\n" " $( 1) " | $( CC) -Werror $( CLANG_FLAGS) $( KBUILD_AFLAGS) -c -x assembler-with-cpp -o " $$ TMP " -,$( 2) ,$( 3) )
2021-02-28 09:10:27 +03:00
# __cc-option
# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
__cc-option = $( call try-run,\
$( 1) -Werror $( 2) $( 3) -c -x c /dev/null -o " $$ TMP " ,$( 3) ,$( 4) )
# cc-option
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
cc-option = $( call __cc-option, $( CC) ,\
$( KBUILD_CPPFLAGS) $( KBUILD_CFLAGS) ,$( 1) ,$( 2) )
# cc-option-yn
# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
cc-option-yn = $( call try-run,\
$( CC) -Werror $( KBUILD_CPPFLAGS) $( KBUILD_CFLAGS) $( 1) -c -x c /dev/null -o " $$ TMP " ,y,n)
# cc-disable-warning
# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
cc-disable-warning = $( call try-run,\
$( CC) -Werror $( KBUILD_CPPFLAGS) $( KBUILD_CFLAGS) -W$( strip $( 1) ) -c -x c /dev/null -o " $$ TMP " ,-Wno-$( strip $( 1) ) )
2022-09-19 20:08:28 +03:00
# gcc-min-version
# Usage: cflags-$(call gcc-min-version, 70100) += -foo
kbuild: add test-{ge,gt,le,lt} macros
GNU Make 4.4 introduced $(intcmp ...), which is useful to compare two
integers without forking a new process.
Add test-{ge,gt,le,lt} macros, which work more efficiently with GNU
Make >= 4.4. For older Make versions, they fall back to the 'test'
shell command.
The first two parameters to $(intcmp ...) must not be empty. To avoid
the syntax error, I appended '0' to them. Fortunately, '00' is treated
as '0'. This is needed because CONFIG options may expand to an empty
string when the kernel configuration is not included.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com> # RISC-V
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
2022-12-11 05:46:47 +03:00
gcc-min-version = $( call test-ge, $( CONFIG_GCC_VERSION) , $1 )
2022-09-19 20:08:28 +03:00
# clang-min-version
# Usage: cflags-$(call clang-min-version, 110000) += -foo
kbuild: add test-{ge,gt,le,lt} macros
GNU Make 4.4 introduced $(intcmp ...), which is useful to compare two
integers without forking a new process.
Add test-{ge,gt,le,lt} macros, which work more efficiently with GNU
Make >= 4.4. For older Make versions, they fall back to the 'test'
shell command.
The first two parameters to $(intcmp ...) must not be empty. To avoid
the syntax error, I appended '0' to them. Fortunately, '00' is treated
as '0'. This is needed because CONFIG options may expand to an empty
string when the kernel configuration is not included.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com> # RISC-V
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
2022-12-11 05:46:47 +03:00
clang-min-version = $( call test-ge, $( CONFIG_CLANG_VERSION) , $1 )
2021-02-28 09:10:27 +03:00
# ld-option
# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
ld-option = $( call try-run, $( LD) $( KBUILD_LDFLAGS) $( 1) -v,$( 1) ,$( 2) ,$( 3) )