-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
180 lines (118 loc) · 4.51 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# BASED ON THE TARGET NAME BINARY FILES WILL BE GENERATED (.elf, .bin, .hex)
TARGET=template
ST_MCU_FAMILY=STM32F429_439xx
USE_STD_PERPH ?= 1
# LIST ALL MAIN DIRECTORIES HERE.
PROJ_APP_DIR=./srcs
STDLIB_DIRS=./std_lib
DEVICE_DIR=./device_specific
LINKER_DIR=$(DEVICE_DIR)/linker_script
OBJDIR=debug
# Compilers definition.
CROSS_COMPILE = arm-none-eabi-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
OBJDUMP = $(CROSS_COMPILE)objdump
OBJCOPY = $(CROSS_COMPILE)objcopy
SIZE = $(CROSS_COMPILE)size
DBG = $(CROSS_COMPILE)gdb
# Compilers setting.
OPT_LEVEL=O0
#DEVICE SPECIFIC COMPILER SETTINGS
C_LIB=nosys.specs
DEVICE_ARCH=cortex-m4
ENDINAN_TYPE=mlittle-endian
FPU=fpv4-sp-d16
FPU_CALC=soft
ARM_INSTR=mthumb
#LINKER SCRIPT
LD_SCRIPT=$(LINKER_DIR)/stm32_flash.ld
# Path to stlink folder for uploading code to board
STLINK=~/Embedded/stlink-1.5.1
APP_SRC_DIRS := $(sort $(dir $(shell find "$(PROJ_APP_DIR)" -type f -name '*.c')))
UNIQUE_APP_SRC_DIRS := $(strip $(shell echo $(APP_SRC_DIRS) | tr ' ' '\n' | sort -u))
APP_INC_DIRS := $(sort $(dir $(shell find "$(PROJ_APP_DIR)" -type f -name '*.h')))
UNIQUE_APP_INC_DIRS := $(strip $(shell echo $(APP_INC_DIRS) | tr ' ' '\n' | sort -u))
STDLIB_SRC_DIRS := $(sort $(dir $(shell find "$(STDLIB_DIRS)" -type f -name '*.c')))
UNIQUE_STDLIB_SRC_DIRS := $(strip $(shell echo $(STDLIB_SRC_DIRS) | tr ' ' '\n' | sort -u))
STDLIB_INC_DIRS := $(sort $(dir $(shell find "$(STDLIB_DIRS)" -type f -name '*.h')))
UNIQUE_STDLIB_INC_DIRS := $(strip $(shell echo $(STDLIB_INC_DIRS) | tr ' ' '\n' | sort -u))
DEVICE_SRC_DIRS := $(sort $(dir $(shell find "$(DEVICE_DIR)" -type f -name '*.c')))
UNIQUE_DEVICE_SRC_DIRS := $(strip $(shell echo $(DEVICE_SRC_DIRS) | tr ' ' '\n' | sort -u))
DEVICE_ASSMB_DIRS := $(sort $(dir $(shell find "$(DEVICE_DIR)" -type f -name '*.s')))
UNIQUE_DEVICE_ASSMB_DIRS := $(strip $(shell echo $(DEVICE_ASSMB_DIRS) | tr ' ' '\n' | sort -u))
DEVICE_INC_DIRS := $(sort $(dir $(shell find "$(DEVICE_DIR)" -type f -name '*.h')))
UNIQUE_DEVICE_INC_DIRS := $(strip $(shell echo $(DEVICE_INC_DIRS) | tr ' ' '\n' | sort -u))
ALL_SRC_DIRS= $(UNIQUE_APP_SRC_DIRS) $(UNIQUE_STDLIB_SRC_DIRS) $(UNIQUE_DEVICE_SRC_DIRS) $(UNIQUE_DEVICE_ASSMB_DIRS)
ALL_INC_DIRS= $(UNIQUE_APP_INC_DIRS) $(UNIQUE_STDLIB_INC_DIRS) $(UNIQUE_DEVICE_INC_DIRS) $(UNIQUE_DEVICE_ASSMB_DIRS)
C_SRCS_FILES=$(notdir $(foreach dir, $(ALL_SRC_DIRS), $(wildcard $(dir)/*.c)))
ASSEMBLY_FILES=$(notdir $(foreach dir, $(UNIQUE_DEVICE_ASSMB_DIRS),$(wildcard $(dir)/*.s)))
SRCS= $(C_SRCS_FILES) $(ASSEMBLY_FILES)
# Define objects for all sources
OBJS = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(C_SRCS_FILES)))
OBJS+= $(addprefix $(OBJDIR)/,$(patsubst %.s,%.o, $(ASSEMBLY_FILES)))
# # Add this list to VPATH, the place make will look for the source files
VPATH = $(ALL_SRC_DIRS)
CFLAGS_INC=-I. $(foreach dir, $(ALL_INC_DIRS), $(addprefix -I, $(dir)))
#Compiler Prepocessor Flas For defines
DEF_DEVICE=-D$(ST_MCU_FAMILY)
DEF_LIB := $(if $(filter 1,$(USE_STD_PERPH)),-DUSE_STDPERIPH_DRIVER)
CFLAGS_defines=$(DEF_DEVICE)
CFLAGS_defines+=$(DEF_LIB)
TARGET_FLAGS=\
-mcpu=$(DEVICE_ARCH)\
-$(ENDINAN_TYPE)\
-mfpu=$(FPU)\
-mfloat-abi=$(FPU_CALC)\
-$(ARM_INSTR)
CFLAGS=\
-c \
-std=gnu11 -Wall\
--specs=$(C_LIB)\
-$(OPT_LEVEL)\
$(TARGET_FLAGS)\
$(CFLAGS_INC)\
-T $(LD_SCRIPT)\
$(CFLAGS_defines)
# -Wall -Wextra -Werror -Wmissing-include-dirs
LDFLAGS=\
-W\
-T $(LD_SCRIPT)\
$(TARGET_FLAGS)
all: clean $(SRCS) build size
@echo "Successfully finished..."
build: $(TARGET).elf $(TARGET).bin $(TARGET).lst
$(TARGET).elf: $(OBJS)
$(CC) $(OBJS) $(LDFLAGS) -o $(OBJDIR)/$@
$(OBJDIR)/%.o: %.c
@mkdir -p $(OBJDIR)
@echo "Building" $<
$(CC) $(CFLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -c $< -o $@
$(OBJDIR)/%.o: %.s
@echo "Building" $<
$(CC) $(CFLAGS) -c $< -o $@
%.hex: %.elf
@$(OBJCOPY) -O ihex $(OBJDIR)/$< $(OBJDIR)/$@
%.bin: %.elf
@$(OBJCOPY) -O binary $(OBJDIR)/$< $(OBJDIR)/$@
%.lst: %.elf
@$(OBJDUMP) -x -S $(OBJDIR)/$(TARGET).elf > $(OBJDIR)/$@
size: $(TARGET).elf
@$(SIZE) $(OBJDIR)/$(TARGET).elf
disass: $(TARGET).elf
@$(OBJDUMP) -d $(OBJDIR)/$(TARGET).elf
disass-all: $(TARGET).elf
@$(OBJDUMP) -D $(OBJDIR)/$(TARGET).elf
debug:
@$(DBG) --eval-command="target extended-remote :4242" \
$(OBJDIR)/$(TARGET).elf
burn:
@st-flash write $(OBJDIR)/$(TARGET).bin 0x8000000
clean:
@echo "Cleaning..."
@rm -rf $(OBJDIR)/
files:
@echo "vpath : $(VPATH)"
@echo "all srcs directory : $(ALL_SRC_DIRS)"
@echo "Assembly directory : $(UNIQUE_DEVICE_ASSMB_DIRS)"
.PHONY: all build size clean burn debug disass disass-all files