1 #Copyright (C) 2011 by Sagar G V
3 #Permission is hereby granted, free of charge, to any person obtaining a copy
4 #of this software and associated documentation files (the "Software"), to deal
5 #in the Software without restriction, including without limitation the rights
6 #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 #copies of the Software, and to permit persons to whom the Software is
8 #furnished to do so, subject to the following conditions:
10 #The above copyright notice and this permission notice shall be included in
11 #all copies or substantial portions of the Software.
13 #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 # Arthur Wolf & Adam Green in 2011 - 2012 - Updated to work with mbed.
23 ###############################################################################
24 # Check for undefined variables.
26 $(error makefile must set PROJECT variable.
)
30 $(error makefile must set BUILD_DIR.
)
33 # Set VERBOSE make variable to 1 to output all tool commands.
45 MRI_BREAK_ON_INIT ?
= 1
46 MRI_UART ?
= MRI_UART_MBED_USB
48 WRITE_BUFFER_DISABLE ?
= 0
52 # Configure MRI variables based on BUILD_TYPE build type variable.
53 ifeq "$(BUILD_TYPE)" "Release"
56 MRI_SEMIHOST_STDIO ?
= 0
60 ifeq "$(BUILD_TYPE)" "Debug"
63 MRI_SEMIHOST_STDIO ?
= 1
67 ifeq "$(BUILD_TYPE)" "Checked"
70 MRI_SEMIHOST_STDIO ?
= 1
73 MRI_INIT_PARAMETERS
=$(MRI_UART
)
75 # Output Object Directory
78 # List of sources to be compiled/assembled
79 CSRCS1
= $(wildcard $(SRC
)/*.c
$(SRC
)/*/*.c
$(SRC
)/*/*/*.c
$(SRC
)/*/*/*/*.c
$(SRC
)/*/*/*/*/*.c
$(SRC
)/*/*/*/*/*/*.c
)
80 # Totally exclude network if NONETWORK is defined
81 ifeq "$(NONETWORK)" "1"
82 CSRCS
= $(filter-out $(SRC
)/libs
/Network
/%,$(CSRCS1
))
83 DEFINES
+= -DNONETWORK
88 ifeq "$(DISABLEMSD)" "1"
89 DEFINES
+= -DDISABLEMSD
92 ASRCS
= $(wildcard $(SRC
)/*.S
$(SRC
)/*/*.S
$(SRC
)/*/*/*.S
$(SRC
)/*/*/*/*.S
$(SRC
)/*/*/*/*/*.S
)
93 ifneq "$(OS)" "Windows_NT"
94 ASRCS
+= $(wildcard $(SRC
)/*.s
$(SRC
)/*/*.s
$(SRC
)/*/*/*.s
$(SRC
)/*/*/*/*.s
$(SRC
)/*/*/*/*/*.s
)
96 CPPSRCS1
= $(wildcard $(SRC
)/*.
cpp $(SRC
)/*/*.
cpp $(SRC
)/*/*/*.
cpp $(SRC
)/*/*/*/*.
cpp $(SRC
)/*/*/*/*/*.
cpp $(SRC
)/*/*/*/*/*/*.
cpp)
97 ifeq "$(NONETWORK)" "1"
98 CPPSRCS2
= $(filter-out $(SRC
)/libs
/Network
/%,$(CPPSRCS1
))
100 CPPSRCS2
= $(CPPSRCS1
)
103 # Totally exclude any modules listed in EXCLUDE_MODULES
105 uc
= $(subst a
,A
,$(subst b
,B
,$(subst c
,C
,$(subst d
,D
,$(subst e
,E
,$(subst f
,F
,$(subst g
,G
,$(subst h
,H
,$(subst i
,I
,$(subst j
,J
,$(subst k
,K
,$(subst l
,L
,$(subst m
,M
,$(subst n
,N
,$(subst o
,O
,$(subst p
,P
,$(subst q
,Q
,$(subst r
,R
,$(subst s
,S
,$(subst t
,T
,$(subst u
,U
,$(subst v
,V
,$(subst w
,W
,$(subst x
,X
,$(subst y
,Y
,$(subst z
,Z
,$1))))))))))))))))))))))))))
106 EXL
= $(patsubst %,$(SRC
)/modules
/%/%,$(EXCLUDED_MODULES
))
107 CPPSRCS
= $(filter-out $(EXL
),$(CPPSRCS2
))
108 DEFINES
+= $(call uc
, $(subst /,_
,$(patsubst %,-DNO_
%,$(EXCLUDED_MODULES
))))
110 # List of the objects files to be compiled/assembled
111 OBJECTS
= $(patsubst %.c
,$(OUTDIR
)/%.o
,$(CSRCS
)) $(patsubst %.s
,$(OUTDIR
)/%.o
,$(patsubst %.S
,$(OUTDIR
)/%.o
,$(ASRCS
))) $(patsubst %.
cpp,$(OUTDIR
)/%.o
,$(CPPSRCS
))
113 # Add in the MBED customization stubs which allow hooking in the MRI debug monitor.
114 OBJECTS
+= $(OUTDIR
)/mbed_custom.o
116 OBJECTS
+= $(OUTDIR
)/configdefault.o
118 # List of the header dependency files, one per object file.
119 DEPFILES
= $(patsubst %.o
,%.d
,$(OBJECTS
))
121 # Linker script to be used. Indicates what code should be placed where in memory.
122 LSCRIPT
=$(MBED_DIR
)/$(DEVICE
)/GCC_ARM
/$(DEVICE
).
ld
124 # Location of external library and header dependencies.
125 MBED_DIR
= $(BUILD_DIR
)/..
/mbed
/drop
126 MRI_DIR
= $(BUILD_DIR
)/..
/mri
128 # Include path which points to external library headers and to subdirectories of this project which contain headers.
129 SUBDIRS
= $(wildcard $(SRC
)/* $(SRC
)/*/* $(SRC
)/*/*/* $(SRC
)/*/*/*/* $(SRC
)/*/*/*/*/*)
130 PROJINCS
= $(sort $(dir $(SUBDIRS
)))
131 INCDIRS
+= $(SRC
) $(PROJINCS
) $(MRI_DIR
) $(MBED_DIR
) $(MBED_DIR
)/$(DEVICE
)
133 # DEFINEs to be used when building C/C++ code
134 DEFINES
+= -DTARGET_
$(DEVICE
)
135 DEFINES
+= -DMRI_ENABLE
=$(MRI_ENABLE
) -DMRI_INIT_PARAMETERS
='"$(MRI_INIT_PARAMETERS)"'
136 DEFINES
+= -DMRI_BREAK_ON_INIT
=$(MRI_BREAK_ON_INIT
) -DMRI_SEMIHOST_STDIO
=$(MRI_SEMIHOST_STDIO
)
137 DEFINES
+= -DWRITE_BUFFER_DISABLE
=$(WRITE_BUFFER_DISABLE
) -DSTACK_SIZE
=$(STACK_SIZE
)
139 ifeq "$(OPTIMIZATION)" "0"
143 # Libraries to be linked into final binary
144 MBED_LIBS
= $(MBED_DIR
)/$(DEVICE
)/GCC_ARM
/libmbed.a
145 SYS_LIBS
= -lstdc
++_s
-lsupc
++_s
-lm
-lgcc
-lc_s
-lgcc
-lc_s
-lnosys
146 LIBS
= $(LIBS_PREFIX
)
148 ifeq "$(MRI_ENABLE)" "1"
149 LIBS
+= $(MRI_DIR
)/mri.
ar
154 LIBS
+= $(LIBS_SUFFIX
)
156 # Compiler flags used to enable creation of header dependencies.
159 # Setup wraps for newlib read/writes to redirect to MRI debugger.
160 ifeq "$(MRI_ENABLE)" "1"
161 MRI_WRAPS
=,--wrap
=_read
,--wrap
=_write
,--wrap
=semihost_connected
166 # Setup wraps to memory allocations routines if we want to tag heap allocations.
167 ifeq "$(HEAP_TAGS)" "1"
168 DEFINES
+= -DHEAP_TAGS
172 GCFLAGS
+= -O
$(OPTIMIZATION
) -g3
$(DEVICE_CFLAGS
)
173 GCFLAGS
+= -ffunction-sections
-fdata-sections
-fno-exceptions
-fno-delete-null-pointer-checks
174 GCFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
175 GCFLAGS
+= $(DEFINES
)
176 GCFLAGS
+= $(DEPFLAGS
)
177 GCFLAGS
+= -Wall
-Wextra
-Wno-unused-parameter
-Wcast-align
-Wpointer-arith
-Wredundant-decls
-Wcast-qual
-Wcast-align
179 GPFLAGS
+= $(GCFLAGS
) -fno-rtti
-std
=gnu
++11
181 AS_GCFLAGS
+= -g3
$(DEVICE_FLAGS
) -x assembler-with-cpp
182 AS_GCFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
183 AS_FLAGS
+= -g3
$(DEVICE_FLAGS
)
187 LDFLAGS
= $(DEVICE_FLAGS
) -specs
=$(BUILD_DIR
)/startfile.spec
188 LDFLAGS
+= -Wl
,-Map
=$(OUTDIR
)/$(PROJECT
).map
,--cref
,--gc-sections
,--wrap
=_isatty
,--wrap
=malloc
,--wrap
=realloc
,--wrap
=free
$(MRI_WRAPS
)
189 LDFLAGS
+= -T
$(LSCRIPT
) -L
$(EXTERNAL_DIR
)/gcc
/LPC1768
190 ifneq "$(NO_FLOAT_SCANF)" "1"
191 LDFLAGS
+= -u _scanf_float
193 ifneq "$(NO_FLOAT_PRINTF)" "1"
194 LDFLAGS
+= -u _printf_float
198 # Compiler/Assembler/Linker Paths
199 GCC
= arm-none-eabi-gcc
200 GPP
= arm-none-eabi-g
++
201 AS
= arm-none-eabi-as
202 LD
= arm-none-eabi-g
++
203 OBJCOPY
= arm-none-eabi-objcopy
204 OBJDUMP
= arm-none-eabi-objdump
205 SIZE
= arm-none-eabi-size
207 # Some tools are different on Windows in comparison to Unix.
208 ifeq "$(OS)" "Windows_NT"
211 REMOVE_DIR
= rd
/s
/q
213 QUIET
=>nul
2>nul
& exit
0
217 REMOVE_DIR
= rm -r
-f
219 QUIET
=> /dev
/null
2>&1 ; exit
0
223 # Create macro which will convert / to \ on Windows.
224 ifeq "$(OS)" "Windows_NT"
234 #########################################################################
235 .PHONY
: all clean size
237 all:: $(OUTDIR
)/$(PROJECT
).hex
$(OUTDIR
)/$(PROJECT
).bin
$(OUTDIR
)/$(PROJECT
).disasm size
239 $(OUTDIR
)/$(PROJECT
).bin
: $(OUTDIR
)/$(PROJECT
).elf
241 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
242 $(Q
) $(OBJCOPY
) -O binary
$< $@
244 $(OUTDIR
)/$(PROJECT
).hex
: $(OUTDIR
)/$(PROJECT
).elf
246 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
247 $(Q
) $(OBJCOPY
) -R .stack
-O ihex
$< $@
249 $(OUTDIR
)/$(PROJECT
).disasm
: $(OUTDIR
)/$(PROJECT
).elf
250 @echo Extracting disassembly to
$@
251 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
252 $(Q
) $(OBJDUMP
) -d
-f
-M reg-names-std
--demangle
$< >$@
254 $(OUTDIR
)/$(PROJECT
).elf
: $(LSCRIPT
) $(OBJECTS
)
256 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
257 $(Q
) $(LD
) $(LDFLAGS
) $(OBJECTS
) $(LIBS
) -o
$@
259 size
: $(OUTDIR
)/$(PROJECT
).elf
264 @echo Cleaning up
all build generated files
265 $(Q
) $(REMOVE_DIR
) $(OUTDIR
) $(QUIET
)
269 #########################################################################
270 # Default rules to compile .c and .cpp file to .o
271 # and assemble .s files to .o
273 $(OUTDIR
)/mbed_custom.o
: $(BUILD_DIR
)/mbed_custom.
cpp makefile
275 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
276 $(Q
) $(GPP
) $(GPFLAGS
) -c
$< -o
$@
278 $(OUTDIR
)/%.o
: %.
cpp makefile
280 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
281 $(Q
) $(GPP
) $(GPFLAGS
) -c
$< -o
$@
283 $(OUTDIR
)/%.o
: %.c makefile
285 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
286 $(Q
) $(GCC
) $(GCFLAGS
) -c
$< -o
$@
288 $(OUTDIR
)/%.o
: %.S makefile
290 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
291 $(Q
) $(GCC
) $(AS_GCFLAGS
) -c
$< -o
$@
293 $(OUTDIR
)/%.o
: %.s makefile
295 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
296 $(Q
) $(AS
) $(AS_FLAGS
) -o
$@
$<
298 $(OUTDIR
)/configdefault.o
: config.default
299 $(Q
) $(OBJCOPY
) -I binary
-O elf32-littlearm
-B arm
--readonly-text
--rename-section .data
=.rodata.configdefault
$< $@
301 #########################################################################