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