^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) # This mimics the top-level Makefile. We do it explicitly here so that this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # Makefile can operate with or without the kbuild infrastructure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) ifneq ($(LLVM),)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) CC := clang
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) CC := $(CROSS_COMPILE)gcc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) ifeq (0,$(MAKELEVEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) ifeq ($(OUTPUT),)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) OUTPUT := $(shell pwd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) DEFAULT_INSTALL_HDR_PATH := 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) selfdir = $(realpath $(dir $(filter %/lib.mk,$(MAKEFILE_LIST))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) # The following are built by lib.mk common compile rules.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) # TEST_CUSTOM_PROGS should be used by tests that require
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) # custom build rule and prevent common build rule use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) # TEST_PROGS are for test shell scripts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) # TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) # and install targets. Common clean doesn't touch them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) TEST_GEN_PROGS := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) TEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) TEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) ifdef KSFT_KHDR_INSTALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) top_srcdir ?= ../../../..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) include $(top_srcdir)/scripts/subarch.include
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ARCH ?= $(SUBARCH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) # set default goal to all, so make without a target runs all, even when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) # all isn't the first target in the file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .DEFAULT_GOAL := all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) # Invoke headers install with --no-builtin-rules to avoid circular
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) # dependency in "make kselftest" case. In this case, second level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) # make inherits builtin-rules which will use the rule generate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) # Makefile.o and runs into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) # "Circular Makefile.o <- prepare dependency dropped."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) # and headers_install fails and test compile fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) # O= KBUILD_OUTPUT cases don't run into this error, since main Makefile
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) # invokes them as sub-makes and --no-builtin-rules is not necessary,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) # but doesn't cause any failures. Keep it simple and use the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) # flags in both cases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) # Note that the support to install headers from lib.mk is necessary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) # when test Makefile is run directly with "make -C".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) # When local build is done, headers are installed in the default
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) # INSTALL_HDR_PATH usr/include.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .PHONY: khdr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .NOTPARALLEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) khdr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ifndef KSFT_KHDR_INSTALL_DONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ifeq (1,$(DEFAULT_INSTALL_HDR_PATH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) $(MAKE) --no-builtin-rules ARCH=$(ARCH) -C $(top_srcdir) headers_install
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) $(MAKE) --no-builtin-rules INSTALL_HDR_PATH=$$OUTPUT/usr \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ARCH=$(ARCH) -C $(top_srcdir) headers_install
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) all: khdr $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) define RUN_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) BASE_DIR="$(selfdir)"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) . $(selfdir)/kselftest/runner.sh; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if [ "X$(summary)" != "X" ]; then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) per_test_logging=1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) fi; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) run_many $(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) run_tests: all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ifdef building_out_of_srctree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) @if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) rsync -aq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) @if [ "X$(TEST_PROGS)" != "X" ]; then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) $(addprefix $(OUTPUT)/,$(TEST_PROGS))) ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) @$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) define INSTALL_SINGLE_RULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) $(if $(INSTALL_LIST),rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) define INSTALL_RULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) $(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) $(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) $(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) $(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) $(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) $(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) $(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) install: all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ifdef INSTALL_PATH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) $(INSTALL_RULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) $(error Error: set INSTALL_PATH to use install)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) emit_tests:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) BASENAME_TEST=`basename $$TEST`; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) echo "$(COLLECTION):$$BASENAME_TEST"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) # define if isn't already. It is undefined in make O= case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ifeq ($(RM),)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) RM := rm -f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) define CLEAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) $(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) clean:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) $(CLEAN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) # When make O= with kselftest target from main level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) # the following aren't defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ifdef building_out_of_srctree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) # Selftest makefiles can override those targets by setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) # OVERRIDE_TARGETS = 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ifeq ($(OVERRIDE_TARGETS),)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) LOCAL_HDRS := $(selfdir)/kselftest_harness.h $(selfdir)/kselftest.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) $(OUTPUT)/%:%.c $(LOCAL_HDRS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) $(LINK.c) $(filter-out $(LOCAL_HDRS),$^) $(LDLIBS) -o $@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) $(OUTPUT)/%.o:%.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) $(COMPILE.S) $^ -o $@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) $(OUTPUT)/%:%.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) $(LINK.S) $^ $(LDLIBS) -o $@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .PHONY: run_tests all clean install emit_tests