ba3a719668
The .inc suffix is confusing to various tools as it's not specific to Makefiles. This means that editors don't recognize the files, and don't open them with highlighting and any other specific editor functionality. This issue is also seen in the release notes generation script where Makefiles get renamed before running cloc. Signed-off-by: Martin Roth <gaumless@gmail.com> Change-Id: Id09eafd293a54198aab87281f529749325df8b07 Reviewed-on: https://review.coreboot.org/c/coreboot/+/80122 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Felix Held <felix-coreboot@felixheld.de> Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
195 lines
7.7 KiB
Text
195 lines
7.7 KiB
Text
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
# This file contains common definitions, macros and targets for depthcharge
|
|
# unit-tests and screenshot utility. It requires list of defined variables:
|
|
# - src - source directory
|
|
# - testobj - build directory of tests
|
|
# - objutil - utility programs/libraries output directory
|
|
|
|
testsrc := $(top)/tests
|
|
|
|
cmockasrc := 3rdparty/cmocka
|
|
cmockaobj := $(objutil)/cmocka
|
|
coverage_dir := coverage_reports
|
|
|
|
CMOCKA_LIB := $(cmockaobj)/src/libcmocka.so
|
|
|
|
CMAKE := cmake
|
|
OBJCOPY ?= objcopy
|
|
OBJDUMP ?= objdump
|
|
|
|
TEST_DEFAULT_CONFIG ?= $(top)/configs/config.emulation_qemu_x86_i440fx
|
|
TEST_DOTCONFIG := $(testobj)/.config
|
|
TEST_KCONFIG_AUTOHEADER := $(testobj)/config.src.h
|
|
TEST_KCONFIG_AUTOCONFIG := $(testobj)/auto.conf
|
|
TEST_KCONFIG_DEPENDENCIES := $(testobj)/auto.conf.cmd
|
|
TEST_KCONFIG_SPLITCONFIG := $(testobj)/config/
|
|
TEST_KCONFIG_TRISTATE := $(testobj)/tristate.conf
|
|
|
|
# Include order should be same as in real build
|
|
TEST_INCLUDES := -include $(src)/include/kconfig.h \
|
|
-include $(src)/include/rules.h \
|
|
-include $(src)/commonlib/bsd/include/commonlib/bsd/compiler.h
|
|
|
|
# Include generic test mock headers, before original ones
|
|
TEST_INCLUDES += -I$(testsrc)/include/mocks -I$(testsrc)/include
|
|
|
|
TEST_INCLUDES += -I$(src) -I$(src)/include -I$(src)/commonlib/include \
|
|
-I$(src)/commonlib/bsd/include -I$(src)/arch/x86/include \
|
|
-I$(top)/3rdparty/vboot/firmware/include
|
|
|
|
# Path for Kconfig autoheader
|
|
TEST_INCLUDES += -I$(dir $(TEST_KCONFIG_AUTOHEADER))
|
|
|
|
# Note: This is intentionally just a subset of the warnings in the toplevel
|
|
# Makefile.mk. We don't need to be as strict with test code, and things like
|
|
# -Wmissing-prototypes just make working with the test framework cumbersome.
|
|
# Only put conservative warnings here that really detect code that's obviously
|
|
# unintentional.
|
|
TEST_CFLAGS += -Wall -Werror -Wundef -Wstrict-prototypes -Wno-inline-asm
|
|
TEST_CFLAGS += -Wno-unknown-warning-option -Wno-source-mgr -Wno-main-return-type
|
|
TEST_CFLAGS += -Wno-array-compare -Wno-packed-not-aligned -Wno-trigraphs
|
|
TEST_CFLAGS += -Wno-unused-but-set-variables
|
|
|
|
TEST_CFLAGS += -std=gnu11 -Os -ffunction-sections -fdata-sections -fno-builtin
|
|
|
|
TEST_CFLAGS += -D__TEST__
|
|
|
|
ifneq ($(filter-out 0,$(TEST_PRINT)),)
|
|
TEST_CFLAGS += -DTEST_PRINT=1
|
|
endif
|
|
|
|
TEST_LDFLAGS += -Wl,--gc-sections
|
|
|
|
# Some memlayout symbols don't work with userspace relocation -- disable it.
|
|
TEST_CFLAGS += -fno-pie -fno-pic
|
|
TEST_LDFLAGS += -no-pie
|
|
|
|
# Extra attributes for unit tests, declared per test
|
|
# srcs - sources linked with coreboot libc symbols
|
|
# syssrcs - sources linked with system libc, no coreboot includes
|
|
# cflags - attribute with additional CFLAGS
|
|
# config - Kconfig and defines override (`gcc -D` style)
|
|
# mocks - list of symbols to mock
|
|
# no_test_framework - set to `1` not to link test framework
|
|
# stage - name of stage e.g. romstage, bootblock, etc.
|
|
attributes := srcs syssrcs cflags config mocks no_test_framework stage
|
|
|
|
# Copy attributes of one test to another.
|
|
# $1 - input test name
|
|
# $2 - output test name
|
|
copy-test = $(foreach attr,$(attributes), \
|
|
$(eval $(strip $(2))-$(attr) := $($(strip $(1))-$(attr))))
|
|
|
|
# Create actual targets for unit test binaries
|
|
# $1 - test name
|
|
define TEST_CC_template
|
|
|
|
# Generate custom config.h redefining given config symbols, and declaring mocked
|
|
# functions weak. It is important that the compiler already sees that they are
|
|
# weak (and they aren't just turned weak at a later stage) to prevent certain
|
|
# optimizations that would break if the function gets replaced. (For clang this
|
|
# file needs to be marked `system_header` to prevent it from warning about
|
|
# #pragma weak entries without a matching function declaration, since there's no
|
|
# -Wno-xxx command line option for that.)
|
|
$(1)-config-file := $(testobj)/$(1)/config.h
|
|
$$($(1)-config-file): $(TEST_KCONFIG_AUTOHEADER)
|
|
mkdir -p $$(dir $$@)
|
|
printf '// File generated by tests/Makefile.mk\n// Do not change\n' > $$@
|
|
printf '#include <%s>\n\n' "$(notdir $(TEST_KCONFIG_AUTOHEADER))" >> $$@
|
|
for kv in $$($(1)-config); do \
|
|
key="`echo $$$$kv | cut -d '=' -f -1`"; \
|
|
value="`echo $$$$kv | cut -d '=' -f 2-`"; \
|
|
printf '#undef %s\n' "$$$$key" >> $$@; \
|
|
printf '#define %s %s\n\n' "$$$$key" "$$$$value" >> $$@; \
|
|
done
|
|
printf '#ifdef __clang__\n' >> $$@;
|
|
printf '#pragma clang system_header\n' >> $$@;
|
|
printf '#endif\n' >> $$@;
|
|
printf '#ifdef __TEST_SRCOBJ__\n' >> $$@;
|
|
for m in $$($(1)-mocks); do \
|
|
printf '#pragma weak %s\n' "$$$$m" >> $$@; \
|
|
done
|
|
printf '#endif\n' >> $$@;
|
|
|
|
$($(1)-objs): TEST_CFLAGS += -I$$(dir $$($(1)-config-file)) \
|
|
-D__$$(shell echo $$($(1)-stage) | tr '[:lower:]' '[:upper:]')__ \
|
|
-D__TEST_NAME__=\"$(subst /,_,$(1))\" \
|
|
-D__TEST_DATA_DIR__=\"$(testsrc)/data\"
|
|
|
|
# Give us a way to distinguish between coreboot source files and test files in code.
|
|
$($(1)-srcobjs): TEST_CFLAGS += -D__TEST_SRCOBJ__
|
|
|
|
# Add coreboot, vboot, kconfig etc. includes only to non-system libc linked objects
|
|
$(filter-out $($(1)-sysobjs),$($(1)-objs)): TEST_CFLAGS += $(TEST_INCLUDES)
|
|
|
|
# Compile sources and apply mocking/wrapping of selected symbols.
|
|
# For each listed mock add new symbol with prefix `__real_`,
|
|
# and pointing to the same section:address.
|
|
$($(1)-objs): $(testobj)/$(1)/%.o: $$$$*.c $$($(1)-config-file)
|
|
mkdir -p $$(dir $$@)
|
|
$(HOSTCC) $(HOSTCFLAGS) $$(TEST_CFLAGS) $$(TEST_INCLUDES) $($(1)-cflags) -MMD \
|
|
-MF $$(basename $$@).d -MT $$@ -c $$< -o $$@.orig
|
|
objcopy_wrap_flags=''; \
|
|
for sym in $$($(1)-mocks); do \
|
|
sym_line="$$$$($(OBJDUMP) -t $$@.orig \
|
|
| grep -E "[0-9a-fA-F]+\\s+w\\s+F\\s+.*\\s$$$$sym$$$$")"; \
|
|
if [ ! -z "$$$$sym_line" ] ; then \
|
|
addr="$$$$(echo "$$$$sym_line" | awk '{ print $$$$1 }')"; \
|
|
section="$$$$(echo "$$$$sym_line" | awk '{ print $$$$(NF - 2) }')"; \
|
|
objcopy_wrap_flags="$$$$objcopy_wrap_flags --add-symbol __real_$$$${sym}=$$$${section}:0x$$$${addr},function,global"; \
|
|
fi \
|
|
done ; \
|
|
$(OBJCOPY) $$@.orig $$$$objcopy_wrap_flags $$@
|
|
|
|
# Compile system-side sources linked with system libc, without mocking symbols
|
|
# or code-under-test includes.
|
|
$($(1)-sysobjs): $(testobj)/$(1)/%.o: $$$$*.c $$($(1)-config-file)
|
|
mkdir -p $$(dir $$@)
|
|
$(HOSTCC) $(HOSTCFLAGS) $$(TEST_CFLAGS) $($(1)-cflags) -MMD \
|
|
-MF $$(basename $$@).d -MT $$@ -c $$< -o $$@
|
|
|
|
# Link against Cmocka if not disabled
|
|
ifeq ($(strip $(filter-out 0 n no,$($(1)-no_test_framework))),)
|
|
$($(1)-objs): TEST_CFLAGS += -I$(cmockasrc)/include
|
|
$($(1)-bin): TEST_LDFLAGS += -L$(cmockaobj)/src -lcmocka -Wl,-rpath=$(cmockaobj)/src
|
|
$($(1)-bin): TEST_CFLAGS += -I$(cmockasrc)/include
|
|
$($(1)-bin): $(CMOCKA_LIB)
|
|
endif
|
|
|
|
$($(1)-bin): $($(1)-objs) $($(1)-sysobjs)
|
|
$(HOSTCC) $$^ $($(1)-cflags) $$(TEST_LDFLAGS) -o $$@
|
|
|
|
endef
|
|
|
|
# Build cmocka
|
|
$(CMOCKA_LIB):
|
|
echo "*** Building CMOCKA ***"
|
|
mkdir -p $(cmockaobj)
|
|
cd $(cmockaobj) && $(CMAKE) $(abspath $(cmockasrc))
|
|
$(MAKE) -C $(cmockaobj)
|
|
|
|
# Kconfig targets
|
|
$(TEST_DOTCONFIG):
|
|
mkdir -p $(dir $@)
|
|
cp $(TEST_DEFAULT_CONFIG) $(TEST_DOTCONFIG)
|
|
|
|
# Don't override default Kconfig variables, since this will affect all
|
|
# Kconfig targets. Change them only when calling sub-make instead.
|
|
$(TEST_KCONFIG_AUTOHEADER): TEST_KCONFIG_FLAGS := DOTCONFIG=$(TEST_DOTCONFIG) \
|
|
KCONFIG_AUTOHEADER=$(TEST_KCONFIG_AUTOHEADER) \
|
|
KCONFIG_AUTOCONFIG=$(TEST_KCONFIG_AUTOCONFIG) \
|
|
KCONFIG_DEPENDENCIES=$(TEST_KCONFIG_DEPENDENCIES) \
|
|
KCONFIG_SPLITCONFIG=$(TEST_KCONFIG_SPLITCONFIG) \
|
|
KCONFIG_TRISTATE=$(TEST_KCONFIG_TRISTATE) \
|
|
KBUILD_DEFCONFIG=$(TEST_DEFAULT_CONFIG)
|
|
|
|
$(TEST_KCONFIG_AUTOHEADER): $(TEST_DOTCONFIG)
|
|
mkdir -p $(dir $@)
|
|
$(MAKE) $(TEST_KCONFIG_FLAGS) olddefconfig
|
|
$(MAKE) $(TEST_KCONFIG_FLAGS) syncconfig
|
|
|
|
$(TEST_KCONFIG_AUTOCONFIG): $(TEST_KCONFIG_AUTOHEADER)
|
|
true
|
|
|
|
TEST_COMMON_DEPENDENCIES := $(CMOCKA_LIB) $(TEST_KCONFIG_AUTOCONFIG)
|