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 CSRCS
= $(wildcard $(SRC
)/*.c
$(SRC
)/*/*.c
$(SRC
)/*/*/*.c
$(SRC
)/*/*/*/*.c
$(SRC
)/*/*/*/*/*.c
)
80 ASRCS
= $(wildcard $(SRC
)/*.S
$(SRC
)/*/*.S
$(SRC
)/*/*/*.S
$(SRC
)/*/*/*/*.S
$(SRC
)/*/*/*/*/*.S
)
81 ifneq "$(OS)" "Windows_NT"
82 ASRCS
+= $(wildcard $(SRC
)/*.s
$(SRC
)/*/*.s
$(SRC
)/*/*/*.s
$(SRC
)/*/*/*/*.s
$(SRC
)/*/*/*/*/*.s
)
84 CPPSRCS
= $(wildcard $(SRC
)/*.
cpp $(SRC
)/*/*.
cpp $(SRC
)/*/*/*.
cpp $(SRC
)/*/*/*/*.
cpp $(SRC
)/*/*/*/*/*.
cpp)
86 # List of the objects files to be compiled/assembled
87 OBJECTS
= $(patsubst %.c
,$(OUTDIR
)/%.o
,$(CSRCS
)) $(patsubst %.s
,$(OUTDIR
)/%.o
,$(patsubst %.S
,$(OUTDIR
)/%.o
,$(ASRCS
))) $(patsubst %.
cpp,$(OUTDIR
)/%.o
,$(CPPSRCS
))
89 # Add in the MBED customization stubs which allow hooking in the MRI debug monitor.
90 OBJECTS
+= $(OUTDIR
)/mbed_custom.o
92 OBJECTS
+= $(OUTDIR
)/configdefault.o
94 # List of the header dependency files, one per object file.
95 DEPFILES
= $(patsubst %.o
,%.d
,$(OBJECTS
))
97 # Linker script to be used. Indicates what code should be placed where in memory.
98 LSCRIPT
=$(MBED_DIR
)/$(DEVICE
)/GCC_ARM
/$(DEVICE
).
ld
100 # Location of external library and header dependencies.
101 MBED_DIR
= $(BUILD_DIR
)/..
/mbed
/drop
102 MRI_DIR
= $(BUILD_DIR
)/..
/mri
104 # Include path which points to external library headers and to subdirectories of this project which contain headers.
105 SUBDIRS
= $(wildcard $(SRC
)/* $(SRC
)/*/* $(SRC
)/*/*/* $(SRC
)/*/*/*/* $(SRC
)/*/*/*/*/*)
106 PROJINCS
= $(sort $(dir $(SUBDIRS
)))
107 INCDIRS
+= $(SRC
) $(PROJINCS
) $(MRI_DIR
) $(MBED_DIR
) $(MBED_DIR
)/$(DEVICE
)
109 # DEFINEs to be used when building C/C++ code
110 DEFINES
+= -DTARGET_
$(DEVICE
)
111 DEFINES
+= -DMRI_ENABLE
=$(MRI_ENABLE
) -DMRI_INIT_PARAMETERS
='"$(MRI_INIT_PARAMETERS)"'
112 DEFINES
+= -DMRI_BREAK_ON_INIT
=$(MRI_BREAK_ON_INIT
) -DMRI_SEMIHOST_STDIO
=$(MRI_SEMIHOST_STDIO
)
113 DEFINES
+= -DWRITE_BUFFER_DISABLE
=$(WRITE_BUFFER_DISABLE
) -DSTACK_SIZE
=$(STACK_SIZE
)
115 ifeq "$(OPTIMIZATION)" "0"
119 # Libraries to be linked into final binary
120 MBED_LIBS
= $(MBED_DIR
)/$(DEVICE
)/GCC_ARM
/libmbed.a
121 SYS_LIBS
= -lstdc
++_s
-lsupc
++_s
-lm
-lgcc
-lc_s
-lgcc
-lc_s
-lnosys
122 LIBS
= $(LIBS_PREFIX
)
124 ifeq "$(MRI_ENABLE)" "1"
125 LIBS
+= $(MRI_DIR
)/mri.
ar
130 LIBS
+= $(LIBS_SUFFIX
)
132 # Compiler flags used to enable creation of header dependencies.
135 # Setup wraps for newlib read/writes to redirect to MRI debugger.
136 ifeq "$(MRI_ENABLE)" "1"
137 MRI_WRAPS
=,--wrap
=_read
,--wrap
=_write
,--wrap
=semihost_connected
142 # Setup wraps to memory allocations routines if we want to tag heap allocations.
143 ifeq "$(HEAP_TAGS)" "1"
144 DEFINES
+= -DHEAP_TAGS
148 GCFLAGS
+= -O
$(OPTIMIZATION
) -g3
$(DEVICE_CFLAGS
)
149 GCFLAGS
+= -ffunction-sections
-fdata-sections
-fno-exceptions
-fno-delete-null-pointer-checks
150 GCFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
151 GCFLAGS
+= $(DEFINES
)
152 GCFLAGS
+= $(DEPFLAGS
)
153 GCFLAGS
+= -Wall
-Wextra
-Wno-unused-parameter
-Wcast-align
-Wpointer-arith
-Wredundant-decls
-Wcast-qual
-Wcast-align
155 GPFLAGS
+= $(GCFLAGS
) -fno-rtti
-std
=gnu
++11
157 AS_GCFLAGS
+= -g3
$(DEVICE_FLAGS
) -x assembler-with-cpp
158 AS_GCFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
159 AS_FLAGS
+= -g3
$(DEVICE_FLAGS
)
163 LDFLAGS
= $(DEVICE_FLAGS
) -specs
=$(BUILD_DIR
)/startfile.spec
164 LDFLAGS
+= -Wl
,-Map
=$(OUTDIR
)/$(PROJECT
).map
,--cref
,--gc-sections
,--wrap
=_isatty
,--wrap
=malloc
,--wrap
=realloc
,--wrap
=free
$(MRI_WRAPS
)
165 LDFLAGS
+= -T
$(LSCRIPT
) -L
$(EXTERNAL_DIR
)/gcc
/LPC1768
166 ifneq "$(NO_FLOAT_SCANF)" "1"
167 LDFLAGS
+= -u _scanf_float
169 ifneq "$(NO_FLOAT_PRINTF)" "1"
170 LDFLAGS
+= -u _printf_float
174 # Compiler/Assembler/Linker Paths
175 GCC
= arm-none-eabi-gcc
176 GPP
= arm-none-eabi-g
++
177 AS
= arm-none-eabi-as
178 LD
= arm-none-eabi-g
++
179 OBJCOPY
= arm-none-eabi-objcopy
180 OBJDUMP
= arm-none-eabi-objdump
181 SIZE
= arm-none-eabi-size
183 # Some tools are different on Windows in comparison to Unix.
184 ifeq "$(OS)" "Windows_NT"
187 REMOVE_DIR
= rd
/s
/q
189 QUIET
=>nul
2>nul
& exit
0
193 REMOVE_DIR
= rm -r
-f
195 QUIET
=> /dev
/null
2>&1 ; exit
0
199 # Create macro which will convert / to \ on Windows.
200 ifeq "$(OS)" "Windows_NT"
210 #########################################################################
211 .PHONY
: all clean size
213 all:: $(OUTDIR
)/$(PROJECT
).hex
$(OUTDIR
)/$(PROJECT
).bin
$(OUTDIR
)/$(PROJECT
).disasm size
215 $(OUTDIR
)/$(PROJECT
).bin
: $(OUTDIR
)/$(PROJECT
).elf
217 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
218 $(Q
) $(OBJCOPY
) -O binary
$< $@
220 $(OUTDIR
)/$(PROJECT
).hex
: $(OUTDIR
)/$(PROJECT
).elf
222 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
223 $(Q
) $(OBJCOPY
) -R .stack
-O ihex
$< $@
225 $(OUTDIR
)/$(PROJECT
).disasm
: $(OUTDIR
)/$(PROJECT
).elf
226 @echo Extracting disassembly to
$@
227 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
228 $(Q
) $(OBJDUMP
) -d
-f
-M reg-names-std
--demangle
$< >$@
230 $(OUTDIR
)/$(PROJECT
).elf
: $(LSCRIPT
) $(OBJECTS
)
232 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
233 $(Q
) $(LD
) $(LDFLAGS
) $(OBJECTS
) $(LIBS
) -o
$@
235 size
: $(OUTDIR
)/$(PROJECT
).elf
240 @echo Cleaning up
all build generated files
241 $(Q
) $(REMOVE_DIR
) $(OUTDIR
) $(QUIET
)
245 #########################################################################
246 # Default rules to compile .c and .cpp file to .o
247 # and assemble .s files to .o
249 $(OUTDIR
)/mbed_custom.o
: $(BUILD_DIR
)/mbed_custom.
cpp makefile
251 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
252 $(Q
) $(GPP
) $(GPFLAGS
) -c
$< -o
$@
254 $(OUTDIR
)/%.o
: %.
cpp makefile
256 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
257 $(Q
) $(GPP
) $(GPFLAGS
) -c
$< -o
$@
259 $(OUTDIR
)/%.o
: %.c makefile
261 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
262 $(Q
) $(GCC
) $(GCFLAGS
) -c
$< -o
$@
264 $(OUTDIR
)/%.o
: %.S makefile
266 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
267 $(Q
) $(GCC
) $(AS_GCFLAGS
) -c
$< -o
$@
269 $(OUTDIR
)/%.o
: %.s makefile
271 $(Q
) $(MKDIR
) $(call convert-slash
,$(dir $@
)) $(QUIET
)
272 $(Q
) $(AS
) $(AS_FLAGS
) -o
$@
$<
274 $(OUTDIR
)/configdefault.o
: config.default
275 $(Q
) $(OBJCOPY
) -I binary
-O elf32-littlearm
-B arm
--readonly-text
--rename-section .data
=.rodata.configdefault
$< $@
277 #########################################################################