mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 08:14:15 +08:00
selftests: Introduce Makefile variable to list shared bash scripts
[ Upstream commit2a0683be5b
] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
f45c65b1b9
commit
66c43605be
@ -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
|
||||
|
@ -184,6 +184,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;
|
||||
|
||||
@ -234,7 +236,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 * $$?)); \
|
||||
|
@ -77,11 +77,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))) ; \
|
||||
@ -111,6 +129,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