summaryrefslogtreecommitdiff
path: root/cesar/common/make/setup.mk
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/common/make/setup.mk')
-rw-r--r--cesar/common/make/setup.mk67
1 files changed, 67 insertions, 0 deletions
diff --git a/cesar/common/make/setup.mk b/cesar/common/make/setup.mk
new file mode 100644
index 0000000000..d19dcbc3f3
--- /dev/null
+++ b/cesar/common/make/setup.mk
@@ -0,0 +1,67 @@
+# Setup build parameters.
+
+HOST_EXES := $(call prog2exe,$(HOST_PROGRAMS),host)
+TARGET_ELFS := $(call prog2exe,$(TARGET_PROGRAMS),target)
+
+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. Well, this could be made
+# simpler by using more verbose Module files...
+define MODULE_template
+# Include module file.
+MODULE := $1
+include $$(BASE)/$1/Module
+MODULE :=
+# Use defined sources or overridden ones.
+SOURCES := $$(if $$($(call mod2var,$1)_MODULE_SOURCES),$$($(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.
+$(call mod2var,$1)_MODULE_MODULES := $$(MODULES)
+MODULES :=
+$$(foreach module,$$(filter-out $$(ALL_MODULES),$$($(call mod2var,$1)_MODULE_MODULES)),$$(eval $$(call MODULE_template,$$(module))))
+ALL_MODULES := $$(sort $$(ALL_MODULES) $$($(call mod2var,$1)_MODULE_MODULES))
+endef
+$(foreach module,$(ALL_MODULES),$(eval $(call MODULE_template,$(module))))
+
+# Add any dependent modules. For the moment, does not support multiple level
+# of dependencies.
+define PROGRAM_MODULES_template
+$1_MODULES := $$(sort $$($1_MODULES) $$(foreach module,$$($1_MODULES),$$($$(call mod2var,$$(module))_MODULE_MODULES)))
+endef
+$(foreach program,$(ALL_PROGRAMS),$(eval $(call PROGRAM_MODULES_template,$(program),host)))
+
+# 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