tests: Enable config override for tests

Some tests require to change kconfig symbols values to cover the code.
This patch enables one to set these vaues using <test-name>-config
variable.

Example for integer values.
timestamp-test-config += CONFIG_HAVE_MONOTONIC_TIMER=1

Example for string values. Notice escaped quotes.
spd_cache-test-config += CONFIG_SPD_CACHE_FMAP_NAME=\"SPD_CACHE_FMAP_NAME\"

Signed-off-by: Jakub Czapiga <jacz@semihalf.com>
Change-Id: I1aeb78362c2609fbefbfd91c0f58ec19ed258ee1
Reviewed-on: https://review.coreboot.org/c/coreboot/+/52937
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
diff --git a/tests/Makefile.inc b/tests/Makefile.inc
index 44e3c69..cd25e0f 100644
--- a/tests/Makefile.inc
+++ b/tests/Makefile.inc
@@ -11,7 +11,7 @@
 
 TEST_DEFAULT_CONFIG = $(top)/configs/config.emulation_qemu_x86_i440fx
 TEST_DOTCONFIG = $(testobj)/.config
-TEST_KCONFIG_AUTOHEADER := $(testobj)/config.h
+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
@@ -52,7 +52,7 @@
 TEST_LDFLAGS += -no-pie
 
 # Extra attributes for unit tests, declared per test
-attributes:= srcs cflags mocks stage
+attributes:= srcs cflags config mocks stage
 
 stages:= decompressor bootblock romstage smm verstage
 stages+= ramstage rmodule postcar libagesa
@@ -83,9 +83,23 @@
 # Create actual targets for unit test binaries
 # $1 - test name
 define TEST_CC_template
-$($(1)-objs): TEST_CFLAGS+= \
+
+# Generate custom config.h redefining given symbols
+$(1)-config-file := $(obj)/$(1)/config.h
+$$($(1)-config-file): $(TEST_KCONFIG_AUTOHEADER)
+	mkdir -p $$(dir $$@)
+	printf '// File generated by tests/Makefile.inc\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
+
+$($(1)-objs): TEST_CFLAGS += -I$$(dir $$($(1)-config-file)) \
 	-D__$$(shell echo $$($(1)-stage) | tr '[:lower:]' '[:upper:]')__
-$($(1)-objs): $(obj)/$(1)/%.o: $$$$*.c $(TEST_KCONFIG_AUTOHEADER)
+$($(1)-objs): $(obj)/$(1)/%.o: $$$$*.c $$($(1)-config-file)
 	mkdir -p $$(dir $$@)
 	$(HOSTCC) $(HOSTCFLAGS) $$(TEST_CFLAGS) $($(1)-cflags)  -MMD \
 		-MT $$@ -c $$< -o $$@