Merge remote branch 'origin/andrei/cdefs2doc'
[sip-router] / Makefile.modules
1 #
2 # $Id$
3 #
4 # module Makefile
5 #(to be included from each module)
6 #
7 # History:
8 # --------
9 #  2007-03-29  if a module depends on SER_LIBS, it will be rebuilt on install
10 #               with the proper rpath; libraries will be automatically
11 #               installed if needed (andrei)
12 #  2008-06-23  added the README & man targets (andrei)
13 #  2008-06-27  make cfg / config.mak support (andrei)
14 #  2009-03-10  replaced DEFS with C_DEFS and INCLUDES with C_INCLUDES (DEFS
15 #              and INCLUDES are now used only for "temporary" defines/includes
16 #              inside modules or libs) (andrei)
17 #  2009-10-01  added support for automatically installing extra utils,
18 #               scripts and cfg files (andrei)
19 #  2010-03-04  don't overwrite already installed .cfgs, save the .cfg as
20 #              .sample in this case (andrei)
21 #
22
23 #
24 # Variables that should be defined in the modules, prior to including
25 # this makefile:
26 #
27 # NAME - module binary name, complete with .so and no path (MUST).
28 #
29 # COREPATH - path to the main/core directory (OPTIONAL, default ../..)
30 #
31 # DEFS - per module extra defines (OPTIONAL)
32 #
33 # LIBS - per module extra libs (OPTIONAL)
34 #
35 # SER_LIBS - ser/sr libs that should be compiled, linked against and installed
36 #           along the module. The format is: <path>/<shortname>, e.g.
37 #           SER_LIBS=../../lib/srdb2/srdb2 for libsrdb2 with the sources
38 #            in ../../lib/srdb2. (OPTIONAL)
39 #
40 # MOD_INSTALL_UTILS - list of utils directories that should be compiled and
41 #                     installed along the module. The utils must know how to
42 #                     install themselves (make install).
43 #                     E.g.: MOD_INSTALL_UTILS=../../utils/sercmd
44 #                     (OPTIONAL)
45 #
46 # MOD_INSTALL_SCRIPTS - list of scripts (complete path including the file name)
47 #                       that should be installed along the module.
48 #                       E.g.: MOD_INSTALL_SCRIPTS=../../scripts/foo/foo.sh
49 #                       (OPTIONAL)
50 #
51 # MOD_INSTALL_CFGS - list of extra config files that should be installed in
52 #                    the main config directory, along the module (OPTIONAL).
53 #
54 # MOD_INSTALL_SHARE - list of files to install into the arch-independent
55 #                     shared directory (by default
56 #                     /usr/local/share/$(MAIN_NAME))
57 #
58
59 MOD_NAME=$(NAME:.so=)
60
61 # allow placing modules in separate directory apart from ser core
62 COREPATH ?=../..
63
64 ALLDEP=Makefile $(COREPATH)/Makefile.sources $(COREPATH)/Makefile.rules \
65  $(COREPATH)/Makefile.modules $(COREPATH)/Makefile.dirs $(COREPATH)/config.mak
66
67 #override modules value, a module cannot have submodules
68 override modules=
69 override static_modules=
70 override static_modules_path=
71
72 # should be set in the Makefile of each module
73 # INCLUDES += -I$(COREPATH)
74
75 # temporary def (visible only in the module, not exported)
76 DEFS += -DMOD_NAME='"$(MOD_NAME)"'
77
78 ifneq ($(makefile_defs_included),1)
79 $(error "the local makefile does not include Makefile.defs!")
80 endif
81
82 ifeq ($(MAKELEVEL), 0)
83 # make called directly in the module dir!
84
85 #$(warning "you should run make from the main ser directory")
86
87 else
88 # called by the main Makefile
89
90 ALLDEP+=$(COREPATH)/Makefile
91
92 endif
93
94 include $(COREPATH)/Makefile.sources
95
96
97 # if config was not loaded (makefile_defs!=1) ignore
98 # the rest of makefile and try only to remake the config
99 ifeq ($(makefile_defs),1)
100
101 ifeq (,$(filter $(MOD_NAME), $(static_modules)))
102 CFLAGS:=$(MOD_CFLAGS)
103 LDFLAGS:=$(MOD_LDFLAGS)
104 endif
105
106
107 err_fail?=1
108
109 include $(COREPATH)/Makefile.dirs
110 include $(COREPATH)/Makefile.targets
111 include $(COREPATH)/Makefile.rules
112 include $(COREPATH)/Makefile.shared
113
114 # default: if not overwritten by the main Makefile, install in modules
115 mods_dst=$(modules_prefix)/$(modules_dir)/modules
116
117 $(mods_dst):
118                 mkdir -p $(mods_dst)
119
120 LIBS:=$(filter-out -ldl -lresolv, $(LIBS))
121
122
123 .PHONY: install
124 .PHONY: install-libs
125 .PHONY: install-utils
126 .PHONY: install-scripts
127 .PHONY: install-cfgs
128 install: $(NAME) $(mods_dst) install-libs install-utils install-scripts \
129                 install-cfg install-share
130         $(INSTALL_TOUCH) $(mods_dst)/$(NAME)
131         $(INSTALL_MODULES)  $(NAME)  $(mods_dst)
132
133 ifneq (,$(SER_LIBS))
134 install-libs:
135         @for lib in $(dir $(SER_LIBS)) ; do \
136                 $(call try_err, $(MAKE) -C "$${lib}" install-if-newer ) ;\
137         done; true
138
139 else
140 install-libs:
141
142 endif # $(SER_LIBS)
143
144 .PHONY: utils
145 .PHONY: clean-utils
146 .PHONY: proper-utils
147 .PHONY: distclean-utils
148 .PHONY: realclean-utils
149 .PHONY: maintainer-clean-utils
150 ifneq (,$(MOD_INSTALL_UTILS))
151 install-utils:
152         @for ut in $(MOD_INSTALL_UTILS) ; do \
153                 $(call try_err, $(MAKE) -C "$${ut}" install-if-newer ) ;\
154         done; true
155
156 utils:
157         @for r in $(MOD_INSTALL_UTILS) ; do \
158                 $(call try_err, $(MAKE) -C "$$r" ) ;\
159         done; true
160
161 clean-utils:
162         @for r in $(MOD_INSTALL_UTILS) ; do \
163                 if [ -d "$$r" ]; then \
164                          $(MAKE) -C "$$r" clean ; \
165                 fi ; \
166         done
167
168 proper-utils realclean-utils distclean-utils maintainer-clean-utils: \
169  clean_target=$(patsubst %-utils,%,$@)
170 proper-utils realclean-utils distclean-utils maintainer-clean-utils:
171         @for r in $(MOD_INSTALL_UTILS) ; do \
172                 if [ -d "$$r" ]; then \
173                          $(MAKE) -C "$$r" $(clean_target); \
174                 fi ; \
175         done
176
177 else
178 # ! MOD_INSTALL_UTILS
179 install-utils:
180 utils:
181 clean-utils:
182 proper-utils realclean-utils distclean-utils maintainer-clean-utils:
183
184 endif # $(MOD_INSTALL_UTILS)
185
186 ifneq (,$(MOD_INSTALL_SCRIPTS))
187 install-scripts: $(bin_prefix)/$(bin_dir)
188         @for r in $(MOD_INSTALL_SCRIPTS) ; do \
189                 if [ -n "$$r" ]; then \
190                         if [ -f "$$r" ]; then \
191                                 $(call try_err, $(INSTALL_TOUCH) \
192                                         $(bin_prefix)/$(bin_dir)/`basename "$$r"` ); \
193                                 $(call try_err,\
194                                         $(INSTALL_SCRIPT)  "$$r"  $(bin_prefix)/$(bin_dir) ); \
195                         else \
196                                 echo "ERROR: $$r not found" ; \
197                                 if [ ${err_fail} = 1 ] ; then \
198                                         exit 1; \
199                                 fi ; \
200                         fi ; \
201                 fi ; \
202         done; true
203
204 else
205 install-scripts:
206
207 endif # $(MOD_INSTALL_SCRIPTS)
208
209 ifneq (,$(MOD_INSTALL_CFGS))
210 install-cfg: $(cfg_prefix)/$(cfg_dir)
211         @for r in $(MOD_INSTALL_CFGS) ; do \
212                 if [ -n "$$r" ]; then \
213                         if [ -f "$$r" ]; then \
214                                 n=`basename "$$r"` ; \
215                                 $(call try_err, $(INSTALL_TOUCH) \
216                                         "$(cfg_prefix)/$(cfg_dir)/$$n.sample" ); \
217                                 $(call try_err,\
218                                         $(INSTALL_CFG)  "$$r"  \
219                                                 "$(cfg_prefix)/$(cfg_dir)/$$n.sample"); \
220                                 if [ -z "${skip_cfg_install}" -a \
221                                                 ! -f "$(cfg_prefix)/$(cfg_dir)$$n" ]; then \
222                                         mv -f $(cfg_prefix)/$(cfg_dir)$$n.sample \
223                                                 $(cfg_prefix)/$(cfg_dir)$$n; \
224                                 fi ; \
225                         else \
226                                 echo "ERROR: $$r not found" ; \
227                                 if [ ${err_fail} = 1 ] ; then \
228                                         exit 1; \
229                                 fi ; \
230                         fi ; \
231                 fi ; \
232         done; true
233
234 else
235 install-cfg:
236
237 endif # $(MOD_INSTALL_CFGS)
238
239 ifneq (,$(MOD_INSTALL_SHARE))
240 install-share: $(share_prefix)/$(share_dir)
241         @for r in $(MOD_INSTALL_SHARE) ; do \
242                 if [ -n "$$r" ]; then \
243                         if [ -f "$$r" ]; then \
244                                 $(call try_err, $(INSTALL_TOUCH) \
245                                         $(share_prefix)/$(share_dir)/`basename "$$r"` ); \
246                                 $(call try_err,\
247                                         $(INSTALL_SHARE)  "$$r"  $(share_prefix)/$(share_dir) ); \
248                         else \
249                                 echo "ERROR: $$r not found" ; \
250                                 if [ ${err_fail} = 1 ] ; then \
251                                         exit 1; \
252                                 fi ; \
253                         fi ; \
254                 fi ; \
255         done; true
256
257 else
258 install-share:
259
260 endif # $(MOD_INSTALL_SHARE)
261
262
263 $(bin_prefix)/$(bin_dir):
264         mkdir -p $@
265
266 $(cfg_prefix)/$(cfg_dir):
267         mkdir -p $@
268
269 $(share_prefix)/$(share_dir):
270         mkdir -p $@
271
272 # README build rules
273 ifneq (,$(wildcard doc/Makefile))
274 #doc/Makefile present => we can generate README
275
276 README: doc/*.xml
277         $(MAKE) -C doc $(MOD_NAME).txt
278         mv doc/$(MOD_NAME).txt $@
279
280 else
281 # do nothing
282
283 README:
284 endif
285
286 #man page build rules
287 ifneq (,$(wildcard $(MOD_NAME).xml))
288
289 $(MOD_NAME).7: $(MOD_NAME).xml
290         docbook2x-man -s ../../doc/stylesheets/serdoc2man.xsl $<
291
292 man: $(MOD_NAME).7
293
294 else
295
296 man:
297
298 endif
299
300 endif # ifeq($(makefile_defs),1)
301
302 include $(COREPATH)/Makefile.cfg