Makefile.rules: added target tags as alias for target TAGS
[sip-router] / Makefile.rules
1 # Kamailio build system
2 #
3 # common Makefile rules, included by main Makefile & the  modules
4 #
5
6 #
7 # Uses: NAME, ALLDEP, CC, CFLAGS, C_DEFS, DEFS, C_INCLUDES, INCLUDES, LIBS, 
8 #       MKDEP, auto_gen, auto_gen_others, auto_gen_keep, 
9 #       depends, objs, extra_objs, static_modules, static_modules_path,
10 #       LD_RPATH
11 # (all this must  be defined previously!,  see Makefile.defs & Makefile)
12 # Optional: SER_LIBS - list of ser libraries that will be automatically
13 #  built if necessary. Format: path/shortname, where shortname is the 
14 #  name passed to -l (e.g. for libprint.so the shortname is print)
15 #
16
17
18 # check if the saved cfg corresponds with the current one
19 # (if not rebuild everything)
20 ifeq (,$(filter $(nodep_targets),$(MAKECMDGOALS)))
21 -include makecfg.lst
22 # if trying  to build a lib automatically and the lib is already compiled,
23 # don't rebuild it if the only differences in DEFS or INCLUDES are covered
24 # by LIB_NOREBUILD_DEFS/LIB_NOREBUILD_INCLUDES
25 LIB_NOREBUILD_DEFS=
26
27 # don't rebuild if the differences are covered by NOREBUILD_DEFS or 
28 # NOREBUILD_INCLUDES
29 ifneq ($(strip $(filter-out $(NOREBUILD_DEFS),\
30                 $(C_DEFS) $(DEFS))),$(strip $(CFG_DEFS)))
31 #$(warning different defs: <$(strip $(C_DEFS) $(DEFS))> != )
32 #$(warning               : <$(strip $(CFG_DEFS))>)
33 $(shell rm -f makecfg.lst)
34 endif
35 ifneq ($(strip $(filter-out $(NOREBUILD_INCLUDES),\
36                         $(C_INCLUDES) $(INCLUDES))),$(strip $(CFG_INCLUDES)))
37 $(shell rm -f makecfg.lst)
38 endif
39 endif
40
41 ALLDEP+=makecfg.lst
42
43 # returns current type: "" core/unknown, "M" module, "L" libray, "U" util
44 crt_type=$(if $(MOD_NAME),M,$(if $(LIB_NAME),L,$(if $(UTIL_NAME),U)))
45
46 cmd_CC=$(CC) $(CFLAGS) $(C_INCLUDES) $(INCLUDES) $(C_DEFS) $(DEFS) -c $< -o $@
47 cmd_LD=$(LD) $(LDFLAGS) $(objs) $(extra_objs) $(ALL_LIBS) $(SER_RPATH) \
48         -o $(NAME)
49
50 ifeq (,$(CC_MKDEP_OPTS))
51 # if CCC_MKDEP_OPTS is empty => CC cannot generate dependencies on the fly
52 cmd_MKDEP=$(MKDEP) $(filter -D% -I%,$(CFLAGS)) $(C_INCLUDES) $(INCLUDES) \
53                         $(C_DEFS) $(DEFS) $< \
54                 |  sed  -e 's/\#.*//' -e '/:[   ]*$$/d' -e '/^[         ]*$$/d' \
55                                 -e 's|.*:|$@: $$(wildcard |' -e 's/\([^\\]\)$$/\1)/'> $*.d
56 else
57 # deps can be generated on the fly by cmd_CC
58 cmd_CC+=$(CC_MKDEP_OPTS)
59 # no MKDEP command any more
60 cmd_MKDEP=
61 endif # CC_MKDEP_OPTS
62
63 # what will be displayed if quiet==silent
64 silent_cmd_CC=CC ($(CC)) [$(strip $(crt_type) $(NAME))]         $@
65 silent_cmd_LD=LD ($(LD)) [$(strip $(crt_type) $(NAME))]         $@
66
67 ifneq (,$(filter 0 no off verbose noisy, $(Q) $(QUIET)))
68 override Q:=
69 quiet=verbose
70 #shell optional print
71 oecho=echo $(1)
72 else
73 quiet=silent
74 Q=1
75 MAKE+= --no-print-directory
76 #shell optional print
77 oecho=
78 endif
79
80 module_make=    if [ -n "$(1)" -a -r "$(1)/Makefile" ]; then \
81                         $(call oecho, "" ;) \
82                         $(call oecho, "" ;) \
83                         if  $$(MAKE) -C $(1) $(2) || [ ${err_fail} != 1 ] ; then \
84                                 :; \
85                         else \
86                                 exit 1; \
87                         fi ; \
88                 fi ;
89
90 quote:= "
91 escall= $(subst $$,\$$,$(subst $(quote),\$(quote),$1))
92 exec_cmd= $(if $($(quiet)_cmd_$(1)),\
93                         @echo "$(call escall,$($(quiet)_cmd_$(1)))" ;) $(cmd_$(1))
94
95 #implicit rules
96 %.o:%.c  $(ALLDEP)
97         $(call exec_cmd,CC)
98         @$(call cmd_MKDEP)
99
100 # use RPATH and SER_LIBS if needed (make install and the module depends
101 # on some ser libs)
102
103 ifneq   ($(SER_LIBS),)
104 # abspath & realpath don't work on make <= 3.80
105 SER_LIBS_DIRS:=$(dir $(SER_LIBS))
106 ifneq   (,$(filter install install% %install, $(MAKECMDGOALS)))
107 lib_compile_for_install=yes
108 expected_lib_ipath=$(lib_target)
109 else
110 lib_compile_for_install=$(compile_for_install)
111 # function: expected_lib_ipath ser_lib_dir
112 expected_lib_ipath=$(1)
113 endif
114 ifneq   ($(LD_RPATH),)
115 ifneq   (,$(filter install install% %install, $(MAKECMDGOALS)))
116 SER_RPATH_LST:=$(lib_target)
117 else
118 # realpath is not supported in make 3.80 or older
119 ifeq (,$(filter-out 3.80 3.80.%,$(MAKE_VERSION)))
120 fullpath=$(shell cd $(1); pwd)
121 else
122 fullpath=$(realpath $(1))
123 endif
124
125 SER_RPATH_LST:=$(call fullpath,$(dir $(SER_LIBS)))
126 endif
127 ifneq   ($(strip $(SER_RPATH_LST)),)
128 SER_RPATH:=$(addprefix $(LD_RPATH),$(SER_RPATH_LST))
129 endif
130 endif
131 ifeq ($(OS), darwin)
132 SER_IPATH_LST:=$(addsuffix /libiname.lst,$(SER_LIBS_DIRS))
133 #$(warning $(NAME) DARWIN, SER_LIBS=$(SER_LIBS), $(SER_LIBS_DIRS), ipath_lst=$(SER_IPATH_LST))
134 endif
135 endif
136
137 ALL_LIBS=$(LIBS)
138
139 ifeq    (,$(filter clean %clean clean% proper %proper proper%, $(MAKECMDGOALS)))
140 ifneq ($(SER_LIBS),)
141 -include librpath.lst
142 ifneq ($(SER_RPATH_LST), $(LIB_RPATH_LST))
143 $(shell rm -f librpath.lst)
144 endif
145 endif
146
147 SER_LIBS_DEPS:= \
148         $(foreach l, $(SER_LIBS), $(dir $l)$(LIB_PREFIX)$(notdir $l)$(LIB_SUFFIX))
149 ALL_LIBS+=$(foreach l, $(SER_LIBS), -L$(dir $l) -l$(notdir $l))
150
151 $(NAME): librpath.lst $(SER_LIBS_DEPS)
152
153 $(SER_LIBS_DEPS): FORCE
154         @$(MAKE) -wC $(dir $@)  compile_for_install=$(lib_compile_for_install) \
155                 NOREBUILD_DEFS="$(NOREBUILD_DEFS) $(LIB_NOREBUILD_DEFS)" \
156                 NOREBUILD_INCLUDES="$(NOREBUILD_INCLUDES) $(LIB_NOREBUILD_INCLUDES)"
157
158 .PHONY: FORCE
159 FORCE:
160
161 ifneq ($(SER_IPATH_LST),)
162
163 $(NAME): $(SER_IPATH_LST) 
164
165 $(SER_IPATH_LST): FORCE
166         @if grep \
167                 "COMPILED_INAME:=$(call expected_lib_ipath,$(shell cd $(@D); pwd))" \
168                 $(@) 1>/dev/null 2>/dev/null ; \
169         then :; \
170         else \
171                 $(call oecho,"re-building $(@D)" ;) \
172                 $(MAKE) -wC $(@D) compile_for_install=$(lib_compile_for_install) ; \
173         fi
174
175 .PHONY: FORCE-BUILD-LIBS
176 FORCE-BUILD-LIBS:
177         @for r in $(SER_LIBS_DIRS) ; do \
178                 $(call oecho,building lib $$r ;) \
179                 $(MAKE) -wC $$r compile_for_install=$(lib_compile_for_install) ; \
180         done
181
182 endif
183
184 endif
185
186 # normal rules
187 $(NAME): $(objs) $(ALLDEP)
188         $(call exec_cmd,LD)
189
190
191 librpath.lst: $(ALLDEP)
192         @echo LIB_RPATH_LST:=$(SER_RPATH_LST) >librpath.lst
193
194 makecfg.lst:
195         @echo "CFG_DEFS:=$(call escall,$(strip \
196                         $(filter-out $(NOREBUILD_DEFS), $(C_DEFS) $(DEFS))))" >>$@
197         @echo "CFG_INCLUDES:=$(call escall,$(strip \
198                         $(filter-out $(NOREBUILD_INCLUDES),\
199                                 $(C_INCLUDES) $(INCLUDES))))" >>$@
200 .PHONY: all
201 all: $(NAME) every-module
202
203 .PHONY: static
204 static: $(objs)
205
206 # clean only the current directory (no modules or utils)
207 # (it's usefull to have it separated from clean for speeding up make proper)
208 .PHONY: local-clean
209 local-clean:
210         -@rm -f $(objs) $(NAME) $(objs:.o=.il) librpath.lst 2>/dev/null
211
212 .PHONY: clean
213 clean: local-clean
214
215 .PHONY: clean-modules
216 clean-modules:
217         -@for r in $(cmodules) $(static_modules_path) "" ; do \
218                 if [ -d "$$r" ]; then \
219                         $(call oecho,"module $$r" ;) \
220                         $(MAKE) -C "$$r" clean ; \
221                         [ -r "$$r"/doc/Makefile ] && $(MAKE) -C "$$r"/doc clean ; \
222                 fi ; \
223         done
224
225 # make proper for the local directory
226 .PHONY: proper
227 .PHONY: distclean
228 .PHONY: realclean
229 .PHONY: maintainer-clean
230 proper distclean realclean maintainer-clean: local-clean
231         -@rm -f $(depends) $(auto_gen) $(auto_gen_others) $(auto_gen_keep) \
232                         makecfg.lst 2>/dev/null
233
234 maintainer-clean: clean-tmp
235
236 .PHONY: proper-modules
237 .PHONY: distclean-modules
238 .PHONY: realclean-modules
239 .PHONY: maintainer-clean-modules
240 proper-modules realclean-modules distclean-modules maintainer-clean-modules: \
241  clean_target=$(patsubst %-modules,%,$@)
242 proper-modules realclean-modules distclean-modules maintainer-clean-modules:
243         -@for r in $(cmodules) "" ; do \
244                 if [ -d "$$r" ]; then \
245                         $(MAKE) -C "$$r" $(clean_target); \
246                         [ -r "$$r"/doc/Makefile ] && $(MAKE) -C "$$r"/doc $(clean_target);\
247                 fi ; \
248         done
249
250 .PHONY: clean-tmp
251 clean-tmp:
252         -@rm -f TAGS tags *.dbg .*.swp
253
254
255 .PHONY: doxygen
256 doxygen:
257         -@mkdir -p $(doxygen_dir)
258         -@echo "Create Doxygen documentation"
259         # disable call graphes, because of the DOT dependencies
260         (cat ./$(COREPATH)/doc/doxygen/ser.doxygen; \
261         echo "HAVE_DOT=no" ;\
262         echo "PROJECT_NAME=SIP-ROUTER" ;\
263         echo "PROJECT_NUMBER=$(NAME)-$(RELEASE)" )| doxygen -
264         -@echo "Doxygen documentation created"
265
266 .PHONY: clean_doxygen
267 clean_doxygen:
268         -@rm -rf $(doxygen_dir)/{xml,man,rtf,latex,html}
269         -@rmdir --ignore-fail-on-non-empty -p $(doxygen_dir) || true
270
271
272 .PHONY: TAGS
273 .PHONY: tags
274 TAGS tags:
275         $(MKTAGS) --exclude="obsolete/*" -R .
276
277 .PHONY: TAGS-ALL
278 .PHONY: tags-all
279 TAGS-ALL tags-all:
280         $(MKTAGS) -R .
281
282
283
284 ifeq (,$(MAKECMDGOALS))
285 -include $(depends)
286 else
287 ifeq (,$(strip $(nodep_targets)))
288 include $(COREPATH)/Makefile.targets
289 endif
290 ifneq (,$(filter-out $(nodep_targets),$(MAKECMDGOALS)))
291 -include $(depends)
292 endif
293 endif # ifeq (,$(MAKECMDGOALS))