diff mbox series

[3/4] kbuild: spilt cc-option and friends to scripts/Makefile.compiler

Message ID 20210228061028.239459-3-masahiroy@kernel.org (mailing list archive)
State New
Headers show
Series [1/4] kbuild: add image_name to no-sync-config-targets | expand

Commit Message

Masahiro Yamada Feb. 28, 2021, 6:10 a.m. UTC
scripts/Kbuild.include is included everywhere, but macros such as
cc-option are needed by build targets only.

For example, when 'make clean' traverses the tree, it does not need
to evaluate $(call cc-option,).

Split cc-option, ld-option, etc. to scripts/Makefile.compiler, which
is only included from the top Makefile and scripts/Makefile.build.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 Makefile                  |  4 ++
 scripts/Kbuild.include    | 80 ---------------------------------------
 scripts/Makefile.build    |  1 +
 scripts/Makefile.compiler | 77 +++++++++++++++++++++++++++++++++++++
 4 files changed, 82 insertions(+), 80 deletions(-)
 create mode 100644 scripts/Makefile.compiler

Comments

Janosch Frank April 13, 2021, 12:51 p.m. UTC | #1
On 2/28/21 7:10 AM, Masahiro Yamada wrote:
> scripts/Kbuild.include is included everywhere, but macros such as
> cc-option are needed by build targets only.
> 
> For example, when 'make clean' traverses the tree, it does not need
> to evaluate $(call cc-option,).
> 
> Split cc-option, ld-option, etc. to scripts/Makefile.compiler, which
> is only included from the top Makefile and scripts/Makefile.build.
> 
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

This commit broke the KVM selftest compilation under s390 in linux-next
for me. Funny enough the compilation is only broken on Ubuntu, under
Fedora the test fails with an assertion.

FEDORA:
[root@fedora kvm]# ./set_memory_region_test
Allowed number of memory slots: 32767
==== Test Assertion Failure ====
  lib/kvm_util.c:142: vm->fd >= 0
  pid=1541645 tid=1541645 - Invalid argument
     1	0x0000000001002f4b: vm_open at kvm_util.c:142
     2	 (inlined by) vm_create at kvm_util.c:258
     3	0x00000000010015ef: test_add_max_memory_regions at
set_memory_region_test.c:351
     4	 (inlined by) main at set_memory_region_test.c:397
     5	0x000003ffa3d2bb89: ?? ??:0
     6	0x00000000010017ad: .annobin_abi_note.c.hot at crt1.o:?
  KVM_CREATE_VM ioctl failed, rc: -1 errno: 22


Ubuntu:
make[1]: Leaving directory '/mnt/dev/linux'
gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
-fno-stack-protector -fno-PIE -I../../../../tools/include
-I../../../../tools/arch/s390/include -I../../../../usr/include/
-Iinclude -Ilib -Iinclude/s390x -I..   -c lib/sparsebit.c -o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/sparsebit.o
gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
-fno-stack-protector -fno-PIE -I../../../../tools/include
-I../../../../tools/arch/s390/include -I../../../../usr/include/
-Iinclude -Ilib -Iinclude/s390x -I..   -c lib/kvm_util.c -o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/kvm_util.o
gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
-fno-stack-protector -fno-PIE -I../../../../tools/include
-I../../../../tools/arch/s390/include -I../../../../usr/include/
-Iinclude -Ilib/s390x -Iinclude/s390x -I..   -c
lib/s390x/diag318_test_handler.c -o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.o
ar crs /mnt/dev/linux/tools/testing/selftests/kvm/libkvm.a
/mnt/dev/linux/tools/testing/selftests/kvm/lib/assert.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/elf.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/io.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/kvm_util.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/sparsebit.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/test_util.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/guest_modes.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/perf_test_util.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/processor.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/ucall.o
/mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.o
gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
-fno-stack-protector -fno-PIE -I../../../../tools/include
-I../../../../tools/arch/s390/include -I../../../../usr/include/
-Iinclude -Is390x -Iinclude/s390x -I..  -pthread    s390x/memop.c
/mnt/dev/linux/tools/testing/selftests/kvm/libkvm.a  -o
/mnt/dev/linux/tools/testing/selftests/kvm/s390x/memop
/usr/bin/ld: /tmp/ccFU8WYF.o: `stdout@@GLIBC_2.2' non-PLT reloc for
symbol defined in shared library and accessed from executable (rebuild
file with -fPIC ?)
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make: *** [../lib.mk:139:
/mnt/dev/linux/tools/testing/selftests/kvm/s390x/memop] Error 1

> ---
> 
>  Makefile                  |  4 ++
>  scripts/Kbuild.include    | 80 ---------------------------------------
>  scripts/Makefile.build    |  1 +
>  scripts/Makefile.compiler | 77 +++++++++++++++++++++++++++++++++++++
>  4 files changed, 82 insertions(+), 80 deletions(-)
>  create mode 100644 scripts/Makefile.compiler
> 
> diff --git a/Makefile b/Makefile
> index 2253e31a6bcf..eec7a94f5c33 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -582,6 +582,10 @@ KBUILD_AFLAGS	+= $(CLANG_FLAGS)
>  export CLANG_FLAGS
>  endif
> 
> +# Include this also for config targets because some architectures need
> +# cc-cross-prefix to determine CROSS_COMPILE.
> +include $(srctree)/scripts/Makefile.compiler
> +
>  ifdef config-build
>  # ===========================================================================
>  # *config targets only - make sure prerequisites are updated, and descend
> diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
> index 509e0856d653..82dd1b65b7a8 100644
> --- a/scripts/Kbuild.include
> +++ b/scripts/Kbuild.include
> @@ -67,86 +67,6 @@ define filechk
>  	fi
>  endef
> 
> -######
> -# gcc support functions
> -# See documentation in Documentation/kbuild/makefiles.rst
> -
> -# 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;		\
> -	TMPO=$(TMPOUT)/tmp.o;		\
> -	mkdir -p $(TMPOUT);		\
> -	trap "rm -rf $(TMPOUT)" EXIT;	\
> -	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))
> -
> -######
> -
>  ###
>  # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
>  # Usage:
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 750d6d5225af..d74d3383666e 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -36,6 +36,7 @@ subdir-ccflags-y :=
>  -include include/config/auto.conf
> 
>  include $(srctree)/scripts/Kbuild.include
> +include $(srctree)/scripts/Makefile.compiler
> 
>  # The filename Kbuild has precedence over Makefile
>  kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
> diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler
> new file mode 100644
> index 000000000000..5f759ecc4f04
> --- /dev/null
> +++ b/scripts/Makefile.compiler
> @@ -0,0 +1,77 @@
> +######
> +# gcc support functions
> +# See documentation in Documentation/kbuild/makefiles.rst
> +
> +# 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;		\
> +	TMPO=$(TMPOUT)/tmp.o;		\
> +	mkdir -p $(TMPOUT);		\
> +	trap "rm -rf $(TMPOUT)" EXIT;	\
> +	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))
>
Christian Borntraeger April 13, 2021, 1:11 p.m. UTC | #2
On 13.04.21 14:51, Janosch Frank wrote:
> On 2/28/21 7:10 AM, Masahiro Yamada wrote:
>> scripts/Kbuild.include is included everywhere, but macros such as
>> cc-option are needed by build targets only.
>>
>> For example, when 'make clean' traverses the tree, it does not need
>> to evaluate $(call cc-option,).
>>
>> Split cc-option, ld-option, etc. to scripts/Makefile.compiler, which
>> is only included from the top Makefile and scripts/Makefile.build.
>>
>> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> 
> This commit broke the KVM selftest compilation under s390 in linux-next
> for me. Funny enough the compilation is only broken on Ubuntu, under
> Fedora the test fails with an assertion.
> 
> FEDORA:
> [root@fedora kvm]# ./set_memory_region_test
> Allowed number of memory slots: 32767
> ==== Test Assertion Failure ====
>    lib/kvm_util.c:142: vm->fd >= 0
>    pid=1541645 tid=1541645 - Invalid argument
>       1	0x0000000001002f4b: vm_open at kvm_util.c:142
>       2	 (inlined by) vm_create at kvm_util.c:258
>       3	0x00000000010015ef: test_add_max_memory_regions at
> set_memory_region_test.c:351
>       4	 (inlined by) main at set_memory_region_test.c:397
>       5	0x000003ffa3d2bb89: ?? ??:0
>       6	0x00000000010017ad: .annobin_abi_note.c.hot at crt1.o:?
>    KVM_CREATE_VM ioctl failed, rc: -1 errno: 22
> 
> 
> Ubuntu:
> make[1]: Leaving directory '/mnt/dev/linux'
> gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> -fno-stack-protector -fno-PIE -I../../../../tools/include
> -I../../../../tools/arch/s390/include -I../../../../usr/include/
> -Iinclude -Ilib -Iinclude/s390x -I..   -c lib/sparsebit.c -o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/sparsebit.o
> gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> -fno-stack-protector -fno-PIE -I../../../../tools/include
> -I../../../../tools/arch/s390/include -I../../../../usr/include/
> -Iinclude -Ilib -Iinclude/s390x -I..   -c lib/kvm_util.c -o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/kvm_util.o
> gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> -fno-stack-protector -fno-PIE -I../../../../tools/include
> -I../../../../tools/arch/s390/include -I../../../../usr/include/
> -Iinclude -Ilib/s390x -Iinclude/s390x -I..   -c
> lib/s390x/diag318_test_handler.c -o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.o
> ar crs /mnt/dev/linux/tools/testing/selftests/kvm/libkvm.a
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/assert.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/elf.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/io.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/kvm_util.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/sparsebit.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/test_util.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/guest_modes.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/perf_test_util.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/processor.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/ucall.o
> /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.o
> gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> -fno-stack-protector -fno-PIE -I../../../../tools/include
> -I../../../../tools/arch/s390/include -I../../../../usr/include/
> -Iinclude -Is390x -Iinclude/s390x -I..  -pthread    s390x/memop.c
> /mnt/dev/linux/tools/testing/selftests/kvm/libkvm.a  -o
> /mnt/dev/linux/tools/testing/selftests/kvm/s390x/memop
> /usr/bin/ld: /tmp/ccFU8WYF.o: `stdout@@GLIBC_2.2' non-PLT reloc for
> symbol defined in shared library and accessed from executable (rebuild
> file with -fPIC ?)
> /usr/bin/ld: final link failed: bad value
> collect2: error: ld returned 1 exit status
> make: *** [../lib.mk:139:
> /mnt/dev/linux/tools/testing/selftests/kvm/s390x/memop] Error 1
> 



It looks like that from tools/testing/selftests/kvm/Makefile
additional linker flags are being ignored with this patch.

no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
         $(CC) -Werror -no-pie -x c - -o "$$TMP", -no-pie)

# On s390, build the testcases KVM-enabled
pgste-option = $(call try-run, echo 'int main() { return 0; }' | \
         $(CC) -Werror -Wl$(comma)--s390-pgste -x c - -o "$$TMP",-Wl$(comma)--s390-pgste)


LDFLAGS += -pthread $(no-pie-option) $(pgste-option)
Masahiro Yamada April 15, 2021, 7:34 a.m. UTC | #3
On Tue, Apr 13, 2021 at 10:11 PM Christian Borntraeger
<borntraeger@de.ibm.com> wrote:
>
>
>
> On 13.04.21 14:51, Janosch Frank wrote:
> > On 2/28/21 7:10 AM, Masahiro Yamada wrote:
> >> scripts/Kbuild.include is included everywhere, but macros such as
> >> cc-option are needed by build targets only.
> >>
> >> For example, when 'make clean' traverses the tree, it does not need
> >> to evaluate $(call cc-option,).
> >>
> >> Split cc-option, ld-option, etc. to scripts/Makefile.compiler, which
> >> is only included from the top Makefile and scripts/Makefile.build.
> >>
> >> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> >
> > This commit broke the KVM selftest compilation under s390 in linux-next
> > for me. Funny enough the compilation is only broken on Ubuntu, under
> > Fedora the test fails with an assertion.
> >
> > FEDORA:
> > [root@fedora kvm]# ./set_memory_region_test
> > Allowed number of memory slots: 32767
> > ==== Test Assertion Failure ====
> >    lib/kvm_util.c:142: vm->fd >= 0
> >    pid=1541645 tid=1541645 - Invalid argument
> >       1       0x0000000001002f4b: vm_open at kvm_util.c:142
> >       2        (inlined by) vm_create at kvm_util.c:258
> >       3       0x00000000010015ef: test_add_max_memory_regions at
> > set_memory_region_test.c:351
> >       4        (inlined by) main at set_memory_region_test.c:397
> >       5       0x000003ffa3d2bb89: ?? ??:0
> >       6       0x00000000010017ad: .annobin_abi_note.c.hot at crt1.o:?
> >    KVM_CREATE_VM ioctl failed, rc: -1 errno: 22
> >
> >
> > Ubuntu:
> > make[1]: Leaving directory '/mnt/dev/linux'
> > gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> > -fno-stack-protector -fno-PIE -I../../../../tools/include
> > -I../../../../tools/arch/s390/include -I../../../../usr/include/
> > -Iinclude -Ilib -Iinclude/s390x -I..   -c lib/sparsebit.c -o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/sparsebit.o
> > gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> > -fno-stack-protector -fno-PIE -I../../../../tools/include
> > -I../../../../tools/arch/s390/include -I../../../../usr/include/
> > -Iinclude -Ilib -Iinclude/s390x -I..   -c lib/kvm_util.c -o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/kvm_util.o
> > gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> > -fno-stack-protector -fno-PIE -I../../../../tools/include
> > -I../../../../tools/arch/s390/include -I../../../../usr/include/
> > -Iinclude -Ilib/s390x -Iinclude/s390x -I..   -c
> > lib/s390x/diag318_test_handler.c -o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.o
> > ar crs /mnt/dev/linux/tools/testing/selftests/kvm/libkvm.a
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/assert.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/elf.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/io.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/kvm_util.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/sparsebit.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/test_util.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/guest_modes.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/perf_test_util.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/processor.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/ucall.o
> > /mnt/dev/linux/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.o
> > gcc -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99
> > -fno-stack-protector -fno-PIE -I../../../../tools/include
> > -I../../../../tools/arch/s390/include -I../../../../usr/include/
> > -Iinclude -Is390x -Iinclude/s390x -I..  -pthread    s390x/memop.c
> > /mnt/dev/linux/tools/testing/selftests/kvm/libkvm.a  -o
> > /mnt/dev/linux/tools/testing/selftests/kvm/s390x/memop
> > /usr/bin/ld: /tmp/ccFU8WYF.o: `stdout@@GLIBC_2.2' non-PLT reloc for
> > symbol defined in shared library and accessed from executable (rebuild
> > file with -fPIC ?)
> > /usr/bin/ld: final link failed: bad value
> > collect2: error: ld returned 1 exit status
> > make: *** [../lib.mk:139:
> > /mnt/dev/linux/tools/testing/selftests/kvm/s390x/memop] Error 1
> >
>
>
>
> It looks like that from tools/testing/selftests/kvm/Makefile
> additional linker flags are being ignored with this patch.
>
> no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
>          $(CC) -Werror -no-pie -x c - -o "$$TMP", -no-pie)
>
> # On s390, build the testcases KVM-enabled
> pgste-option = $(call try-run, echo 'int main() { return 0; }' | \
>          $(CC) -Werror -Wl$(comma)--s390-pgste -x c - -o "$$TMP",-Wl$(comma)--s390-pgste)
>
>
> LDFLAGS += -pthread $(no-pie-option) $(pgste-option)
>


Thanks.

I will separate Kbuild and the tool build system.
https://patchwork.kernel.org/project/linux-kbuild/patch/20210415072700.147125-2-masahiroy@kernel.org/

I do not want to be bothered by the can of worms.
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 2253e31a6bcf..eec7a94f5c33 100644
--- a/Makefile
+++ b/Makefile
@@ -582,6 +582,10 @@  KBUILD_AFLAGS	+= $(CLANG_FLAGS)
 export CLANG_FLAGS
 endif
 
+# Include this also for config targets because some architectures need
+# cc-cross-prefix to determine CROSS_COMPILE.
+include $(srctree)/scripts/Makefile.compiler
+
 ifdef config-build
 # ===========================================================================
 # *config targets only - make sure prerequisites are updated, and descend
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 509e0856d653..82dd1b65b7a8 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -67,86 +67,6 @@  define filechk
 	fi
 endef
 
-######
-# gcc support functions
-# See documentation in Documentation/kbuild/makefiles.rst
-
-# 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;		\
-	TMPO=$(TMPOUT)/tmp.o;		\
-	mkdir -p $(TMPOUT);		\
-	trap "rm -rf $(TMPOUT)" EXIT;	\
-	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))
-
-######
-
 ###
 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
 # Usage:
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 750d6d5225af..d74d3383666e 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -36,6 +36,7 @@  subdir-ccflags-y :=
 -include include/config/auto.conf
 
 include $(srctree)/scripts/Kbuild.include
+include $(srctree)/scripts/Makefile.compiler
 
 # The filename Kbuild has precedence over Makefile
 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler
new file mode 100644
index 000000000000..5f759ecc4f04
--- /dev/null
+++ b/scripts/Makefile.compiler
@@ -0,0 +1,77 @@ 
+######
+# gcc support functions
+# See documentation in Documentation/kbuild/makefiles.rst
+
+# 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;		\
+	TMPO=$(TMPOUT)/tmp.o;		\
+	mkdir -p $(TMPOUT);		\
+	trap "rm -rf $(TMPOUT)" EXIT;	\
+	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))