On Sun, 01 Sep 2024 17:15:38 -0400 Willem de Bruijn wrote:
Changing kselftests to preserve directories turns out to be trivial. Patch inline below.
But, existing TARGETS of course then start failing. Because they depend on existing rsync without -R. In (at least) two ways:
amd-pstate fails because its TEST_FILES has includes from other directories and it expects those files to land in the directory with tests.
x86 prefixes all its output with $(OUTPUT) to form absolute paths, which also creates absolute paths in kselftest-list.txt.
These two are examples, not necessarily the one instances of those patterns. So switching to preserving directories for existing targets like TEST_FILES seems intractable.
I wonder how many of the targets actually need this behavior (it's intentionally useful to them) vs they grew to depend on it accidentally.
Plan B is to add a new TEST_PROGS_RECURSE, analogous to how TEST_INCLUDES extended TEST_FILES with optional path preservation. That is not much more complex.
Alternative would be to allow opt-in (diff at the end), I'm personally biased against yet another TEST_* group because it's hard enough already to make sense of the existing ones. Maybe it's better for the test to "declare":
PRESERVE_TEST_DIRS
--- tools/testing/selftests/lib.mk | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk index d6edcfcb5be8..7be9bd583642 100644 --- a/tools/testing/selftests/lib.mk +++ b/tools/testing/selftests/lib.mk @@ -51,6 +51,12 @@ else CC := $(CROSS_COMPILE)gcc endif # LLVM
+ifeq ($(PRESERVE_TEST_DIRS),) +RSYNC_INSTALL_FLAGS=-a --copy-unsafe-links +else +RSYNC_INSTALL_FLAGS=-aR --copy-unsafe-links +endif + ifeq (0,$(MAKELEVEL)) ifeq ($(OUTPUT),) OUTPUT := $(shell pwd) @@ -150,12 +156,12 @@ endif
define INSTALL_SINGLE_RULE $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH)) - $(if $(INSTALL_LIST),rsync -a --copy-unsafe-links $(INSTALL_LIST) $(INSTALL_PATH)/) + $(if $(INSTALL_LIST),rsync $(RSYNC_INSTALL_FLAGS) $(INSTALL_LIST) $(INSTALL_PATH)/) endef
define INSTALL_MODS_RULE $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH)/$(INSTALL_LIST)) - $(if $(INSTALL_LIST),rsync -a --copy-unsafe-links $(INSTALL_LIST)/*.ko $(INSTALL_PATH)/$(INSTALL_LIST)) + $(if $(INSTALL_LIST),rsync $(RSYNC_INSTALL_FLAGS) $(INSTALL_LIST)/*.ko $(INSTALL_PATH)/$(INSTALL_LIST)) endef
define INSTALL_RULE @@ -179,10 +185,17 @@ else endif
emit_tests: +ifeq ($(PRESERVE_TEST_DIRS),) for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \ BASENAME_TEST=`basename $$TEST`; \ echo "$(COLLECTION):$$BASENAME_TEST"; \ done +else + for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \ + BASENAME_TEST=$$TEST; \ + echo "$(COLLECTION):$$TEST"; \ + done +endif
# define if isn't already. It is undefined in make O= case. ifeq ($(RM),)