# -*-Makefile-*- libflash_test_test_ipmi_hiomap_SOURCES = \ libflash/test/test-ipmi-hiomap.c \ libflash/test/stubs.c \ libflash/ipmi-hiomap.c libflash_test_test_blocklevel_SOURCES = \ libflash/test/test-blocklevel.c \ libflash/test/stubs.c libflash_test_test_flash_SOURCES = \ libflash/test/test-flash.c \ libflash/test/stubs.c \ libflash/test/mbox-server.c libflash_test_test_ecc_SOURCES = \ libflash/test/test-ecc.c \ libflash/test/stubs.c \ libflash/test/mbox-server.c libflash_test_test_mbox_SOURCES = \ libflash/test/test-mbox.c \ libflash/test/stubs.c \ libflash/test/mbox-server.c check_PROGRAMS = \ libflash/test/test-ipmi-hiomap \ libflash/test/test-blocklevel \ libflash/test/test-flash \ libflash/test/test-ecc \ libflash/test/test-mbox TEST_FLAGS = -D__TEST__ -MMD -MP .PHONY: libflash-check libflash-coverage libflash-check: $(check_PROGRAMS:%=%-check) libflash-coverage: $(check_PROGRAMS:%=%-gcov-run) clean: libflash-test-clean check: libflash-check coverage: libflash-coverage strict-check: TEST_FLAGS += -D__STRICT_TEST__ strict-check: check LCOV_EXCLUDE += $(check_PROGRAMS:%=%.c) $(check_PROGRAMS:%=%-check) : %-check : % $(call QTEST, RUN-TEST , $(VALGRIND) $<, $<) # Transform a prerequisite into something approximating a variable name. This # is used to map check_PROGRAMS prerequisits to the corresponding _SOURCES # variable. # # For example: # # $(call prereq2var,libflash/test/test-mbox) # # Will output: # # 'libflash_test_test_mbox' # prereq2var = $(subst /,_,$(subst -,_,$(1))) # Generate prerequisites from a target based on the target's corresponding # _SOURCES variable. # # For example, with: # # libflash_test_test_mbox_SOURCES = \ # libflash/test/test-mbox.c \ # libflash/test/stubs.c \ # libflash/test/mbox-server.c # HOST_TRIPLE = x86_64-linux-gnu # # A call to target2prereq where the target is libflash/test/test-mbox: # # $(call target2prereq,$@,$(HOST_TRIPLE)/) # # Will output: # # x86_64-linux-gnu/libflash/test/test-mbox.o # x86_64-linux-gnu/libflash/test/stubs.o # x86_64-linux-gnu/libflash/test/mbox-server.o target2prereq = $(patsubst %.c,%.o,$(addprefix $(2),$($(call prereq2var,$(1))_SOURCES))) # Generate path stems for all applications in check_PROGRAMS. This is usef # # For example, with: # # libflash_test_test_mbox_SOURCES = \ # libflash/test/test-mbox.c \ # libflash/test/stubs.c \ # libflash/test/mbox-server.c # libflash_test_test_ecc_SOURCES = \ # libflash/test/test-ecc.c \ # libflash/test/stubs.c \ # libflash/test/mbox-server.c # check_PROGRAMS = libflash/test/test-mbox libflash/test/test-ecc # HOST_TRIPLE = x86_64-linux-gnu # # A call to: # # $(call objstem,$(check_PROGRAMS),$(HOST_TRIPLE)/) # # Will output: # # x86_64-linux-gnu/libflash/test/test-mbox # x86_64-linux-gnu/libflash/test/stubs # x86_64-linux-gnu/libflash/test/mbox-server # x86_64-linux-gnu/libflash/test/test-ecc # x86_64-linux-gnu/libflash/test/stubs # x86_64-linux-gnu/libflash/test/mbox-server objstem = $(patsubst %.c,%,$(addprefix $(2),$(foreach bin,$(1),$($(call prereq2var,$(bin))_SOURCES)))) # Record the host platform triple to separate test vs production objects. HOST_TRIPLE = $(shell $(HOSTCC) -dumpmachine) # Mirror the skiboot directory structure under a directory named after the host # triple in the skiboot root directory, and place the built objects in this # mirrored structure. $(HOST_TRIPLE)/%.o : %.c @mkdir -p $(dir $@) $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) $(TEST_FLAGS) -Wno-suggest-attribute=const -g -c -o $@ $<, $@) # Use GNU make metaprogramming dynamically define targets and prequisites for # binaries listed in check_PROGRAMS. # # Secondary expansion[1] allows us to use the target automatic variable ($@) in # the prequisite list. Knowing the target we can map to the corresponding # _SOURCES variable to learn what to build and link. Finally, make sure the # artifacts are output under the $(HOST_TRIPLE) directory to separate them from # objects intended for skiboot proper. # # [1] https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html#Secondary-Expansion .SECONDEXPANSION: $(check_PROGRAMS) : $$(call target2prereq,$$@,$(HOST_TRIPLE)/) $(call Q, HOSTCC , $(HOSTCC) $(HOSTCFLAGS) $(TEST_FLAGS) -Wno-suggest-attribute=const -O0 -g -o $@ $^, $@) .PHONY: libflash-test-clean libflash-test-clean: OBJ_STEMS = $(call objstem,$(check_PROGRAMS),$(HOST_TRIPLE)/) libflash-test-clean: libflash-test-gcov-clean $(RM) $(check_PROGRAMS) $(RM) $(OBJ_STEMS:%=%.o) $(RM) $(OBJ_STEMS:%=%.d) # gcov support: Build objects under $(HOST_TRIPLE)/gcov/ $(check_PROGRAMS:%=%-gcov-run) : %-run: % $(call QTEST, TEST-COVERAGE ,$< , $<) $(HOST_TRIPLE)/gcov/%.o : %.c @mkdir -p $(dir $@) $(call Q, HOSTCC ,$(HOSTCC) $(HOSTCFLAGS) $(HOSTGCOVCFLAGS) $(TEST_FLAGS) -Wno-suggest-attribute=const -g -c -o $@ $<, $@) .SECONDEXPANSION: $(check_PROGRAMS:%=%-gcov) : $$(call target2prereq,$$(patsubst %-gcov,%,$$@),$(HOST_TRIPLE)/gcov/) $(call Q, HOSTCC , $(HOSTCC) $(HOSTCFLAGS) $(HOSTGCOVCFLAGS) $(TEST_FLAGS) -Wno-suggest-attribute=const -O0 -g -o $@ $^, $@) .PHONY: libflash-test-gcov-clean libflash-test-gcov-clean: GCOV_OBJ_STEMS = $(call objstem,$(check_PROGRAMS),$(HOST_TRIPLE)/gcov/) libflash-test-gcov-clean: $(RM) $(check_PROGRAMS:%=%-gcov) $(RM) $(GCOV_OBJ_STEMS:%=%.o) $(RM) $(GCOV_OBJ_STEMS:%=%.d) $(RM) $(GCOV_OBJ_STEMS:%=%.gcda) $(RM) $(GCOV_OBJ_STEMS:%=%.gcno) -include $(patsubst %,%.d,$(call objstem,$(check_PROGRAMS),$(HOST_TRIPLE)/)) -include $(patsubst %,%.d,$(call objstem,$(check_PROGRAMS),$(HOST_TRIPLE)/gcov/))