Commit 9fc96c7c authored by John Hubbard's avatar John Hubbard Committed by Andrew Morton
Browse files

selftests: error out if kernel header files are not yet built

As per a discussion with Muhammad Usama Anjum [1], the following is how
one is supposed to build selftests:

    make headers && make -C tools/testing/selftests/mm

Change the selftest build system's lib.mk to fail out with a helpful
message if that prerequisite "make headers" has not been done yet.

[1] https://lore.kernel.org/all/bf910fa5-0c96-3707-cce4-5bcc656b6274@collabora.com/

[jhubbard@nvidia.com: abort the make process the first time headers aren't detected]
  Link: https://lkml.kernel.org/r/14573e7e-f2ad-ff34-dfbd-3efdebee51ed@nvidia.com
[anders.roxell@linaro.org: fix out-of-tree builds]
  Link: https://lkml.kernel.org/r/20230613074931.666966-1-anders.roxell@linaro.org
Link: https://lkml.kernel.org/r/20230606071637.267103-12-jhubbard@nvidia.com


Signed-off-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
Signed-off-by: default avatarAnders Roxell <anders.roxell@linaro.org>
Reviewed-by: default avatarMuhammad Usama Anjum <usama.anjum@collabora.com>
Tested-by: default avatarMuhammad Usama Anjum <usama.anjum@collabora.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 01d6c48a
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -145,10 +145,12 @@ ifneq ($(KBUILD_OUTPUT),)
  abs_objtree := $(realpath $(abs_objtree))
  BUILD := $(abs_objtree)/kselftest
  KHDR_INCLUDES := -isystem ${abs_objtree}/usr/include
  KHDR_DIR := ${abs_objtree}/usr/include
else
  BUILD := $(CURDIR)
  abs_srctree := $(shell cd $(top_srcdir) && pwd)
  KHDR_INCLUDES := -isystem ${abs_srctree}/usr/include
  KHDR_DIR := ${abs_srctree}/usr/include
  DEFAULT_INSTALL_HDR_PATH := 1
endif

@@ -162,7 +164,7 @@ export KHDR_INCLUDES
# all isn't the first target in the file.
.DEFAULT_GOAL := all

all:
all: kernel_header_files
	@ret=1;							\
	for TARGET in $(TARGETS); do				\
		BUILD_TARGET=$$BUILD/$$TARGET;			\
@@ -173,6 +175,23 @@ all:
		ret=$$((ret * $$?));				\
	done; exit $$ret;

kernel_header_files:
	@ls $(KHDR_DIR)/linux/*.h >/dev/null 2>/dev/null;                          \
	if [ $$? -ne 0 ]; then                                                     \
            RED='\033[1;31m';                                                  \
            NOCOLOR='\033[0m';                                                 \
            echo;                                                              \
            echo -e "$${RED}error$${NOCOLOR}: missing kernel header files.";   \
            echo "Please run this and try again:";                             \
            echo;                                                              \
            echo "    cd $(top_srcdir)";                                       \
            echo "    make headers";                                           \
            echo;                                                              \
	    exit 1;                                                                \
	fi

.PHONY: kernel_header_files

run_tests: all
	@for TARGET in $(TARGETS); do \
		BUILD_TARGET=$$BUILD/$$TARGET;	\
+37 −3
Original line number Diff line number Diff line
@@ -44,10 +44,26 @@ endif
selfdir = $(realpath $(dir $(filter %/lib.mk,$(MAKEFILE_LIST))))
top_srcdir = $(selfdir)/../../..

ifeq ($(KHDR_INCLUDES),)
KHDR_INCLUDES := -isystem $(top_srcdir)/usr/include
ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

ifneq ($(KBUILD_OUTPUT),)
  # Make's built-in functions such as $(abspath ...), $(realpath ...) cannot
  # expand a shell special character '~'. We use a somewhat tedious way here.
  abs_objtree := $(shell cd $(top_srcdir) && mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) && pwd)
  $(if $(abs_objtree),, \
    $(error failed to create output directory "$(KBUILD_OUTPUT)"))
  # $(realpath ...) resolves symlinks
  abs_objtree := $(realpath $(abs_objtree))
  KHDR_DIR := ${abs_objtree}/usr/include
else
  abs_srctree := $(shell cd $(top_srcdir) && pwd)
  KHDR_DIR := ${abs_srctree}/usr/include
endif

KHDR_INCLUDES := -isystem $(KHDR_DIR)

# The following are built by lib.mk common compile rules.
# TEST_CUSTOM_PROGS should be used by tests that require
# custom build rule and prevent common build rule use.
@@ -58,7 +74,25 @@ 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))

all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
all: kernel_header_files $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) \
     $(TEST_GEN_FILES)

kernel_header_files:
	@ls $(KHDR_DIR)/linux/*.h >/dev/null 2>/dev/null;                      \
	if [ $$? -ne 0 ]; then                                                 \
            RED='\033[1;31m';                                                  \
            NOCOLOR='\033[0m';                                                 \
            echo;                                                              \
            echo -e "$${RED}error$${NOCOLOR}: missing kernel header files.";   \
            echo "Please run this and try again:";                             \
            echo;                                                              \
            echo "    cd $(top_srcdir)";                                       \
            echo "    make headers";                                           \
            echo;                                                              \
	    exit 1; \
	fi

.PHONY: kernel_header_files

define RUN_TESTS
	BASE_DIR="$(selfdir)";			\