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 CSRCS2
= $(filter-out $(SRC
)/libs
/Network
/%,$(CSRCS1
))
83 DEFINES
+= -DNONETWORK
88 # do not compile the src/testframework as that can only be done with rake
89 CSRCS
= $(filter-out $(SRC
)/testframework
/%,$(CSRCS2
))
91 ifeq "$(DISABLEMSD)" "1"
92 DEFINES
+= -DDISABLEMSD
95 ASRCS
= $(wildcard $(SRC
)/*.S
$(SRC
)/*/*.S
$(SRC
)/*/*/*.S
$(SRC
)/*/*/*/*.S
$(SRC
)/*/*/*/*/*.S
)
96 ifneq "$(OS)" "Windows_NT"
97 ASRCS
+= $(wildcard $(SRC
)/*.s
$(SRC
)/*/*.s
$(SRC
)/*/*/*.s
$(SRC
)/*/*/*/*.s
$(SRC
)/*/*/*/*/*.s
)
100 CPPSRCS1
= $(wildcard $(SRC
)/*.
cpp $(SRC
)/*/*.
cpp $(SRC
)/*/*/*.
cpp $(SRC
)/*/*/*/*.
cpp $(SRC
)/*/*/*/*/*.
cpp $(SRC
)/*/*/*/*/*/*.
cpp)
101 ifeq "$(NONETWORK)" "1"
102 CPPSRCS2
= $(filter-out $(SRC
)/libs
/Network
/%,$(CPPSRCS1
))
106 CPPSRCS2
= $(filter-out $(SRC
)/libs
/Network
/uip
/plan9
/%,$(CPPSRCS1
))
108 CPPSRCS2
= $(CPPSRCS1
)
114 CPPSRCS21
= $(filter-out $(SRC
)/modules
/utils
/panel
/screens
/3dprinter
/%,$(CPPSRCS2
))
117 CPPSRCS21
= $(filter-out $(SRC
)/modules
/utils
/panel
/screens
/cnc
/%,$(CPPSRCS2
))
120 # Totally exclude any modules listed in EXCLUDE_MODULES
122 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))))))))))))))))))))))))))
123 EXL
= $(patsubst %,$(SRC
)/modules
/%/%,$(EXCLUDED_MODULES
))
124 CPPSRCS3
= $(filter-out $(EXL
),$(CPPSRCS21
))
125 DEFINES
+= $(call uc
, $(subst /,_
,$(patsubst %,-DNO_
%,$(EXCLUDED_MODULES
))))
127 # do not compile the src/testframework as that can only be done with rake
128 CPPSRCS
= $(filter-out $(SRC
)/testframework
/%,$(CPPSRCS3
))
130 # List of the objects files to be compiled/assembled
131 OBJECTS
= $(patsubst %.c
,$(OUTDIR
)/%.o
,$(CSRCS
)) $(patsubst %.s
,$(OUTDIR
)/%.o
,$(patsubst %.S
,$(OUTDIR
)/%.o
,$(ASRCS
))) $(patsubst %.
cpp,$(OUTDIR
)/%.o
,$(CPPSRCS
))
133 # Add in the MBED customization stubs which allow hooking in the MRI debug monitor.
134 OBJECTS
+= $(OUTDIR
)/mbed_custom.o
136 OBJECTS
+= $(OUTDIR
)/configdefault.o
138 # List of the header dependency files, one per object file.
139 DEPFILES
= $(patsubst %.o
,%.d
,$(OBJECTS
))
141 # Linker script to be used. Indicates what code should be placed where in memory.
142 LSCRIPT
=$(MBED_DIR
)/$(DEVICE
)/GCC_ARM
/$(DEVICE
).
ld
144 # Location of external library and header dependencies.
145 MBED_DIR
= $(BUILD_DIR
)/..
/mbed
/drop
146 MRI_DIR
= $(BUILD_DIR
)/..
/mri
148 # Include path which points to external library headers and to subdirectories of this project which contain headers.
149 SUBDIRS
= $(wildcard $(SRC
)/* $(SRC
)/*/* $(SRC
)/*/*/* $(SRC
)/*/*/*/* $(SRC
)/*/*/*/*/* $(SRC
)/*/*/*/*/*/*)
150 PROJINCS
= $(sort $(dir $(SUBDIRS
)))
151 INCDIRS
+= $(SRC
) $(PROJINCS
) $(MRI_DIR
) $(MBED_DIR
) $(MBED_DIR
)/$(DEVICE
)
153 # DEFINEs to be used when building C/C++ code
154 DEFINES
+= -DTARGET_
$(DEVICE
)
155 DEFINES
+= -DMRI_ENABLE
=$(MRI_ENABLE
) -DMRI_INIT_PARAMETERS
='"$(MRI_INIT_PARAMETERS)"'
156 DEFINES
+= -DMRI_BREAK_ON_INIT
=$(MRI_BREAK_ON_INIT
) -DMRI_SEMIHOST_STDIO
=$(MRI_SEMIHOST_STDIO
)
157 DEFINES
+= -DWRITE_BUFFER_DISABLE
=$(WRITE_BUFFER_DISABLE
) -DSTACK_SIZE
=$(STACK_SIZE
)
159 ifeq "$(OPTIMIZATION)" "0"
163 # Libraries to be linked into final binary
164 MBED_LIBS
= $(MBED_DIR
)/$(DEVICE
)/GCC_ARM
/libmbed.a
165 #SYS_LIBS = -lstdc++_s -lsupc++_s -lm -lgcc -lc_s -lgcc -lc_s -lnosys
166 SYS_LIBS
= -specs
=nano.specs
-lstdc
++ -lsupc
++ -lm
-lgcc
-lc
-lnosys
167 LIBS
= $(LIBS_PREFIX
)
169 ifeq "$(MRI_ENABLE)" "1"
170 LIBS
+= $(MRI_DIR
)/mri.
ar
175 LIBS
+= $(LIBS_SUFFIX
)
177 # Compiler flags used to enable creation of header dependencies.
180 # Setup wraps for newlib read/writes to redirect to MRI debugger.
181 ifeq "$(MRI_ENABLE)" "1"
182 MRI_WRAPS
=,--wrap
=_read
,--wrap
=_write
,--wrap
=semihost_connected
187 # Setup wraps to memory allocations routines if we want to tag heap allocations.
188 ifeq "$(HEAP_TAGS)" "1"
189 DEFINES
+= -DHEAP_TAGS
193 GCFLAGS
+= -O
$(OPTIMIZATION
) -g3
$(DEVICE_CFLAGS
)
194 GCFLAGS
+= -ffunction-sections
-fdata-sections
-fno-exceptions
-fno-delete-null-pointer-checks
195 GCFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
196 GCFLAGS
+= $(DEFINES
)
197 GCFLAGS
+= $(DEPFLAGS
)
198 GCFLAGS
+= -Wall
-Wextra
-Wno-unused-parameter
-Wcast-align
-Wpointer-arith
-Wredundant-decls
-Wcast-qual
-Wcast-align
200 GPFLAGS
+= $(GCFLAGS
) -fno-rtti
-std
=gnu
++11
202 AS_GCFLAGS
+= -g3
$(DEVICE_FLAGS
) -x assembler-with-cpp
203 AS_GCFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
204 AS_FLAGS
+= -g3
$(DEVICE_FLAGS
)
208 LDFLAGS
= $(DEVICE_FLAGS
) -specs
=$(BUILD_DIR
)/startfile.spec
209 LDFLAGS
+= -Wl
,-Map
=$(OUTDIR
)/$(PROJECT
).map
,--cref
,--gc-sections
,--wrap
=_isatty
,--wrap
=malloc
,--wrap
=realloc
,--wrap
=free
$(MRI_WRAPS
)
210 LDFLAGS
+= -T
$(LSCRIPT
) -L
$(EXTERNAL_DIR
)/gcc
/LPC1768
211 ifneq "$(NO_FLOAT_SCANF)" "1"
212 LDFLAGS
+= -u _scanf_float
214 ifneq "$(NO_FLOAT_PRINTF)" "1"
215 LDFLAGS
+= -u _printf_float
219 # Compiler/Assembler/Linker Paths
220 GCC
= arm-none-eabi-gcc
221 GPP
= arm-none-eabi-g
++
222 AS
= arm-none-eabi-as
223 LD
= arm-none-eabi-g
++
224 OBJCOPY
= arm-none-eabi-objcopy
225 OBJDUMP
= arm-none-eabi-objdump
226 SIZE
= arm-none-eabi-size
228 # Some tools are different on Windows in comparison to Unix.
229 ifeq "$(OS)" "Windows_NT"
232 REMOVE_DIR
= rd
/s
/q
234 QUIET
=>nul
2>nul
& exit
0
238 REMOVE_DIR
= rm -r
-f
240 QUIET
=> /dev
/null
2>&1 ; exit
0
244 # Create macro which will convert / to \ on Windows.
245 ifeq "$(OS)" "Windows_NT"
255 #########################################################################
256 .PHONY
: all clean size
258 all:: $(OUTDIR
)/$(PROJECT
).hex
$(OUTDIR
)/$(PROJECT
).bin
$(OUTDIR
)/$(PROJECT
).disasm size
260 $(OUTDIR
)/$(PROJECT
).bin
: $(OUTDIR
)/$(PROJECT
).elf
262 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
263 $(Q
) $(OBJCOPY
) -O binary
$< $@
265 $(OUTDIR
)/$(PROJECT
).hex
: $(OUTDIR
)/$(PROJECT
).elf
267 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
268 $(Q
) $(OBJCOPY
) -R .stack
-O ihex
$< $@
270 $(OUTDIR
)/$(PROJECT
).disasm
: $(OUTDIR
)/$(PROJECT
).elf
271 @echo Extracting disassembly to
$@
272 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
273 $(Q
) $(OBJDUMP
) -d
-f
-M reg-names-std
--demangle
$< >$@
275 $(OUTDIR
)/$(PROJECT
).elf
: $(LSCRIPT
) $(OBJECTS
)
277 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
278 $(Q
) $(LD
) $(LDFLAGS
) $(OBJECTS
) $(LIBS
) -o
$@
280 size
: $(OUTDIR
)/$(PROJECT
).elf
285 @echo Cleaning up
all build generated files
286 $(Q
) $(REMOVE_DIR
) $(call convert-slash
,$(OUTDIR
)) $(QUIET
)
290 #########################################################################
291 # Default rules to compile .c and .cpp file to .o
292 # and assemble .s files to .o
294 $(OUTDIR
)/mbed_custom.o
: $(BUILD_DIR
)/mbed_custom.
cpp makefile
296 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
297 $(Q
) $(GPP
) $(GPFLAGS
) -c
$< -o
$@
299 $(OUTDIR
)/%.o
: %.
cpp makefile
301 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
302 $(Q
) $(GPP
) $(GPFLAGS
) -c
$< -o
$@
304 $(OUTDIR
)/%.o
: %.c makefile
306 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
307 $(Q
) $(GCC
) $(GCFLAGS
) -c
$< -o
$@
309 $(OUTDIR
)/%.o
: %.S makefile
311 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
312 $(Q
) $(GCC
) $(AS_GCFLAGS
) -c
$< -o
$@
314 $(OUTDIR
)/%.o
: %.s makefile
316 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
317 $(Q
) $(AS
) $(AS_FLAGS
) -o
$@
$<
319 $(OUTDIR
)/configdefault.o
: config.default
320 $(Q
) $(OBJCOPY
) -I binary
-O elf32-littlearm
-B arm
--readonly-text
--rename-section .data
=.rodata.configdefault
$< $@
322 #########################################################################