Commit 2a0683be authored by Benjamin Poirier's avatar Benjamin Poirier Committed by David S. Miller

selftests: Introduce Makefile variable to list shared bash scripts

Some tests written in bash source other files in a parent directory. For
example, drivers/net/bonding/dev_addr_lists.sh sources
net/forwarding/lib.sh. If a subset of tests is exported and run outside the
source tree (for example by using `make -C tools/testing/selftests gen_tar
TARGETS="drivers/net/bonding"`), these other files must be made available
as well.

Commit ae108c48 ("selftests: net: Fix cross-tree inclusion of scripts")
addressed this problem by symlinking and copying the sourced files but this
only works for direct dependencies. Commit 25ae948b ("selftests/net:
add lib.sh") changed net/forwarding/lib.sh to source net/lib.sh. As a
result, that latter file must be included as well when the former is
exported. This was not handled and was reverted in commit 2114e833
("selftests: forwarding: Avoid failures to source net/lib.sh"). In order to
allow reinstating the inclusion of net/lib.sh from net/forwarding/lib.sh,
add a mechanism to list dependent files in a new Makefile variable and
export them. This allows sourcing those files using the same expression
whether tests are run in-tree or exported.

Dependencies are not resolved recursively so transitive dependencies must
be listed in TEST_INCLUDES. For example, if net/forwarding/lib.sh sources
net/lib.sh; the Makefile related to a test that sources
net/forwarding/lib.sh from a parent directory must list:
TEST_INCLUDES := \
	../../../net/forwarding/lib.sh \
	../../../net/lib.sh

v2:
Fix rst syntax in Documentation/dev-tools/kselftest.rst (Jakub Kicinski)

v1 (from RFC):
* changed TEST_INCLUDES to take relative paths, like other TEST_* variables
  (Vladimir Oltean)
* preserved common "$(MAKE) OUTPUT=... -C ... target" ordering in Makefile
  (Petr Machata)
Signed-off-by: default avatarBenjamin Poirier <bpoirier@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bc34d10c
...@@ -255,9 +255,21 @@ Contributing new tests (details) ...@@ -255,9 +255,21 @@ Contributing new tests (details)
TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the
executable which is not tested by default. executable which is not tested by default.
TEST_FILES, TEST_GEN_FILES mean it is the file which is used by TEST_FILES, TEST_GEN_FILES mean it is the file which is used by
test. test.
TEST_INCLUDES is similar to TEST_FILES, it lists files which should be
included when exporting or installing the tests, with the following
differences:
* symlinks to files in other directories are preserved
* the part of paths below tools/testing/selftests/ is preserved when
copying the files to the output directory
TEST_INCLUDES is meant to list dependencies located in other directories of
the selftests hierarchy.
* First use the headers inside the kernel source and/or git repo, and then the * First use the headers inside the kernel source and/or git repo, and then the
system headers. Headers for the kernel release as opposed to headers system headers. Headers for the kernel release as opposed to headers
installed by the distro on the system should be the primary focus to be able installed by the distro on the system should be the primary focus to be able
......
...@@ -191,6 +191,8 @@ run_tests: all ...@@ -191,6 +191,8 @@ run_tests: all
@for TARGET in $(TARGETS); do \ @for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \ BUILD_TARGET=$$BUILD/$$TARGET; \
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests \ $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests \
SRC_PATH=$(shell readlink -e $$(pwd)) \
OBJ_PATH=$(BUILD) \
O=$(abs_objtree); \ O=$(abs_objtree); \
done; done;
...@@ -241,7 +243,10 @@ ifdef INSTALL_PATH ...@@ -241,7 +243,10 @@ ifdef INSTALL_PATH
@ret=1; \ @ret=1; \
for TARGET in $(TARGETS); do \ for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \ BUILD_TARGET=$$BUILD/$$TARGET; \
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install \ $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET install \
INSTALL_PATH=$(INSTALL_PATH)/$$TARGET \
SRC_PATH=$(shell readlink -e $$(pwd)) \
OBJ_PATH=$(INSTALL_PATH) \
O=$(abs_objtree) \ O=$(abs_objtree) \
$(if $(FORCE_TARGETS),|| exit); \ $(if $(FORCE_TARGETS),|| exit); \
ret=$$((ret * $$?)); \ ret=$$((ret * $$?)); \
......
...@@ -69,11 +69,29 @@ define RUN_TESTS ...@@ -69,11 +69,29 @@ define RUN_TESTS
run_many $(1) run_many $(1)
endef endef
define INSTALL_INCLUDES
$(if $(TEST_INCLUDES), \
relative_files=""; \
for entry in $(TEST_INCLUDES); do \
entry_dir=$$(readlink -e "$$(dirname "$$entry")"); \
entry_name=$$(basename "$$entry"); \
relative_dir=$${entry_dir#"$$SRC_PATH"/}; \
if [ "$$relative_dir" = "$$entry_dir" ]; then \
echo "Error: TEST_INCLUDES entry \"$$entry\" not located inside selftests directory ($$SRC_PATH)" >&2; \
exit 1; \
fi; \
relative_files="$$relative_files $$relative_dir/$$entry_name"; \
done; \
cd $(SRC_PATH) && rsync -aR $$relative_files $(OBJ_PATH)/ \
)
endef
run_tests: all run_tests: all
ifdef building_out_of_srctree ifdef building_out_of_srctree
@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \ @if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
rsync -aq --copy-unsafe-links $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \ rsync -aq --copy-unsafe-links $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \
fi fi
@$(INSTALL_INCLUDES)
@if [ "X$(TEST_PROGS)" != "X" ]; then \ @if [ "X$(TEST_PROGS)" != "X" ]; then \
$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) \ $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) \
$(addprefix $(OUTPUT)/,$(TEST_PROGS))) ; \ $(addprefix $(OUTPUT)/,$(TEST_PROGS))) ; \
...@@ -103,6 +121,7 @@ endef ...@@ -103,6 +121,7 @@ endef
install: all install: all
ifdef INSTALL_PATH ifdef INSTALL_PATH
$(INSTALL_RULE) $(INSTALL_RULE)
$(INSTALL_INCLUDES)
else else
$(error Error: set INSTALL_PATH to use install) $(error Error: set INSTALL_PATH to use install)
endif endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment