Newer
Older
build_scripts / build.mk
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)