###############################################################################
# Linux kernel configuration overrides, useful for enabling a driver build 
# but not much else (can't turn on whole subsystems or change kernel options)
###############################################################################

configs := CONFIG_INTEL_IOATDMA
CONFIG_INTEL_IOATDMA := m

###############################################################################
# Everything below should be independant of the module being built
###############################################################################

KVER ?= $(shell uname -r)
KBUILD_SRC ?= /lib/modules/$(KVER)/source
KBUILD_OUTPUT ?= /lib/modules/$(KVER)/build

.PHONY: default help modules modules_install install clean distclean

default: modules
install: modules_install

modules: config config.h

help modules modules_install clean:
	$(MAKE) -C $(KBUILD_SRC) O=$(KBUILD_OUTPUT) M=$(PWD) $@

distclean:: clean
	-$(RM) config config.h

config config.h: CONFIG_STRINGS := $(foreach C, $(configs), $(C)=$($(C)))

config: $(MAKEFILE_LIST)
	@echo "  CHK     $@"
	@( \
		for line in $(CONFIG_STRINGS); \
		do \
			symbol=$$(echo $$line | cut -f1 -d=); \
			value=$$(echo $$line | cut -f2 -d=); \
			case $$value in \
			y) \
				printf "override %s=y\n" $$symbol; \
				;; \
			m) \
				printf "override %s=m\n" $$symbol; \
				;; \
			n) \
				printf "# %s is not set\n" $$symbol; \
				printf "override %s=\n" $$symbol; \
				;; \
			esac \
		done; \
		printf '\nEXTRA_CFLAGS += --include $$(PWD)/config.h\n'; \
	) > $@

config.h: $(MAKEFILE_LIST)
	@echo "  CHK     $@"
	@( \
		printf "#ifndef __LOCALCONFIG_H\n"; \
		printf "#define __LOCALCONFIG_H\n\n"; \
		printf "#include <linux/config.h>\n\n"; \
		for line in $(CONFIG_STRINGS); \
		do \
			symbol=$$(echo $$line | cut -f1 -d=); \
			value=$$(echo $$line | cut -f2 -d=); \
			printf "#undef %s\n" $$symbol; \
			printf "#undef %s_MODULE\n" $$symbol; \
			case $$value in \
			y) \
				printf "#define %s 1\n" $$symbol; \
				;; \
			m) \
				printf "#define %s_MODULE 1\n" $$symbol; \
				;; \
			esac \
		done; \
		printf "\n#endif /* __LOCALCONFIG_H */\n"; \
	) > $@

