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 - Updated to work with mbed.
23 ###############################################################################
25 # Variables that must be defined in including makefile.
26 # PROJECT: Name to be given to the output binary for this project.
27 # SRC: The root directory for the sources of your project.
28 # GCC4MED_DIR: The root directory for where the gcc4mbed sources are located
29 # in your project. This should point to the parent directory
30 # of the build directory which contains this gcc4mbed.mk file.
31 # LIBS_PREFIX: List of library/object files to prepend to mbed.ar capi.ar libs.
32 # LIBS_SUFFIX: List of library/object files to append to mbed.ar capi.ar libs.
33 # GCC4MBED_DELAYED_STDIO_INIT: Set to non-zero value to have intialization of
34 # stdin/stdout/stderr delayed which will
35 # shrink the size of the resulting binary if
36 # APIs like printf(), scanf(), etc. aren't used.
37 # GCC4MBED_TYPE: Type of build to produce. Allowed values are:
38 # Debug - Build for debugging. Disables optimizations and
39 # links in debug MRI runtime. Best debugging
41 # Release - Build for release with no debug support.
42 # Checked - Release build with debug support. Due to
43 # optimizations, debug experience won't be as good
44 # as Debug but might be needed when bugs don't
45 # reproduce in Debug builds.
47 # MRI_BREAK_ON_INIT: Should the program halt before calling into main(),
48 # allowing the developer time to set breakpoints in main()
49 # or in code run from within global constructors.
50 # default: 1 - break on init.
51 # MRI_SEMIHOST_STDIO: Set to non-zero value to allow debug monitor to use
52 # semi-host calls to redirect stdin/stdout/stderr to the
54 # default: 1 for Debug/Checked builds and 0 for Release.
55 # MRI_UART: Select the UART to be used by the debugger. See mri.h for
57 # default: MRI_UART_MBED_USB - Use USB based UART on the mbed.
62 # LIBS_PREFIX=../agutil/agutil.ar
65 # include ../../build/gcc4mbed.mk
67 ###############################################################################
69 # Check for undefined variables.
71 $(error makefile must set PROJECT variable.
)
75 $(error makefile must set GCC4MBED_DIR.
)
81 GCC4MBED_DELAYED_STDIO_INIT ?
= 0
82 GCC4MBED_TYPE ?
= Release
83 MRI_BREAK_ON_INIT ?
= 1
84 MRI_UART ?
= MRI_UART_MBED_USB
87 # Configure MRI variables based on GCC4MBED_TYPE build type variable.
88 ifeq "$(GCC4MBED_TYPE)" "Release"
91 MRI_SEMIHOST_STDIO ?
= 0
95 ifeq "$(GCC4MBED_TYPE)" "Debug"
98 MRI_SEMIHOST_STDIO ?
= 1
102 ifeq "$(GCC4MBED_TYPE)" "Checked"
105 MRI_SEMIHOST_STDIO ?
= 1
108 MRI_INIT_PARAMETERS
=$(MRI_UART
)
111 # List of sources to be compiled/assembled
112 CSRCS
= $(wildcard $(SRC
)/*.c
$(SRC
)/*/*.c
$(SRC
)/*/*/*.c
$(SRC
)/*/*/*/*.c
$(SRC
)/*/*/*/*/*.c
)
113 ASRCS
= $(wildcard $(SRC
)/*.S
$(SRC
)/*/*.S
$(SRC
)/*/*/*.S
$(SRC
)/*/*/*/*.S
$(SRC
)/*/*/*/*/*.S
)
114 CPPSRCS
= $(wildcard $(SRC
)/*.
cpp $(SRC
)/*/*.
cpp $(SRC
)/*/*/*.
cpp $(SRC
)/*/*/*/*.
cpp $(SRC
)/*/*/*/*/*.
cpp)
116 # Add in the gcc4mbed shim sources that allow mbed code build under GCC
117 CSRCS
+= $(GCC4MBED_DIR
)/src
/gcc4mbed.c
$(GCC4MBED_DIR
)/src
/syscalls.c
119 # List of the objects files to be compiled/assembled
120 OBJECTS
= $(CSRCS
:.c
=.o
) $(ASRCS
:.S
=.o
) $(CPPSRCS
:.
cpp=.o
)
121 LSCRIPT
=$(GCC4MBED_DIR
)/build
/mbed.
ld
123 # Location of external library and header dependencies.
124 EXTERNAL_DIR
= $(GCC4MBED_DIR
)/external
126 # Include path which points to external library headers and to subdirectories of this project which contain headers.
127 SUBDIRS
= $(wildcard $(SRC
)/* $(SRC
)/*/* $(SRC
)/*/*/* $(SRC
)/*/*/*/* $(SRC
)/*/*/*/*/*)
128 PROJINCS
= $(sort $(dir $(SUBDIRS
)))
129 INCDIRS
+= $(PROJINCS
) $(EXTERNAL_DIR
)/mbed
$(EXTERNAL_DIR
)/mbed
/LPC1768
$(EXTERNAL_DIR
)/FATFileSystem
$(GCC4MBED_DIR
)/mri
131 # DEFINEs to be used when building C/C++ code
132 DEFINES
= -DTARGET_LPC1768
-DGCC4MBED_DELAYED_STDIO_INIT
=$(GCC4MBED_DELAYED_STDIO_INIT
)
133 DEFINES
+= -DMRI_ENABLE
=$(MRI_ENABLE
) -DMRI_INIT_PARAMETERS
='"$(MRI_INIT_PARAMETERS)"' -DMRI_BREAK_ON_INIT
=$(MRI_BREAK_ON_INIT
)
134 DEFINES
+= -DMRI_SEMIHOST_STDIO
=$(MRI_SEMIHOST_STDIO
)
136 # Libraries to be linked into final binary
137 LIBS
= $(LIBS_PREFIX
) $(GCC4MBED_DIR
)/mri
/mri.
ar $(EXTERNAL_DIR
)/mbed
/LPC1768
/mbed.
ar $(EXTERNAL_DIR
)/mbed
/LPC1768
/capi.
ar $(EXTERNAL_DIR
)/FATFileSystem
/LPC1768
/FATFileSystem.
ar $(LIBS_SUFFIX
)
140 GPFLAGS
= -O
$(OPTIMIZATION
) -gstabs
+3 -mcpu
=cortex-m3
-mthumb
-mthumb-interwork
-fshort-wchar
-ffunction-sections
-fdata-sections
-fpromote-loop-indices
-Wall
-Wextra
-Wimplicit
-Wcast-align
-Wpointer-arith
-Wredundant-decls
-Wshadow
-Wcast-qual
-Wcast-align
-fno-exceptions
141 GPFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
142 GPFLAGS
+= $(DEFINES
)
144 LDFLAGS
= -mcpu
=cortex-m3
-mthumb
-O
$(OPTIMIZATION
) -Wl
,-Map
=$(PROJECT
).map
,--cref
,--gc-sections
,--no-wchar-size-warning
-T
$(LSCRIPT
) -L
$(EXTERNAL_DIR
)/gcc
/LPC1768
146 ASFLAGS
= $(LISTING
) -mcpu
=cortex-m3
-mthumb
-x assembler-with-cpp
147 ASFLAGS
+= $(patsubst %,-I
%,$(INCDIRS
))
149 # Compiler/Assembler/Linker Paths
150 GPP
= arm-none-eabi-g
++
151 AS
= arm-none-eabi-gcc
152 LD
= arm-none-eabi-g
++
153 OBJCOPY
= arm-none-eabi-objcopy
154 OBJDUMP
= arm-none-eabi-objdump
155 SIZE
= arm-none-eabi-size
158 # Switch to cs-rm on Windows and make sure that cmd.exe is used as shell.
159 ifeq "$(MAKE)" "cs-make"
164 #########################################################################
165 .PHONY
: all clean deploy
167 all:: $(PROJECT
).hex
$(PROJECT
).bin
$(PROJECT
).disasm
169 $(PROJECT
).bin
: $(PROJECT
).elf
170 $(OBJCOPY
) -O binary
$(PROJECT
).elf
$(PROJECT
).bin
172 $(PROJECT
).hex
: $(PROJECT
).elf
173 $(OBJCOPY
) -R .stack
-O ihex
$(PROJECT
).elf
$(PROJECT
).hex
175 $(PROJECT
).disasm
: $(PROJECT
).elf
176 $(OBJDUMP
) -d
$(PROJECT
).elf
>$(PROJECT
).disasm
178 $(PROJECT
).elf
: $(LSCRIPT
) $(OBJECTS
) $(LIBS
)
179 $(LD
) $(LDFLAGS
) $(OBJECTS
) $(LIBS
) -o
$(PROJECT
).elf
180 $(SIZE
) $(PROJECT
).elf
183 $(REMOVE
) -f
$(OBJECTS
)
184 $(REMOVE
) -f
$(PROJECT
).hex
185 $(REMOVE
) -f
$(PROJECT
).elf
186 $(REMOVE
) -f
$(PROJECT
).map
187 $(REMOVE
) -f
$(PROJECT
).bin
188 $(REMOVE
) -f
$(PROJECT
).disasm
191 DEPLOY_COMMAND
= $(subst PROJECT
,$(PROJECT
),$(LPC_DEPLOY
))
196 #########################################################################
197 # Default rules to compile .c and .cpp file to .o
198 # and assemble .s files to .o
201 $(GPP
) $(GPFLAGS
) -c
$< -o
$(<:.c
=.o
)
204 $(GPP
) $(GPFLAGS
) -c
$< -o
$(<:.
cpp=.o
)
207 $(AS
) $(ASFLAGS
) -c
$< -o
$(<:.S
=.o
)
209 #########################################################################