]> rtime.felk.cvut.cz Git - arc.git/blob - scripts/rules.mk
Merged in from mpc551x_mcal
[arc.git] / scripts / rules.mk
1 \r
2 CFG_ARCH_$(ARCH):=y\r
3 \r
4 RELDIR := $(subst $(TOPDIR)/,,$(CURDIR))\r
5 \r
6 # Create the target name... \r
7 target := $(subst /,_,$(SUBDIR))\r
8 \r
9 #goal=$(subst /cygdrive/c/,c:/,$(abspath $@))\r
10 #goal=$(abspath $@)\r
11 goal=$@\r
12 \r
13 #===== MODULE CONFIGURATION =====\r
14 include $(ROOTDIR)/boards/$(BOARDDIR)/build_config.mk\r
15 -include ../build_config.mk\r
16 \r
17 \r
18 define MOD_AVAIL_template\r
19         MOD_$(1)=y\r
20 endef\r
21 \r
22 define MOD_USE_template\r
23         USE_$(1)=y\r
24         def-y += USE_$(1)\r
25 endef\r
26 \r
27 define CFG_template\r
28         CFG_$(1)=y\r
29         def-y += CFG_$(1)\r
30 endef\r
31 \r
32 $(foreach mod,$(MOD_AVAIL),$(eval $(call MOD_AVAIL_template,${mod})))\r
33 $(foreach mod,$(MOD_USE),$(eval $(call MOD_USE_template,${mod})))\r
34 $(foreach mod,$(CFG),$(eval $(call CFG_template,${mod})))\r
35 #def-y += $(ARCH) $(ARCH_FAM) $(ARCH_MCU) \r
36 \r
37 # Select console / debug\r
38 $(foreach mod,$(SELECT_OS_CONSOLE),$(eval $(call MOD_USE_template,${mod})))\r
39 $(foreach mod,$(SELECT_CONSOLE),$(eval $(call MOD_USE_template,${mod})))\r
40 \r
41 def-y += SELECT_OS_CONSOLE=$(if $(SELECT_OS_CONSOLE),$(SELECT_OS_CONSOLE),TTY_NONE)\r
42 def-y += SELECT_CONSOLE=$(if $(SELECT_CONSOLE),$(SELECT_CONSOLE),TTY_NONE)\r
43 def-$(USE_DEBUG_PRINTF) += USE_DEBUG_PRINTF \r
44 \r
45 not_avail = $(filter-out $(MOD_AVAIL),$(MOD_USE))\r
46 ifneq ($(not_avail),)\r
47 $(error Trying to build a module that is not available: $(not_avail))\r
48 endif\r
49 \r
50 #===== COMPILER CONFIG =====\r
51 \r
52 # set debug optimization level as default\r
53 ifeq ($(SELECT_OPT),)\r
54 SELECT_OPT=OPT_DEBUG\r
55 endif\r
56 \r
57 $(eval CFG_$(SELECT_OPT)=y)\r
58 \r
59 ARCH_PATH-y = arch/$(ARCH_FAM)/$(ARCH)\r
60 \r
61 # Include compiler generic and arch specific\r
62 COMPILER?=gcc\r
63 ifneq ($(ARCH),)\r
64 include $(ROOTDIR)/$(ARCH_PATH-y)/scripts/gcc.mk\r
65 endif\r
66 include $(ROOTDIR)/scripts/cc_$(COMPILER).mk\r
67 \r
68 # Include pclint or splint settings\r
69 ifneq ($(PCLINT),)\r
70 include $(ROOTDIR)/scripts/cc_pclint.mk\r
71 endif\r
72 ifneq ($(SPLINT),)\r
73 include $(ROOTDIR)/scripts/cc_splint.mk\r
74 endif\r
75 \r
76 \r
77 \r
78 # Get object files\r
79 include ../makefile\r
80 \r
81 # Perform build system version check\r
82 include $(ROOTDIR)/scripts/version_check.mk\r
83 \r
84 ##### For backwards compatability with older project makefiles\r
85 # Remove dependency on libkernel\r
86 deprecated-libs += $(ROOTDIR)/libs/libkernel_$(ARCH_MCU).a\r
87 deprecated-libs-included = $(filter $(deprecated-libs),$(libitem-y))\r
88 ifneq ($(deprecated-libs-included),)\r
89 $(info >>>> Ignoring deprecated lib dependencies: $(deprecated-libs-included)')\r
90 libitem-y := $(filter-out $(deprecated-libs),$(libitem-y))\r
91 endif\r
92 \r
93 # Automatic preprocessing of std linkscripts\r
94 old-ldcmdfile = $(ROOTDIR)/$(ARCH_PATH-y)/scripts/linkscript_gcc.ldf\r
95 new-ldcmdfile = linkscript_gcc.ldp\r
96 old-ldcmdfile-used = $(filter $(old-ldcmdfile),$(ldcmdfile-y))\r
97 ifneq ($(old-ldcmdfile-used),)\r
98 $(info >>>> Changing linkscript to preprocessed version: $(old-ldcmdfile) -> $(new-ldcmdfile)')\r
99 ldcmdfile-y := $(subst $(old-ldcmdfile),$(new-ldcmdfile),$(ldcmdfile-y))\r
100 vpath %.ldf $(ROOTDIR)/$(ARCH_PATH-y)/scripts\r
101 endif\r
102 \r
103 #####\r
104 \r
105 inc-y += $(ROOTDIR)/include\r
106 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)\r
107 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)/$(ARCH)\r
108 \r
109 \r
110 .PHONY clean: \r
111 clean: FORCE\r
112         @-rm -f *.o *.d *.h *.elf *.a *.ldp\r
113 \r
114 .PHONY config: \r
115 config: FORCE\r
116         @echo "board   modules:" $(MOD_AVAIL)\r
117         @echo "example modules:" $(MOD_USE)\r
118         @echo $(MOD) ${def-y}\r
119 \r
120 FORCE:\r
121 \r
122 $(ROOTDIR)/binaries:\r
123         @mkdir -p $@\r
124 \r
125 # build- targets are "end" target that the included makefile want's to build\r
126 .PHONY all:\r
127 all: $(build-exe-y) $(build-hex-y) $(build-lib-y) $(build-bin-y) $(ROOTDIR)/binaries\r
128         @cp -v $(build-lib-y) $(build-exe-y) $(build-hex-y) $(build-bin-y) $(ROOTDIR)/binaries\r
129 \r
130 \r
131 # Determine what kind of filetype to build from  \r
132 VPATH += $(ROOTDIR)/$(SUBDIR)/src\r
133 VPATH += $(ROOTDIR)/$(SUBDIR)\r
134 \r
135 inc-y += ../include\r
136 \r
137 .SUFFIXES:\r
138 \r
139 # Simple depencendy stuff\r
140 -include $(subst .o,.d,$(obj-y))\r
141 # Some dependency for xxx_offset.c/h also\r
142 -include $(subst .h,.d,$(dep-y))\r
143 \r
144 #LINT:\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 # Compile\r
176 %.o: %.c\r
177         @echo "  >> CC $(notdir $<)"\r
178 # compile\r
179         $(Q)$(CC) -c $(CFLAGS) -o $(goal) $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $(abspath $<)\r
180 # run lint if enabled\r
181         $(run_pclint)\r
182         $(run_splint)\r
183 \r
184 # Assembler\r
185 \r
186 %.o: %.s\r
187         @echo "  >> AS $(notdir $<)  $(ASFLAGS)"\r
188         $(Q)$(AS) $(ASFLAGS) -o $(goal) $<\r
189         \r
190 # PP Assembler  \r
191 #.SECONDARY %.s:\r
192 \r
193 %.s: %.sx\r
194         @echo "  >> CPP $(notdir $<)"\r
195         $(Q)$(CPP) -x assembler-with-cpp -E -o $@ $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
196 \r
197 \r
198 # Board linker files are in the board directory \r
199 inc-y += $(ROOTDIR)/boards/$(BOARDDIR)\r
200 \r
201 # Preprocess linker files..\r
202 %.ldp: %.ldf\r
203         @echo "  >> CPP $<"\r
204         $(Q)$(CPP) -E -P -x assembler-with-cpp -o $@ $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
205 \r
206 #       @cat $@ \r
207         \r
208 .PHONY $(ROOTDIR)/libs:\r
209 $(ROOTDIR)/libs:\r
210         $(Q)mkdir -p $@\r
211 \r
212 dep-y += $(ROOTDIR)/libs\r
213         \r
214 # lib   \r
215 $(build-lib-y): $(dep-y) $(obj-y)\r
216         @echo "  >> AR $@"   \r
217         $(Q)$(AR) -r -o $@ $(obj-y) 2> /dev/null\r
218 \r
219 $(build-hex-y): $(build-exe-y)\r
220         @echo "  >> OBJCOPY $@"   \r
221         $(Q)$(CROSS_COMPILE)objcopy -O ihex $< $@\r
222         \r
223 $(build-bin-y): $(build-exe-y)\r
224         @echo "  >> OBJCOPY $@"   \r
225         $(Q)$(CROSS_COMPILE)objcopy -O binary $< $@     \r
226 \r
227 # Linker\r
228 # Could use readelf -S instead of parsing the *.map file.\r
229 $(build-exe-y): $(dep-y) $(obj-y) $(sim-y) $(libitem-y) $(ldcmdfile-y)\r
230         @echo "  >> LD $@"\r
231 ifeq ($(CROSS_COMPILE),)\r
232         $(Q)$(CC) $(LDFLAGS) -o $@ $(libpath-y) $(obj-y) $(lib-y) $(libitem-y)  \r
233 else    \r
234         $(Q)$(LD) $(LDFLAGS) -T $(ldcmdfile-y) -o $@ $(libpath-y) --start-group $(obj-y) $(lib-y) $(libitem-y) --end-group $(LDMAPFILE)\r
235 ifdef CFG_MC912DG128A\r
236         @$(CROSS_COMPILE)objdump -h $@ | gawk -f $(ROOTDIR)/scripts/hc1x_memory.awk\r
237 else\r
238         @echo "Image size: (decimal)"\r
239         @gawk --non-decimal-data        '/^\.text/ { print "  text:"  $$3+0 " bytes"; rom+=$$3 };\\r
240                                                                 /^\.data/ { print "  data:"  $$3+0 " bytes"; rom+=$$3; ram+=$$3}; \\r
241                                                                 /^\.bss/ { print "  bss :"  $$3+0 " bytes"; ram+=$$3}; \\r
242                                                                 END { print "  ROM: ~" rom " bytes"; print "  RAM: ~" ram " bytes"}' $(subst .elf,.map,$@)\r
243 ifeq ($(BUILD_LOAD_MODULE),y)\r
244         @$(CROSS_COMPILE)objcopy -O srec $@ $@.raw.s19\r
245         srec_cat $@.raw.s19 --crop 0x8008000 0x803fffc --fill 0x00 0x8008000 0x803fffc --l-e-crc32 0x803fffc -o $@.lm.s19\r
246 endif\r
247 endif\r
248 endif\r
249         @echo\r
250         @echo "  >>>>>>>  DONE  <<<<<<<<<"\r
251         @echo\r
252         \r
253         \r
254 $(size-exe-y): $(build-exe-y)\r
255         $(Q)$(OBJDUMP) -h $<\r
256         @echo TODO: Parse the file....\r
257 \r