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
# Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
as-option = $( call try-run,\
$( CC) $( KBUILD_CFLAGS) $( 1) -c -x assembler /dev/null -o " $$ TMP " ,$( 1) ,$( 2) )
# as-instr
# Usage: cflags-y += $(call as-instr,instr,option1,option2)
as-instr = $( call try-run,\
printf "%b\n" " $( 1) " | $( CC) $( KBUILD_AFLAGS) -c -x assembler -o " $$ TMP " -,$( 2) ,$( 3) )
# __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) ) )
# cc-ifversion
# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
cc-ifversion = $( shell [ $( CONFIG_GCC_VERSION) 0 $( 1) $( 2) 000 ] && echo $( 3) || echo $( 4) )
# ld-option
# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
ld-option = $( call try-run, $( LD) $( KBUILD_LDFLAGS) $( 1) -v,$( 1) ,$( 2) ,$( 3) )
# ld-ifversion
# Usage: $(call ld-ifversion, -ge, 22252, y)
ld-ifversion = $( shell [ $( CONFIG_LD_VERSION) 0 $( 1) $( 2) 0 ] && echo $( 3) || echo $( 4) )