# 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)