]> rtime.felk.cvut.cz Git - arc.git/blob - scripts/rules.mk
Merged in from hcs12x branch
[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 define MOD_AVAIL_template\r
18         MOD_$(1)=y\r
19 endef\r
20 \r
21 define MOD_USE_template\r
22         USE_$(1)=y\r
23         def-y += USE_$(1)\r
24 endef\r
25 \r
26 define CFG_template\r
27         CFG_$(1)=y\r
28         def-y += CFG_$(1)\r
29 endef\r
30 \r
31 $(foreach mod,$(MOD_AVAIL),$(eval $(call MOD_AVAIL_template,${mod})))\r
32 $(foreach mod,$(MOD_USE),$(eval $(call MOD_USE_template,${mod})))\r
33 $(foreach mod,$(CFG),$(eval $(call CFG_template,${mod})))\r
34 def-y += $(ARCH) $(ARCH_FAM) $(ARCH_MCU) \r
35 \r
36 # Select console / debug\r
37 $(foreach mod,$(SELECT_OS_CONSOLE),$(eval $(call MOD_USE_template,${mod})))\r
38 $(foreach mod,$(SELECT_CONSOLE),$(eval $(call MOD_USE_template,${mod})))\r
39 \r
40 def-y += SELECT_OS_CONSOLE=$(if $(SELECT_OS_CONSOLE),$(SELECT_OS_CONSOLE),TTY_NONE)\r
41 def-y += SELECT_CONSOLE=$(if $(SELECT_CONSOLE),$(SELECT_CONSOLE),TTY_NONE)\r
42 def-$(USE_DEBUG_PRINTF) += USE_DEBUG_PRINTF \r
43 \r
44 not_avail = $(filter-out $(MOD_AVAIL),$(MOD_USE))\r
45 ifneq ($(not_avail),)\r
46 $(error Trying to build a module that is not available: $(not_avail))\r
47 endif\r
48 \r
49 #===== COMPILER CONFIG =====\r
50 \r
51 # set debug optimization level as default\r
52 ifeq ($(SELECT_OPT),)\r
53 SELECT_OPT=OPT_DEBUG\r
54 endif\r
55 \r
56 $(eval CFG_$(SELECT_OPT)=y)\r
57 \r
58 ARCH_PATH-y = arch/$(ARCH_FAM)/$(ARCH)\r
59 \r
60 # Include compiler generic and arch specific\r
61 COMPILER?=gcc\r
62 ifneq ($(ARCH),)\r
63 include $(ROOTDIR)/$(ARCH_PATH-y)/scripts/gcc.mk\r
64 endif\r
65 include $(ROOTDIR)/scripts/cc_$(COMPILER).mk\r
66 \r
67 # Get object files\r
68 include ../makefile\r
69 \r
70 \r
71 ##### For backwards compatability with older project makefiles\r
72 # Remove dependency on libkernel\r
73 deprecated-libs += $(ROOTDIR)/libs/libkernel_$(ARCH_MCU).a\r
74 deprecated-libs-included = $(filter $(deprecated-libs),$(libitem-y))\r
75 ifneq ($(deprecated-libs-included),)\r
76 $(info >>>> Ignoring deprecated lib dependencies: $(deprecated-libs-included)')\r
77 libitem-y := $(filter-out $(deprecated-libs),$(libitem-y))\r
78 endif\r
79 \r
80 # Automatic preprocessing of std linkscripts\r
81 old-ldcmdfile = $(ROOTDIR)/$(ARCH_PATH-y)/scripts/linkscript_gcc.ldf\r
82 new-ldcmdfile = linkscript_gcc.ldp\r
83 old-ldcmdfile-used = $(filter $(old-ldcmdfile),$(ldcmdfile-y))\r
84 ifneq ($(old-ldcmdfile-used),)\r
85 $(info >>>> Changing linkscript to preprocessed version: $(old-ldcmdfile) -> $(new-ldcmdfile)')\r
86 ldcmdfile-y := $(subst $(old-ldcmdfile),$(new-ldcmdfile),$(ldcmdfile-y))\r
87 vpath %.ldf $(ROOTDIR)/$(ARCH_PATH-y)/scripts\r
88 endif\r
89 \r
90 #####\r
91 \r
92 inc-y += $(ROOTDIR)/include\r
93 inc-y += $(ROOTDIR)/include/$(ARCH_FAM)\r
94 \r
95 \r
96 .PHONY clean: \r
97 clean: FORCE\r
98         @-rm -f *.o *.d *.h *.elf *.a *.ldp\r
99 \r
100 .PHONY config: \r
101 config: FORCE\r
102         @echo "board   modules:" $(MOD_AVAIL)\r
103         @echo "example modules:" $(MOD_USE)\r
104         @echo $(MOD) ${def-y}\r
105 \r
106 FORCE:\r
107 \r
108 $(ROOTDIR)/binaries:\r
109         @mkdir -p $@\r
110 \r
111 # build- targets are "end" target that the included makefile want's to build\r
112 .PHONY all:\r
113 all: $(build-exe-y) $(build-hex-y) $(build-lib-y) $(build-bin-y) $(ROOTDIR)/binaries\r
114         @cp -v $(build-lib-y) $(build-exe-y) $(build-hex-y) $(build-bin-y) $(ROOTDIR)/binaries\r
115 \r
116 \r
117 # Determine what kind of filetype to build from  \r
118 VPATH += $(ROOTDIR)/$(SUBDIR)/src\r
119 VPATH += $(ROOTDIR)/$(SUBDIR)\r
120 \r
121 inc-y += ../include\r
122 \r
123 .SUFFIXES:\r
124 \r
125 # Simple depencendy stuff\r
126 -include $(subst .o,.d,$(obj-y))\r
127 # Some dependency for xxx_offset.c/h also\r
128 -include $(subst .h,.d,$(dep-y))\r
129 \r
130 # Compile\r
131 %.o: %.c\r
132         @echo "  >> CC $(notdir $<)"\r
133         $(Q)$(CC) -c $(CFLAGS) -o $(goal) $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $(abspath $<)\r
134 \r
135 # Assembler\r
136 \r
137 %.o: %.s\r
138         @echo "  >> AS $(notdir $<)  $(ASFLAGS)"\r
139         $(Q)$(AS) $(ASFLAGS) -o $(goal) $<\r
140         \r
141 # PP Assembler  \r
142 #.SECONDARY %.s:\r
143 \r
144 %.s: %.sx\r
145         @echo "  >> CPP $(notdir $<)"\r
146         $(Q)$(CPP) -x assembler-with-cpp -E -o $@ $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
147 \r
148 \r
149 # Board linker files are in the board directory \r
150 inc-y += $(ROOTDIR)/boards/$(BOARDDIR)\r
151 \r
152 # Preprocess linker files..\r
153 %.ldp: %.ldf\r
154         @echo "  >> CPP $<"\r
155         $(Q)$(CPP) -E -P -x assembler-with-cpp -o $@ $(addprefix -I ,$(inc-y)) $(addprefix -D,$(def-y)) $<\r
156 \r
157 #       @cat $@ \r
158         \r
159 .PHONY $(ROOTDIR)/libs:\r
160 $(ROOTDIR)/libs:\r
161         $(Q)mkdir -p $@\r
162 \r
163 dep-y += $(ROOTDIR)/libs\r
164         \r
165 # lib   \r
166 $(build-lib-y): $(dep-y) $(obj-y)\r
167         @echo "  >> AR $@"   \r
168         $(Q)$(AR) -r -o $@ $(obj-y) 2> /dev/null\r
169 \r
170 $(build-hex-y): $(build-exe-y)\r
171         @echo "  >> OBJCOPY $@"   \r
172         $(Q)$(CROSS_COMPILE)objcopy -O ihex $< $@\r
173         \r
174 $(build-bin-y): $(build-exe-y)\r
175         @echo "  >> OBJCOPY $@"   \r
176         $(Q)$(CROSS_COMPILE)objcopy -O binary $< $@     \r
177 \r
178 # Linker\r
179 # Could use readelf -S instead of parsing the *.map file.\r
180 $(build-exe-y): $(dep-y) $(obj-y) $(sim-y) $(libitem-y) $(ldcmdfile-y)\r
181         @echo "  >> LD $@"\r
182 ifeq ($(CROSS_COMPILE),)\r
183         $(Q)$(CC) $(LDFLAGS) -o $@ $(libpath-y) $(obj-y) $(lib-y) $(libitem-y)  \r
184 else    \r
185         $(Q)$(LD) $(LDFLAGS) -T $(ldcmdfile-y) -o $@ $(libpath-y) --start-group $(obj-y) $(lib-y) $(libitem-y) --end-group $(LDMAPFILE)\r
186 ifdef CFG_HC1X\r
187         @$(CROSS_COMPILE)objdump -h $@ | gawk -f $(ROOTDIR)/scripts/hc1x_memory.awk\r
188 else\r
189         @echo "Image size: (decimal)"\r
190         @gawk --non-decimal-data        '/^\.text/ { print "  text:"  $$3+0 " bytes"; rom+=$$3 };\\r
191                                                                 /^\.data/ { print "  data:"  $$3+0 " bytes"; rom+=$$3; ram+=$$3}; \\r
192                                                                 /^\.bss/ { print "  bss :"  $$3+0 " bytes"; ram+=$$3}; \\r
193                                                                 END { print "  ROM: ~" rom " bytes"; print "  RAM: ~" ram " bytes"}' $(subst .elf,.map,$@)\r
194 ifeq ($(BUILD_LOAD_MODULE),y)\r
195         @$(CROSS_COMPILE)objcopy -O srec $@ $@.raw.s19\r
196         srec_cat $@.raw.s19 --crop 0x8008000 0x803fffc --fill 0x00 0x8008000 0x803fffc --l-e-crc32 0x803fffc -o $@.lm.s19\r
197 endif\r
198 endif\r
199 endif\r
200         @echo\r
201         @echo "  >>>>>>>  DONE  <<<<<<<<<"\r
202         @echo\r
203         \r
204         \r
205 $(size-exe-y): $(build-exe-y)\r
206         $(Q)$(OBJDUMP) -h $<\r
207         @echo TODO: Parse the file....\r
208 \r