>From [1]: > Please look into a wayto invoke all of them instead of adding individual > net/* to the main Makefile. This list seems to be growing. :) I might have misunderstood what was suggested... Here is an attempt to let sub-selftests define their own $(TARGETS) directories. [1]: https://lore.kernel.org/all/aa0143bc-b0d1-69fb-c117-1e7241f0ad89@xxxxxxxxxxxxxxxxxxx/T/#u Cc: "David S. Miller" <davem@xxxxxxxxxxxxx> Cc: Eric Dumazet <edumazet@xxxxxxxxxx> Cc: Jakub Kicinski <kuba@xxxxxxxxxx> Cc: Paolo Abeni <pabeni@xxxxxxxxxx> Signed-off-by: Dmitry Safonov <dima@xxxxxxxxxx> --- tools/testing/selftests/Makefile | 71 ++++---------------- tools/testing/selftests/drivers/Makefile | 7 ++ tools/testing/selftests/filesystems/Makefile | 4 ++ tools/testing/selftests/lib.mk | 60 ++++++++++++++++- tools/testing/selftests/net/Makefile | 4 ++ 5 files changed, 86 insertions(+), 60 deletions(-) create mode 100644 tools/testing/selftests/drivers/Makefile diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index c2064a35688b..69bb25f7b3b8 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -10,15 +10,10 @@ TARGETS += core TARGETS += cpufreq TARGETS += cpu-hotplug TARGETS += damon -TARGETS += drivers/dma-buf -TARGETS += drivers/s390x/uvdevice -TARGETS += drivers/net/bonding +TARGETS += drivers TARGETS += efivarfs TARGETS += exec TARGETS += filesystems -TARGETS += filesystems/binderfs -TARGETS += filesystems/epoll -TARGETS += filesystems/fat TARGETS += firmware TARGETS += fpu TARGETS += ftrace @@ -44,9 +39,6 @@ TARGETS += move_mount_set_group TARGETS += mqueue TARGETS += nci TARGETS += net -TARGETS += net/af_unix -TARGETS += net/forwarding -TARGETS += net/mptcp TARGETS += netfilter TARGETS += nsfs TARGETS += pidfd @@ -93,16 +85,14 @@ TARGETS_HOTPLUG += memory-hotplug # BPF since it has cutting edge build time dependencies which require # more effort to install. SKIP_TARGETS ?= bpf -ifneq ($(SKIP_TARGETS),) - TMP := $(filter-out $(SKIP_TARGETS), $(TARGETS)) - override TARGETS := $(TMP) -endif +export SKIP_TARGETS # User can set FORCE_TARGETS to 1 to require all targets to be successfully # built; make will fail if any of the targets cannot be built. If # FORCE_TARGETS is not set (the default), make will succeed if at least one # of the targets gets built. FORCE_TARGETS ?= +export FORCE_TARGETS # Clear LDFLAGS and MAKEFLAGS when implicit rules are missing. This provides # implicit rules to sub-test Makefiles which avoids build failures in test @@ -145,6 +135,7 @@ endif # Prepare for headers install include $(top_srcdir)/scripts/subarch.include ARCH ?= $(SUBARCH) +export abs_objtree export BUILD export KHDR_INCLUDES @@ -152,23 +143,7 @@ export KHDR_INCLUDES # all isn't the first target in the file. .DEFAULT_GOAL := all -all: - @ret=1; \ - for TARGET in $(TARGETS); do \ - BUILD_TARGET=$$BUILD/$$TARGET; \ - mkdir $$BUILD_TARGET -p; \ - $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET \ - O=$(abs_objtree) \ - $(if $(FORCE_TARGETS),|| exit); \ - ret=$$((ret * $$?)); \ - done; exit $$ret; - -run_tests: all - @for TARGET in $(TARGETS); do \ - BUILD_TARGET=$$BUILD/$$TARGET; \ - $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests \ - O=$(abs_objtree); \ - done; +OUTPUT := $(BUILD) hotplug: @for TARGET in $(TARGETS_HOTPLUG); do \ @@ -204,8 +179,9 @@ KSFT_INSTALL_PATH := $(abspath $(KSFT_INSTALL_PATH)) INSTALL_PATH := $(KSFT_INSTALL_PATH) ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh TEST_LIST := $(INSTALL_PATH)/kselftest-list.txt +export TEST_LIST -install: all +main_install: all ifdef INSTALL_PATH @# Ask all targets to install their files mkdir -p $(INSTALL_PATH)/kselftest @@ -214,31 +190,14 @@ ifdef INSTALL_PATH install -m 744 kselftest/prefix.pl $(INSTALL_PATH)/kselftest/ install -m 744 run_kselftest.sh $(INSTALL_PATH)/ rm -f $(TEST_LIST) - @ret=1; \ - for TARGET in $(TARGETS); do \ - BUILD_TARGET=$$BUILD/$$TARGET; \ - $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install \ - O=$(abs_objtree) \ - $(if $(FORCE_TARGETS),|| exit); \ - ret=$$((ret * $$?)); \ - done; exit $$ret; - - - @# Ask all targets to emit their test scripts - @# While building kselftest-list.text skip also non-existent TARGET dirs: - @# they could be the result of a build failure and should NOT be - @# included in the generated runlist. - for TARGET in $(TARGETS); do \ - BUILD_TARGET=$$BUILD/$$TARGET; \ - [ ! -d $(INSTALL_PATH)/$$TARGET ] && echo "Skipping non-existent dir: $$TARGET" && continue; \ - echo -ne "Emit Tests for $$TARGET\n"; \ - $(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET COLLECTION=$$TARGET \ - -C $$TARGET emit_tests >> $(TEST_LIST); \ - done; else $(error Error: set INSTALL_PATH to use install) endif +include lib.mk + +install: main_install + FORMAT ?= .gz TAR_PATH = $(abspath ${INSTALL_PATH}/kselftest-packages/kselftest.tar${FORMAT}) gen_tar: install @@ -246,10 +205,4 @@ gen_tar: install @tar caf ${TAR_PATH} --exclude=kselftest-packages -C ${INSTALL_PATH} . @echo "Created ${TAR_PATH}" -clean: - @for TARGET in $(TARGETS); do \ - BUILD_TARGET=$$BUILD/$$TARGET; \ - $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\ - done; - -.PHONY: all run_tests hotplug run_hotplug clean_hotplug run_pstore_crash install clean gen_tar +.PHONY: run_tests hotplug run_hotplug clean_hotplug run_pstore_crash gen_tar diff --git a/tools/testing/selftests/drivers/Makefile b/tools/testing/selftests/drivers/Makefile new file mode 100644 index 000000000000..4d4693c8efbc --- /dev/null +++ b/tools/testing/selftests/drivers/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +TARGETS += dma-buf +TARGETS += s390x/uvdevice +TARGETS += net/bonding + +include ../lib.mk diff --git a/tools/testing/selftests/filesystems/Makefile b/tools/testing/selftests/filesystems/Makefile index 129880fb42d3..04fde0107d7a 100644 --- a/tools/testing/selftests/filesystems/Makefile +++ b/tools/testing/selftests/filesystems/Makefile @@ -4,4 +4,8 @@ CFLAGS += -I../../../../usr/include/ TEST_GEN_PROGS := devpts_pts TEST_GEN_PROGS_EXTENDED := dnotify_test +TARGETS += binderfs +TARGETS += epoll +TARGETS += fat + include ../lib.mk diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk index d44c72b3abe3..7aed8dd54da8 100644 --- a/tools/testing/selftests/lib.mk +++ b/tools/testing/selftests/lib.mk @@ -33,14 +33,17 @@ else CC := $(CROSS_COMPILE)gcc endif # LLVM +pwd=$(shell pwd) ifeq (0,$(MAKELEVEL)) ifeq ($(OUTPUT),) - OUTPUT := $(shell pwd) + OUTPUT := $(pwd) DEFAULT_INSTALL_HDR_PATH := 1 endif endif selfdir = $(realpath $(dir $(filter %/lib.mk,$(MAKEFILE_LIST)))) top_srcdir = $(selfdir)/../../.. +testdir = $(pwd:$(selfdir)/%=%) +export OUTPUT # The following are built by lib.mk common compile rules. # TEST_CUSTOM_PROGS should be used by tests that require @@ -52,7 +55,24 @@ TEST_GEN_PROGS := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS)) TEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED)) TEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES)) +ifneq ($(SKIP_TARGETS),) + TARGETS_REL := $(patsubst %,$(testdir)/%,$(TARGETS)) + TMP := $(filter-out $(SKIP_TARGETS),$(TARGETS_REL)) + override TARGETS := $(TMP:$(testdir)/%=%) +endif + all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) +ifneq ($(TARGETS),) + @ret=1; \ + for TARGET in $(TARGETS); do \ + BUILD_TARGET=$$OUTPUT/$$TARGET; \ + mkdir $$BUILD_TARGET -p; \ + $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET \ + O=$(abs_objtree) \ + $(if $(FORCE_TARGETS),|| exit); \ + ret=$$((ret * $$?)); \ + done; exit $$ret; +endif define RUN_TESTS BASE_DIR="$(selfdir)"; \ @@ -77,6 +97,13 @@ ifdef building_out_of_srctree else @$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS)) endif +ifneq ($(TARGETS),) + @for TARGET in $(TARGETS); do \ + BUILD_TARGET=$$OUTPUT/$$TARGET; \ + $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests \ + O=$(abs_objtree); \ + done; +endif define INSTALL_SINGLE_RULE $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH)) @@ -97,6 +124,30 @@ endef install: all ifdef INSTALL_PATH $(INSTALL_RULE) +ifneq ($(TARGETS),) + @ret=1; \ + for TARGET in $(TARGETS); do \ + BUILD_TARGET=$$OUTPUT/$$TARGET; \ + $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install \ + O=$(abs_objtree) \ + $(if $(FORCE_TARGETS),|| exit); \ + ret=$$((ret * $$?)); \ + done; exit $$ret; + +ifneq ($(TEST_LIST),) + @# Ask all targets to emit their test scripts + @# While building kselftest-list.text skip also non-existent TARGET dirs: + @# they could be the result of a build failure and should NOT be + @# included in the generated runlist. + for TARGET in $(TARGETS); do \ + BUILD_TARGET=$$OUTPUT/$$TARGET; \ + [ ! -d $(INSTALL_PATH)/$$TARGET ] && echo "Skipping non-existent dir: $$TARGET" && continue; \ + echo -ne "Emit Tests for $$TARGET\n"; \ + $(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET COLLECTION=$$TARGET \ + -C $$TARGET emit_tests >> $(TEST_LIST); \ + done; +endif # ifneq ($(TEST_LIST),) +endif # ifneq ($(TARGETS),) else $(error Error: set INSTALL_PATH to use install) endif @@ -118,6 +169,13 @@ endef clean: $(CLEAN) +ifneq ($(TARGETS),) + @for TARGET in $(TARGETS); do \ + BUILD_TARGET=$$OUTPUT/$$TARGET; \ + $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\ + done; +endif + # When make O= with kselftest target from main level # the following aren't defined. diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index c0ee2955fe54..ef768c0992f5 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -66,6 +66,10 @@ TEST_GEN_FILES += io_uring_zerocopy_tx TEST_FILES := settings +TARGETS += af_unix +TARGETS += forwarding +TARGETS += mptcp + include ../lib.mk include bpf/Makefile -- 2.37.2