3 # Rules for compilation of C, C++ and assembler sources using FNU
4 # toolchain. These rules are meant to be used with GNU toolchain and
5 # are included from OMK when it is necessary to compile something for
8 -include $(USER_OBJS_DIR)/*.d
11 # $(CC) -o $@ $(LCFLAGS) -c $<
13 c_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
14 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
16 cc_o_COMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
17 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
19 S_o_COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
20 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(ASFLAGS)
23 # Check GCC version for user build
24 ifndef CC_MAJOR_VERSION
25 CC_MAJOR_VERSION := $(shell $(CC) -dumpversion | sed -e 's/\([^.]\)\..*/\1/')
27 # Prepare suitable define for dependency building
28 ifeq ($(CC_MAJOR_VERSION),2)
29 CC_DEPFLAGS = -Wp,-MD,"$@.d.tmp"
31 CC_DEPFLAGS = -MT $@ -MD -MP -MF "$@.d.tmp"
36 # Syntax: $(call COMPILE_c_o_template,<source>,<target>,<additional c-flags>)
37 define COMPILE_c_o_template
38 $(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
39 @$(QUIET_CMD_ECHO) " CC $$@"
40 $(Q) if $$(c_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
41 then mv -f "$$@.d.tmp" "$$@.d" ; \
42 else rm -f "$$@.d.tmp" ; exit 1; \
48 # Syntax: $(call COMPILE_cc_o_template,<source>,<target>,<additional c-flags>)
49 define COMPILE_cc_o_template
50 $(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
51 @$(QUIET_CMD_ECHO) " CXX $$@"
52 $(Q) if $$(cc_o_COMPILE) $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
53 then mv -f "$$@.d.tmp" "$$@.d" ; \
54 else rm -f "$$@.d.tmp" ; exit 1; \
58 # Syntax: $(call COMPILE_S_o_template,<source>,<target>,<additional c-flags>)
59 define COMPILE_S_o_template
60 $(2): $(1) $(LOCAL_CONFIG_H) $$(GEN_HEADERS)
61 @$(QUIET_CMD_ECHO) " AS $$@"
62 $(Q) if $$(S_o_COMPILE) -D__ASSEMBLY__ $$(CC_DEPFLAGS) $(3) -o $$@ -c $$< ; \
63 then if [ -e "$$@.d.tmp" ] ; then mv -f "$$@.d.tmp" "$$@.d" ; fi ; \
64 else rm -f "$$@.d.tmp" ; exit 1; \
68 # Syntax: $(call CMETRIC_o_h_template,<object_file>,<target_header>)
69 define CMETRIC_o_h_template
71 @$(QUIET_CMD_ECHO) " CMETRIC $$@"
72 $(Q)if [ -n `dirname $$@` ] ; then \
73 if [ ! -e `dirname $$@` ] ; then \
74 mkdir -p `dirname $$@` ; fi ; fi
75 $(Q)echo >$$@ '/* Automatically generated from $$< */'
76 $(Q)echo >>$$@ '/* Conditionals to control compilation */'
77 $(Q)set -o pipefail ; $(NM) $$< \
78 | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2cond_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
80 $(Q)echo >>$$@ '/* Defines from the values defined to symbols */'
81 $(Q)set -o pipefail ; $(NM) $$< \
82 | sed -n 's/^ *0*\(0[0-9A-Fa-f]*\) *A *_cmetric2def_\([A-Za-z_0-9]*\) */#define \2 0x\1/p' \
86 # Syntax: $(call PROGRAM_template,<dir>,<executable-name>,<link-variant>)
87 define PROGRAM_template
88 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
89 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
90 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
91 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.S=%.o))
92 $(1)_OBJS += $$(filter %.o,$(1)_SOURCES)
93 $(1)_OBJS := $$(sort $$($(1)_OBJS))
95 SOURCES += $$($(1)_SOURCES)
97 ifneq ($$(LD_SCRIPT),)
98 $(1)$$(addprefix -,$(3))_LDFLAGS = -Wl,-T,$$(LD_SCRIPT).ld$$(addprefix -,$(3))
102 $(2)/$(1)$(addprefix -,$(3)): $$($(1)_OBJS)
103 @$(QUIET_CMD_ECHO) " LINK $$@"
104 $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
105 then echo $$(CC) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CFLAGS) $$(CFLAGS) ; \
106 else echo $$(CXX) $$(CPPFLAGS) $$(AM_CPPFLAGS) $$(AM_CXXFLAGS) $$(CXXFLAGS) ; fi) \
107 $$(AM_LDFLAGS) $$(LDFLAGS) $$($(1)$$(addprefix -,$(3))_LDFLAGS) -Wl,-Map,$(1)$$(addprefix -,$(3)).map \
108 $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_MOREOBJS) $$($(1)_LIBS:%=-l%) \
110 @echo "$(2)/$(1)$(addprefix -,$(3)): \\" >$(USER_OBJS_DIR)/$(1)$(addprefix -,$(3)).exe.d
111 @if [ -n "$(LD_SCRIPT)" ]; then \
112 echo " $(USER_LIB_DIR)/$(LD_SCRIPT).ld$(addprefix -,$(3)) \\" >>$(USER_OBJS_DIR)/$(1)$(addprefix -,$(3)).exe.d; fi
113 @sed -n -e 's/^LOAD \(.*\)$$$$/ \1 \\/p' $(USER_OBJS_DIR)/$(1)$(addprefix -,$(3)).map >>$(USER_OBJS_DIR)/$(1)$(addprefix -,$(3)).exe.d
114 @echo >>$(USER_OBJS_DIR)/$(1).exe.d
117 # Rules for other output formats (can be specified by OUTPUT_FORMATS)
119 @$(QUIET_CMD_ECHO) " OBJCOPY $@"
120 $(Q) $(OBJCOPY) --output-target=binary -S $< $@
123 @$(QUIET_CMD_ECHO) " OBJCOPY $@"
124 $(Q) $(OBJCOPY) --output-target=ihex -S $< $@
127 @$(QUIET_CMD_ECHO) " OBJCOPY $@"
128 $(Q) $(OBJCOPY) --output-target=srec -S $< $@
130 # Syntax: $(call LIBRARY_template,<library-name>)
131 define LIBRARY_template
132 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.c=%.o))
133 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cc=%.o))
134 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.cxx=%.o))
135 $(1)_OBJS += $$(filter %.o,$$($(1)_SOURCES:%.S=%.o))
136 $(1)_OBJS := $$(sort $$($(1)_OBJS))
138 SOURCES += $$($(1)_SOURCES)
140 $(USER_LIB_DIR)/lib$(1).a: $$($(1)_OBJS)
141 @$(QUIET_CMD_ECHO) " AR $$@"
142 $(Q) $(AR) rcs $$@ $$^
146 # Syntax: $(call SOLIB_template,<library-name>)
147 define SOLIB_template
148 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.c=%.lo))
149 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cc=%.lo))
150 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.cxx=%.lo))
151 $(1)_OBJSLO += $$(filter %.lo,$$($(1)_SOURCES:%.S=%.lo))
152 $(1)_OBJSLO := $$(sort $$($(1)_OBJSLO))
154 SOLIB_OBJS += $$($(1)_OBJSLO)
155 SOLIB_SOURCES += $$($(1)_SOURCES)
157 $(USER_LIB_DIR)/lib$(1).so: $$($(1)_OBJSLO)
158 @$(QUIET_CMD_ECHO) " LINK $$@"
159 $(Q) $(LD) --shared --soname=lib$(1).so -o $$@ $$^
163 # lib_obj_SOURCES handling
164 lib_OBJS = $(addsuffix .o,$(basename $(lib_obj_SOURCES)))
165 SOURCES += $(filter-out %.o,$(lib_obj_SOURCES))
166 #$(warning lib_OBJS = $(lib_OBJS))
168 # # Syntax: $(call LIBOBJ_template,<object-name>)
169 # define LIBOBJ_template
170 # $(USER_LIB_DIR)/$(1): $(1)
171 # @cp $(CP_FLAGS) $$< $$@
173 $(USER_LIB_DIR)/%.o: %.o
174 @cp $(CP_FLAGS) $< $@