Makefile (4486B)
1 # Be silent per default, but 'make V=1' will show all compiler calls. 2 ifneq ($(V),1) 3 Q := @ 4 NULL := 2>/dev/null 5 endif 6 7 .DEFAULT_GOAL := all 8 9 # toolchain 10 TOOLCHAIN = arm-none-eabi- 11 CC = $(TOOLCHAIN)gcc 12 DB = $(TOOLCHAIN)gdb 13 CP = $(TOOLCHAIN)objcopy 14 AS = $(TOOLCHAIN)gcc -x assembler-with-cpp 15 HEX = $(CP) -O ihex 16 BIN = $(CP) -O binary -S --gap-fill 0xFF 17 18 # define mcu, specify the target processor 19 MCU = cortex-m4 20 21 ROOT_DIR = . 22 SRC_DIR = $(ROOT_DIR)/src 23 include $(SRC_DIR)/globals/make-version.mk 24 include $(SRC_DIR)/app/make-app.mk 25 include $(SRC_DIR)/bl/make-bl.mk 26 27 # all the files will be generated with this name (.elf, .bin, .hex, etc) 28 PROJECT_NAME = project 29 APP_NAME = $(PROJECT_NAME)-$(VERSION) 30 BL_NAME = $(PROJECT_NAME)-bl 31 32 APP_INC += -I$(SRC_DIR) $(APPLICATION_INC) 33 34 # CPU defs 35 DEFS += -DSTM32F4 36 FP_FLAGS ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 37 ARCH_FLAGS = -mthumb -mcpu=$(MCU) $(FP_FLAGS) 38 39 # Compile flags 40 OPT := -Os 41 DEBUG := -ggdb3 42 CSTD ?= -std=c99 43 44 BUILD_DIR = $(ROOT_DIR)/build 45 46 APP_OBJ = $(addprefix $(BUILD_DIR)/,$(notdir $(APP_SRC:.c=.o))) 47 vpath %.c $(sort $(dir $(APP_SRC))) 48 49 BL_OBJ = $(addprefix $(BUILD_DIR)/,$(notdir $(BL_SRC:.c=.o))) 50 vpath %.c $(sort $(dir $(BL_SRC))) 51 52 53 54 ############################################################################### 55 # C flags 56 TGT_CFLAGS += $(OPT) $(CSTD) $(DEBUG) 57 TGT_CFLAGS += $(ARCH_FLAGS) 58 TGT_CFLAGS += -Wall -Wextra -Wpedantic -Wshadow -Wdouble-promotion -Wformat=2 \ 59 -Wformat-truncation -Wundef -fno-common -MD $(DEFS) -Wimplicit-function-declaration \ 60 61 TGT_CFLAGS += -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes 62 TGT_CFLAGS += -ffunction-sections -fdata-sections 63 64 ############################################################################### 65 # Linker flags 66 TGT_LDFLAGS += --static -nostartfiles 67 TGT_LDFLAGS += $(ARCH_FLAGS) $(DEBUG) 68 TGT_LDFLAGS += -Wl,--cref 69 TGT_LDFLAGS += -Wl,--gc-sections 70 TGT_LDFLAGS += -Wl,--print-memory-usage 71 TGT_LDFLAGS += --specs=rdimon.specs -u _printf_float 72 ifeq ($(V),99) 73 TGT_LDFLAGS += -Wl,--print-gc-sections 74 endif 75 76 ############################################################################### 77 # Used libraries 78 LDLIBS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group $(SHARED_LIB_PATH) $(SHARED_LIB) 79 80 APP_LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(APP_NAME).map $(TGT_LDFLAGS) -T$(APP_LINKER_SCRIPT) $(LDLIBS) -lm -DBOOTLOADER=0 81 82 BL_LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(BL_NAME).map $(TGT_LDFLAGS) -T$(BL_LINKER_SCRIPT) $(LDLIBS) -DBOOTLOADER=1 83 84 85 all: update_bin #tags 86 87 update_bin: version bl app 88 $(eval APP_ELF = $(notdir $(shell ls -t $(BUILD_DIR)/$(APP_NAME).elf))) 89 $(eval BL_ELF = $(notdir $(shell ls -t $(BUILD_DIR)/$(BL_NAME).elf))) 90 @(cp $(BUILD_DIR)/$(APP_ELF) $(BUILD_DIR)/fw.elf) 91 @(cp $(BUILD_DIR)/$(APP_NAME).bin $(BUILD_DIR)/fw.bin) 92 93 app: $(BUILD_DIR)/$(APP_NAME).elf $(BUILD_DIR)/$(APP_NAME).bin $(BUILD_DIR)/$(APP_NAME).hex 94 $(Q)#$(TOOLCHAIN)size $(BUILD_DIR)/$(APP_NAME).elf 95 96 bl: $(BUILD_DIR)/$(BL_NAME).elf $(BUILD_DIR)/$(BL_NAME).bin $(BUILD_DIR)/$(BL_NAME).hex 97 $(Q)#$(TOOLCHAIN)size $(BUILD_DIR)/$(BL_NAME).elf 98 99 OPENOCD_INTERFACE = /usr/share/openocd/scripts/interface/stlink.cfg 100 OPENOCD_TARGET = /usr/share/openocd/scripts/target/stm32f4x.cfg 101 102 flash-app: update_bin 103 $(Q)openocd -d0 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c "program $(BUILD_DIR)/"$(APP_ELF)" verify reset exit" 104 flash-bl: update_bin 105 $(Q)openocd -d0 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c "program $(BUILD_DIR)/$(BL_ELF) verify reset exit" 106 flash: update_bin 107 $(Q)openocd -d0 -f $(OPENOCD_INTERFACE) -f $(OPENOCD_TARGET) -c "program $(BUILD_DIR)/$(BL_ELF) verify" -c "program $(BUILD_DIR)/"$(APP_ELF)" verify reset exit" 108 109 fw-debug: update_bin 110 $(DB) $(BUILD_DIR)/$(APP_ELF) 111 112 bl-debug: update_bin 113 $(DB) $(BUILD_DIR)/$(BL_ELF) 114 115 # Force to re-build version file 116 $(BUILD_DIR)/firmware_info.o: .FORCE 117 118 .PHONY: .FORCE 119 120 .FORCE: 121 122 $(BUILD_DIR)/%.o: %.c | $(BUILD_DIR) 123 @printf " CC $(<F)\n" 124 $(Q)$(CC) -c $(TGT_CFLAGS) $(APP_INC) $< -o $@ 125 126 $(BUILD_DIR)/$(APP_NAME).elf: $(APP_OBJ) 127 $(Q)$(CC) $(APP_OBJ) $(APP_LDFLAGS) -o $@ 128 129 $(BUILD_DIR)/$(BL_NAME).elf: $(BL_OBJ) 130 $(Q)$(CC) $(BL_OBJ) $(BL_LDFLAGS) -o $@ 131 $(Q)printf "\n" 132 133 $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf 134 $(Q)$(HEX) $< $@ 135 136 $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf 137 $(Q)$(BIN) $< $@ 138 139 $(BUILD_DIR): 140 $(Q)mkdir -p $(BUILD_DIR) 141 142 clean: 143 $(Q)rm -rf $(BUILD_DIR) 144 145 tags: $(APP_OBJ) $(BL_OBJ) 146 $(Q)@printf "Generating tags ...\n" 147 $(Q)ctags -R .