Makefile

Makefile

keil

  • 缺点:
  1. 编译较大项目麻烦,添加文件和包含路径不方便,不易理解编译和调试的原理
  2. 语法上可以加GNUC规则,但是并不全
  3. 对于添加软件包等也较复杂
  • 优点:
  1. 编译快
  2. 优化好,编译文件体积小
  3. 仿真方便

尽量选gcc + makefile方式,如果工程庞大,可选gcc + cmake

语法参考

生成部分建文件夹

1
2
3
4
5
6
7
8
9
10
OBJECTS += $(addprefix $(BUILD_DIR)/,$(ASM_SOURCES:.s=.o))
vpath %.s $(sort $(dir $(ASM_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
@mkdir -p $(dir $@)
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(<:.c=.lst) $< -o $@

@mkdir -p $(dir $(BUILD_DIR)/$<)

# $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(<:.c=.lst) $< -o $(BUILD_DIR)/$(<:.c=.o)

通配符

1
2
C_SOURCES =   \
$(wildcard Template/*.c) \

排除

1
C_SOURCES := $(filter-out APP/glyc.c, $(C_SOURCES))

反汇编

1
2
$(TARGET_ASM): $(TARGET_AXF)
arm-none-eabi-objdump -d $< > $@

生成库

1
ar -rc lib.a 1.o 2.o ...

条件

1
2
3
4
5
6
OS = 1
ifeq ($(OS),1)
###
else
###
endif

关键字

1
2
3
addprefix加前缀
wildcard通配
filter-out排除

增加用量显示

1
-Wl,--print-memory-usage

命令合并 其他

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
all clean ocd_flash ocd_flash_softdevice:
make -C $(DIR) $@

openocd:
openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg

# makefile添加
debug:
openocd -f openocd.cfg &
"C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin/arm-none-eabi-gdb" ./_build/$(TARGETS).out -ex "target remote localhost:3333"

exit:
@taskkill -f -im openocd.exe

download:
@echo "h" > jlink.cfg
@echo "loadfile" $(BUILD)/$(TARGET).hex >> jlink.cfg
@echo "r" >> jlink.cfg
@echo "qc" >> jlink.cfg
@$(JLINKEXE) -device $(CHIP) -Speed 4000 -IF SWD -CommanderScript jlink.cfg
@$(RM) jlink.cfg
#系统判断:
ifeq ($(OS),Windows_NT)
RM = rmdir /s /q
else
RM = rm -rf
endif

F303discovery

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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.11.2] date: [Fri Dec 03 14:33:59 CST 2021]
##########################################################################################################################

# ------------------------------------------------
# Generic Makefile (based on gcc)
#
# ChangeLog :
# 2017-02-10 - Several enhancements + project update mode
# 2015-07-22 - first version
# ------------------------------------------------

######################################
# target
######################################
TARGET = F303


######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og


#######################################
# paths
#######################################
# Build path
BUILD_DIR = build

######################################
# source
######################################
# C sources
C_SOURCES = \
startup_stm32.c \
Core/Src/main.c \
Core/Src/gpio.c \
Core/Src/i2c.c \
Core/Src/spi.c \
Core/Src/usb.c \
Core/Src/usart.c \
Core/Src/stm32f3xx_it.c \
Core/Src/stm32f3xx_hal_msp.c \
Core/Src/system_stm32f3xx.c \
STM32F3-Discovery/stm32f3_discovery.c \
STM32F3-Discovery/stm32f3_discovery_gyroscope.c \
STM32F3-Discovery/stm32f3_discovery_accelerometer.c
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_ll_usb.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart_ex.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pcd.c \
# Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pcd_ex.c

C_SOURCES+=$(wildcard components/commmon/*.c) \
$(wildcard components/i3g4250d/*.c) \
$(wildcard components/l3gd20/*.c) \
$(wildcard components/lsm303agr/*.c) \
$(wildcard components/lsm303dlhc/*.c) \
$(wildcard imu/*.c)
# ASM sources
ASM_SOURCES = \
# startup_stm32f303xc.s


#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
GCC_PATH = "C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin"
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
AR = $(GCC_PATH)/$(PREFIX)ar
MP = $(GCC_PATH)/$(PREFIX)objdump
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
AR = $(PREFIX)ar
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S

#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m4

# fpu
FPU = -mfpu=fpv4-sp-d16

# float-abi
FLOAT-ABI = -mfloat-abi=hard

# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

# macros for gcc
# AS defines
AS_DEFS =

# C defines
C_DEFS = \
-DUSE_HAL_DRIVER \
-DSTM32F303xC


# AS includes
AS_INCLUDES =

# C includes
C_INCLUDES = \
-ICore/Inc \
-IDrivers/STM32F3xx_HAL_Driver/Inc \
-IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy \
-IDrivers/CMSIS/Device/ST/STM32F3xx/Include \
-IDrivers/CMSIS/Include \
-ISTM32F3-Discovery \
-Icomponents/l3gd20 \
-Icomponents/lsm303agr \
-Icomponents/lsm303dlhc \
-Icomponents/i3g4250d \
-Iimu


# compile gcc flags
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif


# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"


#######################################
# LDFLAGS
#######################################
# link script
LDSCRIPT = STM32F303VCTx_FLASH.ld

# libraries
LIBS = -lc -lm -lnosys
LIBS += Drivers/STM32F303VCTx.lib



LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

# default action: build all
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin

Drivers/STM32F303VCTx.lib: lib
#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
$(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(CC) $(OBJECTS) $(LDFLAGS) -o $@
$(SZ) $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(HEX) $< $@

$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(BIN) $< $@

$(BUILD_DIR):
mkdir $@

#######################################
# clean up
#######################################
clean:
-rm -fR $(BUILD_DIR)


ocd_flash: $(BUILD_DIR)/$(TARGET).hex
openocd -f openocd.cfg -c "program $^ verify reset exit"

debug:
openocd -f openocd.cfg &
"C:\Program Files (x86)\GNU Arm Embedded Toolchain\9 2020-q2-update\bin/arm-none-eabi-gdb" $(BUILD_DIR)/$(TARGET).elf -ex "target remote localhost:3333"

exit:
@taskkill -f -im openocd.exe

dump:
$(MP) -d $(BUILD_DIR)/$(TARGET).elf > dump.txt

export CFLAGS CC AR BUILD_DIR
lib libclean:
make -C Drivers $@




#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***

Drivers/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

#$(wildcard STM32F3xx_HAL_Driver/Src/*.c)
LIB_SOURCES+= \
STM32F3xx_HAL_Driver/Src/stm32f3xx_ll_usb.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart_ex.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pcd.c \
STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pcd_ex.c

C_INCLUDES = \
-I../Core/Inc \
-ISTM32F3xx_HAL_Driver/Inc \
-ISTM32F3xx_HAL_Driver/Inc/Legacy \
-ICMSIS/Device/ST/STM32F3xx/Include \
-ICMSIS/Include

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(LIB_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(LIB_SOURCES)))
# list of ASM program objects

$(BUILD_DIR)/%.o: %.c $(BUILD_DIR)
@$(CC) -c $(CFLAGS) $(C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
@echo "Compiled "$<"\n"
$(BUILD_DIR):
mkdir $@

HALLIB = STM32F303VCTx.lib
lib: $(HALLIB)


$(HALLIB):$(BUILD_DIR) $(OBJECTS)
$(AR) -r $@ $(OBJECTS)

libclean:
rm -rf $(BUILD_DIR)
rm STM32F303VCTx.lib

其他操作,打印输出

输出颜色,显示命令,帮助

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
C_SRCS := 
C_OBJS := $(patsubst %.c,$(OBJ_FOLDER)%.o,$(notdir $(C_SRCS)))

CPP_SRCS :=
CPP_OBJS := $(patsubst %.cpp,$(OBJ_FOLDER)%.o,$(notdir $(CPP_SRCS)))

S_SRCS :=
S_OBJS = $(patsubst %.s,$(OBJ_FOLDER)%.o,$(filter %.s,$(notdir $(S_SRCS))))
S_OBJS += $(patsubst %.S,$(OBJ_FOLDER)%.o,$(filter %.S,$(notdir $(S_SRCS))))
#-------------------------------------------------------------------------------
# Logging options
#-------------------------------------------------------------------------------

# Enable color output by default.
USE_COLOR ?= 1

# Normally, commands in recipes are prefixed with '@' so the command itself
# is not echoed by make. But if VERBOSE is defined (set to anything non-empty),
# then the '@' is removed from recipes. The 'at' variable is used to control
# this.
ifeq "$(VERBOSE)" "1"
at :=
else
at := @
endif

# These colors must be printed with the printf command. echo won't handle the
# escape sequences.
color_default = \033[00m
color_bold = \033[01m
color_red = \033[31m
color_green = \033[32m
color_yellow = \033[33m
color_blue = \033[34m
color_magenta = \033[35m
color_cyan = \033[36m
color_orange = \033[38;5;172m
color_light_blue = \033[38;5;039m
color_gray = \033[38;5;008m
color_purple = \033[38;5;097m

ifeq "$(USE_COLOR)" "1"
color_build := $(color_light_blue)
color_c := $(color_green)
color_cxx := $(color_green)
color_cpp := $(color_orange)
color_asm := $(color_magenta)
color_ar := $(color_yellow)
color_link := $(color_cyan)
color_convert := $(color_gray)
endif

# Used in printmessage if the color args are not present.
color_ :=

# Use in recipes to print color messages if printing to a terminal. If
# USE_COLOR is not set to 1, this reverts to a simple uncolorized printf.
# A newline is added to the end of the printed message.
#
# Arguments:
# 1 - name of the color variable (see above), minus the "color_" prefix
# 2 - first colorized part of the message
# 3 - first uncolorized part of the message
# 4 - color name for second colorized message
# 5 - second colorized message
# 6 - second uncolorized part of the message
# 7 - uncolorized prefix on the whole line; this is last because it is expected to be used rarely
#
# All arguments are optional.
#
# Use like:
# $(call printmessage,cyan,Building, remainder of the message...)
ifeq "$(USE_COLOR)" "1"
define printmessage
if [ -t 1 ]; then printf "$(7)$(color_$(1))$(2)$(color_default)$(3)$(color_$(4))$(5)$(color_default)$(6)\n" ; \
else printf "$(7)$(2)$(3)$(5)$(6)\n" ; fi
endef
else
define printmessage
printf "$(7)$(2)$(3)$(5)$(6)\n"
endef
endif

#-------------------------------------------------------------------------------
# Recipes
#-------------------------------------------------------------------------------

# Compile C sources.
$(OBJ_FOLDER)%.o : %.c
@$(call printmessage,c,Compiling, $<)
$(at)$(CC) $(CFLAGS) $(COMMON_FLAGS) $< -o $@

# Compile C++ sources.
$(OBJ_FOLDER)%.o : %.cpp
@$(call printmessage,cxx,Compiling, $<)
$(at)$(CXX) $(CXXFLAGS) $(COMMON_FLAGS) $< -o $@

# Preprocess and assemble .S sources.
$(OBJ_FOLDER)%.o : %.S
@$(call printmessage,asm,Assembling, $<)
$(at)$(AS) $(ASFLAGS) $(COMMON_FLAGS) $< -o $@

# Assemble .s sources.
$(OBJ_FOLDER)%.o : %.s
@$(call printmessage,asm,Assembling, $<)
$(at)$(AS) $(ASFLAGS) $(COMMON_FLAGS) $< -o $@

$(OUT_DIR):
ifeq ($(OS),Windows_NT)
$(at)-mkdir $(OUT_DIR)
else
$(at)$(shell mkdir $(OBJ_FOLDER) 2>/dev/null)
endif



# Tool invocations

$(LD_SCRIPT): $(LD_SCRIPT_IN)
@$(call printmessage,cpp,Preprocessing, $<)
$(at)$(CPP) $(CPP_FLAGS) $(LD_CPP_FLAGS) $(INC_DIRS_F) $(CC_SYMBOLS) -MMD $< -o $@


$(TARGET_OUT): $(LD_SCRIPT) $(C_OBJS) $(CPP_OBJS) $(S_OBJS)
@$(call printmessage,link,Linking, $@)
$(at)$(LD) $(LIB_PATHS) -o $@ $(CPP_OBJS) $(C_OBJS) $(S_OBJS) $(O_OBJS) $(LIBS) $(LD_OPTIONS)
$(at)$(SIZE) --totals $(TARGET_OUT)
$(at)-$(NM) $(NMFLAGS) $(TARGET_OUT) > $(OBJ_FOLDER)$(TARGET)-symbol-table.txt

$(TARGET_HEX): $(TARGET_OUT)
@$(call printmessage,convert,Converting, $@)
$(at)@$(OBJCOPY) -O ihex $(TARGET_OUT) $(TARGET_HEX)

$(TARGET_BIN): $(TARGET_OUT)
@$(call printmessage,convert,Converting, $@)
$(at)@$(OBJCOPY) -O binary $(TARGET_OUT) $(TARGET_BIN)



help:
@echo "Useful targets:"
@echo " - all (default)"
@echo " - clean"
@echo " - help"
@echo
@echo "Options:"
@echo " - VERBOSE={0|1} to show full command lines."
@echo " - USE_COLOR={0|1} to override color output."


-->

请我喝杯咖啡吧~

支付宝
微信