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