xref: /openbmc/linux/tools/testing/selftests/lib.mk (revision 2d43d30a)
184f887bfSMichael Ellerman# This mimics the top-level Makefile. We do it explicitly here so that this
284f887bfSMichael Ellerman# Makefile can operate with or without the kbuild infrastructure.
326e6dd10SYonghong Songifneq ($(LLVM),)
4e9c28192SNathan Chancellorifneq ($(filter %/,$(LLVM)),)
5e9c28192SNathan ChancellorLLVM_PREFIX := $(LLVM)
6e9c28192SNathan Chancellorelse ifneq ($(filter -%,$(LLVM)),)
7e9c28192SNathan ChancellorLLVM_SUFFIX := $(LLVM)
8e9c28192SNathan Chancellorendif
9e9c28192SNathan Chancellor
102d43d30aSValentin ObstCLANG := $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
112d43d30aSValentin Obst
12795285efSMark BrownCLANG_TARGET_FLAGS_arm          := arm-linux-gnueabi
13795285efSMark BrownCLANG_TARGET_FLAGS_arm64        := aarch64-linux-gnu
14795285efSMark BrownCLANG_TARGET_FLAGS_hexagon      := hexagon-linux-musl
15624c60f3SGuillaume TuckerCLANG_TARGET_FLAGS_i386         := i386-linux-gnu
16795285efSMark BrownCLANG_TARGET_FLAGS_m68k         := m68k-linux-gnu
17795285efSMark BrownCLANG_TARGET_FLAGS_mips         := mipsel-linux-gnu
18795285efSMark BrownCLANG_TARGET_FLAGS_powerpc      := powerpc64le-linux-gnu
19795285efSMark BrownCLANG_TARGET_FLAGS_riscv        := riscv64-linux-gnu
20795285efSMark BrownCLANG_TARGET_FLAGS_s390         := s390x-linux-gnu
21795285efSMark BrownCLANG_TARGET_FLAGS_x86          := x86_64-linux-gnu
22624c60f3SGuillaume TuckerCLANG_TARGET_FLAGS_x86_64       := x86_64-linux-gnu
232d43d30aSValentin Obst
242d43d30aSValentin Obst# Default to host architecture if ARCH is not explicitly given.
252d43d30aSValentin Obstifeq ($(ARCH),)
262d43d30aSValentin ObstCLANG_TARGET_FLAGS := $(shell $(CLANG) -print-target-triple)
272d43d30aSValentin Obstelse
28795285efSMark BrownCLANG_TARGET_FLAGS := $(CLANG_TARGET_FLAGS_$(ARCH))
292d43d30aSValentin Obstendif
30795285efSMark Brown
31795285efSMark Brownifeq ($(CROSS_COMPILE),)
32795285efSMark Brownifeq ($(CLANG_TARGET_FLAGS),)
339fdaca2cSMark Brown$(error Specify CROSS_COMPILE or add '--target=' option to lib.mk)
34795285efSMark Brownelse
35795285efSMark BrownCLANG_FLAGS     += --target=$(CLANG_TARGET_FLAGS)
36795285efSMark Brownendif # CLANG_TARGET_FLAGS
37795285efSMark Brownelse
38795285efSMark BrownCLANG_FLAGS     += --target=$(notdir $(CROSS_COMPILE:%-=%))
39795285efSMark Brownendif # CROSS_COMPILE
40795285efSMark Brown
412d43d30aSValentin ObstCC := $(CLANG) $(CLANG_FLAGS) -fintegrated-as
4226e6dd10SYonghong Songelse
4384f887bfSMichael EllermanCC := $(CROSS_COMPILE)gcc
44795285efSMark Brownendif # LLVM
4584f887bfSMichael Ellerman
46e53aff45SShuah Khanifeq (0,$(MAKELEVEL))
4727d79a2bSShuah Khan    ifeq ($(OUTPUT),)
48e53aff45SShuah Khan	OUTPUT := $(shell pwd)
498ce72dc3SShuah Khan	DEFAULT_INSTALL_HDR_PATH := 1
508ce72dc3SShuah Khan    endif
518ce72dc3SShuah Khanendif
5242d46e57SKees Cookselfdir = $(realpath $(dir $(filter %/lib.mk,$(MAKEFILE_LIST))))
53bdbf0617SAxel Rasmussentop_srcdir = $(selfdir)/../../..
54e53aff45SShuah Khan
55d228e98dSJohn Hubbardifeq ($(KHDR_INCLUDES),)
56d228e98dSJohn HubbardKHDR_INCLUDES := -isystem $(top_srcdir)/usr/include
57a5254052SMickaël Salaünendif
58a5254052SMickaël Salaün
59be16a244SShuah Khan# The following are built by lib.mk common compile rules.
60be16a244SShuah Khan# TEST_CUSTOM_PROGS should be used by tests that require
61be16a244SShuah Khan# custom build rule and prevent common build rule use.
62be16a244SShuah Khan# TEST_PROGS are for test shell scripts.
63be16a244SShuah Khan# TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests
64be16a244SShuah Khan# and install targets. Common clean doesn't touch them.
65d83c3ba0SMichael EllermanTEST_GEN_PROGS := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS))
668050ef2bSShuah KhanTEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED))
67d83c3ba0SMichael EllermanTEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES))
68d83c3ba0SMichael Ellerman
69d228e98dSJohn Hubbardall: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES)
70b2d35fa5SAnders Roxell
717afed3dcSShuah Khan (Samsung OSG)define RUN_TESTS
7299aacebeSYauheni Kaliuta	BASE_DIR="$(selfdir)";			\
735c069b6dSKees Cook	. $(selfdir)/kselftest/runner.sh;	\
7442d46e57SKees Cook	if [ "X$(summary)" != "X" ]; then       \
75bf660782SKees Cook		per_test_logging=1;		\
7642d46e57SKees Cook	fi;                                     \
77bf660782SKees Cook	run_many $(1)
785e29a910SMichael Ellermanendef
795e29a910SMichael Ellerman
805e29a910SMichael Ellermanrun_tests: all
81051f278eSMasahiro Yamadaifdef building_out_of_srctree
8299aacebeSYauheni Kaliuta	@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
833f3f3841SBjörn Töpel		rsync -aq --copy-unsafe-links $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \
841a940687SShuah Khan	fi
8599aacebeSYauheni Kaliuta	@if [ "X$(TEST_PROGS)" != "X" ]; then \
86cb4969e6SIlya Leoshkevich		$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) \
87cb4969e6SIlya Leoshkevich				  $(addprefix $(OUTPUT)/,$(TEST_PROGS))) ; \
8899aacebeSYauheni Kaliuta	else \
8999aacebeSYauheni Kaliuta		$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS)); \
901a940687SShuah Khan	fi
911a940687SShuah Khanelse
9299aacebeSYauheni Kaliuta	@$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
931a940687SShuah Khanendif
945e29a910SMichael Ellerman
95c363eb48SJiri Bencdefine INSTALL_SINGLE_RULE
96c363eb48SJiri Benc	$(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
973f3f3841SBjörn Töpel	$(if $(INSTALL_LIST),rsync -a --copy-unsafe-links $(INSTALL_LIST) $(INSTALL_PATH)/)
98c363eb48SJiri Bencendef
99c363eb48SJiri Benc
10032dcfba6SMichael Ellermandefine INSTALL_RULE
101c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE)
102c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
103c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE)
104c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE)
105c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE)
106c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
107c363eb48SJiri Benc	$(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE)
108de53fa9bSKees Cook	$(eval INSTALL_LIST = $(wildcard config settings)) $(INSTALL_SINGLE_RULE)
10932dcfba6SMichael Ellermanendef
11032dcfba6SMichael Ellerman
11132dcfba6SMichael Ellermaninstall: all
11232dcfba6SMichael Ellermanifdef INSTALL_PATH
11332dcfba6SMichael Ellerman	$(INSTALL_RULE)
11432dcfba6SMichael Ellermanelse
11532dcfba6SMichael Ellerman	$(error Error: set INSTALL_PATH to use install)
11632dcfba6SMichael Ellermanendif
11732dcfba6SMichael Ellerman
118d4e59a53SKees Cookemit_tests:
1193df6131fSShuah Khan (Samsung OSG)	for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \
120a8ba798bSbamvor.zhangjian@huawei.com		BASENAME_TEST=`basename $$TEST`;	\
121f0f0a5dfSKees Cook		echo "$(COLLECTION):$$BASENAME_TEST";	\
122f0f0a5dfSKees Cook	done
12332dcfba6SMichael Ellerman
1248050ef2bSShuah Khan# define if isn't already. It is undefined in make O= case.
1258050ef2bSShuah Khanifeq ($(RM),)
1268050ef2bSShuah KhanRM := rm -f
1278050ef2bSShuah Khanendif
1288050ef2bSShuah Khan
129df6438f9SShuah Khandefine CLEAN
13080d443e8Sbamvor.zhangjian@huawei.com	$(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN)
131df6438f9SShuah Khanendef
132df6438f9SShuah Khan
133df6438f9SShuah Khanclean:
134df6438f9SShuah Khan	$(CLEAN)
13588baa78dSbamvor.zhangjian@huawei.com
136de3ee3f6SMickaël Salaün# Enables to extend CFLAGS and LDFLAGS from command line, e.g.
137de3ee3f6SMickaël Salaün# make USERCFLAGS=-Werror USERLDFLAGS=-static
138de3ee3f6SMickaël SalaünCFLAGS += $(USERCFLAGS)
139de3ee3f6SMickaël SalaünLDFLAGS += $(USERLDFLAGS)
140de3ee3f6SMickaël Salaün
1418050ef2bSShuah Khan# When make O= with kselftest target from main level
1428050ef2bSShuah Khan# the following aren't defined.
1438050ef2bSShuah Khan#
144051f278eSMasahiro Yamadaifdef building_out_of_srctree
1458050ef2bSShuah KhanLINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
1468050ef2bSShuah KhanCOMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
1478050ef2bSShuah KhanLINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
1488050ef2bSShuah Khanendif
1498050ef2bSShuah Khan
1504e49ed2fSMathieu Desnoyers# Selftest makefiles can override those targets by setting
1514e49ed2fSMathieu Desnoyers# OVERRIDE_TARGETS = 1.
1524e49ed2fSMathieu Desnoyersifeq ($(OVERRIDE_TARGETS),)
153a738a4ceSAnders RoxellLOCAL_HDRS += $(selfdir)/kselftest_harness.h $(selfdir)/kselftest.h
1541056d3d2SShuah Khan$(OUTPUT)/%:%.c $(LOCAL_HDRS)
155f825d3f7STommi Rantala	$(LINK.c) $(filter-out $(LOCAL_HDRS),$^) $(LDLIBS) -o $@
156a8ba798bSbamvor.zhangjian@huawei.com
157a8ba798bSbamvor.zhangjian@huawei.com$(OUTPUT)/%.o:%.S
158634ce97cSMichael Ellerman	$(COMPILE.S) $^ -o $@
159a8ba798bSbamvor.zhangjian@huawei.com
160a8ba798bSbamvor.zhangjian@huawei.com$(OUTPUT)/%:%.S
161634ce97cSMichael Ellerman	$(LINK.S) $^ $(LDLIBS) -o $@
1624e49ed2fSMathieu Desnoyersendif
1637d758af2Sbamvor.zhangjian@huawei.com
16432dcfba6SMichael Ellerman.PHONY: run_tests all clean install emit_tests
165