mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-07 06:14:24 +08:00
4a95be7ed7
Paul and I got trapped a few times by not seeing the effects of applying a patch to the nolibc source code until a "make clean" was issued in the nolibc directory. It's particularly annoying when trying to confirm that a proposed patch really solves a problem (or that reverting it reintroduces the problem). The reason for the sysroot not being rebuilt was that it can be quite slow. But in fact it's only slow after a "make clean" issued at the kernel's topdir, because it's the main "make headers" that can take a tens of seconds; as long as "usr/include" still contains headers, the "headers_install" phase is only a quick "rsync", and rebuilding the whole nolibc sysroot takes a bit less than one second, which is perfectly acceptable for a test, even more once the time lost caused by misleading results is factored in. This patch marks the sysroot target as phony and starts by clearing the previous sysroot for the current architecture before reinstalling it. Thanks to this, applying a patch to nolibc makes the effect immediately visible to "make nolibc-test": $ time make -j -C tools/testing/selftests/nolibc nolibc-test make: Entering directory '/k/tools/testing/selftests/nolibc' MKDIR sysroot/x86/include make[1]: Entering directory '/k/tools/include/nolibc' make[2]: Entering directory '/k' make[2]: Leaving directory '/k' make[2]: Entering directory '/k' INSTALL /k/tools/testing/selftests/nolibc/sysroot/sysroot/include make[2]: Leaving directory '/k' make[1]: Leaving directory '/k/tools/include/nolibc' CC nolibc-test make: Leaving directory '/k/tools/testing/selftests/nolibc' real 0m0.869s user 0m0.716s sys 0m0.149s Cc: "Paul E. McKenney" <paulmck@kernel.org> Link: https://lore.kernel.org/all/20221021155645.GK5600@paulmck-ThinkPad-P17-Gen-1/ Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
139 lines
5.1 KiB
Makefile
139 lines
5.1 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
# Makefile for nolibc tests
|
|
include ../../../scripts/Makefile.include
|
|
|
|
# we're in ".../tools/testing/selftests/nolibc"
|
|
ifeq ($(srctree),)
|
|
srctree := $(patsubst %/tools/testing/selftests/,%,$(dir $(CURDIR)))
|
|
endif
|
|
|
|
ifeq ($(ARCH),)
|
|
include $(srctree)/scripts/subarch.include
|
|
ARCH = $(SUBARCH)
|
|
endif
|
|
|
|
# kernel image names by architecture
|
|
IMAGE_i386 = arch/x86/boot/bzImage
|
|
IMAGE_x86 = arch/x86/boot/bzImage
|
|
IMAGE_arm64 = arch/arm64/boot/Image
|
|
IMAGE_arm = arch/arm/boot/zImage
|
|
IMAGE_mips = vmlinuz
|
|
IMAGE_riscv = arch/riscv/boot/Image
|
|
IMAGE = $(IMAGE_$(ARCH))
|
|
IMAGE_NAME = $(notdir $(IMAGE))
|
|
|
|
# default kernel configurations that appear to be usable
|
|
DEFCONFIG_i386 = defconfig
|
|
DEFCONFIG_x86 = defconfig
|
|
DEFCONFIG_arm64 = defconfig
|
|
DEFCONFIG_arm = multi_v7_defconfig
|
|
DEFCONFIG_mips = malta_defconfig
|
|
DEFCONFIG_riscv = defconfig
|
|
DEFCONFIG = $(DEFCONFIG_$(ARCH))
|
|
|
|
# optional tests to run (default = all)
|
|
TEST =
|
|
|
|
# QEMU_ARCH: arch names used by qemu
|
|
QEMU_ARCH_i386 = i386
|
|
QEMU_ARCH_x86 = x86_64
|
|
QEMU_ARCH_arm64 = aarch64
|
|
QEMU_ARCH_arm = arm
|
|
QEMU_ARCH_mips = mipsel # works with malta_defconfig
|
|
QEMU_ARCH_riscv = riscv64
|
|
QEMU_ARCH = $(QEMU_ARCH_$(ARCH))
|
|
|
|
# QEMU_ARGS : some arch-specific args to pass to qemu
|
|
QEMU_ARGS_i386 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
|
QEMU_ARGS_x86 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
|
QEMU_ARGS_arm64 = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
|
QEMU_ARGS_arm = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
|
QEMU_ARGS_mips = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
|
QEMU_ARGS_riscv = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
|
|
QEMU_ARGS = $(QEMU_ARGS_$(ARCH))
|
|
|
|
# OUTPUT is only set when run from the main makefile, otherwise
|
|
# it defaults to this nolibc directory.
|
|
OUTPUT ?= $(CURDIR)/
|
|
|
|
ifeq ($(V),1)
|
|
Q=
|
|
else
|
|
Q=@
|
|
endif
|
|
|
|
CFLAGS ?= -Os -fno-ident -fno-asynchronous-unwind-tables
|
|
LDFLAGS := -s
|
|
|
|
help:
|
|
@echo "Supported targets under selftests/nolibc:"
|
|
@echo " all call the \"run\" target below"
|
|
@echo " help this help"
|
|
@echo " sysroot create the nolibc sysroot here (uses \$$ARCH)"
|
|
@echo " nolibc-test build the executable (uses \$$CC and \$$CROSS_COMPILE)"
|
|
@echo " initramfs prepare the initramfs with nolibc-test"
|
|
@echo " defconfig create a fresh new default config (uses \$$ARCH)"
|
|
@echo " kernel (re)build the kernel with the initramfs (uses \$$ARCH)"
|
|
@echo " run runs the kernel in QEMU after building it (uses \$$ARCH, \$$TEST)"
|
|
@echo " rerun runs a previously prebuilt kernel in QEMU (uses \$$ARCH, \$$TEST)"
|
|
@echo " clean clean the sysroot, initramfs, build and output files"
|
|
@echo ""
|
|
@echo "The output file is \"run.out\". Test ranges may be passed using \$$TEST."
|
|
@echo ""
|
|
@echo "Currently using the following variables:"
|
|
@echo " ARCH = $(ARCH)"
|
|
@echo " CROSS_COMPILE = $(CROSS_COMPILE)"
|
|
@echo " CC = $(CC)"
|
|
@echo " OUTPUT = $(OUTPUT)"
|
|
@echo " TEST = $(TEST)"
|
|
@echo " QEMU_ARCH = $(if $(QEMU_ARCH),$(QEMU_ARCH),UNKNOWN_ARCH) [determined from \$$ARCH]"
|
|
@echo " IMAGE_NAME = $(if $(IMAGE_NAME),$(IMAGE_NAME),UNKNOWN_ARCH) [determined from \$$ARCH]"
|
|
@echo ""
|
|
|
|
all: run
|
|
|
|
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)mv sysroot/sysroot sysroot/$(ARCH)
|
|
|
|
nolibc-test: nolibc-test.c sysroot/$(ARCH)/include
|
|
$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ \
|
|
-nostdlib -static -Isysroot/$(ARCH)/include $< -lgcc
|
|
|
|
initramfs: nolibc-test
|
|
$(QUIET_MKDIR)mkdir -p initramfs
|
|
$(call QUIET_INSTALL, initramfs/init)
|
|
$(Q)cp nolibc-test initramfs/init
|
|
|
|
defconfig:
|
|
$(Q)$(MAKE) -C $(srctree) 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
|
|
|
|
# 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)grep -w FAIL "$(CURDIR)/run.out" && echo "See all results in $(CURDIR)/run.out" || echo "$$(grep -c ^[0-9].*OK $(CURDIR)/run.out) test(s) passed."
|
|
|
|
# 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)grep -w FAIL "$(CURDIR)/run.out" && echo "See all results in $(CURDIR)/run.out" || echo "$$(grep -c ^[0-9].*OK $(CURDIR)/run.out) test(s) passed."
|
|
|
|
clean:
|
|
$(call QUIET_CLEAN, sysroot)
|
|
$(Q)rm -rf sysroot
|
|
$(call QUIET_CLEAN, nolibc-test)
|
|
$(Q)rm -f nolibc-test
|
|
$(call QUIET_CLEAN, initramfs)
|
|
$(Q)rm -rf initramfs
|
|
$(call QUIET_CLEAN, run.out)
|
|
$(Q)rm -rf run.out
|
|
|
|
.PHONY: sysroot/$(ARCH)/include
|