mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
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. Commitae108c48b5
("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. Commit25ae948b44
("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 commit2114e83381
("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: Benjamin Poirier <bpoirier@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bc34d10c18
commit
2a0683be5b
@ -255,9 +255,21 @@ Contributing new tests (details)
|
||||
|
||||
TEST_PROGS_EXTENDED, TEST_GEN_PROGS_EXTENDED mean it is the
|
||||
executable which is not tested by default.
|
||||
|
||||
TEST_FILES, TEST_GEN_FILES mean it is the file which is used by
|
||||
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
|
||||
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
|
||||
|
@ -191,6 +191,8 @@ run_tests: all
|
||||
@for TARGET in $(TARGETS); do \
|
||||
BUILD_TARGET=$$BUILD/$$TARGET; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests \
|
||||
SRC_PATH=$(shell readlink -e $$(pwd)) \
|
||||
OBJ_PATH=$(BUILD) \
|
||||
O=$(abs_objtree); \
|
||||
done;
|
||||
|
||||
@ -241,7 +243,10 @@ ifdef INSTALL_PATH
|
||||
@ret=1; \
|
||||
for TARGET in $(TARGETS); do \
|
||||
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) \
|
||||
$(if $(FORCE_TARGETS),|| exit); \
|
||||
ret=$$((ret * $$?)); \
|
||||
|
@ -69,11 +69,29 @@ define RUN_TESTS
|
||||
run_many $(1)
|
||||
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
|
||||
ifdef building_out_of_srctree
|
||||
@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
|
||||
rsync -aq --copy-unsafe-links $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \
|
||||
fi
|
||||
@$(INSTALL_INCLUDES)
|
||||
@if [ "X$(TEST_PROGS)" != "X" ]; then \
|
||||
$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) \
|
||||
$(addprefix $(OUTPUT)/,$(TEST_PROGS))) ; \
|
||||
@ -103,6 +121,7 @@ endef
|
||||
install: all
|
||||
ifdef INSTALL_PATH
|
||||
$(INSTALL_RULE)
|
||||
$(INSTALL_INCLUDES)
|
||||
else
|
||||
$(error Error: set INSTALL_PATH to use install)
|
||||
endif
|
||||
|
Loading…
Reference in New Issue
Block a user