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