]> rtime.felk.cvut.cz Git - arc.git/blob - scripts/rules.mk
Added memory usage script. Enable with CFG_PRINT_MEM_USAGE
[arc.git] / scripts / rules.mk
1 \r
2 \r
3 ###############################################################################\r
4 # BUILD SETTINGS                                                              #\r
5 ###############################################################################\r
6 \r
7 # Board settings\r
8 include $(ROOTDIR)/boards/$(BOARDDIR)/build_config.mk\r
9 \r
10 # Project settings\r
11 -include ../build_config.mk\r
12 \r
13 # Perform build system version check\r
14 include $(ROOTDIR)/scripts/version_check.mk\r
15 \r
16 COMPILER?=gcc\r
17 ifeq (${COMPILER},gcc)\r
18 # Assume that the board have set DEFAULT_CROSS_COMPILE\r
19 CROSS_COMPILE?=${DEFAULT_CROSS_COMPILE}\r
20 endif\r
21 \r
22 ifeq (${COMPILER},cw)\r
23 CW_COMPILE?=${DEFAULT_CW_COMPILE}\r
24 endif\r
25 \r
26 # Check cross compiler setting against default from board config\r
27 ifeq (${COMPILER},cw)\r
28 ifneq (${CW_COMPILE},${DEFAULT_CW_COMPILE})\r
29 ${warning Not using default cross compiler for architecture.}\r
30 ${warning CROSS_COMPILE:         ${CW_COMPILE} [${origin CW_COMPILE}]}\r
31 ${warning DEFAULT_CROSS_COMPILE: ${DEFAULT_CW_COMPILE} [${origin DEFAULT_CW_COMPILE}]}\r
32 endif\r
33 else\r
34 ifneq (${DEFAULT_CROSS_COMPILE},)\r
35 ifneq (${CROSS_COMPILE},${DEFAULT_CROSS_COMPILE})\r
36 ${warning Not using default cross compiler for architecture.}\r
37 ${warning CROSS_COMPILE:         ${CROSS_COMPILE} [${origin CROSS_COMPILE}]}\r
38 ${warning DEFAULT_CROSS_COMPILE: ${DEFAULT_CROSS_COMPILE} [${origin DEFAULT_CROSS_COMPILE}]}\r
39 endif\r
40 endif\r
41 endif\r
42 \r
43 ###############################################################################\r
44 # MODULE CONFIGURATION                                                        #\r
45 ###############################################################################\r
46 \r
47 # Some useful vars\r
48 CFG_ARCH_$(ARCH):=y\r
49 RELDIR := $(subst $(TOPDIR)/,,$(CURDIR))\r
50 target := $(subst /,_,$(SUBDIR))\r
51 goal=$@\r
52 \r
53 define MOD_AVAIL_template\r
54         MOD_$(1)=y\r
55 endef\r
56 \r
57 define MOD_USE_template\r
58         USE_$(1)=y\r
59         def-y += USE_$(1)\r
60 endef\r
61 \r
62 define CFG_template\r
63         CFG_$(1)=y\r
64         def-y += CFG_$(1)\r
65 endef\r
66 \r
67 $(foreach mod,$(MOD_AVAIL),$(eval $(call MOD_AVAIL_template,${mod})))\r
68 $(foreach mod,$(sort $(MOD_USE)),$(eval $(call MOD_USE_template,${mod})))\r
69 $(foreach mod,$(CFG),$(eval $(call CFG_template,${mod})))\r
70 #def-y += $(ARCH) $(ARCH_FAM) $(ARCH_MCU) \r
71 \r
72 # Select console / debug\r
73 $(foreach mod,$(SELECT_OS_CONSOLE),$(eval $(call MOD_USE_template,${mod})))\r
74 $(foreach mod,$(SELECT_CONSOLE),$(eval $(call MOD_USE_template,${mod})))\r
75 \r
76 def-y += SELECT_OS_CONSOLE=$(if $(SELECT_OS_CONSOLE),$(SELECT_OS_CONSOLE),TTY_NONE)\r
77 def-y += SELECT_CONSOLE=$(if $(SELECT_CONSOLE),$(SELECT_CONSOLE),TTY_NONE)\r
78 def-$(USE_DEBUG_PRINTF) += USE_DEBUG_PRINTF \r
79 \r
80 not_avail = $(filter-out $(MOD_AVAIL),$(sort $(MOD_USE)))\r
81 ifneq ($(not_avail),)\r
82 $(error Trying to build a module that is not available: $(not_avail))\r
83 endif\r
84 \r
85 \r
86 \r
87 ###############################################################################\r
88 # TOOLS CONFIGURATION                                                         #\r
89 ###############################################################################\r
90 \r
91 # set debug optimization level as default\r
92 ifeq ($(SELECT_OPT),)\r
93 SELECT_OPT=OPT_DEBUG\r
94 endif\r
95 \r
96 $(eval CFG_$(SELECT_OPT)=y)\r
97 \r
98 ARCH_PATH-y = arch/$(ARCH_FAM)/$(ARCH)\r
99 \r
100 # Include compiler settings\r
101 include $(ROOTDIR)/scripts/cc_$(COMPILER).mk\r
102 \r
103 # Include pclint or splint settings\r
104 ifneq ($(PCLINT),)\r
105 include $(ROOTDIR)/scripts/cc_pclint.mk\r
106 endif\r
107 ifneq ($(SPLINT),)\r
108 include $(ROOTDIR)/scripts/cc_splint.mk\r
109 endif\r
110 \r
111 \r
112 \r
113 ###############################################################################\r
114 # PROJECT MAKEFILE                                                            #\r
115 ###############################################################################\r
116 \r
117 # Include project makefile\r
118 include ../makefile\r
119 \r
120 # All module object files (guarded for backwards compatability)\r
121 ifndef _BOARD_COMMON_MK\r
122 include $(ROOTDIR)/boards/board_common.mk\r
123 endif\r
124 \r
125 \r
126 ##### For backwards compatability with older project makefiles:\r
127 \r
128 # Remove dependency on libkernel\r
129 deprecated-libs += $(ROOTDIR)/libs/libkernel_$(ARCH_MCU).a\r
130 deprecated-libs-included = $(filter $(deprecated-libs),$(libitem-y))\r
131 ifneq ($(deprecated-libs-included),)\r
132 $(info >>>> Ignoring deprecated lib dependencies: $(deprecated-libs-included)')\r
133 libitem-y := $(filter-out $(deprecated-libs),$(libitem-y))\r
134 endif\r
135 \r
136 # Automatic preprocessing of std linkscripts\r
137 old-ldcmdfile = $(ROOTDIR)/$(ARCH_PATH-y)/scripts/linkscript_gcc.ldf\r
138 new-ldcmdfile = linkscript_gcc.ldp\r
139 old-ldcmdfile-used = $(filter $(old-ldcmdfile),$(ldcmdfile-y))\r
140 ifneq ($(old-ldcmdfile-used),)\r
141 $(info >>>> Changing linkscript to preprocessed version: $(old-ldcmdfile) -> $(new-ldcmdfile)')\r
142 ldcmdfile-y := $(subst $(old-ldcmdfile),$(new-ldcmdfile),$(ldcmdfile-y))\r
143 vpath %.ldf $(ROOTDIR)/$(ARCH_PATH-y)/scripts\r
144 endif\r
145 \r
146 #####\r
147 \r
148 inc-y += ../include\r
149 inc-y += $(ROOTDIR)/include\r
150 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)\r
151 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)/$(ARCH)\r
152   \r
153 VPATH += $(ROOTDIR)/$(SUBDIR)/src\r
154 VPATH += $(ROOTDIR)/$(SUBDIR)\r
155 \r
156 \r
157 \r
158 ###############################################################################\r
159 # LINT                                                                        #\r
160 ###############################################################################\r
161 \r
162 LINT_EXCLUDE_PATHS := $(abspath $(LINT_EXCLUDE_PATHS))\r
163 $(info $(LINT_EXCLUDE_PATHS))\r
164 \r
165 LINT_BAD_EXCLUDE_PATHS := $(filter %/,$(LINT_EXCLUDE_PATHS))\r
166 ifneq ($(LINT_BAD_EXCLUDE_PATHS),)\r
167 $(warning LINT_EXCLUDE_PATHS entries must not end in '/'. Ignoring $(LINT_BAD_EXCLUDE_PATHS))\r
168 endif\r
169 \r
170 LINT_NICE_EXCLUDE_PATHS := $(filter-out %/,$(LINT_EXCLUDE_PATHS))\r
171 LINT_NICE_EXCLUDE_PATHS := $(foreach path,$(LINT_NICE_EXCLUDE_PATHS),$(path)/)\r
172 \r
173 ifneq ($(PCLINT),)\r
174 define run_pclint\r
175 $(if \r
176 $(filter $(dir $(abspath $<)),$(LINT_NICE_EXCLUDE_PATHS)),\r
177 $(info $(abspath $<):0:0: Info: Not running lint check on $(abspath $<)),\r
178 $(Q)$(PCLINT) $(lint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<))\r
179 endef\r
180 endif\r
181 \r
182 ifneq ($(SPLINT),)\r
183 define run_splint\r
184 $(if \r
185 $(filter $(dir $(abspath $<)),$(LINT_NICE_EXCLUDE_PATHS)),\r
186 $(info $(abspath $<):0:0: Info: Not running lint check on $(abspath $<)),\r
187 $(Q)$(SPLINT) $(splint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<))\r
188 endef\r
189 endif\r
190 \r
191 \r
192 \r
193 ###############################################################################\r
194 # TOP-LEVEL TARGETS                                                           #\r
195 ###############################################################################\r
196 \r
197 .PHONY clean: \r
198 clean: FORCE\r
199         @echo\r
200         @echo "  >> Cleaning $(CURDIR)"\r
201         $(Q)-rm -f *.o *.d *.h *.elf *.a *.ldp *.lcf *.tmp *.s *.c *.map *.out\r
202         @echo\r
203         \r
204 .PHONY : config \r
205 config: FORCE\r
206         @echo ">>>> Available modules:" $(sort $(MOD_AVAIL))\r
207         @echo ">>>> Used modules:     " $(sort $(MOD_USE)) \r
208         @echo $(MOD) ${def-y}\r
209 \r
210 .PHONY : module_config\r
211 module_config: FORCE\r
212         @echo ">>>> Available modules:" $(sort $(MOD_AVAIL))\r
213         @echo ">>>> Used modules:     " $(sort $(MOD_USE)) \r
214 \r
215 \r
216 FORCE:\r
217 \r
218 $(ROOTDIR)/binaries/$(BOARDDIR):\r
219         @mkdir -p $@\r
220 \r
221 .PHONY all:\r
222 all: module_config $(build-exe-y) $(build-hex-y) $(build-lib-y) $(build-bin-y) $(ROOTDIR)/binaries/$(BOARDDIR)\r
223         $(Q)cp -v $(build-lib-y) $(build-exe-y) $(build-hex-y) $(build-bin-y) $(ROOTDIR)/binaries/$(BOARDDIR)\r
224         \r
225 \r
226 \r
227 .SUFFIXES:\r
228 \r
229 ifeq ($(COMPILER),cw)\r
230 define run_mem_usage-$(CFG_PRINT_MEM_USAGE)\r
231         @gawk -f $(ROOTDIR)/scripts/mem_usage_cw.awk  $(subst .$(TE),.map, $@)\r
232 endef\r
233 endif\r
234 \r
235 ###############################################################################\r
236 # TARGETS                                                                     #\r
237 ###############################################################################\r
238         \r
239 # Simple depencendy stuff\r
240 -include $(subst .o,.d,$(obj-y))\r
241 # Some dependency for xxx_offset.c/h also\r
242 -include $(subst .h,.d,$(dep-y))\r
243 \r
244 # Compile\r
245 %.o: %.c\r
246         @echo\r
247         @echo "  >> CC $(notdir $<)"\r
248         $(Q)$(CC) -c $(CFLAGS) -o $(goal) $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $(abspath $<)\r
249 # run lint if enabled\r
250         $(run_pclint)\r
251         $(run_splint)\r
252 \r
253 # Assembler\r
254 %.o: %.s\r
255         @echo\r
256         @echo "  >> AS $(notdir $<)"\r
257         $(Q)$(AS) $(ASFLAGS) -o $(goal) $<\r
258         \r
259 # PP Assembler  \r
260 \r
261 .SECONDARY %.s: # Don't remove *.s files (needed for debugging)\r
262 \r
263 %.s: %.sx\r
264         @echo\r
265         @echo "  >> CPP $(notdir $<)"\r
266         $(Q)$(CPP) $(CPP_ASM_FLAGS) -o $@ $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
267 \r
268 # Board linker files are in the board directory \r
269 inc-y += $(ROOTDIR)/boards/$(BOARDDIR)\r
270 \r
271 \r
272 # *.ldf (file on disc) -> *.lcf (preprocessed *.ldf file)\r
273 # Preprocess linker files..\r
274 %.lcf %.ldp: %.ldf\r
275         @echo\r
276         @echo "  >> CPP $(notdir $<)"\r
277         $(Q)$(CPP) -E -P $(CPP_ASM_FLAGS) -o $@ $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
278 \r
279 .PHONY $(ROOTDIR)/libs:\r
280 $(ROOTDIR)/libs:\r
281         $(Q)mkdir -p $@\r
282 \r
283 dep-y += $(ROOTDIR)/libs\r
284         \r
285 # lib output\r
286 $(build-lib-y): $(dep-y) $(obj-y)\r
287         @echo\r
288         @echo "  >> AR $@"   \r
289         $(Q)$(AR) -r -o $@ $(obj-y) 2> /dev/null\r
290 \r
291 # hex output\r
292 $(build-hex-y): $(build-exe-y)\r
293         @echo\r
294         @echo "  >> OBJCOPY $@"   \r
295         $(Q)$(CROSS_COMPILE)objcopy -O ihex $< $@\r
296         \r
297 # bin output\r
298 $(build-bin-y): $(build-exe-y)\r
299         @echo\r
300         @echo "  >> OBJCOPY $@"   \r
301         $(Q)$(CROSS_COMPILE)objcopy -O binary $< $@     \r
302 \r
303 # Linker\r
304 $(build-exe-y): $(dep-y) $(obj-y) $(sim-y) $(libitem-y) $(ldcmdfile-y)\r
305         @echo\r
306         @echo "  >> LD $@"\r
307 ifeq ($(CROSS_COMPILE)$(COMPILER),gcc)\r
308         $(Q)$(CC) $(LDFLAGS) -o $@ $(libpath-y) $(obj-y) $(lib-y) $(libitem-y)  \r
309 else\r
310         $(Q)$(LD) $(LDFLAGS) $(LD_FILE) $(ldcmdfile-y) -o $@ $(libpath-y) $(LD_START_GRP) $(obj-y) $(lib-y) $(libitem-y) $(LD_END_GRP) $(LDMAPFILE)\r
311         $(run_mem_usage-y)\r
312  ifdef CFG_HC1X\r
313     # Print memory layout\r
314         @$(CROSS_COMPILE)objdump -h $@ | gawk -f $(ROOTDIR)/scripts/hc1x_memory.awk\r
315  else\r
316   ifeq ($(COMPILER),gcc)        \r
317     # Print memory layout\r
318         @echo ""\r
319         @gawk --non-decimal-data -f $(ROOTDIR)/scripts/gcc_map_memory.awk $(subst .elf,.map,$@)\r
320   endif # ($(COMPILER),gcc)\r
321    \r
322   ifeq ($(BUILD_LOAD_MODULE),y)\r
323         @$(CROSS_COMPILE)objcopy -O srec $@ $@.raw.s19\r
324         srec_cat $@.raw.s19 --crop 0x8008000 0x803fffc --fill 0x00 0x8008000 0x803fffc --l-e-crc32 0x803fffc -o $@.lm.s19\r
325   endif #($(BUILD_LOAD_MODULE),y)\r
326    \r
327  endif #CFG_MC912DG128A\r
328 \r
329 endif #($(CROSS_COMPILE),)\r
330         @echo\r
331         @echo "  >>>>>>>  DONE  <<<<<<<<<"\r
332         @echo\r
333         \r