]> rtime.felk.cvut.cz Git - arc.git/blob - scripts/rules.mk
Bug: mpc560x was forced to defined sleep
[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 CW_COMPILE:            ${CW_COMPILE} [${origin CW_COMPILE}]}\r
31 ${warning DEFAULT_CW_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 # Misc tools\r
126 ifneq ($(CFG_BOOT),)\r
127 include $(ROOTDIR)/boards/$(BOARDDIR)/boot_info.mk\r
128 include $(ROOTDIR)/scripts/bootloader_image.mk\r
129 endif  \r
130 \r
131 ##### For backwards compatability with older project makefiles:\r
132 \r
133 # Remove dependency on libkernel\r
134 deprecated-libs += $(ROOTDIR)/libs/libkernel_$(ARCH_MCU).a\r
135 deprecated-libs-included = $(filter $(deprecated-libs),$(libitem-y))\r
136 ifneq ($(deprecated-libs-included),)\r
137 $(info >>>> Ignoring deprecated lib dependencies: $(deprecated-libs-included)')\r
138 libitem-y := $(filter-out $(deprecated-libs),$(libitem-y))\r
139 endif\r
140 \r
141 # Automatic preprocessing of std linkscripts\r
142 old-ldcmdfile = $(ROOTDIR)/$(ARCH_PATH-y)/scripts/linkscript_gcc.ldf\r
143 new-ldcmdfile = linkscript_gcc.ldp\r
144 old-ldcmdfile-used = $(filter $(old-ldcmdfile),$(ldcmdfile-y))\r
145 ifneq ($(old-ldcmdfile-used),)\r
146 $(info >>>> Changing linkscript to preprocessed version: $(old-ldcmdfile) -> $(new-ldcmdfile)')\r
147 ldcmdfile-y := $(subst $(old-ldcmdfile),$(new-ldcmdfile),$(ldcmdfile-y))\r
148 vpath %.ldf $(ROOTDIR)/$(ARCH_PATH-y)/scripts\r
149 endif\r
150 \r
151 #####\r
152 \r
153 inc-y += ../include\r
154 inc-y += $(ROOTDIR)/include\r
155 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)\r
156 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)/$(ARCH)\r
157   \r
158 VPATH += $(ROOTDIR)/$(SUBDIR)/src\r
159 VPATH += $(ROOTDIR)/$(SUBDIR)\r
160 \r
161 \r
162 \r
163 ###############################################################################\r
164 # LINT                                                                        #\r
165 ###############################################################################\r
166 \r
167 LINT_EXCLUDE_PATHS := $(abspath $(LINT_EXCLUDE_PATHS))\r
168 $(info $(LINT_EXCLUDE_PATHS))\r
169 \r
170 LINT_BAD_EXCLUDE_PATHS := $(filter %/,$(LINT_EXCLUDE_PATHS))\r
171 ifneq ($(LINT_BAD_EXCLUDE_PATHS),)\r
172 $(warning LINT_EXCLUDE_PATHS entries must not end in '/'. Ignoring $(LINT_BAD_EXCLUDE_PATHS))\r
173 endif\r
174 \r
175 LINT_NICE_EXCLUDE_PATHS := $(filter-out %/,$(LINT_EXCLUDE_PATHS))\r
176 LINT_NICE_EXCLUDE_PATHS := $(foreach path,$(LINT_NICE_EXCLUDE_PATHS),$(path)/)\r
177 \r
178 ifneq ($(PCLINT),)\r
179 define run_pclint\r
180 $(if \r
181 $(filter $(dir $(abspath $<)),$(LINT_NICE_EXCLUDE_PATHS)),\r
182 $(info $(abspath $<):0:0: Info: Not running lint check on $(abspath $<)),\r
183 $(Q)$(PCLINT) $(lint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<))\r
184 endef\r
185 endif\r
186 \r
187 ifneq ($(SPLINT),)\r
188 define run_splint\r
189 $(if \r
190 $(filter $(dir $(abspath $<)),$(LINT_NICE_EXCLUDE_PATHS)),\r
191 $(info $(abspath $<):0:0: Info: Not running lint check on $(abspath $<)),\r
192 $(Q)$(SPLINT) $(splint_extra) $(addprefix $(lintinc_ext),$(inc-y)) $(addprefix $(lintdef_ext),$(def-y)) $(abspath $<))\r
193 endef\r
194 endif\r
195 \r
196 \r
197 \r
198 ###############################################################################\r
199 # TOP-LEVEL TARGETS                                                           #\r
200 ###############################################################################\r
201 \r
202 .PHONY clean: \r
203 clean: FORCE\r
204         @echo\r
205         @echo "  >> Rules Clean $(CURDIR)"\r
206         $(Q)-rm -v *\r
207         $(Q)-rm -v $(ROOTDIR)/binaries/$(BOARDDIR)/*\r
208         \r
209 .PHONY : config \r
210 config: FORCE\r
211         @echo ">>>> Available modules:" $(sort $(MOD_AVAIL))\r
212         @echo ">>>> Used modules:     " $(sort $(MOD_USE)) \r
213         @echo $(MOD) ${def-y}\r
214 \r
215 .PHONY : module_config\r
216 module_config: FORCE\r
217         @echo ">>>> Available modules:" $(sort $(MOD_AVAIL))\r
218         @echo ">>>> Used modules:     " $(sort $(MOD_USE)) \r
219 \r
220 \r
221 FORCE:\r
222 \r
223 $(ROOTDIR)/binaries/$(BOARDDIR):\r
224         @mkdir -p $@\r
225 \r
226 all-mod += $(build-hex-y) $(build-exe-y) $(build-srec-y) \r
227 all-mod += $(build-lib-y) $(build-bin-y)\r
228 \r
229 .PHONY all:\r
230 all: | module_config $(ROOTDIR)/binaries/$(BOARDDIR) $(all-mod) $(all-mod-post)\r
231 all: module_config $(all-mod) $(all-mod-post) $(ROOTDIR)/binaries/$(BOARDDIR) \r
232         @cp -v $(all-mod) $(all-mod-post) $(ROOTDIR)/binaries/$(BOARDDIR)\r
233 \r
234 .SUFFIXES:\r
235 \r
236 \r
237 ###############################################################################\r
238 # TARGETS                                                                     #\r
239 ###############################################################################\r
240         \r
241 # Simple depencendy stuff\r
242 -include $(subst .o,.d,$(obj-y))\r
243 # Some dependency for xxx_offset.c/h also\r
244 -include $(subst .h,.d,$(dep-y))\r
245 \r
246 # Compile\r
247 %.o: %.c\r
248         @echo\r
249         @echo "  >> CC $(notdir $<)"\r
250         $(Q)$(CC) -c $(CFLAGS) $(CFLAGS_$@) -o $(goal) $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $(abspath $<)\r
251         $(do-compile-post)\r
252 # run lint if enabled\r
253         $(run_pclint)\r
254         $(run_splint)\r
255 \r
256 # Assembler\r
257 %.o: %.s\r
258         @echo\r
259         @echo "  >> AS $(notdir $<)"\r
260         $(Q)$(AS) $(ASFLAGS) -o $(goal) $<\r
261         \r
262 # PP Assembler  \r
263 \r
264 .SECONDARY %.s: # Don't remove *.s files (needed for debugging)\r
265 \r
266 %.s: %.sx\r
267         @echo\r
268         @echo "  >> CPP $(notdir $<)"\r
269         $(Q)$(CPP) $(CPP_ASM_FLAGS) $(CPPOUT) $@ $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
270 \r
271 # Board linker files are in the board directory \r
272 inc-y += $(ROOTDIR)/boards/$(BOARDDIR)\r
273 \r
274 \r
275 # *.ldf (file on disc) -> *.lcf (preprocessed *.ldf file)\r
276 # Preprocess linker files..\r
277 %.lcf %.ldp: %.ldf\r
278         @echo\r
279         @echo "  >> CPP $(notdir $<)"\r
280         $(Q)$(CPP) -P $(CPP_ASM_FLAGS) $(CPPOUT) $@ $(addprefix -I,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
281 \r
282 .PHONY $(ROOTDIR)/libs:\r
283 $(ROOTDIR)/libs:\r
284         $(Q)mkdir -p $@\r
285 \r
286 dep-y += $(ROOTDIR)/libs\r
287         \r
288 # lib output\r
289 $(build-lib-y): $(dep-y) $(obj-y)\r
290         @echo\r
291         @echo "  >> AR $@"   \r
292         $(Q)$(AR) -r -o $@ $(obj-y) 2> /dev/null\r
293 \r
294 # hex output\r
295 $(build-hex-y): $(build-exe-y)\r
296         @echo\r
297         @echo "  >> OBJCOPY $@"   \r
298         $(Q)$(CROSS_COMPILE)objcopy -O ihex $< $@\r
299         \r
300 # bin output\r
301 #$(build-bin-y): $(build-exe-y)\r
302 #       @echo\r
303 #       @echo "  >> OBJCOPY $@"   \r
304 #       $(Q)$(CROSS_COMPILE)objcopy -O binary $< $@     \r
305 \r
306 # Linker\r
307 $(build-exe-y): $(dep-y) $(obj-y) $(sim-y) $(libitem-y) $(ldcmdfile-y)\r
308         @echo\r
309         @echo "  >> LD $@"\r
310 ifeq ($(CROSS_COMPILE)$(COMPILER),gcc)\r
311         $(Q)$(CC) $(LDFLAGS) -o $@ $(libpath-y) $(obj-y) $(lib-y) $(libitem-y)  \r
312 else\r
313         $(Q)$(LD) $(LDFLAGS) $(LD_FILE) $(ldcmdfile-y) -o $@ $(libpath-y) $(LD_START_GRP) $(obj-y) $(lib-y) $(libitem-y) $(LD_END_GRP) $(LDMAPFILE)\r
314         $(do-memory-footprint)\r
315         $(do-memory-footprint2-y)\r
316 endif #($(CROSS_COMPILE),)\r
317         @echo\r
318         @echo "  >>>>>>>  DONE  <<<<<<<<<"\r
319         @echo\r
320         \r