1 #
2 # Copyright (c) 2013-2016, Texas Instruments Incorporated
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 #
9 # * Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 #
12 # * Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 #
16 # * Neither the name of Texas Instruments Incorporated nor the names of
17 # its contributors may be used to endorse or promote products derived
18 # from this software without specific prior written permission.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27 # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #
33 # Filename: rules_ti_cgt_arm.mk
34 #
35 # Make rules for TI ARM CGT - This file has all the common rules and defines
36 # required for Cortex-M4/R5F ISA
37 #
38 # This file needs to change when:
39 # 1. Code generation tool chain changes (currently it uses TI ARM CGT)
40 # 2. Internal switches (which are normally not touched) has to change
41 # 3. XDC specific switches change
42 # 4. a rule common for M4/R5F ISA has to be added or modified
44 # Set compiler/archiver/linker commands and include paths
45 CODEGEN_INCLUDE = $(TOOLCHAIN_PATH_$(CGT_ISA))/include
46 CC = $(TOOLCHAIN_PATH_$(CGT_ISA))/bin/armcl
47 AR = $(TOOLCHAIN_PATH_$(CGT_ISA))/bin/armar
48 LNK = $(TOOLCHAIN_PATH_$(CGT_ISA))/bin/armlnk
49 STRP = $(TOOLCHAIN_PATH_$(CGT_ISA))/bin/armstrip
50 SIZE = $(TOOLCHAIN_PATH_$(CGT_ISA))/bin/armofd
52 # Derive a part of RTS Library name based on ENDIAN: little/big
53 ifeq ($(ENDIAN),little)
54 RTSLIB_ENDIAN = le
55 else
56 RTSLIB_ENDIAN = be
57 endif
59 # Derive compiler switch and part of RTS Library name based on FORMAT: COFF/ELF
60 ifeq ($(FORMAT),COFF)
61 CSWITCH_FORMAT = ti_arm9_abi
62 RTSLIB_FORMAT = tiarm9
63 endif
64 ifeq ($(FORMAT),ELF)
65 CSWITCH_FORMAT = eabi
66 RTSLIB_FORMAT = eabi
67 endif
69 # Internal CFLAGS - normally doesn't change
70 ifeq ($(CGT_ISA),$(filter $(CGT_ISA), M4 R5 M3))
71 CFLAGS_INTERNAL = -c -qq -pdsw225 --endian=$(ENDIAN) -mv7$(CGT_ISA) --abi=$(CSWITCH_FORMAT) -eo.$(OBJEXT) -ea.$(ASMEXT) --symdebug:dwarf --embed_inline_assembly
72 ifeq ($(CGT_ISA),$(filter $(CGT_ISA), R5))
73 CFLAGS_INTERNAL += --float_support=vfpv3d16
74 else
75 CFLAGS_INTERNAL += --float_support=vfplib
76 endif
77 else ifeq ($(CGT_ISA), Arm9)
78 CFLAGS_INTERNAL = -c -qq -pdsw225 --endian=$(ENDIAN) -mv5e --float_support=vfplib --abi=$(CSWITCH_FORMAT) -eo.$(OBJEXT) -ea.$(ASMEXT) --symdebug:dwarf --embed_inline_assembly
79 endif
80 ifeq ($(TREAT_WARNINGS_AS_ERROR), yes)
81 CFLAGS_INTERNAL += --emit_warnings_as_errors
82 LNKFLAGS_INTERNAL_COMMON += --emit_warnings_as_errors
83 endif
84 CFLAGS_DIROPTS = -fr=$(OBJDIR) -fs=$(OBJDIR)
86 ifeq ($(CGT_ISA),$(filter $(CGT_ISA),R5))
87 XDC_TARGET_NAME=$(CGT_ISA)F
89 ifneq ($(EXTERNAL_LNKCMD_FILE_LOCAL),)
90 EXTERNAL_LNKCMD_FILE = $(EXTERNAL_LNKCMD_FILE_LOCAL)
91 else
92 EXTERNAL_LNKCMD_FILE = $(CONFIG_BLD_LNK_r5f)
93 endif
95 else
96 XDC_TARGET_NAME=$(CGT_ISA)
97 endif
100 XDC_HFILE_NAME = $(basename $(notdir $(XDC_CFG_FILE_$(CORE))))
101 # CFLAGS based on profile selected
102 ifeq ($(BUILD_PROFILE_$(CORE)), debug)
103 LNKFLAGS_INTERNAL_BUILD_PROFILE =
104 CFLAGS_XDCINTERNAL = -Dxdc_target_name__=$(XDC_TARGET_NAME) -Dxdc_target_types__=ti/targets/arm/elf/std.h -Dxdc_bld__profile_debug
105 CFLAGS_INTERNAL += -D_DEBUG_=1
106 ifndef MODULE_NAME
107 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_HFILE_NAME)_pe$(CGT_EXT).h'
108 endif
110 endif
111 ifeq ($(BUILD_PROFILE_$(CORE)), release)
112 ifeq ($(CGT_ISA),$(filter $(CGT_ISA), M4 R5 M3))
113 ifeq ($(CGT_ISA),$(filter $(CGT_ISA), R5))
114 LNKFLAGS_INTERNAL_BUILD_PROFILE = --opt='--float_support=vfpv3d16 --endian=$(ENDIAN) -mv7$(CGT_ISA) --abi=$(CSWITCH_FORMAT) -qq -pdsw225 $(CFLAGS_GLOBAL_$(CORE)) -ms -op2 -O4 -s --diag_suppress=23000' --strict_compatibility=on
115 else
116 LNKFLAGS_INTERNAL_BUILD_PROFILE = --opt='--float_support=vfplib --endian=$(ENDIAN) -mv7$(CGT_ISA) --abi=$(CSWITCH_FORMAT) -qq -pdsw225 $(CFLAGS_GLOBAL_$(CORE)) -oe --symdebug:dwarf -ms -op2 -O3 -os --optimize_with_debug --inline_recursion_limit=20 --diag_suppress=23000' --strict_compatibility=on
117 endif
118 ifeq ($(CGT_ISA),$(filter $(CGT_ISA), R5))
119 CFLAGS_INTERNAL += -ms -O4 -s
120 else
121 CFLAGS_INTERNAL += -ms -oe -O3 -op0 -os --optimize_with_debug --inline_recursion_limit=20
122 endif
123 CFLAGS_XDCINTERNAL = -Dxdc_target_name__=$(XDC_TARGET_NAME) -Dxdc_target_types__=ti/targets/arm/elf/std.h -Dxdc_bld__profile_release
124 ifndef MODULE_NAME
125 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_HFILE_NAME)_pe$(CGT_EXT).h'
126 endif
127 endif
128 ifeq ($(CGT_ISA), Arm9)
129 LNKFLAGS_INTERNAL_BUILD_PROFILE = --opt='--endian=$(ENDIAN) -mv5e --float_support=vfplib --abi=$(CSWITCH_FORMAT) -qq -pdsw225 $(CFLAGS_GLOBAL_$(CORE)) -oe --symdebug:dwarf -ms -op2 -O3 -os --optimize_with_debug --inline_recursion_limit=20 --diag_suppress=23000' --strict_compatibility=on
130 CFLAGS_INTERNAL += -ms -oe -O3 -op0 -os --optimize_with_debug --inline_recursion_limit=20
131 CFLAGS_XDCINTERNAL = -Dxdc_target_name__=$(XDC_TARGET_NAME) -Dxdc_target_types__=ti/targets/arm/elf/std.h -Dxdc_bld__profile_release
132 ifndef MODULE_NAME
133 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_HFILE_NAME)_pe$(CGT_EXT).h'
134 endif
135 endif
136 endif
138 # Assemble CFLAGS from all other CFLAGS definitions
139 _CFLAGS = $(CFLAGS_GLOBAL_$(CORE)) $(CFLAGS_INTERNAL) $(CFLAGS_LOCAL_COMMON) $(CFLAGS_LOCAL_$(CORE)) $(CFLAGS_COMP_COMMON)
140 ifeq ($($(MODULE_NAME)_BOARD_DEPENDENCY),yes)
141 _CFLAGS += $(CFLAGS_LOCAL_$(BOARD)) $(CFLAGS_GLOBAL_$(BOARD))
142 else
143 ifeq ($($(APP_NAME)_BOARD_DEPENDENCY),yes)
144 _CFLAGS += $(CFLAGS_LOCAL_$(BOARD)) $(CFLAGS_GLOBAL_$(BOARD))
145 else
146 _CFLAGS += $(CFLAGS_LOCAL_$(SOC)) $(CFLAGS_GLOBAL_$(SOC))
147 endif
148 endif
149 ifneq ($(XDC_CFG_FILE_$(CORE)),)
150 _CFLAGS += $(CFLAGS_XDCINTERNAL)
151 else
152 ifneq ($(findstring xdc, $(INCLUDE_EXTERNAL_INTERFACES)),)
153 _CFLAGS += $(CFLAGS_XDCINTERNAL)
154 endif
155 endif
157 # Decide the compile mode
158 COMPILEMODE = -fc
159 ifeq ($(CPLUSPLUS_BUILD), yes)
160 COMPILEMODE = -fg
161 endif
163 # Object file creation
164 # The first $(CC) generates the dependency make files for each of the objects
165 # The second $(CC) compiles the source to generate object
166 $(OBJ_PATHS): $(OBJDIR)/%.$(OBJEXT): %.c | $(OBJDIR) $(DEPDIR)
167 $(ECHO) \# Compiling $(PRINT_MESSAGE): $<
168 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) $(COMPILEMODE) $<
169 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) $(COMPILEMODE) $<
171 #TODO: Check ASMFLAGS if really required
172 ASMFLAGS = -me -g --code_state=32 --diag_warning=225
174 # Object file creation
175 $(OBJ_PATHS_ASM): $(OBJDIR)/%.$(OBJEXT): %.asm | $(OBJDIR) $(DEPDIR)
176 $(ECHO) \# Compiling $(PRINT_MESSAGE): $<
177 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fa $<
178 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fa $<
180 $(PACKAGE_PATHS): $(PACKAGEDIR)/%: %
181 $(ECHO) \# Copying to $(PACKAGE_RELPATH)/$($(APP_NAME)$(MODULE_NAME)_RELPATH)/$<
182 $(MKDIR) -p $(PACKAGE_ROOT)/$($(APP_NAME)$(MODULE_NAME)_RELPATH)
183 $(CP) --parents -rf $< $(PACKAGE_ROOT)/$($(APP_NAME)$(MODULE_NAME)_RELPATH)
185 # Archive flags - normally doesn't change
186 ARFLAGS = rq
188 # Archive/library file creation
189 $(LIBDIR)/$(LIBNAME).$(LIBEXT) : $(OBJ_PATHS_ASM) $(OBJ_PATHS) | $(LIBDIR)
190 $(ECHO) \#
191 $(ECHO) \# Archiving $(PRINT_MESSAGE) into $@ ...
192 $(ECHO) \#
193 $(AR) $(ARFLAGS) $@ $(OBJ_PATHS_ASM) $(OBJ_PATHS)
195 $(LIBDIR)/$(LIBNAME).$(LIBEXT)_size: $(LIBDIR)/$(LIBNAME).$(LIBEXT)
196 $(ECHO) \#
197 $(ECHO) \# Computing sectti size $(PRINT_MESSAGE) info into $@.txt ...
198 $(ECHO) \#
199 $(SIZE) -x $(subst _size,,$@) > $@temp
200 $(SECTTI) $@temp > $@.txt
201 $(RM) $@temp
203 # Linker options and rules
204 LNKFLAGS_INTERNAL_COMMON += -w -q -u _c_int00
206 ifeq ($(BOARD),$(filter $(BOARD), qtJ7))
207 LNKFLAGS_INTERNAL_COMMON += -cr --ram_model
208 else
209 LNKFLAGS_INTERNAL_COMMON += -c
210 endif
212 ifeq ($(CGT_ISA), R5)
213 LNKFLAGS_INTERNAL_COMMON += -mv7R5
214 #--diag_suppress=10063 supresses 'warning: entry point other than _c_int00 specified'
215 LNKFLAGS_INTERNAL_COMMON += --diag_suppress=10063
216 else
217 ifeq ($(CGT_ISA), Arm9)
218 LNKFLAGS_INTERNAL_COMMON +=
219 else
220 LNKFLAGS_INTERNAL_COMMON += --silicon_version=7$(CGT_ISA)
221 endif
222 endif
224 # Assemble Linker flags from all other LNKFLAGS definitions
225 _LNKFLAGS = $(LNKFLAGS_INTERNAL_COMMON) $(LNKFLAGS_INTERNAL_BUILD_PROFILE) $(LNKFLAGS_GLOBAL_$(CORE)) $(LNKFLAGS_LOCAL_COMMON) $(LNKFLAGS_LOCAL_$(CORE))
227 # Path of the RTS library - normally doesn't change for a given tool-chain
228 #Let the linker choose the required library
229 RTSLIB_PATH = $(CGT_PATH)/lib/libc.a
231 LNK_LIBS = $(addprefix -l,$(LIB_PATHS))
232 LNK_LIBS += $(addprefix -l,$(EXT_LIB_PATHS))
234 # Linker - to create executable file
235 ifeq ($(LOCAL_APP_NAME),)
236 EXE_NAME = $(BINDIR)/$(APP_NAME)_$(CORE)_$(BUILD_PROFILE_$(CORE)).$(EXEEXT)
237 EXE_STRIP_NAME = $(BINDIR)/$(APP_NAME)_$(CORE)_$(BUILD_PROFILE_$(CORE))_strip.$(EXEEXT)
238 else
239 EXE_NAME = $(BINDIR)/$(LOCAL_APP_NAME)_$(BUILD_PROFILE_$(CORE)).$(EXEEXT)
240 EXE_STRIP_NAME = $(BINDIR)/$(LOCAL_APP_NAME)_$(BUILD_PROFILE_$(CORE))_strip.$(EXEEXT)
241 endif
243 NUM_PROCS = 1
245 ifeq ($(OS),Windows_NT)
246 NUM_PROCS = $(NUMBER_OF_PROCESSORS)
247 else
248 NUM_PROCS = $(shell grep -c ^processor /proc/cpuinfo)
249 endif
251 ifneq ($(findstring mcu,$(CORE)),)
252 BUILD_LIB_ONCE = $(CGT_PATH)/lib/rtsv7R4_A_le_v3D16_eabi.lib
253 $(BUILD_LIB_ONCE):
254 $(ECHO) \# $@ not found, building $@ ...
255 $(CGT_PATH)/lib/mklib --pattern=rtsv7R4_A_le_v3D16_eabi.lib --parallel=$(NUM_PROCS) --compiler_bin_dir=$(CGT_PATH)/bin
256 endif
258 ifneq ($(XDC_CFG_FILE_$(CORE)),)
259 $(EXE_NAME) : $(OBJ_PATHS_ASM) $(OBJ_PATHS) $(LIB_PATHS) $(LNKCMD_FILE) $(OBJDIR)/$(CFG_COBJ_XDC) $(BUILD_LIB_ONCE)
260 $(CP) $(CONFIGURO_DIR)/package/cfg/*.rov.xs $(BINDIR)
261 else
262 $(EXE_NAME) : $(OBJ_PATHS_ASM) $(OBJ_PATHS) $(LIB_PATHS) $(LNKCMD_FILE) $(BUILD_LIB_ONCE)
263 endif
264 $(ECHO) \# Linking into $(EXE_NAME)...
265 $(ECHO) \#
266 ifneq ($(XDC_CFG_FILE_$(CORE)),)
267 $(CP) $(OBJDIR)/$(CFG_COBJ_XDC) $(CONFIGURO_DIR)/package/cfg
268 ifeq ($(BUILD_PROFILE_$(CORE)),whole_program_debug)
269 $(LNK) $(_LNKFLAGS) $(OBJ_PATHS_ASM) $(OBJ_PATHS) $(OBJDIR)/$(CFG_COBJ_XDC) $(LNKCMD_FILE) $(EXTERNAL_LNKCMD_FILE) -o $@ -m $@.map $(LNK_LIBS) $(RTSLIB_PATH)
270 else
271 $(LNK) $(_LNKFLAGS) $(OBJ_PATHS_ASM) $(OBJ_PATHS) $(LNKCMD_FILE) $(EXTERNAL_LNKCMD_FILE) -o $@ -m $@.map $(LNK_LIBS) $(RTSLIB_PATH)
272 endif
273 else
274 $(LNK) $(_LNKFLAGS) $(OBJ_PATHS_ASM) $(OBJ_PATHS) $(LNKCMD_FILE) $(EXTERNAL_LNKCMD_FILE) -o $@ -m $@.map $(LNK_LIBS) $(RTSLIB_PATH)
275 endif
276 $(ECHO) \#
277 $(ECHO) \# $@ created.
278 $(ECHO) \#
279 ifeq ($(BUILD_PROFILE_$(CORE)), release)
280 $(ECHO) \# Generating stripped image into $(EXE_STRIP_NAME)...
281 $(ECHO) \#
282 $(STRP) -p $(EXE_NAME) -o $(EXE_STRIP_NAME)
283 endif
284 # XDC specific - assemble XDC-Configuro command
285 ifeq ($(BUILD_PROFILE_$(CORE)),prod_release)
286 CONFIGURO_BUILD_PROFILE = release
287 else
288 CONFIGURO_BUILD_PROFILE = $(BUILD_PROFILE_$(CORE))
289 endif
291 _XDC_GREP_STRING = \"$(XDC_GREP_STRING)\"
292 EGREP_CMD = $(EGREP) -ivw $(XDC_GREP_STRING) $(XDCLNKCMD_FILE)
294 ifeq ($(OS),Windows_NT)
295 EVERYONE = $(word 1,$(shell whoami -groups | findstr "S-1-1-0"))
296 endif
298 # Invoke configuro for the rest of the components
299 # NOTE: 1. String handling is having issues with various make versions when the
300 # cammand is directly tried to be given below. Hence, as a work-around,
301 # the command is re-directed to a file (shell or batch file) and then
302 # executed
303 # 2. The linker.cmd file generated, includes the libraries generated by
304 # XDC. An egrep to search for these and omit in the .cmd file is added
305 # after configuro is done
306 xdc_configuro : $(CFG_C_XDC)
307 $(MAKE) $(LNKCMD_FILE)
309 ifeq ($(DEST_ROOT),)
310 XDC_BUILD_ROOT = .
311 else
312 XDC_BUILD_ROOT = $(DEST_ROOT)
313 endif
315 $(CFG_C_XDC) $(LNKCMD_FILE) : $(XDC_CFG_FILE_NAME) $(XDC_CFG_UPDATE)
316 $(ECHO) \# Invoking configuro...
317 $(MKDIR) -p $(XDC_BUILD_ROOT)
318 $(xdc_PATH)/xs xdc.tools.configuro --generationOnly -o $(CONFIGURO_DIR) -t $(TARGET_XDC) -p $(PLATFORM_XDC) \
319 -r $(CONFIGURO_BUILD_PROFILE) -b $(CONFIG_BLD_XDC_$(ISA)) --ol $(LNKCMD_FILE) $(XDC_CFG_FILE_NAME)
320 $(ECHO) \# Configuro done!
322 ifneq ($(XDC_CFG_FILE_$(CORE)),)
323 ifndef MODULE_NAME
324 $(OBJDIR)/$(CFG_COBJ_XDC) : $(CFG_C_XDC)
325 $(ECHO) \# Compiling generated $(CFG_COBJ_XDC)
326 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $(CFG_C_XDC)
327 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $(CFG_C_XDC)
328 endif
329 endif
331 # Include dependency make files that were generated by $(CC)
332 -include $(SRCS:%.c=$(DEPDIR)/%.P)
334 # Nothing beyond this point