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