ifndef BINDIR $(error BINDIR is not defined in the Makefile) endif #definition of various tools AWK = awk CAT = cat CD = cd CP = cp CPIO = cpio MV = mv RM = rm LS = ls SED = sed MKDIR = mkdir CHMOD = chmod IHEX2BIN = ihex2bin BIN2IHEX = bin2ihex BIN2C = bin2c ifeq ($(RELEASE), yes) $(info ******************************* Release build *******************************) else $(info ******************************* Debug build *******************************) endif OBJDIR = $(BINDIR)/obj #update CFLAGS and LDFLAGS CFLAGS += $(PLATFORM_CFLAGS) $(ARCH_CFLAGS) $(OPT_CFLAGS) -O$(OPTLEVEL) -g$(DBGLEVEL) $(addprefix -I, $(INCDIRS)) $(addprefix -D, $(CPPDEFS)) CXXFLAGS += $(PLATFORM_CXXFLAGS) $(ARCH_CFLAGS) $(OPT_CFLAGS) -O$(OPTLEVEL) -g$(DBGLEVEL) $(addprefix -I, $(INCDIRS)) $(addprefix -D, $(CPPDEFS)) LDFLAGS += $(PLATFORM_LDFLAGS) $(ARCH_CFLAGS) $(OPT_CFLAGS) -O$(OPTLEVEL) -g$(DBGLEVEL) -Wl,-Map=$(BINDIR)/$(TARGET).map,--gc-sections,--cref #create list of all objects ALLOBJS = $(addprefix $(OBJDIR)/, $(patsubst %.s, %.o, $(notdir $(ASRCS)))) $(addprefix $(OBJDIR)/, $(patsubst %.c, %.o, $(notdir $(CSRCS)))) $(addprefix $(OBJDIR)/, $(patsubst %.cpp, %.o, $(notdir $(CXXSRCS)))) #create list of all object directories NEWDIRS += $(sort $(dir $(ALLOBJS))) ifeq ($(BUILD_VERSION), svn) SVNVER = $(subst :,r,$(shell svnversion -n .)) CFLAGS += -D_BUILD_VERSION_=\""svn-r$(SVNVER)"\" CFLAGS += -D_BUILD_VERSION_BCD_=0xDDDD CXXFLAGS += -D_BUILD_VERSION_=\""svn-r$(SVNVER)"\" CXXFLAGS += -D_BUILD_VERSION_BCD_=0xDDDD TARGET_VER = $(addsuffix _r$(SVNVER), $(TARGET)) else BUILD_VERSION_BCD = 0x$(subst .,,$(BUILD_VERSION)) CFLAGS += -D_BUILD_VERSION_=\""v$(BUILD_VERSION)"\" CXXFLAGS += -D_BUILD_VERSION_=\""v$(BUILD_VERSION)"\" CFLAGS += -D_BUILD_VERSION_BCD_=$(BUILD_VERSION_BCD) CXXFLAGS += -D_BUILD_VERSION_BCD_=$(BUILD_VERSION_BCD) TARGET_VER = $(addsuffix _v$(BUILD_VERSION), $(TARGET)) endif ifeq ($(VERBOSE), yes) PREFIX := EMPTY_LINE := @echo; else PREFIX := @ EMPTY_LINE := endif #(1) = target #(2) = source(s) #(3) = extra flags define COMPILE_ASM_SOURCE $(1): $(2) | $(dir $(1)) @echo Compiling $(2) ...; $(PREFIX)$(CC) -c $(3) -o $(1) $(2); $(EMPTY_LINE) endef #(1) = target #(2) = source(s) #(3) = extra flags define COMPILE_C_SOURCE $(1): $(2) | $(dir $(1)) @echo Compiling $(2) ...; $(PREFIX)$(CC) -c $(3) -MD -pipe -o $(1) $(2); $(EMPTY_LINE) @$(CP) -R $(patsubst %.o, %.d, $(1)) $(patsubst %.o, %.dtemp, $(1)); @$(SED) -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$$$//' -e '/^$$$$/ d' -e 's/$$$$/ :/' <$(patsubst %.o,%.d,$(1)) >>$(patsubst %.o,%.dtemp,$(1)); @$(MV) $(patsubst %.o, %.dtemp, $(1)) $(patsubst %.o, %.d, $(1)); endef #(1) = target #(2) = source(s) #(3) = extra flags define COMPILE_CXX_SOURCE $(1): $(2) | $(dir $(1)) @echo Compiling $(2) ...; $(PREFIX)$(CC) -c $(3) -MD -pipe -o $(1) $(2); $(EMPTY_LINE) @$(CP) -R $(patsubst %.o, %.d, $(1)) $(patsubst %.o, %.dtemp, $(1)); @$(SED) -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$$$//' -e '/^$$$$/ d' -e 's/$$$$/ :/' <$(patsubst %.o,%.d,$(1)) >>$(patsubst %.o,%.dtemp,$(1)); @$(MV) $(patsubst %.o, %.dtemp, $(1)) $(patsubst %.o, %.d, $(1)); endef define CREATE_DIRECTORY $(1)/: @echo Creating directory $(1) ... @$(MKDIR) -p $(1) endef .PHONY: all clean user_final_target user_clean_target config_final_target config_clean_target all: user_final_target config_final_target .SUFFIXES: ifdef LINK_TARGET $(BINDIR)/$(LINK_TARGET): $(ALLOBJS) $(LINKER_SCRIPT) | $(BINDIR)/ @echo "Linking ..." ifdef LINKER_SCRIPT $(CC) $(LDFLAGS) -o $(BINDIR)/$(LINK_TARGET) -T$(LINKER_SCRIPT) $(ALLOBJS) $(COMPONENT_LIBS) $(LIBS) else $(CC) $(LDFLAGS) -o $(BINDIR)/$(LINK_TARGET) $(ALLOBJS) $(LIBS) endif $(EMPTY_LINE) endif $(BINDIR)/$(TARGET).a: $(ALLOBJS) | $(BINDIR)/ $(AR) rcs $(BINDIR)/$(TARGET).a $(ALLOBJS) @echo $(foreach dir, $(OBJDIR), $(eval $(call CREATE_DIRECTORY, $(dir)))) $(eval $(call CREATE_DIRECTORY, $(BINDIR))) $(foreach source, $(ASRCS), $(eval $(call COMPILE_ASM_SOURCE, $(OBJDIR)/$(notdir $(source:%.s=%.o)), $(source), $(CFLAGS)))) $(foreach source, $(CSRCS), $(eval $(call COMPILE_C_SOURCE, $(OBJDIR)/$(notdir $(source:%.c=%.o)), $(source), $(CFLAGS)))) $(foreach source, $(CXXSRCS), $(eval $(call COMPILE_CXX_SOURCE, $(OBJDIR)/$(notdir $(source:%.cpp=%.o)), $(source), $(CXXFLAGS)))) clean: user_clean_target @echo Cleaning application files ... -$(RM) -rf $(BINDIR) $(eval $(call CONFIG_TARGETS)) $(eval $(call USER_TARGETS)) $(eval $(call USER_DEPENDENCY_RULES)) -include $(ALLOBJS:%.o=%.d)