summaryrefslogtreecommitdiff
path: root/cesar/common/make/build.mk
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/common/make/build.mk')
-rw-r--r--cesar/common/make/build.mk66
1 files changed, 66 insertions, 0 deletions
diff --git a/cesar/common/make/build.mk b/cesar/common/make/build.mk
new file mode 100644
index 0000000000..4ff67afd85
--- /dev/null
+++ b/cesar/common/make/build.mk
@@ -0,0 +1,66 @@
+# Define build rules.
+
+# No default implicit rules.
+.SUFFIXES:
+
+HOST_CC ?= $(CC)
+HOST_CXX ?= $(CXX)
+TARGET_CC ?= $(CROSS_COMPILE)gcc
+TARGET_CXX ?= $(CROSS_COMPILE)g++
+
+HOST_COMPILE.c = $(HOST_CC) $(HOST_CPPFLAGS) $(HOST_CFLAGS) -c
+HOST_COMPILE.cpp = $(HOST_CXX) $(HOST_CPPFLAGS) $(HOST_CXXFLAGS) -c
+HOST_COMPILE.S = $(HOST_CC) $(HOST_CPPFLAGS) $(HOST_ASFLAGS) -c
+HOST_LINK = $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS)
+HOST_LINK_CXX = $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_LDFLAGS)
+
+TARGET_COMPILE.c = $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -c
+TARGET_COMPILE.cpp = $(TARGET_CXX) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -c
+TARGET_COMPILE.S = $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_ASFLAGS) -c
+TARGET_LINK = $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS)
+TARGET_LINK_CXX = $(TARGET_CXX) $(TARGET_CXXFLAGS) $(TARGET_LDFLAGS)
+
+.PHONY: build.all host.all target.all build.clean
+
+build.all: host.all target.all
+
+host.all: $(HOST_EXES)
+
+target.all: $(TARGET_ELFS)
+
+# For each program, define the link rule.
+PROGRAM_rule_template_echo := "LINK"
+PROGRAM_rule_template_echo_CXX := "LDXX"
+define PROGRAM_rule_template
+.PHONY: $1
+$1: $$(call prog2exe,$1,$2)
+$$(call prog2exe,$1,$2): $$($1_OBJECTS) $$($1_MODULES_OBJECTS) $$($(call type2var,$2)_LINK_DEPS)
+ @echo $(PROGRAM_rule_template_echo$3)" [$2] $$@"
+ $Q$$($(call type2var,$2)_LINK$3) $$($1_OBJECTS) $$($1_MODULES_OBJECTS) $$($(call type2var,$2)_LDLIBS) $$($1_LDLIBS) -o $$@
+endef
+$(foreach program,$(HOST_PROGRAMS),$(eval $(call PROGRAM_rule_template,$(program),host,$(call iscxx,$(program)))))
+$(foreach program,$(TARGET_PROGRAMS),$(eval $(call PROGRAM_rule_template,$(program),target,$(call iscxx,$(program)))))
+
+# For each source, define the compile rule.
+SOURCE_rule_template_echo.c := "CC "
+SOURCE_rule_template_echo.cpp := "CXX "
+SOURCE_rule_template_echo.S := "AS "
+define SOURCE_rule_template
+$$(call src2obj,$1,$2): $1 | $$(OBJ_DIR_STAMP) $$($(call type2var,$2)_COMPILE_DEPS)
+ @echo $(SOURCE_rule_template_echo$3)" [$2] $$<"
+ $Q$$($(call type2var,$2)_COMPILE$3) -I$$(dir $$<).. -MMD -MP -MF $$(@:.o=.d) -MQ $$@ -o $$@ $$<
+endef
+$(foreach source,$(HOST_SOURCES),$(eval $(call SOURCE_rule_template,$(source),host,$(suffix $(source)))))
+$(foreach source,$(TARGET_SOURCES),$(eval $(call SOURCE_rule_template,$(source),target,$(suffix $(source)))))
+
+# Include deps.
+-include $(call src2dep,$(HOST_SOURCES),host)
+-include $(call src2dep,$(TARGET_SOURCES),target)
+
+# Clean rules.
+build.clean:
+ rm -f $(HOST_EXES) $(TARGET_ELFS) \
+ $(call src2obj,$(HOST_SOURCES),host) \
+ $(call src2obj,$(TARGET_SOURCES),target) \
+ $(call src2dep,$(HOST_SOURCES),host) \
+ $(call src2dep,$(TARGET_SOURCES),target)