]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/embedded/Makefile.sdcc
Initializing repo
[can-usb1.git] / ulan / embedded / Makefile.sdcc
1 #  Makefile.rules - OCERA make framework common project rules
2 #                   This version is adapted for SDCC build
3 #   
4 #  (C) Copyright 2003-2005 by Pavel Pisa - OCERA team member
5 #
6 #  The uLan driver is distributed under the Gnu General Public License. 
7 #  See file COPYING for details.
8 #
9 #
10 # input variables
11 # V                .. if set to 1, full command text is shown else short form is used
12 # SUBDIRS          .. list of subdirectories intended for make from actual directory
13 # lib_LIBRARIES    .. list of the user-space libraries
14 # lib_LDSCRIPTS    .. list of LD scripts that should be copied to the lib direcotry 
15 # shared_LIBRARIES .. list of the user-space shared libraries
16 # include_HEADERS  .. list of the user-space public header files
17 # nobase_include_HEADERS .. public headers copied even with directory part
18 # renamed_include_HEADERS .. public headers copied to the different target name
19 # asm_build_HEADERS .. list of files copied to the build object directory
20 # bin_PROGRAMS     .. list of the require binary programs
21 # utils_PROGRAMS   .. list of the development utility programs
22 # xxx_SOURCES      .. list of specific target sources
23 # INCLUDES         .. additional include directories and defines for user-space
24 # default_CONFIG   .. list of default config assignments CONFIG_XXX=y/n ...
25 # tar_EMBEDFILES   .. list of tars with embedded files
26 # link_VARIANTS    .. list of ld script suffixes (after hypen `-') that
27 #                     should be used for linking (e.g. ram flash). If this is not
28 #                     specified, then the value of DEFAULT_LD_SCRIPT_VARIANT from config.target is used.
29 #
30
31 BUILD_DIR_NAME = _build
32 COMPILED_DIR_NAME = _compiled
33 GROUP_DIR_NAME = 
34
35 CC = sdcc
36 OBJ_EXT = .rel
37 LIB_EXT = .lib
38 LIB_PREF =
39 AR = sdcclib
40 AS = asx8051
41 HC = packihx
42 TOHIT = ul_sendhex
43 ARFLAGS = -a
44 A51TOASX = $(MAKERULES_DIR)/a51toasx.sh
45
46 # We need to ensure definition of sources directory first
47 ifndef SOURCES_DIR
48 SOURCES_DIR := $(shell ( pwd -L ) )
49 endif
50
51 all: default
52
53 USER_INCLUDE_DIR := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/include
54 USER_LIB_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/lib
55 USER_UTILS_DIR   := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin-utils
56 USER_BIN_DIR     := $(MAKERULES_DIR)/$(COMPILED_DIR_NAME)/bin
57 USER_BUILD_DIR   := $(MAKERULES_DIR)/$(BUILD_DIR_NAME)/user
58 ifndef CONFIG_FILE
59 CONFIG_FILE      := $(MAKERULES_DIR)/config.omk
60 endif
61 ifneq ($(wildcard $(CONFIG_FILE)-default),)
62 -include $(CONFIG_FILE)-default
63 else
64 $(warning Please, run "make default-config" first)
65 endif
66 ifneq ($(wildcard $(CONFIG_FILE)),)
67 include $(CONFIG_FILE)
68 CONFIG_FILE_OK = y
69 endif
70
71 # Check and include real OCERA style Makefile.omk now
72 ifndef OMK_INCLUDED
73 include $(SOURCES_DIR)/Makefile.omk
74 OMK_INCLUDED := 1
75 endif
76
77 export SOURCES_DIR MAKERULES_DIR RELATIVE_DIR
78 export CONFIG_FILE OMK_SERIALIZE_INCLUDED OMK_VERBOSE OMK_SILENT
79 export MOD
80
81 #CFLAGS += -ggdb
82 #CFLAGS += -O2 
83 #CFLAGS += -Wall
84 #CXXFLAGS += -ggdb
85 #CXXFLAGS += -O2
86 #CXXFLAGS += -Wall
87
88 #DEFAULT_INCLUDES = -I $(PROJECT_INCLUDE)
89
90 CPPFLAGS  += -I $(USER_INCLUDE_DIR)
91
92 CPPFLAGS  += $(CONFIG_OMK_DEFINES)
93
94 #CPPFLAGS  += $(AM_CPPFLAGS)
95 #CFLAGS    += $(AM_CFLAGS)
96 #CXXFLAGS  += $(AM_CXXFLAGS)
97 #LDFLAGS   += $(CFLAGS) $(AM_CFLAGS) $(LD_PATHS:%=-L%)
98  
99 CFLAGS  += $(TARGET_ARCH) 
100 LDFLAGS += $(TARGET_ARCH) 
101
102 LOADLIBES += -L$(USER_LIB_DIR) 
103
104 LOADLIBES += $(lib_LOADLIBES:%=-l%)
105
106 SOLIB_PICFLAGS += -shared -fpic
107
108 ifndef RELATIVE_DIR
109 RELATIVE_DIR := $(SOURCES_DIR:$(MAKERULES_DIR)%=%)
110 endif
111 override RELATIVE_DIR := $(RELATIVE_DIR:/%=%)
112 override RELATIVE_DIR := $(RELATIVE_DIR:\\%=%)
113 #$(warning  RELATIVE_DIR $(RELATIVE_DIR))
114 override BACK2TOP_DIR := $(shell echo $(RELATIVE_DIR)/ | sed -e 's_//_/_g' -e 's_/\./_/_g' -e 's_^\./__g'  -e 's_\([^/][^/]*\)_.._g' -e 's_/$$__')
115 #$(warning  BACK2TOP_DIR $(BACK2TOP_DIR))
116
117 #$(warning SOURCES_DIR = $(SOURCES_DIR))
118 #$(warning MAKERULES_DIR = $(MAKERULES_DIR))
119 #$(warning RELATIVE_DIR = $(RELATIVE_DIR))
120
121 override RELATIVE_PREFIX := $(RELATIVE_DIR)/
122 override RELATIVE_PREFIX := $(RELATIVE_PREFIX:/%=%)
123
124 #vpath %.c $(SOURCES_DIR)
125 #vpath %.cc $(SOURCES_DIR)
126
127 VPATH = $(SOURCES_DIR)
128 srcdir = $(SOURCES_DIR)
129
130 USER_OBJS_DIR = $(USER_BUILD_DIR)/$(RELATIVE_DIR)
131
132
133 .PHONY: default dep subdirs clean cleandepend default-config
134 .PHONY: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
135 .PHONY: default-config-pass
136 .PHONY: check-dir-local include-pass-local library-pass-local binary-pass-local 
137 .PHONY: utils-pass-local default-config-pass-local
138
139 # Some support to serialize some targets for parallel make
140 ifneq ($(OMK_SERIALIZE_INCLUDED),y)
141 include-pass: check-dir
142 library-pass: include-pass
143 binary-pass utils-pass: library-pass
144
145 OMK_SERIALIZE_INCLUDED = y
146 endif
147
148 # Defines for quiet compilation
149 ifdef V
150   ifeq ("$(origin V)", "command line")
151     OMK_VERBOSE = $(V)
152   endif
153 endif
154 ifndef OMK_VERBOSE
155   OMK_VERBOSE = 0
156 endif
157 ifeq ($(OMK_VERBOSE),1)
158   Q =
159 else
160   Q = @
161 endif
162 ifneq ($(findstring s,$(MAKEFLAGS)),)
163   QUIET_CMD_ECHO = true
164   OMK_SILENT = 1
165 else
166   QUIET_CMD_ECHO = echo
167   CPHEADER_FLAGS += -v
168 endif
169
170 default: check-make-ver check-dir include-pass library-pass binary-pass utils-pass
171
172 #=====================================================================
173 # Common utility rules
174
175 define mkdir_def
176         [ -d $(1) ] || mkdir -p $(1) || exit 1
177 endef
178
179 # Syntax: $(call BUILD_CONFIG_H_template,<header_file_path>,<list_of_options_to_export>,<header_barrier>)
180 define BUILD_CONFIG_H_template
181
182 $(1) : $(wildcard $(CONFIG_FILE)) $(wildcard $(CONFIG_FILE)-default)
183         @$(QUIET_CMD_ECHO) "  CONFGEN $$@ in `pwd`"
184         @if [ ! -d `dirname $(1).tmp` ] ; then \
185                 mkdir `dirname $(1).tmp` ; fi
186         @echo "/* Automatically generated from */" > "$(1).tmp"
187         @echo "/* config file : $< */" >> "$(1).tmp"
188         @echo "#ifndef $(3)" >> "$(1).tmp"
189         @echo "#define $(3)" >> "$(1).tmp"
190         @( $(foreach x, $(shell echo '$($(2))' | sed -e 's/\<\([^ =]*\)\(=[^ ]\+\|\)\>/\1/g' ), \
191                 echo '$(x).$($(x))' ; ) echo ; ) | \
192                 sed -e '/^[^.]*\.n$$$$/d' -e '/^[^.]*\.$$$$/d' -e 's/^\([^.]*\)\.[ym]$$$$/\1.1/' | \
193                 sed -n -e 's/^\([^.]*\)\.\(.*\)$$$$/#define \1 \2/p' \
194                   >> "$(1).tmp"
195         @echo "#endif /*$(3)*/" >> "$(1).tmp"
196         @if cmp --quiet "$(1).tmp" "$(1)" ; then \
197         echo rm "$(1).tmp" ; \
198         else mv "$(1).tmp" "$(1)" ; \
199         echo Updated configuration "$(1)" ; fi
200 endef
201
202 ifdef LOCAL_CONFIG_H
203
204 $(eval $(call BUILD_CONFIG_H_template,$(LOCAL_CONFIG_H),default_CONFIG,_LOCAL_CONFIG_H) )
205
206 endif
207
208 check-make-ver:
209         @GOOD_MAKE_VERSION=`echo $(MAKE_VERSION) | sed -n -e 's/^[4-9]\..*\|^3\.9[0-9].*\|^3\.8[1-9].*/y/p'` ; \
210         if [ x$$GOOD_MAKE_VERSION != xy ] ; then \
211                 echo "Your make program version is too old and does not support OMK system." ; \
212                 echo "Please update to make program 3.81beta1 or newer." ; exit 1 ; \
213         fi
214
215 link_VARIANTS ?= $(DEFAULT_LD_SCRIPT_VARIANT)
216
217 #=====================================================================
218 # Special rules for target filesystem and data preparation
219
220
221 define TARFILE_template
222
223 .PHONY: $(2)
224
225 $(2):
226         $(Q) ABSOLUTETARFILE=`cd $$(dir $$@) ; pwd`/$$@ ; \
227              ( test -e $$$$ABSOLUTETARFILE && ( cd  $(3) && tar -df $$$$ABSOLUTETARFILE ) ) || \
228              ( cd  $(3) && tar -cf $$$$ABSOLUTETARFILE . )
229
230 $(2)$(OBJ_EXT): $(2)
231         @$(QUIET_CMD_ECHO) "  TARFILE $$@"
232         $(Q) $(OBJCOPY) -I binary -O elf32-littlearm  $$^ $$@
233
234 endef
235
236 #=====================================================================
237 # User-space rules and templates to compile programs, libraries etc.
238
239 ifdef USER_RULE_TEMPLATES
240
241
242 #%.lo: %.c
243 #       $(CC) -o $@ $(LCFLAGS) -c $<
244
245 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
246         $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
247
248 cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
249         $(CPPFLAGS) $(AM_CXXFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
250
251
252 # Check GCC version for user build
253 ifndef CC_MAJOR_VERSION
254 CC_MAJOR_VERSION := sdcc
255 endif
256 # Prepare suitable define for dependency building
257 #CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
258
259
260
261
262 # Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
263 define COMPILE_c_o_template
264 $(2): $(1) $(LOCAL_CONFIG_H)
265         @$(QUIET_CMD_ECHO) "  CC      $$@"
266         $(Q) if $$(c_o_COMPILE) $(3) -o "$$@" -c $$< ; \
267         then $$(c_o_COMPILE) $(3) -M $$< > "$$@.d" ; \
268         else exit 1; \
269         fi
270 endef
271
272
273 # Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
274 define COMPILE_cc_o_template
275 $(2): $(1) $(LOCAL_CONFIG_H)
276         @$(QUIET_CMD_ECHO) "  CXX     $$@"
277         $(Q) echo "C++ compilation not suported for this compiler"
278 endef
279
280
281 # Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
282 define COMPILE_asm_o_template
283 $(2): $(1) $(LOCAL_CONFIG_H)
284         @$(QUIET_CMD_ECHO) "  ASM      $$@"
285         $(Q) $$(A51TOASX) $(1) $(2:%$(OBJ_EXT)=%.s)
286         $(Q) $$(AS) -l -o $(2:%$(OBJ_EXT)=%.s)
287 endef
288
289
290 # Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<executable-suffix>,<linker-sript>)
291 define PROGRAM_template
292 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
293 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
294 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
295 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
296 $(1)_OBJS := $$(sort $$($(1)_OBJS))
297
298 USER_OBJS  += $$($(1)_OBJS)
299 USER_SOURCES += $$($(1)_SOURCES)
300 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
301
302 -include $(USER_LIB_DIR)/$(LD_SCRIPT).ld$$(addprefix -,$(3)) 
303
304 $(2)/$(1)$(addprefix -,$(3)): $(USER_LIB_DIR)/timestamp
305
306 $(2)/$(1)$(addprefix -,$(3)): $$($(1)_OBJS)
307         @$(QUIET_CMD_ECHO) "  LINK    $$@"
308         $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
309           then echo $$(CC)  $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS) $$(CFLAGS) ; \
310           else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
311           $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
312           -o $(2)/$(1)$(addprefix -,$(3))
313         $(HC) $(2)/$(1)$(addprefix -,$(3)) >$(2)/$(1)$(addprefix -,$(3)).hex
314         hex2bin $(2)/$(1)$(addprefix -,$(3)).hex
315 #@echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d
316 #@sed -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(USER_OBJS_DIR)/$(1).exe.map  >>$(USER_OBJS_DIR)/$(1).exe.d
317 #@echo >>$(USER_OBJS_DIR)/$(1).exe.d
318 #-Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map
319 endef
320
321
322 # Syntax: $(call LIBRARY_template,<library-name>)
323 define LIBRARY_template
324 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.c=%$(OBJ_EXT)))
325 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.cc=%$(OBJ_EXT)))
326 $(1)_OBJS += $$(filter %$(OBJ_EXT),$$($(1)_SOURCES:%.asm=%$(OBJ_EXT)))
327 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
328 $(1)_OBJS := $$(sort $$($(1)_OBJS))
329
330 USER_OBJS  += $$($(1)_OBJS)
331 USER_SOURCES += $$($(1)_SOURCES)
332 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
333
334 $(USER_LIB_DIR)/$(LIB_PREF)$(1)$(LIB_EXT): $$($(1)_OBJS)
335         @$(QUIET_CMD_ECHO) "  AR      $$@"
336         $(Q) for i in $$^ ; do $(AR) $(ARFLAGS) $$@ $$$$i ; done
337         @touch $(USER_LIB_DIR)/timestamp
338 endef
339
340
341 # Syntax: $(call SOLIB_template,<library-name>)
342 define SOLIB_template
343 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo))
344 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo))
345 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile$(OBJ_EXT))
346 $(1)_OBJSLO := $$(sort $$($(1)_OBJSLO))
347
348 SOLIB_OBJS  += $$($(1)_OBJSLO)
349 SOLIB_SOURCES += $$($(1)_SOURCES)
350 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
351
352 $(USER_LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
353         @$(QUIET_CMD_ECHO) "  LINK    $$@"
354         $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^
355 endef
356
357
358 library-pass-local: $(lib_LIBRARIES:%=$(USER_LIB_DIR)/$(LIB_PREF)%$(LIB_EXT)) $(shared_LIBRARIES:%=$(USER_LIB_DIR)/$(LIB_PREF)%.so)
359
360 binary-pass-local: $(foreach link,$(link_VARIANTS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link)) $(foreach of,$(OUTPUT_FORMATS),$(bin_PROGRAMS:%=$(USER_BIN_DIR)/%-$(link).$(of))))
361
362 utils-pass-local: $(foreach link,$(link_VARIANTS),$(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%-$(link)) $(foreach of,$(OUTPUT_FORMATS),$(utils_PROGRAMS:%=$(USER_UTILS_DIR)/%-$(link).$(of))))
363
364 $(foreach prog,$(utils_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_UTILS_DIR),$(link)))))
365
366 $(foreach prog,$(bin_PROGRAMS),$(foreach link,$(link_VARIANTS),$(eval $(call PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
367
368 $(foreach lib,$(lib_LIBRARIES),$(eval $(call LIBRARY_template,$(lib))))
369
370 $(foreach lib,$(shared_LIBRARIES),$(eval $(call SOLIB_template,$(lib))))
371
372 -include $(USER_OBJS_DIR)/*.d
373
374 endif
375
376 #=====================================================================
377
378
379 library-pass binary-pass utils-pass:
380         +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
381                 $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
382                 RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(USER_OBJS_DIR)/$(dir) \
383                 -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
384         +@$(call mkdir_def,$(USER_OBJS_DIR))
385         @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
386                 -f $(SOURCES_DIR)/Makefile USER_RULE_TEMPLATES=y $(@:%=%-local)
387
388
389 dep clean install check-dir include-pass default-config-pass:
390         +@$(foreach dir, $(SUBDIRS), $(call mkdir_def,$(USER_OBJS_DIR)/$(dir)) ; \
391                 $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) \
392                 RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(USER_OBJS_DIR)/$(dir) \
393                 -f $(SOURCES_DIR)/$(dir)/Makefile $@ || exit 1 ;)
394         +@$(call mkdir_def,$(USER_OBJS_DIR))
395         @$(MAKE) --no-print-directory -C $(USER_OBJS_DIR) \
396                 -f $(SOURCES_DIR)/Makefile $(@:%=%-local)
397
398
399 dep-local:
400         
401 check-dir-local:
402         @$(call mkdir_def,$(USER_OBJS_DIR))
403         @$(call mkdir_def,$(USER_INCLUDE_DIR))
404         @$(call mkdir_def,$(USER_LIB_DIR))
405         @$(call mkdir_def,$(USER_BIN_DIR))
406         @$(call mkdir_def,$(USER_UTILS_DIR))
407
408 install-local:
409
410 default-config:
411         @echo "# Start of OMK config file" > "$(CONFIG_FILE)-default"
412         @echo "# This file should not be altered manually" >> "$(CONFIG_FILE)-default"
413         @echo "# Overrides should be stored in file $(notdir $(CONFIG_FILE))" >> "$(CONFIG_FILE)-default"
414         @echo >> "$(CONFIG_FILE)-default"
415         @$(MAKE) --no-print-directory -C $(MAKERULES_DIR) \
416                 RELATIVE_DIR="" SOURCES_DIR=$(MAKERULES_DIR) \
417                 -f $(MAKERULES_DIR)/Makefile default-config-pass
418
419 default-config-pass-local:
420         @echo Default config for $(RELATIVE_DIR)
421         @echo "# Config for $(RELATIVE_DIR)" >> "$(CONFIG_FILE)-default"
422         @$(foreach x, $(default_CONFIG), echo '$(x)' | \
423                 sed -e 's/^[^=]*=x$$/#\0/' >> "$(CONFIG_FILE)-default" ; )
424
425 include-pass-local: $(addprefix $(USER_INCLUDE_DIR)/,$(config_include_HEADERS))
426         @$(call mkdir_def,$(USER_INCLUDE_DIR))
427         @$(foreach f, $(include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) \
428            || cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(notdir $(f)) || exit 1 ; )
429         @$(foreach f, $(nobase_include_HEADERS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) \
430            || ( mkdir -p $(USER_INCLUDE_DIR)/$(dir $(f)) && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$(f) $(USER_INCLUDE_DIR)/$(f) ) || exit 1 ; )
431         @$(foreach f, $(renamed_include_HEADERS), \
432            srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
433            cmp --quiet $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} \
434            || ( mkdir -p `dirname $(USER_INCLUDE_DIR)/$${destfname}` && cp $(CPHEADER_FLAGS) $(SOURCES_DIR)/$${srcfname} $(USER_INCLUDE_DIR)/$${destfname} ) || exit 1 ; )
435         @$(foreach f, $(asm_build_HEADERS), \
436            srcfname=`echo '$(f)' | sed -e 's/^\(.*\)->.*$$/\1/'` ; destfname=`echo '$(f)' | sed -e 's/^.*->\(.*\)$$/\1/'` ; \
437            cmp --quiet $(SOURCES_DIR)/$${srcfname} $(USER_OBJS_DIR)/$${destfname} \
438            || ( mkdir -p `dirname $(USER_OBJS_DIR)/$${destfname}` && \
439            $(A51TOASX) $(SOURCES_DIR)/$${srcfname} $(USER_OBJS_DIR)/$${destfname} ) || exit 1 ; )
440         $(foreach f, $(lib_LDSCRIPTS), cmp --quiet $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) \
441            || cp $(CP_FLAGS) $(SOURCES_DIR)/$(f) $(USER_LIB_DIR)/$(notdir $(f)) || exit 1 ; ) 
442
443
444 ifdef USER_RULE_TEMPLATES
445
446 # User-space static libraries and applications object files
447
448 USER_SOURCES := $(sort $(USER_SOURCES))
449
450 #$(warning USER_SOURCES = $(USER_SOURCES))
451
452 $(foreach src,$(filter %.c,$(USER_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%$(OBJ_EXT)),)))
453
454 $(foreach src,$(filter %.cc,$(USER_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%$(OBJ_EXT)),)))
455
456 $(foreach src,$(filter %.asm,$(USER_SOURCES)),$(eval $(call COMPILE_asm_o_template,$(SOURCES_DIR)/$(src),$(src:%.asm=%$(OBJ_EXT)),)))
457
458 # User-space shared libraries object files
459
460 SOLIB_SOURCES := $(sort $(SOLIB_SOURCES))
461
462 #$(warning SOLIB_SOURCES = $(SOLIB_SOURCES))
463
464 $(foreach src,$(filter %.c,$(SOLIB_SOURCES)),$(eval $(call COMPILE_c_o_template,$(SOURCES_DIR)/$(src),$(src:%.c=%.lo),$(SOLIB_PICFLAGS))))
465
466 $(foreach src,$(filter %.cc,$(SOLIB_SOURCES)),$(eval $(call COMPILE_cc_o_template,$(SOURCES_DIR)/$(src),$(src:%.cc=%.lo),$(SOLIB_PICFLAGS))))
467
468 $(foreach src,$(filter %.asm,$(SOLIB_SOURCES)),$(eval $(call COMPILE_asm_o_template,$(SOURCES_DIR)/$(src),$(src:%.asm=%$(OBJ_EXT)),$(SOLIB_PICFLAGS))))
469
470 $(foreach tarfile,$(USER_EMBEDTARFILES),$(eval $(call TARFILE_template,$(tarfile),$(tarfile)_tarfile,$(SOURCES_DIR)/$(tarfile))))
471
472 endif
473
474
475 #=====================================================================
476 # Automatic loading of compiled program by issuing "make load"
477
478 ifneq ($(OUTPUT_FORMATS),)
479 # Select a file extension (e.g. .bin) for "make load" command to load.
480 LOAD_EXTENSION = .$(firstword $(OUTPUT_FORMATS))
481 endif
482
483 # Syntax: $(call LOAD_PROGRAM_template,<executable-name>,<dir>,<link-variant>)
484 # Used to load program to the target hardware
485 define LOAD_PROGRAM_template
486 .PHONY: load-$(1)$(addprefix -,$(3))
487 -include $(USER_LIB_DIR)/$(LD_SCRIPT).ld$$(addprefix -,$(3)) 
488 load-$(1)$(addprefix -,$(3)): $(2)/$(1)$(addprefix -,$(3))$(LOAD_EXTENSION)
489         @$(QUIET_CMD_ECHO) "  LOAD    $$<"
490         @if [ -z "$$(LOAD_CMD$(addprefix -,$(3)))" ]; then echo "No command for loading applications to '$(3)' is specified."; exit 1; fi
491         $(Q) $$(LOAD_CMD$(addprefix -,$(3))) $$<
492 endef
493
494 # Syntax: $(call LOAD__RUN_VARIANT_template,<link-variant>)
495 # Used to load and/or run non-default variant of the default program
496 define LOAD_RUN_VARIANT_template
497 .PHONY: load-$(1) run-$(1)
498 -include $(USER_LIB_DIR)/$(LD_SCRIPT).ld$$(addprefix -,$(3)) 
499 load-$(1): load-$(firstword $(bin_PROGRAMS))-$(1)
500 run-$(1):
501         @$(QUIET_CMD_ECHO) "  RUN     $(1)"
502         @if [ -z "$(RUN_CMD-$(1))" ]; then echo "No command for running '$(1)' variant is specified."; exit 1; fi
503         $(Q) $(RUN_CMD-$(1))
504 endef
505
506 $(foreach link,$(link_VARIANTS),$(foreach prog,$(bin_PROGRAMS),$(eval $(call LOAD_PROGRAM_template,$(prog),$(USER_BIN_DIR),$(link)))))
507 $(foreach link,$(link_VARIANTS),$(eval $(call LOAD_RUN_VARIANT_template,$(link))))
508
509 .PHONY: load run
510 load: $(addprefix load-,$(firstword $(bin_PROGRAMS))-$(firstword $(link_VARIANTS)))
511
512 run: run-$(firstword $(link_VARIANTS))
513
514
515 # Special rules for configuration exported headers
516
517 $(foreach confh,$(config_include_HEADERS),$(eval $(call BUILD_CONFIG_H_template,$(addprefix $(USER_INCLUDE_DIR)/,$(confh)),$(basename $(notdir $(confh)))_DEFINES,\
518 _$(basename $(notdir $(confh)))_H \
519 )))
520
521
522 #=====================================================================
523
524 clean-local:
525         @echo Cleaning in $(USER_OBJS_DIR)
526         @rm -f $(USER_OBJS_DIR)/*$(OBJ_EXT) $(USER_OBJS_DIR)/*.lo \
527                $(USER_OBJS_DIR)/*.d \
528                $(USER_OBJS_DIR)/*.map \
529                $(LOCAL_CONFIG_H:%=$(USER_OBJS_DIR)/%) \
530                $(tar_EMBEDFILES:%=$(USER_OBJS_DIR)/%_tarfile)
531         @$(foreach confh,$(addprefix $(USER_INCLUDE_DIR)/,$(config_include_HEADERS)),\
532             if [ -e $(confh) ] ; then touch -t 200001010101 $(confh) ; fi ; \
533         )
534