1 #=====================================================================
2 # User-space rules and templates to compile programs, libraries etc.
4 ifdef USER_RULE_TEMPLATES
8 # $(CC) -o $@ $(LCFLAGS) -c $<
10 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
11 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
13 cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(AM_CPPFLAGS) \
14 $(CPPFLAGS) $(AM_CXXFLAGS) $(CFLAGS) $(INCLUDES) -DOMK_FOR_USER
16 S_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
17 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(ASFLAGS) -DOMK_FOR_USER
19 # Check GCC version for user build
20 ifndef CC_MAJOR_VERSION
21 CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
23 # Prepare suitable define for dependency building
24 ifeq ($(CC_MAJOR_VERSION),2)
25 CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp"
27 CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
31 # Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
32 define COMPILE_c_o_template
33 $(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
34 @$(QUIET_CMD_ECHO) " CC $$@"
35 $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
36 then mv -f "$$@.d.tmp" "$$@.d" ; \
37 else rm -f "$$@.d.tmp" ; exit 1; \
42 # Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
43 define COMPILE_cc_o_template
44 $(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
45 @$(QUIET_CMD_ECHO) " CXX $$@"
46 $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
47 then mv -f "$$@.d.tmp" "$$@.d" ; \
48 else rm -f "$$@.d.tmp" ; exit 1; \
53 # Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
54 define COMPILE_S_o_template
55 $(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
56 @$(QUIET_CMD_ECHO) " AS $$@"
57 $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
58 then if [ -e "$$@.d.tmp" ] ; then mv -f "$$@.d.tmp" "$$@.d" ; fi ; \
59 else rm -f "$$@.d.tmp" ; exit 1; \
63 # Syntax: $(call CMETRIC_o_h_template,<object_file>,<target_header>)
64 define CMETRIC_o_h_template
66 @$(QUIET_CMD_ECHO) " CMETRIC $$@"
67 $(Q)if [ -n `dirname $$@` ] ; then \
68 if [ ! -e `dirname $$@` ] ; then \
69 mkdir -p `dirname $$@` ; fi ; fi
70 $(Q)echo >$$@ '/* Automatically generated from $$< */'
71 $(Q)echo >>$$@ '/* Conditionals to control compilation */'
72 $(Q)set -o pipefail ; $(NM) $$< \
73 | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2cond_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
75 $(Q)echo >>$$@ '/* Defines from the values defined to symbols */'
76 $(Q)set -o pipefail ; $(NM) $$< \
77 | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2def_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
81 # Syntax: $(call PROGRAM_template,<dir>,<executable-name>,<link-variant>)
82 define PROGRAM_template
83 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
84 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
85 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
86 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.S=%.o))
87 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile.o)
88 $(1)_OBJS := $$(sort $$($(1)_OBJS))
90 USER_OBJS += $$($(1)_OBJS)
91 USER_SOURCES += $$($(1)_SOURCES)
92 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
94 $(2)/$(1): $(USER_LIB_DIR)/timestamp
96 $(2)/$(1): $$($(1)_OBJS)
97 @$(QUIET_CMD_ECHO) " LINK $$@"
98 $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
99 then echo $$(CC) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS) $$(CFLAGS) ; \
100 else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
101 $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
103 #@echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d
104 #@sed -n -e 's/^LOAD \(.*\)$$$$/ \1 \\/p' $(USER_OBJS_DIR)/$(1).exe.map >>$(USER_OBJS_DIR)/$(1).exe.d
105 #@echo >>$(USER_OBJS_DIR)/$(1).exe.d
106 #-Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map
111 # Syntax: $(call LIBRARY_template,<library-name>)
112 define LIBRARY_template
113 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
114 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
115 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
116 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.S=%.o))
117 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile.o)
118 $(1)_OBJS := $$(sort $$($(1)_OBJS))
120 USER_OBJS += $$($(1)_OBJS)
121 USER_SOURCES += $$($(1)_SOURCES)
122 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
124 $(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
125 @$(QUIET_CMD_ECHO) " AR $$@"
126 $(Q) $(AR) rcs $$@ $$^
127 @touch $(USER_LIB_DIR)/timestamp
132 # Syntax: $(call SOLIB_template,<library-name>)
133 define SOLIB_template
134 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo))
135 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo))
136 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cxx=%.lo))
137 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.S=%.lo))
138 $(1)_OBJS += $$($(1)_EMBEDTARFILES:%=%_tarfile.o)
139 $(1)_OBJSLO := $$(sort $$($(1)_OBJSLO))
141 SOLIB_OBJS += $$($(1)_OBJSLO)
142 SOLIB_SOURCES += $$($(1)_SOURCES)
143 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
145 $(USER_LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
146 @$(QUIET_CMD_ECHO) " LINK $$@"
147 $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^