[v2,3/3] selftests/nolibc: fix up O= option support

Message ID 06d96bd81fe812a9718098a383678ad3beba98b1.1691215074.git.falcon@tinylab.org
State New
Headers
Series selftests/nolibc: add misc improvments |

Commit Message

Zhangjin Wu Aug. 5, 2023, 6:13 a.m. UTC
  To avoid pollute the source code tree and avoid mrproper for every
architecture switch, the O= argument must be supported.

Both IMAGE and .config are from the building directory, let's use
objtree instead of srctree for them.

If no O= option specified, means building kernel in source code tree,
objtree should be srctree in such case.

To support relative path, as suggested by Thomas, $(COMMAND_O) is used
to pass the O=$(ABSOLUTE_O) to the $(MAKE) commands.

Suggested-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/lkml/ZK0AB1OXH1s2xYsh@1wt.eu/
Suggested-by: Thomas Weißschuh <linux@weissschuh.net>
Link: https://lore.kernel.org/lkml/058a264d-45bd-4f1f-8af3-56ed337b3251@t-8ch.de/
Link: https://lore.kernel.org/lkml/500504f6-fed1-45a4-a518-4631a6f3e463@t-8ch.de/
Signed-off-by: Zhangjin Wu <falcon@tinylab.org>
---
 tools/testing/selftests/nolibc/Makefile | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
  

Comments

Willy Tarreau Aug. 6, 2023, 11:21 a.m. UTC | #1
On Sat, Aug 05, 2023 at 02:13:11PM +0800, Zhangjin Wu wrote:
> To avoid pollute the source code tree and avoid mrproper for every
> architecture switch, the O= argument must be supported.
> 
> Both IMAGE and .config are from the building directory, let's use
> objtree instead of srctree for them.
> 
> If no O= option specified, means building kernel in source code tree,
> objtree should be srctree in such case.
> 
> To support relative path, as suggested by Thomas, $(COMMAND_O) is used
> to pass the O=$(ABSOLUTE_O) to the $(MAKE) commands.

Zhangjin, I cannot get this one to work, regardless of what I try:

   $ make -j8 O=$PWD/output-i386 nolibc-test XARCH=i386 CROSS_COMPILE=/f/tc/nolibc/gcc-12.3.0-nolibc/i386-linux/bin/i386-linux- CC=/f/tc/nolibc/gcc-12.3.0-nolibc/i386-linux/bin/i386-linux-gcc
   (...)
   CC      nolibc-test
   In file included from sysroot/i386/include/stdio.h:14,
                    from nolibc-test.c:13:
   sysroot/i386/include/errno.h:10:10: fatal error: asm/errno.h: No such file or directory
      10 | #include <asm/errno.h>
         |          ^~~~~~~~~~~~~
   compilation terminated.

I'll leave it aside for now as I've spent way longer than I hoped on
these series. I could take the previous two patches however.

Thanks,
Willy
  
Zhangjin Wu Aug. 6, 2023, 12:17 p.m. UTC | #2
> On Sat, Aug 05, 2023 at 02:13:11PM +0800, Zhangjin Wu wrote:
> > To avoid pollute the source code tree and avoid mrproper for every
> > architecture switch, the O= argument must be supported.
> > 
> > Both IMAGE and .config are from the building directory, let's use
> > objtree instead of srctree for them.
> > 
> > If no O= option specified, means building kernel in source code tree,
> > objtree should be srctree in such case.
> > 
> > To support relative path, as suggested by Thomas, $(COMMAND_O) is used
> > to pass the O=$(ABSOLUTE_O) to the $(MAKE) commands.
> 
> Zhangjin, I cannot get this one to work, regardless of what I try:
> 
>    $ make -j8 O=$PWD/output-i386 nolibc-test XARCH=i386 CROSS_COMPILE=/f/tc/nolibc/gcc-12.3.0-nolibc/i386-linux/bin/i386-linux- CC=/f/tc/nolibc/gcc-12.3.0-nolibc/i386-linux/bin/i386-linux-gcc
>    (...)
>    CC      nolibc-test
>    In file included from sysroot/i386/include/stdio.h:14,
>                     from nolibc-test.c:13:
>    sysroot/i386/include/errno.h:10:10: fatal error: asm/errno.h: No such file or directory
>       10 | #include <asm/errno.h>
>          |          ^~~~~~~~~~~~~
>    compilation terminated.
>

Willy, I also just reproduced the issue, seems only i386 sysroot has no
asm/errno.h, will check why it is no rightly installed later.

    $ find sysroot/ -name "errno.h"
    sysroot/arm/include/errno.h
    sysroot/arm/include/asm-generic/errno.h
    sysroot/arm/include/asm/errno.h
    sysroot/arm/include/linux/errno.h
    sysroot/riscv/include/errno.h
    sysroot/riscv/include/asm-generic/errno.h
    sysroot/riscv/include/asm/errno.h
    sysroot/riscv/include/linux/errno.h
    sysroot/s390/include/errno.h
    sysroot/s390/include/asm-generic/errno.h
    sysroot/s390/include/asm/errno.h
    sysroot/s390/include/linux/errno.h
    sysroot/arm64/include/errno.h
    sysroot/arm64/include/asm-generic/errno.h
    sysroot/arm64/include/asm/errno.h
    sysroot/arm64/include/linux/errno.h
    sysroot/mips/include/errno.h
    sysroot/mips/include/asm-generic/errno.h
    sysroot/mips/include/asm/errno.h
    sysroot/mips/include/linux/errno.h
    sysroot/x86_64/include/errno.h
    sysroot/x86_64/include/asm-generic/errno.h
    sysroot/x86_64/include/asm/errno.h
    sysroot/x86_64/include/linux/errno.h
    sysroot/i386/include/errno.h
    sysroot/i386/include/asm-generic/errno.h
    sysroot/i386/include/linux/errno.h
    sysroot/powerpc/include/errno.h
    sysroot/powerpc/include/asm-generic/errno.h
    sysroot/powerpc/include/asm/errno.h
    sysroot/powerpc/include/linux/errno.h

> I'll leave it aside for now as I've spent way longer than I hoped on
> these series. I could take the previous two patches however.
>

Ok, let's ignore this one, I will find why sysroot not install well for i386.

Thanks,
Zhangjin

> Thanks,
> Willy
  

Patch

diff --git a/tools/testing/selftests/nolibc/Makefile b/tools/testing/selftests/nolibc/Makefile
index 51fef5e6a152..20797ba5d393 100644
--- a/tools/testing/selftests/nolibc/Makefile
+++ b/tools/testing/selftests/nolibc/Makefile
@@ -9,6 +9,9 @@  ifeq ($(srctree),)
 srctree := $(patsubst %/tools/testing/selftests/,%,$(dir $(CURDIR)))
 endif
 
+# add objtree for O= option, required by IMAGE and .config
+objtree ?= $(srctree)
+
 ifeq ($(ARCH),)
 include $(srctree)/scripts/subarch.include
 ARCH = $(SUBARCH)
@@ -52,7 +55,7 @@  IMAGE_ppc64le    = arch/powerpc/boot/zImage
 IMAGE_riscv      = arch/riscv/boot/Image
 IMAGE_s390       = arch/s390/boot/bzImage
 IMAGE_loongarch  = arch/loongarch/boot/vmlinuz.efi
-IMAGE            = $(IMAGE_$(XARCH))
+IMAGE            = $(objtree)/$(IMAGE_$(XARCH))
 IMAGE_NAME       = $(notdir $(IMAGE))
 
 # CROSS_COMPILE: cross toolchain prefix by architecture
@@ -173,7 +176,7 @@  sysroot: sysroot/$(ARCH)/include
 sysroot/$(ARCH)/include:
 	$(Q)rm -rf sysroot/$(ARCH) sysroot/sysroot
 	$(QUIET_MKDIR)mkdir -p sysroot
-	$(Q)$(MAKE) -C ../../../include/nolibc ARCH=$(ARCH) OUTPUT=$(CURDIR)/sysroot/ headers_standalone
+	$(Q)$(MAKE) -C ../../../include/nolibc $(COMMAND_O) ARCH=$(ARCH) OUTPUT=$(CURDIR)/sysroot/ headers_standalone
 	$(Q)mv sysroot/sysroot sysroot/$(ARCH)
 
 ifneq ($(NOLIBC_SYSROOT),0)
@@ -210,19 +213,19 @@  initramfs: nolibc-test
 	$(Q)cp nolibc-test initramfs/init
 
 defconfig:
-	$(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) mrproper $(DEFCONFIG) prepare
+	$(Q)$(MAKE) -C $(srctree) $(COMMAND_O) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) mrproper $(DEFCONFIG) prepare
 
 kernel: initramfs
-	$(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) $(IMAGE_NAME) CONFIG_INITRAMFS_SOURCE=$(CURDIR)/initramfs
+	$(Q)$(MAKE) -C $(srctree) $(COMMAND_O) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) $(IMAGE_NAME) CONFIG_INITRAMFS_SOURCE=$(CURDIR)/initramfs
 
 # run the tests after building the kernel
 run: kernel
-	$(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
+	$(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
 	$(Q)$(REPORT) $(CURDIR)/run.out
 
 # re-run the tests from an existing kernel
 rerun:
-	$(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
+	$(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out"
 	$(Q)$(REPORT) $(CURDIR)/run.out
 
 # report with existing test log