summaryrefslogtreecommitdiff
path: root/cesar/common/make/setup.mk
blob: f1cdeeedbc34f764aec93dd9979fb2908b37ae5e (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
# Setup build parameters.

HOST_EXES := $(call prog2exe,$(HOST_PROGRAMS),host)
TARGET_ELFS := $(call prog2exe,$(TARGET_PROGRAMS),target)
TARGET_BINS := $(call prog2bin,$(TARGET_PROGRAMS))

ALL_PROGRAMS := $(HOST_PROGRAMS) $(TARGET_PROGRAMS)
ALL_MODULES := $(sort $(foreach program,$(ALL_PROGRAMS),$($(program)_MODULES)))

MODULES_CONFIG :=

ifdef SOURCES
$(error the SOURCES variable should not be defined)
endif

ifdef MODULES
$(error the MODULES variable should not be defined)
endif

# For each used module, include its Module file, get its source files, and
# module dependencies.
define MODULE_template
# Include module file.
MODULE := $1
include $$(BASE)/$1/Module
MODULE :=
# Use defined sources or overridden ones.
SOURCES := $$(call default,$(call mod2var,$1)_MODULE_SOURCES,$$(SOURCES))
$(call mod2var,$1)_MODULE_SOURCES := $$(call src2src,$$(SOURCES),$1/src)
SOURCES :=
# Merge module configuration.
MODULES_CONFIG += $$(wildcard $$(BASE)/$1/Config)
# Add any dependent modules.
MODULES := $$(call default,$(call mod2var,$1)_MODULE_MODULES,$$(MODULES))
$(call mod2var,$1)_MODULE_MODULES := $$(MODULES)
MODULES :=
NEW_MODULES := $$(filter-out $$(ALL_MODULES),$$($(call mod2var,$1)_MODULE_MODULES))
ALL_MODULES := $$(sort $$(ALL_MODULES) $$(NEW_MODULES))
# Recursively call itself on new modules.
$$(foreach module,$$(NEW_MODULES),$$(eval $$(call MODULE_template,$$(module))))
NEW_MODULES :=
endef
$(foreach module,$(ALL_MODULES),$(eval $(call MODULE_template,$(module))))

# Add any dependent modules to programs.
define PROGRAM_MODULES_template
NEW_MODULES := $$(foreach module,$$($1_MODULES),$$($$(call mod2var,$$(module)_MODULE_MODULES)))
NEW_MODULES := $$(filter-out $$($1_MODULES),$$(NEW_MODULES))
$1_MODULES := $$(sort $$($1_MODULES) $$(NEW_MODULES))
$$(if $$(NEW_MODULES),$$(eval $$(call PROGRAM_MODULES_template,$1)))
endef
$(foreach program,$(ALL_PROGRAMS),$(eval $(call PROGRAM_MODULES_template,$(program))))

# For each program.
define PROGRAM_template
$1_SOURCES := $$(call src2src,$$($1_SOURCES),src)
$1_OBJECTS := $$(call src2obj,$$($1_SOURCES),$2)
$1_MODULES_SOURCES := $$(foreach module,$$($1_MODULES),$$($$(call mod2var,$$(module))_MODULE_SOURCES))
$1_MODULES_OBJECTS := $$(call src2obj,$$($1_MODULES_SOURCES),$2)
endef
$(foreach program,$(HOST_PROGRAMS),$(eval $(call PROGRAM_template,$(program),host)))
$(foreach program,$(TARGET_PROGRAMS),$(eval $(call PROGRAM_template,$(program),target)))

HOST_SOURCES := $(sort $(foreach program,$(HOST_PROGRAMS),$($(program)_SOURCES) $($(program)_MODULES_SOURCES)))
TARGET_SOURCES := $(sort $(foreach program,$(TARGET_PROGRAMS),$($(program)_SOURCES) $($(program)_MODULES_SOURCES)))
ALL_SOURCES := $(sort $(HOST_SOURCES) $(TARGET_SOURCES))

vpath %.c $(BASE)
vpath %.cpp $(BASE)
vpath %.S $(BASE)

OBJ_DIR_STAMP := $(OBJ_DIR)/dir.stamp
OBJ_INC_DIR := $(OBJ_DIR)/inc
OBJ_INC_DIR_STAMP := $(OBJ_INC_DIR)/dir.stamp