1 # Filename: rules_a15.mk\r
2 #\r
3 # Make rules for A15 - This file has all the common rules and defines required\r
4 # for Cortex-A15 ISA\r
5 #\r
6 # This file needs to change when:\r
7 # 1. Code generation tool chain changes (This file uses Code Sourcery)\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 A15 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_A15)/arm-none-eabi/include\r
14 CC = $(CODEGEN_PATH_A15)/bin/arm-none-eabi-gcc \r
15 AR = $(CODEGEN_PATH_A15)/bin/arm-none-eabi-ar\r
16 LNK = $(CODEGEN_PATH_A15)/bin/arm-none-eabi-ld\r
17 \r
18 # XDC Specific defines\r
19 ifneq ($(XDC_CFG_FILE_$(CORE)),)\r
20 ifeq ($(PROFILE_$(CORE)),debug)\r
21 # CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)a15f\r
22 CFG_CFILENAMEPART_XDC =pa15fg\r
23 endif\r
24 ifeq ($(PROFILE_$(CORE)),release)\r
25 # CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)a15f\r
26 CFG_CFILENAMEPART_XDC =pa15fg\r
27 endif\r
28 ifeq ($(PROFILE_$(CORE)),whole_program_debug)\r
29 CFG_CFILENAMEPART_XDC =p$(FORMAT_EXT)a15f$(ENDIAN_EXT)\r
30 CFG_LNKFILENAMEPART_XDC=_x\r
31 endif\r
32 CFG_CFILE_XDC =$(patsubst %.cfg,%_$(CFG_CFILENAMEPART_XDC).c,$(notdir $(XDC_CFG_FILE_$(CORE))))\r
33 CFG_C_XDC = $(addprefix $(CONFIGURO_DIR)/package/cfg/,$(CFG_CFILE_XDC))\r
34 XDCLNKCMD_FILE =$(patsubst %.c, %$(CFG_LNKFILENAMEPART_XDC)_x.xdl, $(CFG_C_XDC))\r
35 # CFG_COBJ_XDC = $(patsubst %.c,%.$(OBJEXT),$(CFG_CFILE_XDC))\r
36 CFG_COBJ_XDC = $(patsubst %.c,%.oa15fg,$(CFG_CFILE_XDC))\r
37 # OBJ_PATHS += $(CFG_COBJ_XDC)\r
38 LNKCMD_FILE = $(CONFIGURO_DIR)/linker.cmd\r
39 SPACE := \r
40 SPACE += \r
41 XDC_GREP_STRING = $(CONFIGURO_DIRNAME)\r
42 # XDC_GREP_STRING = $(subst $(SPACE),\|,$(COMP_LIST_$(CORE)))\r
43 # XDC_GREP_STRING += \|$(CONFIGURO_DIRNAME)\r
44 endif\r
45 # Internal CFLAGS - normally doesn't change\r
46 CFLAGS_INTERNAL = -Wall -Wunknown-pragmas -c -mcpu=cortex-a15 -g -mfpu=neon -mfloat-abi=hard -mabi=aapcs -mapcs-frame \r
47 #-ffunction-sections -fdata-sections\r
48 CFLAGS_DIROPTS =\r
49 \r
50 #LNKFLAGS_INTERNAL = -nostartfiles -static -Wl,--gc-sections\r
51 \r
52 # CFLAGS based on profile selected\r
53 CFLAGS_XDCINTERNAL = -Dxdc_target_name__=A15F -Dxdc_target_types__=gnu/targets/arm/std.h -Dxdc_cfg__header__='$(CONFIGURO_DIR)/package/cfg/$(XDC_CFG_BASE_FILE_NAME)_xem3.h'\r
54 # Following 'if...' block is for an application; to add a #define for each\r
55 # component in the build. This is required to know - at compile time - which\r
56 # components are on which core.\r
57 ifndef MODULE_NAME\r
58 # Derive list of all packages from each of the components needed by the app\r
59 PKG_LIST_LOCAL = $(foreach COMP,$(COMP_LIST_$(CORE)),$($(COMP)_PKG_LIST))\r
60 \r
61 # Defines for the app and cfg source code to know which components/packages\r
62 # are included in the build for the local CORE...\r
63 CFLAGS_APP_DEFINES = $(foreach PKG,$(PKG_LIST_LOCAL),-D_LOCAL_$(PKG)_)\r
64 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_LOCAL),-D_BUILD_$(PKG)_)\r
65 \r
66 ifeq ($(CORE),a15host)\r
67 PKG_LIST_REMOTE = $(foreach COMP,$(COMP_LIST_a15host),$($(COMP)_PKG_LIST))\r
68 CFLAGS_APP_DEFINES += -D_LOCAL_CORE_a15host_\r
69 endif\r
70 \r
71 # Defines for the app and cfg source code to know which components/packages\r
72 # are included in the build for the remote CORE...\r
73 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_REMOTE),-D_REMOTE_$(PKG)_)\r
74 CFLAGS_APP_DEFINES += $(foreach PKG,$(PKG_LIST_REMOTE),-D_BUILD_$(PKG)_)\r
75 endif\r
76 ifeq ($(PROFILE_$(CORE)), debug)\r
77 CFLAGS_INTERNAL += -D_DEBUG_=1\r
78 endif\r
79 ifeq ($(PROFILE_$(CORE)), release)\r
80 LNKFLAGS_INTERNAL_PROFILE =\r
81 endif\r
82 \r
83 # Assemble CFLAGS from all other CFLAGS definitions\r
84 _CFLAGS = $(CFLAGS_INTERNAL) $(CFLAGS_XDCINTERNAL) $(CFLAGS_GLOBAL_$(CORE)) $(CFLAGS_LOCAL_COMMON) $(CFLAGS_LOCAL_$(CORE)) $(CFLAGS_LOCAL_$(PLATFORM)) $(CFLAGS_LOCAL_$(SOC)) $(CFLAGS_APP_DEFINES) $(CFLAGS_COMP_COMMON) $(CFLAGS_GLOBAL_$(PLATFORM))\r
85 \r
86 # Object file creation\r
87 # The second $(CC) compiles the source to generate object\r
88 $(OBJ_PATHS): $(OBJDIR)/%.$(OBJEXT): %.c\r
89 $(ECHO) \# Compiling $(PLATFORM):$(CORE):$(PROFILE_$(CORE)):$(APP_NAME)$(MODULE_NAME): $<\r
90 $(CC) -c -MD -MF $@.dep $(_CFLAGS) $(INCLUDES) -o $(OBJDIR)/$(basename $(notdir $<)).$(OBJEXT) $<\r
91 \r
92 ASMFLAGS =\r
93 # Object file creation\r
94 $(OBJ_PATHS_ASM): $(OBJDIR)/%.$(OBJEXT): %.asm\r
95 $(ECHO) \# Compiling $(PLATFORM):$(CORE):$(PROFILE_$(CORE)):$(APP_NAME)$(MODULE_NAME): $<\r
96 $(CC) -c -x assembler-with-cpp $(_CFLAGS) $(ASMFLAGS) $(INCLUDES) -o $(OBJDIR)/$(basename $(notdir $<)).$(OBJEXT) $<\r
97 \r
98 $(PACKAGE_PATHS): $(PACKAGEDIR)/%: %\r
99 $(ECHO) \# Copying $(PACKAGE_NAME)/$($(MODULE_NAME)_RELPATH)/$<\r
100 $(MKDIR) -p $(DEST_ROOT)/package/$(PACKAGE_SELECT)/$(PACKAGE_NAME)/$($(MODULE_NAME)_RELPATH)\r
101 $(CP) --parents -rf $< $(DEST_ROOT)/package/$(PACKAGE_SELECT)/$(PACKAGE_NAME)/$($(MODULE_NAME)_RELPATH)\r
102 \r
103 # Archive flags - normally doesn't change\r
104 ARFLAGS = cr\r
105 \r
106 # Archive/library file creation\r
107 $(LIBDIR)/$(MODULE_NAME).$(LIBEXT) : $(OBJ_PATHS_ASM) $(OBJ_PATHS)\r
108 $(ECHO) \#\r
109 $(ECHO) \# Archiving $(PLATFORM):$(CORE):$(PROFILE_$(CORE)):$(MODULE_NAME)\r
110 $(ECHO) \#\r
111 $(AR) $(ARFLAGS) $@ $(OBJ_PATHS_ASM) $(OBJ_PATHS)\r
112 \r
113 # Linker options and rules\r
114 LNKFLAGS_INTERNAL_COMMON =\r
115 \r
116 # Assemble Linker flags from all other LNKFLAGS definitions\r
117 _LNKFLAGS = $(LNKFLAGS_INTERNAL) $(LNKFLAGS_INTERNAL_COMMON) $(LNKFLAGS_INTERNAL_PROFILE) $(LNKFLAGS_GLOBAL_$(CORE)) $(LNKFLAGS_LOCAL_COMMON) $(LNKFLAGS_LOCAL_$(CORE))\r
118 \r
119 # Path of the RTS library - normally doesn't change for a given tool-chain\r
120 RTSLIB_PATH =\r
121 LIB_PATHS += $(EXT_LIB_a15host) $(CODEGEN_PATH_A15)/arm-none-eabi/lib/fpu/libc.a $(CODEGEN_PATH_A15)/arm-none-eabi/lib/fpu/libg.a $(CODEGEN_PATH_A15)/arm-none-eabi/lib/fpu/libm.a $(CODEGEN_PATH_A15)/arm-none-eabi/lib/fpu/librdimon.a $(CODEGEN_PATH_A15)/lib/gcc/arm-none-eabi/4.7.3/fpu/libgcc.a\r
122 \r
123 \r
124 LNK_LIBS = $(addprefix -l,$(LIB_PATHS))\r
125 # Linker - to create executable file\r
126 \r
127 ifeq ($(LOCAL_APP_NAME),)\r
128 EXE_NAME = $(BINDIR)/$(APP_NAME)_$(CORE)_$(PROFILE_$(CORE)).$(EXEEXT)\r
129 else\r
130 ifeq ($(PROFILE_$(CORE)),prod_release)\r
131 EXE_NAME = $(BINDIR)/$(LOCAL_APP_NAME).$(EXEEXT)\r
132 else\r
133 EXE_NAME = $(BINDIR)/$(LOCAL_APP_NAME)_$(PROFILE_$(CORE)).$(EXEEXT)\r
134 endif\r
135 endif\r
136 \r
137 $(EXE_NAME) : $(OBJ_PATHS_ASM) $(OBJ_PATHS) $(LIB_PATHS) $(LNKCMD_FILE) $(CONFIGURO_DIR)/package/cfg/$(CFG_COBJ_XDC)\r
138 $(ECHO) \# Linking into $(EXE_NAME)...\r
139 $(ECHO) \#\r
140 $(LNK) $(_LNKFLAGS) $(OBJ_PATHS_ASM) $(OBJ_PATHS) -T $(LNKCMD_FILE) -Map $@.map $(LIB_PATHS) -o $@ \r
141 $(ECHO) \#\r
142 $(ECHO) \# $@ created.\r
143 $(ECHO) \#\r
144 \r
145 ifeq ($(CONFIG_BLD_XDC_CUSTOM),)\r
146 CONFIG_BLD_FILE = $(CONFIG_BLD_XDC_$(ISA))\r
147 else\r
148 CONFIG_BLD_FILE = $(CONFIG_BLD_XDC_CUSTOM)\r
149 endif\r
150 ifeq ($(PLATFORM_XDC_CUSTOM),)\r
151 PLATFORM_XDC_NAME = $(PLATFORM_XDC)\r
152 else\r
153 PLATFORM_XDC_NAME = $(PLATFORM_XDC_CUSTOM)\r
154 endif\r
155 \r
156 # XDC specific - assemble XDC-Configuro command\r
157 CONFIGURO_CMD = $(xdc_PATH)/xs xdc.tools.configuro --generationOnly -o $(CONFIGURO_DIR) -t $(TARGET_XDC) -p "$(PLATFORM_XDC_NAME)" \\r
158 -r debug -c $(CODEGEN_PATH_A15) -b $(CONFIG_BLD_FILE) $(XDC_CFG_FILE_NAME)\r
159 _XDC_GREP_STRING = \"$(XDC_GREP_STRING)\"\r
160 EGREP_CMD = $(EGREP) -ivw $(XDC_GREP_STRING) $(XDCLNKCMD_FILE)\r
161 \r
162 ifneq ($(DEST_ROOT),)\r
163 DEST_ROOT += /\r
164 endif\r
165 # Invoke configuro for the rest of the components\r
166 # NOTE: 1. String handling is having issues with various make versions when the \r
167 # cammand is directly tried to be given below. Hence, as a work-around, \r
168 # the command is re-directed to a file (shell or batch file) and then \r
169 # executed\r
170 # 2. The linker.cmd file generated, includes the libraries generated by\r
171 # XDC. An egrep to search for these and omit in the .cmd file is added\r
172 # after configuro is done\r
173 #$(CFG_CFILE_XDC) : $(XDC_CFG_FILE)\r
174 xdc_configuro : $(XDC_CFG_FILE)\r
175 $(ECHO) \# Invoking configuro...\r
176 $(ECHO) -e $(CONFIGURO_CMD) > $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
177 ifeq ($(OS),Windows_NT)\r
178 CACLS $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat /E /P Everyone:F\r
179 $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
180 else\r
181 $(CHMOD) a+x $(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
182 ./$(DEST_ROOT)maketemp_configuro_cmd_$(CORE).bat\r
183 endif\r
184 # $(CP) $(XDCLNKCMD_FILE) $(LNKCMD_FILE)\r
185 # $(ECHO) @ $(EGREP_CMD) > maketemp_egrep_cmd.bat\r
186 # ./maketemp_egrep_cmd.bat | $(CYGWINPATH)/bin/tail -n+3 > $(LNKCMD_FILE)\r
187 # $(EGREP_CMD) > $(LNKCMD_FILE)\r
188 # $(EGREP) -iv "$(XDC_GREP_STRING)" $(XDCLNKCMD_FILE) > $(LNKCMD_FILE)\r
189 $(ECHO) \# Configuro done!\r
190 \r
191 $(LNKCMD_FILE) :\r
192 # $(CP) $(XDCLNKCMD_FILE) $(LNKCMD_FILE)\r
193 # $(ECHO) @ $(EGREP_CMD) > maketemp_egrep_cmd.bat\r
194 # ./maketemp_egrep_cmd.bat | $(CYGWINPATH)/bin/tail -n+3 > $(LNKCMD_FILE)\r
195 # $(EGREP_CMD) > $(LNKCMD_FILE)\r
196 \r
197 ifndef MODULE_NAME\r
198 $(CONFIGURO_DIR)/package/cfg/$(CFG_COBJ_XDC) : $(CFG_C_XDC)\r
199 $(ECHO) \# Compiling generated $< to $@ ...\r
200 $(CC) $(_CFLAGS) $(INCLUDES) $(CFLAGS_DIROPTS) -o $(CONFIGURO_DIR)/package/cfg/$(CFG_COBJ_XDC) $(CFG_C_XDC)\r
201 endif\r
202 \r
203 # Include dependency make files that were generated by $(CC)\r
204 -include $(SRCS:%.c=$(DEPDIR)/%.P)\r
205 # Nothing beyond this point\r