-
Notifications
You must be signed in to change notification settings - Fork 2
/
Makefile
235 lines (186 loc) · 6.81 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
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
#/*
#**************************************************************************************************
#*文件:Makefile
#*作者:fanwenl_
#*版本:V0.0.1
#*日期:2018-05-23
#*描述:Makefile for iBox,add auto build with gcc.
#* 参考LiteOS编写.
#**************************************************************************************************
#*/
PROJECT := iBoxClient
TARGET := $(PROJECT)
TARGET_ELF := $(TARGET).elf
TARGET_BIN := $(TARGET).bin
TARGET_HEX := $(TARGET).hex
TARGET_MAP := $(TARGET).map
OBJCPFLAGS_ELF_TO_BIN = -Obinary
OBJCPFLAGS_ELF_TO_HEX = -Oihex
OBJCPFLAGS_BIN_TO_HEX = -Ibinary -Oihex
OBJCPFLAGS_ELF_TO_SREC = -Osrec
OBJCPFLAGS_ELF_TO_LIST = -S
# ---------------------------------------------------------------------------
# Beautify output
# 可以实现像Kernel一样的输出格式(参考kernel、libopencm3)
# ---------------------------------------------------------------------------
ifeq ($(V),1)
Q =
else
Q = @
endif
#ifeq (${ARCH}, arm)
CROSS_COMPILE := arm-none-eabi-
#endif
ifeq ($(USE_CCACHE),1)
CCACHE := ccache
endif
# Make variables (CC, etc...)
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
ifeq ($(USE_CCACHE),1)
CC = $(CCACHE) $(CROSS_COMPILE)gcc
CXX = $(CCACHE) $(CROSS_COMPILE)g++
else
CC := $(CROSS_COMPILE)gcc
CXX := $(CROSS_COMPILE)g++
endif
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
GDB = $(CROSS_COMPILE)gdb
READELF = $(CROSS_COMPILE)readelf
SIZE =$(CROSS_COMPILE)size
ifndef SOURCE_ROOT
# Assume we're in the source directory if not specified.
SOURCE_ROOT=.
export SOURCE_ROOT
endif
APPDIR ?= ${SOURCE_ROOT}/Application/src
# -Wall 使能所有警告
ifeq (${DEBUG}, 1)
CFLAGS += -g -O0 -Wall
DEFINES += IBOX_DEBUG
else
CFLAGS += -O2
endif
# -ffunction-sections -fdata-sections去除没有使用的函数
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS += -mlittle-endian -mcpu=cortex-m3 -march=armv7-m -ffreestanding -mthumb -std=gnu99 --specs=nosys.specs
# --specs=rdimon.specs https://stackoverflow.com/questions/19419782/exit-c-text0x18-undefined-reference-to-exit-when-using-arm-none-eabi-gcc
# 增加定义
DEFINES += HSE_VALUE=12000000
DEFINES += STM32F10X_HD
DEFINES += USE_STDPERIPH_DRIVER
# If a parent Makefile has passed us DEFINES, assume they will be missing -D.
DEFINES := ${DEFINES:%=-D%}
#ifeq (${USE_RTOS}, 1)
DEFINES += -DUSE_RTOS
#endif
ifeq (${USE_WIFI}, 1)
DEFINES += -DUSE_WIFI
endif
# 头文件
vpath %.c ${SOURCE_ROOT}
vpath %.h ${SOURCE_ROOT}
vpath %.S ${SOURCE_ROOT}
vpath %.s ${SOURCE_ROOT}
INCLUDE_DIRS = ${SOURCE_ROOT}/Application/inc \
${SOURCE_ROOT}/Drivers/BSP/inc \
${SOURCE_ROOT}/Drivers/CMSIS/CM3/CoreSupport \
${SOURCE_ROOT}/Drivers/CMSIS/CM3/DeviceSupport/ST/STM32F10x \
${SOURCE_ROOT}/Drivers/STM32F10x_StdPeriph_Driver/inc \
${SOURCE_ROOT}/Middlewares/Eth
INCLUDES += ${INCLUDE_DIRS:%=-I%}
CFLAGS += ${DEFINES}
CFLAGS += ${INCLUDES}
#STM32F103ZE_FLASH.ld
LINKER_SCRIPT = ${SOURCE_ROOT}/Drivers/LinkerScript_gcc/stm32_rom.ld
LDFLAGS += -T $(LINKER_SCRIPT)
#-lm:连接数学库libm.a;-lc:连接C标准库libc.a;lgcc:连接GCC支持库libgcc.a
# -Wl,-–gc-sections去除没有调用的函数
# 注意连接的顺序
# 使用修改的ld文件保留finish和rtt initial代码
LDFLAGS += ${CFLAGS}
LDFLAGS += -lm -lc -Wl,--gc-sections,-Map=build/$(TARGET_MAP),-cref,-u,Reset_Handler
############################################################
### Sub-makefiles
############################################################
include ${SOURCE_ROOT}/Application/Makefile
include ${SOURCE_ROOT}/Drivers/BSP/Makefile
include ${SOURCE_ROOT}/Drivers/CMSIS/Makefile
include ${SOURCE_ROOT}/Drivers/STM32F10x_StdPeriph_Driver/Makefile
include ${SOURCE_ROOT}/Middlewares/Eth/Makefile
include ${SOURCE_ROOT}/Middlewares/cJSON/Makefile
include ${SOURCE_ROOT}/Middlewares/CmBacktrace/Makefile
include ${SOURCE_ROOT}/Middlewares/RTOS/Makefile
include ${SOURCE_ROOT}/Middlewares/SystemView/Makefile
include ${SOURCE_ROOT}/Middlewares/MQTT/Makefile
include ${SOURCE_ROOT}/lib/Makefile
OBJECTS += ${patsubst %.c,build/%.o,$(C_SOURCES)}
OBJECTS += ${patsubst %.s,build/%.o,$(ASM_SOURCES)}
.PHONY: all default clean
default: all
all:build build/lib build/$(TARGET_BIN) build/$(TARGET_HEX)
build:
@echo -----------------------------------------------------------------------------------
@echo Building target: $(PROJECT)
@echo Invoking: $(CC) Linker
@printf " NEW $@\n"
$(Q)mkdir -p $@
build/lib:
# $(MAKE) -C Drivers/STM32F10x_StdPeriph_Driver
build/$(TARGET_BIN):build/$(TARGET_ELF)
@printf " OBJCOPY $(TARGET_BIN)\n"
$(Q)$(OBJCOPY) $(OBJCPFLAGS_ELF_TO_BIN) -S $^ $@
build/$(TARGET_HEX):build/$(TARGET_ELF)
@printf " OBJCOPY $(TARGET_HEX)\n"
$(Q)$(OBJCOPY) $(OBJCPFLAGS_ELF_TO_HEX) -S $^ $@
@echo 'Finished building target: $(PROJECT)'
$(Q)$(SIZE) $@
@echo -----------------------------------------------------------------------------------
# link 的时候需要加参数--specs=rdimon.specs
build/$(TARGET_ELF):$(OBJECTS)
@printf " LD $(TARGET_ELF)\n"
@printf " LD $(TARGET_MAP)\n"
$(Q)$(CC) $(LDFLAGS) -o $@ $^
build/%.o:%.c
# $(CC) $(CFLAGS) -c -o $(addprefix $(dir $^), $(notdir $@)) $^
# @printf " BUILD $(dir $@)\n"
$(Q)mkdir -p $(dir $@)
@printf " CC $(<F)\n"
$(Q)$(CC) $(CFLAGS) -o $@ -c $^
build/%.o:%.s
$(Q)mkdir -p $(dir $@)
@printf " CC $(<F)\n"
$(Q)$(CC) $(ASFLAGS) -c -o $@ $^
clean:
@echo -----------------------------------------------------------------------------------
@echo "Removing linked and compiled files......"
# $(MAKE) -C Drivers/STM32F10x_StdPeriph_Driver clean
@printf " CLEAN *.o *.bin *.elf *.map *.hex\n"
@printf " REMOVE ./build \n"
$(Q)-rm -rf build
$(Q)find $(SOURCE_ROOT) -iname '*.o' -delete
$(Q)find $(SOURCE_ROOT) -iname '*.bin' -delete
$(Q)find $(SOURCE_ROOT) -iname '*.elf' -delete
$(Q)find $(SOURCE_ROOT) -iname '*.map' -delete
@echo -----------------------------------------------------------------------------------
# ROOT=$(shell pwd)
# OBJS = $(SRCS:.c=.o)
# .PHONY: lib proj
# all: lib proj
# lib:
# $(MAKE) -C HAL
# proj: $(PROJ_NAME).elf
# $(PROJ_NAME).elf: $(SRCS)
# $(CC) $(CFLAGS) $^ -o $@ -LHAL -lstm32f7
# $(OBJCOPY) -O ihex -S $(PROJ_NAME).elf $(PROJ_NAME).hex
# $(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
# clean:
# $(MAKE) -C HAL clean
# rm -f $(PROJ_NAME).elf
# rm -f $(PROJ_NAME).hex
# rm -f $(PROJ_NAME).bin