1 # Filename: rules_TI_arm9.mk\r
2 #\r
3 # Make rules for ARM9 - This file has all the common rules and defines required\r
4 # for ARM9 ISA\r
5 #\r
6 # This file needs to change when:\r
7 # 1. Code generation tool chain changes (This file uses TMS470)\r
8 # 2. Internal switches (which are normally not touched) has to change\r
9 # 3. XDC specific switches change\r
10 # 4. a rule common for ARM9 ISA has to be added or modified\r
11 \r
12 # Set compiler/archiver/linker commands and include paths\r
13 CODEGEN_INCLUDE = $(CODEGEN_PATH_ARM9)/include\r
14 CC = $(CODEGEN_PATH_ARM9)/bin/armcl \r
15 AR = $(CODEGEN_PATH_ARM9)/bin/armar\r
16 LNK = $(CODEGEN_PATH_ARM9)/bin/armlnk\r
17 \r
18 # Derive a part of RTS Library name based on ENDIAN: little/big\r
19 ifeq ($(ENDIAN),little)\r
20 RTSLIB_ENDIAN = le\r
21 else\r
22 RTSLIB_ENDIAN = be\r
23 endif\r
24 \r
25 # Derive compiler switch and part of RTS Library name based on FORMAT: COFF/ELF\r
26 ifeq ($(FORMAT),COFF)\r
27 CSWITCH_FORMAT = \r
28 RTSLIB_FORMAT = \r
29 endif\r
30 ifeq ($(FORMAT),ELF)\r
31 CSWITCH_FORMAT = eabi\r
32 RTSLIB_FORMAT = eabi\r
33 endif\r
34 \r
35 # XDC Specific defines\r
36 ifneq ($(XDC_CFG_FILE_$(CORE)),)\r
37 ifeq ($(PROFILE_$(CORE)),debug)\r
38 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)9\r
39 endif\r
40 ifeq ($(PROFILE_$(CORE)),release)\r
41 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)9\r
42 endif\r
43 ifeq ($(PROFILE_$(CORE)),whole_program_debug)\r
44 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)9$(ENDIAN_EXT)\r
45 CFG_LNKFILENAMEPART_XDC=_x\r
46 endif\r
47 CFG_CFILE_XDC =$(patsubst %.cfg,%_$(CFG_CFILENAMEPART_XDC).c,$(notdir $(XDC_CFG_FILE_$(CORE))))\r
48 CFG_C_XDC = $(addprefix $(CONFIGURO_DIR)/package/cfg/,$(CFG_CFILE_XDC))\r
49 XDCLNKCMD_FILE =$(patsubst %.c, %$(CFG_LNKFILENAMEPART_XDC)_x.xdl, $(CFG_C_XDC))\r
50 CFG_COBJ_XDC = $(patsubst %.c,%.$(OBJEXT),$(CFG_CFILE_XDC))\r
51 # OBJ_PATHS += $(CFG_COBJ_XDC)\r
52 LNKCMD_FILE = $(CONFIGURO_DIR)/linker_mod.cmd\r
53 SPACE := \r
54 SPACE += \r
55 XDC_GREP_STRING = $(CONFIGURO_DIRNAME)\r
56 # XDC_GREP_STRING = $(subst $(SPACE),\|,$(COMP_LIST_$(CORE)))\r
57 # XDC_GREP_STRING += \|$(CONFIGURO_DIRNAME)\r
58 endif\r
59 \r
60 # Internal CFLAGS - normally doesn't change\r
61 CFLAGS_INTERNAL = -c -qq -pdsw225 -me -mv5e --abi=$(CSWITCH_FORMAT) -eo.$(OBJEXT) -ea.$(ASMEXT) \r
62 CFLAGS_DIROPTS = -fr=$(OBJDIR) -fs=$(OBJDIR)\r
63 \r
64 # CFLAGS based on profile selected\r
65 ifeq ($(PROFILE_$(CORE)), debug)\r
66 CFLAGS_XDCINTERNAL = -g --symdebug:dwarf -Dxdc_target_name__=Arm9 -Dxdc_target_types__=ti/targets/arm/elf/std.h -Dxdc_bld__profile_debug -Dxdc_bld__vers_1_0_4_6_1 -D_DEBUG_=1 \r
67 ifndef MODULE_NAME\r
68 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_CFG_BASE_FILE_NAME)_xem3.h' --diag_warning=225 -me --abi=eabi --code_state=32 --preproc_with_compile \r
69 endif\r
70 LNKFLAGS_INTERNAL_PROFILE = \r
71 endif\r
72 ifeq ($(PROFILE_$(CORE)), whole_program_debug)\r
73 CFLAGS_XDCINTERNAL = -g --symdebug:dwarf -Dxdc_target_name__=Arm9 -Dxdc_target_types__=ti/targets/arm/elf/std.h -Dxdc_bld__profile_whole_program_debug -Dxdc_bld__vers_1_0_4_6_1 -ms -oe \r
74 ifndef MODULE_NAME\r
75 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/VpsAppMain_pem3.h' --diag_warning=225 -me --abi=eabi --code_state=32 --preproc_with_compile \r
76 endif\r
77 LNKFLAGS_INTERNAL_PROFILE = --opt='--endian=$(ENDIAN) -mv5e --abi=$(CSWITCH_FORMAT) -qq -pdsw225 $(CFLAGS_GLOBAL_$(CORE)) -oe --symdebug:dwarf -ms -op2 -O3 -k -os --optimize_with_debug --inline_recursion_limit=20' --strict_compatibility=on \r
78 # LNKFLAGS_INTERNAL_PROFILE = \r
79 endif\r
80 ifeq ($(PROFILE_$(CORE)), release)\r
81 CFLAGS_XDCINTERNAL = -Dxdc_target_name__=Arm9 -Dxdc_target_types__=ti/targets/arm/elf/std.h -Dxdc_bld__profile_debug -Dxdc_bld__vers_1_0_4_6_1 -O2\r
82 ifndef MODULE_NAME\r
83 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_CFG_BASE_FILE_NAME)_xem3.h' --diag_warning=225 -me --abi=eabi --code_state=32 --preproc_with_compile \r
84 endif\r
85 LNKFLAGS_INTERNAL_PROFILE = -o2\r
86 endif\r
87 \r
88 # For generic platform define GENERIC in CFLAGS\r
89 ifeq ($(PLATFORM),generic)\r
90 CFLAGS_XDCINTERNAL += -DGENERIC\r
91 endif\r
92 \r
93 # Following 'if...' block is for an application; to add a #define for each\r
94 # component in the build. This is required to know - at compile time - which\r
95 # components are on which core.\r
96 ifndef MODULE_NAME\r
97 # Derive list of all packages from each of the components needed by the app\r
98 PKG_LIST_A8 = $(foreach COMP,$(COMP_LIST_$(CORE)),$($(COMP)_PKG_LIST))\r
99 \r
100 # Defines for the app and cfg source code to know which components/packages\r
101 # are included in the build for the local CORE...\r
102 CFLAGS_APP_DEFINES = $(foreach PKG,$(PKG_LIST_A8_LOCAL),-D_LOCAL_$(PKG)_)\r
103 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_LOCAL),-D_BUILD_$(PKG)_)\r
104 \r
105 ifeq ($(CORE),m3vpss)\r
106 PKG_LIST_A8_REMOTE = $(foreach COMP,$(COMP_LIST_m3video),$($(COMP)_PKG_LIST))\r
107 CFLAGS_APP_DEFINES += -D_LOCAL_CORE_m3vpss_\r
108 endif\r
109 ifeq ($(CORE),m3video)\r
110 PKG_LIST_A8_REMOTE = $(foreach COMP,$(COMP_LIST_m3vpss),$($(COMP)_PKG_LIST))\r
111 CFLAGS_APP_DEFINES += -D_LOCAL_CORE_m3video_\r
112 endif\r
113 PKG_LIST_A8_REMOTE = $(foreach COMP,$(COMP_LIST_a8host),$($(COMP)_PKG_LIST))\r
114 \r
115 # Defines for the app and cfg source code to know which components/packages\r
116 # are included in the build for the remote CORE...\r
117 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_REMOTE),-D_REMOTE_$(PKG)_)\r
118 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_REMOTE),-D_BUILD_$(PKG)_)\r
119 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_REMOTE),-D_REMOTE_$(PKG)_)\r
120 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_REMOTE),-D_BUILD_$(PKG)_)\r
121 endif\r
122 \r
123 # Assemble CFLAGS from all other CFLAGS definitions\r
124 _CFLAGS = $(CFLAGS_INTERNAL) $(CFLAGS_GLOBAL_$(CORE)) $(CFLAGS_XDCINTERNAL) $(CFLAGS_LOCAL_COMMON) $(CFLAGS_LOCAL_$(CORE)) $(CFLAGS_LOCAL_$(PLATFORM)) $(CFLAGS_LOCAL_$(SOC)) $(CFLAGS_APP_DEFINES) $(CFLAGS_COMP_COMMON) $(CFLAGS_GLOBAL_$(PLATFORM))\r
125 \r
126 # Object file creation\r
127 # The first $(CC) generates the dependency make files for each of the objects\r
128 # The second $(CC) compiles the source to generate object\r
129 $(OBJ_PATHS): $(OBJDIR)/%.$(OBJEXT): %.c\r
130 $(ECHO) \# Compiling $< to $@ ...\r
131 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $<\r
132 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $<\r
133 \r
134 # Archive flags - normally doesn't change\r
135 ARFLAGS = rq\r
136 \r
137 # Archive/library file creation\r
138 $(LIBDIR)/$(MODULE_NAME).$(LIBEXT) : $(OBJ_PATHS)\r
139 $(ECHO) \#\r
140 $(ECHO) \# Archiving $(OBJ_PATHS) into $@...\r
141 $(ECHO) \#\r
142 $(AR) $(ARFLAGS) $@ $(OBJ_PATHS)\r
143 \r
144 # Linker options and rules\r
145 LNKFLAGS_INTERNAL_COMMON = -w -q -u _c_int00 --silicon_version=5e -c --dynamic \r
146 \r
147 # Assemble Linker flags from all other LNKFLAGS definitions\r
148 _LNKFLAGS = $(LNKFLAGS_INTERNAL_COMMON) $(LNKFLAGS_INTERNAL_PROFILE) $(LNKFLAGS_GLOBAL_$(CORE)) $(LNKFLAGS_LOCAL_COMMON) $(LNKFLAGS_LOCAL_$(CORE)) \r
149 \r
150 # Path of the RTS library - normally doesn't change for a given tool-chain\r
151 #RTSLIB_PATH = $(CODEGEN_PATH_A8)/lib/rtsv5_A_$(RTSLIB_ENDIAN)_$(RTSLIB_FORMAT).lib\r
152 LIB_PATHS += $(RTSLIB_PATH)\r
153 \r
154 LNK_LIBS = $(addprefix -l,$(LIB_PATHS))\r
155 ifeq ($(DEST_ROOT),)\r
156 TMPOBJDIR = .\r
157 else\r
158 TMPOBJDIR = $(OBJDIR)\r
159 endif\r
160 # Linker - to create executable file \r
161 $(BINDIR)/$(APP_NAME)_$(CORE)_$(PROFILE_$(CORE)).$(EXEEXT) : $(OBJ_PATHS) $(LIB_PATHS) $(LNKCMD_FILE) $(OBJDIR)/$(CFG_COBJ_XDC)\r
162 $(ECHO) \# Linking into $@\r
163 $(ECHO) \#\r
164 cd $(TMPOBJDIR) && $(LNK) $(_LNKFLAGS) $(OBJ_PATHS) $(OBJDIR)/$(CFG_COBJ_XDC) -l$(LNKCMD_FILE) sample_app/linker.cmd -o $@ -m $@.map $(LNK_LIBS) -l$(CODEGEN_PATH_A8)/lib/libc.a \r
165 $(ECHO) \#\r
166 $(ECHO) \# $@ created.\r
167 $(ECHO) \#\r
168 \r
169 # XDC specific - assemble XDC-Configuro command\r
170 CONFIGURO_CMD = $(xdc_PATH)/xs xdc.tools.configuro --generationOnly -o $(CONFIGURO_DIR) -t $(TARGET_XDC) -p $(PLATFORM_XDC) \\r
171 -r whole_program -c $(CODEGEN_PATH_ARM9) -b $(CONFIG_BLD_XDC_$(ISA)) $(XDC_CFG_FILE_NAME)\r
172 _XDC_GREP_STRING = \"$(XDC_GREP_STRING)\"\r
173 EGREP_CMD = $(EGREP) -ivw $(XDC_GREP_STRING) $(XDCLNKCMD_FILE)\r
174 \r
175 ifneq ($(DEST_ROOT),)\r
176 DEST_ROOT += /\r
177 endif\r
178 # Invoke configuro for the rest of the components\r
179 # NOTE: 1. String handling is having issues with various make versions when the \r
180 # cammand is directly tried to be given below. Hence, as a work-around, \r
181 # the command is re-directed to a file (shell or batch file) and then \r
182 # executed\r
183 # 2. The linker.cmd file generated, includes the libraries generated by\r
184 # XDC. An egrep to search for these and omit in the .cmd file is added\r
185 # after configuro is done\r
186 #$(CFG_CFILE_XDC) : $(XDC_CFG_FILE)\r
187 xdc_configuro : $(XDC_CFG_FILE)\r
188 $(ECHO) \# Invoking configuro...\r
189 $(ECHO) -e $(CONFIGURO_CMD) > $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
190 $(CHMOD) a+x $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
191 ifeq ($(OS),Windows_NT)\r
192 $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
193 else\r
194 ./$(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
195 endif\r
196 $(CP) $(XDCLNKCMD_FILE) $(LNKCMD_FILE)\r
197 # $(ECHO) @ $(EGREP_CMD) > maketemp_egrep_cmd.bat\r
198 # ./maketemp_egrep_cmd.bat | $(CYGWINPATH)/bin/tail -n+3 > $(LNKCMD_FILE)\r
199 # $(EGREP_CMD) > $(LNKCMD_FILE)\r
200 # $(EGREP) -iv "$(XDC_GREP_STRING)" $(XDCLNKCMD_FILE) > $(LNKCMD_FILE)\r
201 $(ECHO) \# Configuro done!\r
202 \r
203 $(LNKCMD_FILE) :\r
204 # $(CP) $(XDCLNKCMD_FILE) $(LNKCMD_FILE)\r
205 # $(ECHO) @ $(EGREP_CMD) > maketemp_egrep_cmd.bat\r
206 # ./maketemp_egrep_cmd.bat | $(CYGWINPATH)/bin/tail -n+3 > $(LNKCMD_FILE)\r
207 # $(EGREP_CMD) > $(LNKCMD_FILE)\r
208 \r
209 ifndef MODULE_NAME\r
210 $(OBJDIR)/$(CFG_COBJ_XDC) : $(CFG_C_XDC)\r
211 $(ECHO) \# Compiling generated $< to $@ ...\r
212 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $(CFG_C_XDC)\r
213 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $(CFG_C_XDC)\r
214 endif\r
215 \r
216 # Include dependency make files that were generated by $(CC)\r
217 -include $(SRCS:%.c=$(DEPDIR)/%.P)\r
218 \r
219 # Nothing beyond this point\r