# build/output directory O ?= build # CPu type MCU ?= atmega2560 # project name PROJECT = NMES CSRC := $(shell find src/ -name '*.c') CXXSRC := $(shell find src/ -name '*.cpp') ASRC := $(shell find src/ -name '*.S') INC := $(shell find src/ -type d) LIBRARIES = m OBJ := $(patsubst %.S,$(O)/%.o,$(notdir $(ASRC))) $(patsubst %.c,$(O)/%.o,$(notdir $(CSRC))) $(patsubst %.cpp,$(O)/%.o,$(notdir $(CXXSRC))) DEP := $(patsubst %o,%d,$(OBJ)) TOOLCHAIN_PATH = ARCH ?= avr PREFIX = $(ARCH)- OPTIMIZE := s FLAGS += -O$(OPTIMIZE) FLAGS += -ffunction-sections -fdata-sections FLAGS += -Wall -g FLAGS += -funsigned-char -funsigned-bitfields -fshort-enums FLAGS += $(patsubst %,-I%,$(INC)) FLAGS += $(patsubst %,-D%,$(CDEFS)) FLAGS += -DF_CPU=$(F_CPU) FLAGS += -DBAUD=$(APPBAUD) FLAGS += -DXONXOFF FLAGS += -mmcu=$(MCU) FLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -finline-functions-called-once CFLAGS += $(FLAGS) -std=gnu11 -pipe ASFLAGS += $(FLAGS) CXXFLAGS += $(FLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -pipe LDFLAGS += $(FLAGS) -Wl,--as-needed,--gc-sections LDFLAGS += -Wl,-Map=$(O)/$(PROJECT).map LIBS += $(patsubst %,-l%,$(LIBRARIES)) CONSOLE ?= /dev/arduino BAUD ?= 115200 PROGRAMMER ?= stk500v2 F_CPU ?= 16000000UL APPBAUD ?= 500000 ### # depend on eigen3 # CFLAGS += $(shell pkg-config --cflags eigen3) # LIBS += $(shell pkg-config --libs eigen3) ### VPATH = $(O) $(shell find src/ -type d) CC = $(TOOLCHAIN_PATH)$(PREFIX)gcc CXX = $(TOOLCHAIN_PATH)$(PREFIX)g++ OBJCOPY = $(TOOLCHAIN_PATH)$(PREFIX)objcopy OBJDUMP = $(TOOLCHAIN_PATH)$(PREFIX)objdump AR = $(TOOLCHAIN_PATH)$(PREFIX)ar SIZE = $(TOOLCHAIN_PATH)$(PREFIX)size READELF = $(TOOLCHAIN_PATH)$(PREFIX)readelf NM = $(TOOLCHAIN_PATH)$(PREFIX)nm RM = rm -f RMDIR = rmdir MKDIR = mkdir -p .PHONY: all clean run flash functionsbysize .PRECIOUS: $(O)/%.o $(O)/%.elf all: $(O)/$(PROJECT).hex clean: $(RM) $(O)/$(PROJECT).hex $(O)/$(PROJECT).elf $(RM) $(OBJ) $(RM) $(DEP) $(RM) $(O)/$(PROJECT).map $(RMDIR) $(O) flash: $(O)/$(PROJECT).hex avrdude -c$(PROGRAMMER) -b$(BAUD) -p$(MCU) -P$(CONSOLE) -U flash:w:$< functionsbysize: $(OBJ) @$(OBJDUMP) -h $^ | grep '\.text\.' | perl -ne '/\.text\.(\S+)\s+([0-9a-f]+)/ && printf "%u\t%s\n", eval("0x$$2"), $$1;' | sort -n $(O): $(MKDIR) $(O) $(O)/%.hex: $(O)/%.elf | $(O) @echo " COPY " $@ @$(OBJCOPY) -j .text -j .data -j .rodata -O ihex $< $@ $(O)/%.elf: $(OBJ) | $(O) @echo " LINK " $@ @$(CXX) $(LDFLAGS) -o $@ $^ $(LIBS) $(O)/%.o: %.cpp | $(O) @echo " CXX " $@ @$(CXX) $(CXXFLAGS) -c -o $@ $^ $(O)/%.o: %.c | $(O) @echo " CC " $@ @$(CC) $(CFLAGS) -c -o $@ $^ $(O)/%.o: $.S | $(O) @echo " AS " $@ @$(AS) $(ASFLAGS) -c -o $@ $^ #autodep $(O)/%.d: %.cpp | $(O) @echo " DEP " $@ @$(CXX) -MM $(CXXFLAGS) $< | sed -e 's!\($*\)\.o[ :]+!\1.o \1.d:!' > $@ $(O)/%.d: %.c | $(O) @echo " DEP " $@ @$(CC) -MM $(CFLAGS) $< | sed -e 's!\($*\)\.o[ :]+!\1.o \1.d:!' > $@ include $(DEP)