summaryrefslogtreecommitdiff
path: root/cesar/common/make/config.mk
blob: c5dbc829ff880becd1211f36702233adc3a59816 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Build time configuration.

USER_PROJECT_CONFIG ?= $(wildcard $(if $(VARIANT),$(VARIANT)-)Config)
DEFAULT_PROJECT_CONFIG := $(OBJ_DIR)/Config.empty
PROJECT_CONFIG := $(if $(USER_PROJECT_CONFIG),$(USER_PROJECT_CONFIG),$(DEFAULT_PROJECT_CONFIG))

.PHONY: CONFIG_FORCE CONFIG_CHECK BUILD_INFO_FORCE

BUILD_INFO_FLAGS := -i implementation -i project -i version

# Config per build type.
# Call with: type, typevar
define CONFIG_template

$2_MERGED_CONFIG := $$(OBJ_DIR)/Config.$1.merged
$2_HEADERS_CONFIG := $$($2_OBJ_INC_DIR)/config
$2_HEADERS_CONFIG_STAMP := $$($2_HEADERS_CONFIG)/headers.stamp
$2_COMPILE_DEPS += $$($2_HEADERS_CONFIG_STAMP) $$($2_OBJ_INC_DIR)/module_config.h $$($2_OBJ_INC_DIR)/build_info.h
$2_CONFIG_LIST_FILE := $$(OBJ_DIR)/Config.$1.list
$2_MODULE_LIST_FILE := $$(OBJ_DIR)/Module.$1.list

# Configuration is automatically updated if the list of config file has
# changed since last update.
-include $$($2_CONFIG_LIST_FILE)
$2_CONFIG_FORCE := $$(if $$(call list-neq,$$($2_CONFIG_LIST),$$(PROJECT_CONFIG) $$($2_MODULES_CONFIG)),CONFIG_FORCE)
$2_CONFIG_CHECK := $$(if $$($2_CONFIG_FORCE)$$($2_CONFIG_CHECKED),,CONFIG_CHECK)
$2_CONFIG_MERGE_OPTION := $$(if $$($2_CONFIG_CHECK),,--ignore-unknown-identifier)

# Module configuration should be updated if the list has changed.
-include $$($2_MODULE_LIST_FILE)
$2_MODULE_CONFIG_FORCE := $$(if $$(call list-neq,$$($2_MODULE_LIST),$$($2_MODULES)),CONFIG_FORCE)

endef
$(call foreach_type,CONFIG_template)

HEADERS_CONFIGS := $(call gather_type,HEADERS_CONFIG)
CONFIG_LIST_FILES := $(call gather_type,CONFIG_LIST_FILE)
MODULE_LIST_FILES := $(call gather_type,MODULE_LIST_FILE)

# Define config rules.
# Call with: type, typevar
define CONFIG_RULES_template
$$($2_MERGED_CONFIG): $$(PROJECT_CONFIG) $$($2_MODULES_CONFIG) $$(OBJ_DIR_STAMP) $$($2_CONFIG_FORCE) $$($2_CONFIG_CHECK)
	@echo "CONF [$1] merge"
	$$Qsleep 1 # needed to make make see the file update.
	$$Q$$(TOOLS_DIR)/config-merge $$($2_CONFIG_MERGE_OPTION) $1 $2 $$(PROJECT_CONFIG) $$($2_MODULES_CONFIG) > $$@
	$$Qecho "$2_CONFIG_LIST = $$(PROJECT_CONFIG) $$($2_MODULES_CONFIG)" > $$($2_CONFIG_LIST_FILE)
	$$Qecho "$2_CONFIG_CHECKED = $$($2_CONFIG_CHECK)" >> $$($2_CONFIG_LIST_FILE)

$$($2_HEADERS_CONFIG_STAMP): $$($2_MERGED_CONFIG)
	@echo "CONF [$1] headers"
	$$Qmkdir -p $$(dir $$@)
	$$Q$$(TOOLS_DIR)/config-headers $2 $$($2_OBJ_INC_DIR) $$<
	$$Qtouch $$@

$$($2_OBJ_INC_DIR)/module_config.h: $$($2_OBJ_INC_DIR_STAMP) $$($2_MODULE_CONFIG_FORCE)
	@echo "CONF [$1] module"
	$$Q$$(TOOLS_DIR)/config-module $$($2_MODULES) > $$@
	$$Qecho "$2_MODULE_LIST = $$($2_MODULES)" > $$($2_MODULE_LIST_FILE)

$$($2_OBJ_INC_DIR)/build_info.h: $$($2_OBJ_INC_DIR_STAMP) BUILD_INFO_FORCE
	@echo "CONF [$1] build-info"
	$$Q$$(TOOLS_DIR)/build-info -H $$@ $$(BUILD_INFO_FLAGS)
endef
$(call foreach_type,CONFIG_RULES_template)

# Check for old build system leftovers.
$(if $(wildcard $(OBJ_INC_DIR)/build_info.h),\
$(error old build system leftovers detected, please rm -r obj))

$(DEFAULT_PROJECT_CONFIG): $(OBJ_DIR_STAMP)
	touch $@

config.clean:
	rm -f $(DEFAULT_PROJECT_CONFIG) $(MERGED_CONFIGS) $(CONFIG_LIST_FILES) $(MODULE_LIST_FILES)
	rm -rf $(HEADERS_CONFIGS:%/config=%/config.h) $(HEADERS_CONFIGS) \
		$(HEADERS_CONFIGS:%/config=%/module_config.h) $(HEADERS_CONFIGS:%/config=%/build_info.h)