From 92a02f580cfd28d7747e0401d5db1a379b426a26 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Tue, 7 Jun 2016 11:31:12 -0700 Subject: [PATCH] build: generate config.h and implicitly include it All source files will now depend on config.h, which is generated based on the defaults in CONFIG and the command line arguments passed to make. This ensures that any configuration changes, including on the command line, cause a full rebuild. Change-Id: I6b6fa3290941200dbcf32297c66df8dc5ee18e94 Signed-off-by: Daniel Verkamp --- Makefile | 10 +++++++++- mk/spdk.common.mk | 2 ++ scripts/genconfig.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100755 scripts/genconfig.py diff --git a/Makefile b/Makefile index 47540c070..930ea5b72 100644 --- a/Makefile +++ b/Makefile @@ -38,13 +38,21 @@ include $(SPDK_ROOT_DIR)/mk/spdk.common.mk DIRS-y += lib test examples app -.PHONY: all clean $(DIRS-y) +.PHONY: all clean $(DIRS-y) config.h all: $(DIRS-y) clean: $(DIRS-y) + $(Q)rm -f config.h app: lib test: lib examples: lib +$(DIRS-y): config.h + +config.h: CONFIG scripts/genconfig.py + $(Q)python scripts/genconfig.py $(MAKEFLAGS) > $@.tmp; \ + cmp -s $@.tmp $@ || mv $@.tmp $@ ; \ + rm -f $@.tmp + include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk diff --git a/mk/spdk.common.mk b/mk/spdk.common.mk index 6502cc68d..6f89b52f4 100644 --- a/mk/spdk.common.mk +++ b/mk/spdk.common.mk @@ -45,6 +45,8 @@ OS := $(shell uname) COMMON_CFLAGS = -g $(C_OPT) -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -fno-strict-aliasing -march=native -m64 -I$(SPDK_ROOT_DIR)/include +COMMON_CFLAGS += -include $(SPDK_ROOT_DIR)/config.h + ifeq ($(CONFIG_WERROR), y) COMMON_CFLAGS += -Werror endif diff --git a/scripts/genconfig.py b/scripts/genconfig.py new file mode 100755 index 000000000..64f1ce52d --- /dev/null +++ b/scripts/genconfig.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import re +import sys + +comment = re.compile('^\s*#') +assign = re.compile('^\s*([a-zA-Z_]+)\s*(\?)?=\s*([^#]*)') + +with open('CONFIG') as f: + for line in f: + line = line.strip() + if not comment.match(line): + m = assign.match(line) + if m: + var = m.group(1).strip() + default = m.group(3).strip() + val = default + for arg in sys.argv: + m = assign.match(arg) + if m: + argvar = m.group(1).strip() + argval = m.group(3).strip() + if argvar == var: + val = argval + if default.lower() == 'y' or default.lower() == 'n': + if val.lower() == 'y': + boolval = 1 + else: + boolval = 0 + print "#define SPDK_{} {}".format(var, boolval) + else: + strval = val.replace('"', '\"') + print "#define SPDK_{} \"{}\"".format(var, strval)