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