2014-09-27 15:42:30 +00:00
|
|
|
# See readme.txt for the make API
|
|
|
|
|
|
|
|
# Add ARCH to each of the compiler programs
|
|
|
|
ifeq ($(XCC),)
|
|
|
|
XCC = $(ARCH)gcc
|
|
|
|
endif
|
|
|
|
ifeq ($(XCXX),)
|
|
|
|
XCXX = $(ARCH)g++
|
|
|
|
endif
|
|
|
|
ifeq ($(XAS),)
|
|
|
|
XAS = $(ARCH)gcc -x assembler-with-cpp
|
|
|
|
endif
|
|
|
|
ifeq ($(XLD),)
|
|
|
|
XLD = $(ARCH)gcc
|
|
|
|
endif
|
2014-09-30 14:44:40 +00:00
|
|
|
ifeq ($(XOC),)
|
|
|
|
XOC = $(ARCH)objcopy
|
|
|
|
endif
|
|
|
|
ifeq ($(XOD),)
|
|
|
|
XOD = $(ARCH)objdump
|
|
|
|
endif
|
2014-09-27 15:42:30 +00:00
|
|
|
|
|
|
|
# Default project name is the project directory name
|
|
|
|
ifeq ($(PROJECT),)
|
2014-09-30 14:44:40 +00:00
|
|
|
ifneq ($(firstword $(abspath $(firstword $(MAKEFILE_LIST)))),$(lastword $(abspath $(firstword $(MAKEFILE_LIST)))))
|
|
|
|
$(error Your directory contains spaces. Gmake barfs at that. Please define PROJECT)
|
|
|
|
endif
|
2014-09-27 15:42:30 +00:00
|
|
|
PROJECT := $(notdir $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))))
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Output directory and files
|
|
|
|
ifeq ($(BUILDDIR),)
|
|
|
|
ifeq ($(MAKECMDGOALS),Debug)
|
|
|
|
BUILDDIR = bin/Debug
|
2014-09-30 03:33:00 +00:00
|
|
|
endif
|
|
|
|
ifeq ($(MAKECMDGOALS),Release)
|
2014-09-27 15:42:30 +00:00
|
|
|
BUILDDIR = bin/Release
|
2014-09-30 03:33:00 +00:00
|
|
|
endif
|
|
|
|
ifeq ($(MAKECMDGOALS),cleanDebug)
|
2014-09-27 15:42:30 +00:00
|
|
|
BUILDDIR = bin/Debug
|
2014-09-30 03:33:00 +00:00
|
|
|
endif
|
|
|
|
ifeq ($(MAKECMDGOALS),cleanRelease)
|
2014-09-27 15:42:30 +00:00
|
|
|
BUILDDIR = bin/Release
|
2014-09-30 03:33:00 +00:00
|
|
|
endif
|
|
|
|
ifeq ($(BUILDDIR),)
|
2014-09-27 15:42:30 +00:00
|
|
|
BUILDDIR = .build
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
OBJDIR = $(BUILDDIR)/obj
|
|
|
|
DEPDIR = $(BUILDDIR)/dep
|
|
|
|
|
|
|
|
SRCFILE = $<
|
|
|
|
OBJFILE = $@
|
|
|
|
LSTFILE = $(@:.o=.lst)
|
|
|
|
MAPFILE = $(BUILDDIR)/$(PROJECT).map
|
2014-09-30 14:44:40 +00:00
|
|
|
EXEFILE =
|
|
|
|
ifeq ($(basename $(OPT_OS)),win32)
|
2014-09-27 15:42:30 +00:00
|
|
|
EXEFILE = $(BUILDDIR)/$(PROJECT).exe
|
2014-09-30 14:44:40 +00:00
|
|
|
TARGETS = $(EXEFILE)
|
|
|
|
endif
|
|
|
|
ifeq ($(basename $(OPT_OS)),linux)
|
|
|
|
EXEFILE = $(BUILDDIR)/$(PROJECT)
|
|
|
|
TARGETS = $(EXEFILE)
|
|
|
|
endif
|
|
|
|
ifeq ($(basename $(OPT_OS)),osx)
|
2014-09-27 15:42:30 +00:00
|
|
|
EXEFILE = $(BUILDDIR)/$(PROJECT)
|
2014-09-30 14:44:40 +00:00
|
|
|
TARGETS = $(EXEFILE)
|
|
|
|
endif
|
|
|
|
ifeq ($(EXEFILE),)
|
|
|
|
LDFLAGS += -nostartfiles
|
|
|
|
EXEFILE = $(BUILDDIR)/$(PROJECT).elf
|
|
|
|
TARGETS = $(EXEFILE) $(BUILDDIR)/$(PROJECT).hex $(BUILDDIR)/$(PROJECT).bin $(BUILDDIR)/$(PROJECT).dmp
|
2014-09-27 15:42:30 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
SRCFLAGS += -I. $(patsubst %,-I%,$(INCPATH)) $(patsubst %,-D%,$(patsubst -D%,%,$(DEFS)))
|
|
|
|
LDFLAGS += $(patsubst %,-L%,$(LIBPATH)) $(patsubst %,-l%,$(patsubst -l%,%,$(LIBS)))
|
|
|
|
OBJS = $(addprefix $(OBJDIR)/,$(subst ../,_dot_dot/,$(addsuffix .o,$(basename $(SRC)))))
|
|
|
|
|
2014-09-30 14:44:40 +00:00
|
|
|
ifneq ($(OPT_NONSTANDARD_FLAGS),yes)
|
|
|
|
SRCFLAGS += -fomit-frame-pointer -Wall -Wextra -Wstrict-prototypes -fverbose-asm
|
|
|
|
endif
|
|
|
|
ifeq ($(OPT_LINK_OPTIMIZE),yes)
|
|
|
|
SRCFLAGS += -ffunction-sections -fdata-sections
|
|
|
|
endif
|
2014-09-27 15:42:30 +00:00
|
|
|
ifeq ($(OPT_GENERATE_MAP),yes)
|
2014-09-30 14:44:40 +00:00
|
|
|
ifeq ($(OPT_LINK_OPTIMIZE),yes)
|
|
|
|
LDFLAGS += -Wl,-Map=$(MAPFILE),--cref,--no-warn-mismatch,--gc-sections
|
|
|
|
else
|
|
|
|
LDFLAGS += -Wl,-Map=$(MAPFILE),--cref,--no-warn-mismatch
|
|
|
|
endif
|
2014-09-27 15:42:30 +00:00
|
|
|
endif
|
|
|
|
ifeq ($(OPT_GENERATE_LISTINGS),yes)
|
|
|
|
CFLAGS += -Wa,-alms=$(LSTFILE)
|
|
|
|
CXXFLAGS += -Wa,-alms=$(LSTFILE)
|
|
|
|
ASFLAGS += -Wa,-amhls=$(LSTFILE)
|
|
|
|
endif
|
2014-09-30 14:44:40 +00:00
|
|
|
ifneq ($(LDSCRIPT),)
|
|
|
|
LDFLAGS += -T$(LDSCRIPT)
|
|
|
|
endif
|
2014-09-27 15:42:30 +00:00
|
|
|
|
|
|
|
# Generate dependency information
|
|
|
|
SRCFLAGS += -MMD -MP -MF $(DEPDIR)/$(@F).d
|
|
|
|
|
|
|
|
#
|
|
|
|
# makefile rules
|
|
|
|
#
|
|
|
|
|
|
|
|
.PHONY: builddirs fakefile.o all clean Debug Release cleanDebug cleanRelease
|
|
|
|
|
|
|
|
Debug Release: all
|
|
|
|
cleanDebug cleanRelease: clean
|
|
|
|
|
2014-09-30 14:44:40 +00:00
|
|
|
all: builddirs fakefile.o $(TARGETS)
|
2014-09-27 15:42:30 +00:00
|
|
|
|
|
|
|
builddirs:
|
|
|
|
@mkdir -p $(BUILDDIR)
|
|
|
|
@mkdir -p $(OBJDIR)
|
|
|
|
@mkdir -p $(DEPDIR)
|
|
|
|
|
|
|
|
fakefile.o:
|
|
|
|
ifneq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
@echo Compiler Options - $(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) fakefile.c -o $(OBJDIR)/$@
|
|
|
|
@echo
|
|
|
|
endif
|
|
|
|
|
|
|
|
.SECONDEXPANSION:
|
|
|
|
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.c)
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
ifeq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
@echo
|
|
|
|
$(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
else
|
|
|
|
@echo Compiling $<
|
|
|
|
@$(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
endif
|
|
|
|
|
|
|
|
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.cpp)
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
ifeq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
@echo
|
|
|
|
$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
else
|
|
|
|
@echo Compiling $<
|
|
|
|
@$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
endif
|
|
|
|
|
|
|
|
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.c++)
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
ifeq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
@echo
|
|
|
|
$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
else
|
|
|
|
@echo Compiling $<
|
|
|
|
@$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
endif
|
|
|
|
|
|
|
|
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.s)
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
ifeq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
@echo
|
|
|
|
$(XAS) -c $(CPPFLAGS) $(ASFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
else
|
|
|
|
@echo Compiling $<
|
|
|
|
@$(XAS) -c $(CPPFLAGS) $(ASFLAGS) $(SRCFLAGS) $< -o $@
|
|
|
|
endif
|
|
|
|
|
|
|
|
$(EXEFILE): $(OBJS)
|
|
|
|
@mkdir -p $(dir $@)
|
|
|
|
ifeq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
@echo
|
|
|
|
$(XLD) $(OBJS) $(LDFLAGS) -o $@
|
|
|
|
else
|
|
|
|
@echo Linking $@
|
|
|
|
@$(XLD) $(OBJS) $(LDFLAGS) -o $@
|
|
|
|
endif
|
|
|
|
ifeq ($(OPT_COPY_EXE),yes)
|
2014-09-30 14:44:40 +00:00
|
|
|
@cp $@ .
|
|
|
|
endif
|
|
|
|
|
|
|
|
%.hex: %.elf $(LDSCRIPT)
|
|
|
|
ifeq ($(OPT_VERBOSE_COMPILE),yes)
|
|
|
|
$(XOC) -O ihex $< $@
|
|
|
|
else
|
|
|
|
@echo Creating $@
|
|
|
|
@$(XOC) -O ihex $< $@
|
|
|
|
endif
|
|
|
|
ifeq ($(OPT_COPY_EXE),yes)
|
|
|
|
@cp $@ .
|
|
|
|
endif
|
|
|
|
|
|
|
|
%.bin: %.elf $(LDSCRIPT)
|
|
|
|
ifeq ($(USE_VERBOSE_COMPILE),yes)
|
|
|
|
$(XOC) -O binary $< $@
|
|
|
|
else
|
|
|
|
@echo Creating $@
|
|
|
|
@$(XOC) -O binary $< $@
|
|
|
|
endif
|
|
|
|
ifeq ($(OPT_COPY_EXE),yes)
|
|
|
|
@cp $@ .
|
|
|
|
endif
|
|
|
|
|
|
|
|
%.dmp: %.elf $(LDSCRIPT)
|
|
|
|
ifeq ($(USE_VERBOSE_COMPILE),yes)
|
|
|
|
$(XOD) -x --syms $< > $@
|
|
|
|
else
|
|
|
|
@echo Creating $@
|
|
|
|
@$(XOD) -x --syms $< > $@
|
|
|
|
@echo Done
|
|
|
|
endif
|
|
|
|
ifeq ($(OPT_COPY_EXE),yes)
|
|
|
|
@cp $@ .
|
2014-09-27 15:42:30 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
gcov:
|
|
|
|
-mkdir gcov
|
|
|
|
$(COV) -u $(subst /,\,$(SRC))
|
|
|
|
-mv *.gcov ./gcov
|
|
|
|
|
|
|
|
#
|
|
|
|
# Include the dependency files, should be the last of the makefile except for clean
|
|
|
|
#
|
|
|
|
-include $(shell mkdir -p $(DEPDIR) 2>/dev/null) $(wildcard $(DEPDIR)/*)
|
|
|
|
|
|
|
|
clean:
|
|
|
|
-rm -fR $(BUILDDIR)
|
|
|
|
|
|
|
|
# *** EOF ***
|