1 # Filename: rules_64p.mk
2 #
3 # Make rules for 64p - This file has all the common rules and defines required
4 # for DSP c64+ ISA
5 #
6 # This file needs to change when:
7 # 1. Code generation tool chain changes (currently it uses TI CGT)
8 # 2. Internal switches (which are normally not touched) has to change
9 # 3. XDC specific switches change
10 # 4. a rule common for c64p ISA has to be added or modified
12 # Set compiler/archiver/linker commands and include paths - Currently different
13 # for ELF and COFF. In a future release of the toolchain, it would merge.
14 ifeq ($(FORMAT),COFF)
15 CODEGEN_PATH = $(CODEGEN_PATH_DSP)
16 CODEGEN_INCLUDE = $(CODEGEN_PATH_DSP)/include
17 CC = $(CODEGEN_PATH_DSP)/bin/cl6x
18 AR = $(CODEGEN_PATH_DSP)/bin/ar6x
19 LNK = $(CODEGEN_PATH_DSP)/bin/lnk6x
20 endif
21 ifeq ($(FORMAT),ELF)
22 CODEGEN_PATH = $(CODEGEN_PATH_DSPELF)
23 CODEGEN_INCLUDE = $(CODEGEN_PATH_DSPELF)/include
24 CC = $(CODEGEN_PATH_DSPELF)/bin/cl6x
25 AR = $(CODEGEN_PATH_DSPELF)/bin/ar6x
26 LNK = $(CODEGEN_PATH_DSPELF)/bin/lnk6x
27 endif
29 # Derive a part of RTS Library name based on ENDIAN: little/big
30 ifeq ($(ENDIAN),little)
31 #RTSLIB_ENDIAN =
32 XDCINTERNAL_DEFINES += -Dxdc_target_name__=C64P
33 else
34 CSWITCH_ENDIAN = -me
35 RTSLIB_ENDIAN = e
36 XDCINTERNAL_DEFINES += -DBIG_ENDIAN_MODE -Dxdc_target_name__=C64P_big_endian
37 endif
39 # Derive compiler switch and part of RTS Library name based on FORMAT: COFF/ELF
40 ifeq ($(FORMAT),COFF)
41 CSWITCH_FORMAT =
42 #RTSLIB_FORMAT =
43 XDCINTERNAL_DEFINES += -Dxdc_target_types__=ti/targets/std.h -Dxdc_bld__vers_1_0_7_0_0
44 endif
45 ifeq ($(FORMAT),ELF)
46 CSWITCH_FORMAT = --abi=elfabi
47 RTSLIB_FORMAT = _elf
48 XDCINTERNAL_DEFINES += -Dxdc_target_types__=ti/targets/elf/std.h -Dxdc_bld__vers_1_0_7_2_0_10271
49 endif
51 # XDC Specific defines
52 ifneq ($(XDC_CFG_FILE_$(CORE)),)
53 ifeq ($(PROFILE_$(CORE)),debug)
54 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)$(ISA)$(RTSLIB_ENDIAN)
55 endif
56 ifeq ($(PROFILE_$(CORE)),release)
57 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)$(ISA)$(RTSLIB_ENDIAN)
58 endif
59 ifeq ($(PROFILE_$(CORE)),whole_program_debug)
60 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)$(ISA)$(ENDIAN_EXT)
61 CFG_LNKFILENAMEPART_XDC=_x
62 endif
63 CFG_CFILE_XDC =$(patsubst %.cfg,%_$(CFG_CFILENAMEPART_XDC).c,$(notdir $(XDC_CFG_FILE_$(CORE))))
64 CFG_C_XDC = $(addprefix $(CONFIGURO_DIR)/package/cfg/,$(CFG_CFILE_XDC))
65 XDCLNKCMD_FILE =$(patsubst %.c, %$(CFG_LNKFILENAMEPART_XDC)_x.xdl, $(CFG_C_XDC))
66 CFG_COBJ_XDC = $(patsubst %.c,%.$(OBJEXT),$(CFG_CFILE_XDC))
67 # OBJ_PATHS += $(CFG_COBJ_XDC)
68 LNKCMD_FILE = $(CONFIGURO_DIR)/linker_mod.cmd
69 SPACE :=
70 SPACE +=
71 XDC_GREP_STRING = $(CONFIGURO_DIRNAME)
72 # XDC_GREP_STRING = $(subst $(SPACE),\|,$(COMP_LIST_$(CORE)))
73 # XDC_GREP_STRING += \|$(CONFIGURO_DIRNAME)
74 endif
76 # Internal CFLAGS - normally doesn't change
77 CFLAGS_INTERNAL = -c -qq -pdsw225 -mvtesla $(CSWITCH_FORMAT) $(CSWITCH_ENDIAN) -mo -eo.$(OBJEXT) -ea.$(ASMEXT) -DBUILD_C6XDSP
79 # Uncomment for misra C build
80 #CFLAGS_INTERNAL += --check_misra="all"
82 # Uncomment for Cpp enabled build
83 #CFLAGS_INTERNAL += --cpp_default
85 CFLAGS_DIROPTS = -fr=$(OBJDIR) -fs=$(OBJDIR)
87 # CFLAGS based on profile selected
88 ifeq ($(PROFILE_$(CORE)), debug)
89 CFLAGS_INTERNAL += --symdebug:dwarf
90 CFLAGS_XDCINTERNAL = -Dxdc_bld__profile_debug -D_DEBUG_=1
91 ifndef MODULE_NAME
92 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_CFG_BASE_FILE_NAME)_xem3.h'
93 endif
94 LNKFLAGS_INTERNAL_PROFILE =
95 endif
96 ifeq ($(PROFILE_$(CORE)), release)
97 CFLAGS_INTERNAL += -O2
98 CFLAGS_XDCINTERNAL = -Dxdc_bld__profile_release
99 ifndef MODULE_NAME
100 CFLAGS_XDCINTERNAL += -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_CFG_BASE_FILE_NAME)_pem3.h'
101 endif
102 LNKFLAGS_INTERNAL_PROFILE = -o2
103 # LNKFLAGS_INTERNAL_PROFILE =
104 endif
106 # For generic platform define GENERIC in CFLAGS
107 ifeq ($(PLATFORM),generic)
108 CFLAGS_XDCINTERNAL += -DGENERIC
109 endif
110 CFLAGS_XDCINTERNAL += $(XDCINTERNAL_DEFINES)
112 # Following 'if...' block is for an application; to add a #define for each
113 # component in the build. This is required to know - at compile time - which
114 # components are on which core.
115 ifndef MODULE_NAME
116 # Derive list of all packages from each of the components needed by the app
117 PKG_LIST_M3_LOCAL = $(foreach COMP,$(COMP_LIST_$(CORE)),$($(COMP)_PKG_LIST))
119 # Defines for the app and cfg source code to know which components/packages
120 # are included in the build for the local CORE...
121 CFLAGS_APP_DEFINES = $(foreach PKG,$(PKG_LIST_M3_LOCAL),-D_LOCAL_$(PKG)_)
122 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_M3_LOCAL),-D_BUILD_$(PKG)_)
124 ifeq ($(CORE),m3vpss)
125 PKG_LIST_M3_REMOTE = $(foreach COMP,$(COMP_LIST_m3video),$($(COMP)_PKG_LIST))
126 CFLAGS_APP_DEFINES += -D_LOCAL_CORE_m3vpss_
127 endif
128 ifeq ($(CORE),m3video)
129 PKG_LIST_M3_REMOTE = $(foreach COMP,$(COMP_LIST_m3vpss),$($(COMP)_PKG_LIST))
130 CFLAGS_APP_DEFINES += -D_LOCAL_CORE_m3video_
131 endif
132 PKG_LIST_A8_REMOTE = $(foreach COMP,$(COMP_LIST_a8host),$($(COMP)_PKG_LIST))
134 # Defines for the app and cfg source code to know which components/packages
135 # are included in the build for the remote CORE...
136 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_M3_REMOTE),-D_REMOTE_$(PKG)_)
137 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_M3_REMOTE),-D_BUILD_$(PKG)_)
138 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_REMOTE),-D_REMOTE_$(PKG)_)
139 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_A8_REMOTE),-D_BUILD_$(PKG)_)
140 endif
142 # Assemble CFLAGS from all other CFLAGS definitions
143 _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))
145 # Object file creation
146 # The first $(CC) generates the dependency make files for each of the objects
147 # The second $(CC) compiles the source to generate object
148 $(OBJ_PATHS): $(OBJDIR)/%.$(OBJEXT): %.c
149 $(ECHO) \# Compiling $< to $@ ...
150 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $<
151 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $<
153 # Archive flags - normally doesn't change
154 ARFLAGS = rq
156 # Archive/library file creation
157 $(LIBDIR)/$(MODULE_NAME).$(LIBEXT) : $(OBJ_PATHS)
158 $(ECHO) \#
159 $(ECHO) \# Archiving $(OBJ_PATHS) into $@...
160 $(ECHO) \#
161 $(AR) $(ARFLAGS) $@ $(OBJ_PATHS)
163 # Linker options and rules
164 LNKFLAGS_INTERNAL_COMMON = --warn_sections -q -e=_c_int00 --silicon_version=64+ -c
166 # Assemble Linker flags from all other LNKFLAGS definitions
167 _LNKFLAGS = $(LNKFLAGS_INTERNAL_COMMON) $(LNKFLAGS_INTERNAL_PROFILE) $(LNKFLAGS_GLOBAL_$(CORE)) $(LNKFLAGS_LOCAL_COMMON) $(LNKFLAGS_LOCAL_$(CORE))
169 # Path of the RTS library - normally doesn't change for a given tool-chain
170 RTSLIB_PATH = $(CODEGEN_PATH)/lib/rts64plus$(RTSLIB_ENDIAN)$(RTSLIB_FORMAT).lib
171 LIB_PATHS += $(RTSLIB_PATH)
173 LNK_LIBS = $(addprefix -l,$(LIB_PATHS))
174 ifeq ($(DEST_ROOT),)
175 TMPOBJDIR = .
176 else
177 TMPOBJDIR = $(OBJDIR)
178 endif
179 # Linker - to create executable file
180 $(BINDIR)/$(APP_NAME)_$(CORE)_$(PROFILE_$(CORE)).$(EXEEXT) : $(OBJ_PATHS) $(LIB_PATHS) $(LNKCMD_FILE) $(OBJDIR)/$(CFG_COBJ_XDC)
181 $(ECHO) \# Linking into $@
182 $(ECHO) \#
183 cd $(TMPOBJDIR) && $(LNK) $(_LNKFLAGS) $(OBJ_PATHS) $(OBJDIR)/$(CFG_COBJ_XDC) -l$(LNKCMD_FILE) sample_app/linker.cmd -o $@ -m $@.map $(LNK_LIBS)
184 $(ECHO) \#
185 $(ECHO) \# $@ created.
186 $(ECHO) \#
188 # XDC specific - assemble XDC-Configuro command
189 CONFIGURO_CMD = $(xdc_PATH)/xs xdc.tools.configuro --generationOnly -o $(CONFIGURO_DIR) -t $(TARGET_XDC) -p $(PLATFORM_XDC) \
190 -r whole_program -c $(CODEGEN_PATH) -b $(CONFIG_BLD_XDC_$(ISA)) $(XDC_CFG_FILE_NAME)
191 _XDC_GREP_STRING = \"$(XDC_GREP_STRING)\"
192 EGREP_CMD = $(EGREP) -ivw $(XDC_GREP_STRING) $(XDCLNKCMD_FILE)
194 ifneq ($(DEST_ROOT),)
195 DEST_ROOT += /
196 endif
197 # Invoke configuro for the rest of the components
198 # NOTE: 1. String handling is having issues with various make versions when the
199 # cammand is directly tried to be given below. Hence, as a work-around,
200 # the command is re-directed to a file (shell or batch file) and then
201 # executed
202 # 2. The linker.cmd file generated, includes the libraries generated by
203 # XDC. An egrep to search for these and omit in the .cmd file is added
204 # after configuro is done
205 #$(CFG_CFILE_XDC) : $(XDC_CFG_FILE)
206 xdc_configuro : $(XDC_CFG_FILE)
207 $(ECHO) \# Invoking configuro...
208 $(ECHO) -e $(CONFIGURO_CMD) > $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat
209 $(CHMOD) a+x $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat
210 ifeq ($(OS),Windows_NT)
211 CACLS $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat /E /P Everyone:F
212 $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat
213 else
214 ./$(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat
215 endif
216 $(CP) $(XDCLNKCMD_FILE) $(LNKCMD_FILE)
217 # $(ECHO) @ $(EGREP_CMD) > maketemp_egrep_cmd.bat
218 # ./maketemp_egrep_cmd.bat | $(CYGWINPATH)/bin/tail -n+3 > $(LNKCMD_FILE)
219 # $(EGREP_CMD) > $(LNKCMD_FILE)
220 # $(EGREP) -iv "$(XDC_GREP_STRING)" $(XDCLNKCMD_FILE) > $(LNKCMD_FILE)
221 $(ECHO) \# Configuro done!
223 $(LNKCMD_FILE) :
224 # $(CP) $(XDCLNKCMD_FILE) $(LNKCMD_FILE)
225 # $(ECHO) @ $(EGREP_CMD) > maketemp_egrep_cmd.bat
226 # ./maketemp_egrep_cmd.bat | $(CYGWINPATH)/bin/tail -n+3 > $(LNKCMD_FILE)
227 # $(EGREP_CMD) > $(LNKCMD_FILE)
229 ifndef MODULE_NAME
230 $(OBJDIR)/$(CFG_COBJ_XDC) : $(CFG_C_XDC)
231 $(ECHO) \# Compiling generated $< to $@ ...
232 $(CC) -ppd=$(DEPFILE).P $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $(CFG_C_XDC)
233 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -fc $(CFG_C_XDC)
234 ifeq ($(OS),Windows_NT)
235 ICACLS $@ /q /c /t /grant Everyone:F
236 ICACLS $(CONFIGURO_DIR)/package/cfg/$(CFG_COBJ_XDC) /q /c /t /grant Everyone:F
237 endif
238 endif
240 # Include dependency make files that were generated by $(CC)
241 -include $(SRCS:%.c=$(DEPDIR)/%.P)
243 # Nothing beyond this point