Modifying the return value of cfg_set* functions, in order to make
[sip-router] / Makefile
1 # $Id$
2 #
3 # sip_router makefile
4 #
5 # WARNING: requires gmake (GNU Make)
6 #  Arch supported: Linux, FreeBSD, SunOS (tested on Solaris 8), OpenBSD (3.2),
7 #  NetBSD (1.6).
8 #
9 #  History:
10 #  --------
11 #              created by andrei
12 #  2003-02-24  make install no longer overwrites ser.cfg  - patch provided
13 #               by Maxim Sobolev   <sobomax@FreeBSD.org> and 
14 #                  Tomas Bj√∂rklund <tomas@webservices.se>
15 #  2003-03-11  PREFIX & LOCALBASE must also be exported (andrei)
16 #  2003-04-07  hacked to work with solaris install (andrei)
17 #  2003-04-17  exclude modules overwritable from env. or cmd. line,
18 #               added include_modules and skip_modules (andrei)
19 #  2003-05-30  added extra_defs & EXTRA_DEFS
20 #               Makefile.defs force-included to allow recursive make
21 #               calls -- see comment (andrei)
22 #  2003-06-02  make tar changes -- unpacks in $NAME-$RELEASE  (andrei)
23 #  2003-06-03  make install-cfg will properly replace the module path
24 #               in the cfg (re: /usr/.*lib/ser/modules)
25 #              ser.cfg.default is installed only if there is a previous
26 #               cfg. -- fixes packages containing ser.cfg.default (andrei)
27 #  2003-08-29  install-modules-doc split from install-doc, added 
28 #               install-modules-all, removed README.cfg (andrei)
29 #              added skip_cfg_install (andrei)
30 #  2004-09-02  install-man will automatically "fix" the path of the files
31 #               referred in the man pages
32 #  2006-02-14  added utils & install-utils (andrei)
33 #  2006-03-15  added nodeb parameter for make tar (andrei)
34 #  2006-09-29  added modules-doc as target and doc_format= as make option (greger)
35 #  2006-12-09  added new group_include as make option and defined groups 
36 #               defining which modules to include. Also added new target 
37 #               print-modules that you can use to check which modules will be 
38 #               compiled (greger)
39 #  2007-01-10  added new group_include targets mysql, radius, and presence 
40 #               improved print-modules output fixed problem in include/exclude
41 #               logic when using group_include (greger)
42 #  2007-03-01  fail if a module or a required utility make fail unless 
43 #              err_fail=0; don't try to make modules with no Makefiles (andrei)
44 #  2007-03-16  moved the exports to Makefile.defs (andrei)
45 #  2007-03-29  install-modules changed to use make -C modpath install (andrei)
46 #  2007-05-04  "if ! foo" not supported in standard sh, switched to 
47 #                "if foo; then :; else ... ; fi" (andrei)
48
49 auto_gen=lex.yy.c cfg.tab.c #lexx, yacc etc
50 auto_gen_others=cfg.tab.h  # auto generated, non-c
51
52 #include  source related defs
53 include Makefile.sources
54
55 # whether or not the entire build process should fail if building a module or
56 #  an utility fails
57 err_fail?=1
58
59 # whether or not to install ser.cfg or just ser.cfg.default
60 # (ser.cfg will never be overwritten by make install, this is usefull
61 #  when creating packages)
62 skip_cfg_install?=
63
64 #extra modules to exclude
65 skip_modules?=
66
67 # Set document format
68 # Alternatives are txt, html, xhtml, and pdf (see Makefile.doc)
69 doc_format?=html
70
71 # Module group definitions, default only include the standard group
72 # Make backwards compatible, don't set group_include default...
73 #group_include?="standard"
74
75 # Modules in this group are considered a standard part of SER (due to 
76 # widespread usage) and have no external compile or link dependencies (note 
77 # that some of these interplay with external systems).
78 module_group_standard=acc_syslog auth avp avpops ctl dispatcher diversion enum\
79                                 eval exec fifo flatstore gflags maxfwd mediaproxy \
80                                 nathelper options pdt permissions pike print ratelimit \
81                                 registrar rr sanity sl textops timer tm uac unixsock uri \
82                                 usrloc xlog
83
84 # Modules in this group are considered a standard part of SER (due to 
85 # widespread usage) but they have dependencies that must be satisfied for 
86 # compilation.
87 # acc_radius, auth_radius, avp_radius, uri_radius => radiusclient-ng
88 # acc_db, auth_db, avp_db, db_ops, domain, lcr, msilo, dialog, speeddial,
89 # uri_db => database module (mysql, postgres, dbtext)
90 # mysql, postgres => mysql server and client libraries or postgres server and
91 #  client libraries or other database back-end (ex. mysql-devel)
92 # pa, xmlrpc => libxml2
93 # rls => pa
94 #
95 # NOTE! All presence modules (dialog, pa, presence_b2b, rls, xcap) have been
96 # included in this group due to interdependencies
97 module_group_standard_dep=acc_db acc_radius auth_db auth_radius avp_db \
98                                 avp_radius \
99                                 db_ops domain lcr msilo mysql dialog pa postgres \
100                                 presence_b2b rls speeddial uri_db xcap xmlrpc
101
102 # For mysql
103 module_group_mysql=acc_db auth_db avp_db db_ops uri_db domain lcr msilo mysql\
104                                 speeddial
105
106 # For radius
107 module_group_radius=acc_radius auth_radius avp_radius
108
109 # For presence
110 module_group_presence=dialog pa presence_b2b rls xcap
111
112 # Modules in this group satisfy specific or niche applications, but are 
113 # considered stable for production use. They may or may not have dependencies
114 # cpl-c => libxml2
115 # jabber => expat (library)
116 # osp => OSP Toolkit (sipfoundry)
117 # sms => none (external modem)
118 module_group_stable=cpl-c dbtext jabber osp sms
119
120 # Modules in this group are either not complete, untested, or without enough
121 # reports of usage to allow the module into the stable group. They may or may
122 # not have dependencies
123 module_group_experimental=tls oracle iptrtpproxy
124
125 # if not set on the cmd. line or the env, exclude the below modules.
126 ifneq ($(group_include),)
127         # For group_include, default all modules are excluded except those in 
128         # include_modules
129         exclude_modules?=
130 else
131         # Old defaults for backwards compatibility
132         exclude_modules?=                       acc cpl ext extcmd radius_acc radius_auth vm\
133                                                         group mangler auth_diameter \
134                                                         postgres snmp \
135                                                         im \
136                                                         jabber mysql \
137                                                         cpl-c \
138                                                         auth_radius group_radius uri_radius avp_radius \
139                                                         acc_radius dialog pa rls presence_b2b xcap xmlrpc\
140                                                         osp tls oracle \
141                                                         unixsock dbg print_lib auth_identity
142         # excluded because they do not compile (remove them only after they are
143         #  fixed) -- andrei
144         exclude_modules+= avpops  bdb db_ops dbtext flatstore lcr msilo pdt \
145                                                 permissions speeddial iptrtpproxy
146 endif
147
148 # always exclude the CVS dir
149 override exclude_modules+= CVS $(skip_modules)
150
151 # Test for the groups and add to include_modules
152 ifneq (,$(findstring standard,$(group_include)))
153         override include_modules+= $(module_group_standard)
154 endif
155
156 ifneq (,$(findstring standard-dep,$(group_include)))
157         override include_modules+= $(module_group_standard_dep)
158 endif
159
160 ifneq (,$(findstring mysql,$(group_include)))
161         override include_modules+= $(module_group_mysql)
162 endif
163
164 ifneq (,$(findstring radius,$(group_include)))
165         override include_modules+= $(module_group_radius)
166 endif
167
168 ifneq (,$(findstring presence,$(group_include)))
169         override include_modules+= $(module_group_presence)
170 endif
171
172 ifneq (,$(findstring stable,$(group_include)))
173         override include_modules+= $(module_group_stable)
174 endif
175
176 ifneq (,$(findstring experimental,$(group_include)))
177         override include_modules+= $(module_group_experimental)
178 endif
179
180 # first 2 lines are excluded because of the experimental or incomplete
181 # status of the modules
182 # the rest is excluded because it depends on external libraries
183 #
184 static_modules=
185 static_modules_path=$(addprefix modules/, $(static_modules))
186 extra_sources=$(wildcard $(addsuffix /*.c, $(static_modules_path)))
187 extra_objs=$(extra_sources:.c=.o)
188
189 static_defs= $(foreach  mod, $(static_modules), \
190                 -DSTATIC_$(shell echo $(mod) | tr [:lower:] [:upper:]) )
191
192 override extra_defs+=$(static_defs) $(EXTRA_DEFS)
193 export extra_defs
194
195 # Historically, the resultant set of modules is: modules/* - exclude_modules +
196 # include_modules
197 # When group_include is used, we want: include_modules (based on group_include)
198 # - exclude_modules
199 ifneq ($(group_include),)
200         modules=$(filter-out $(addprefix modules/, \
201                         $(exclude_modules) $(static_modules)), \
202                         $(addprefix modules/, $(include_modules) ))
203 else    
204         # Standard, old resultant set
205         modules=$(filter-out $(addprefix modules/, \
206                         $(exclude_modules) $(static_modules)), \
207                         $(wildcard modules/*))
208         modules:=$(filter-out $(modules), $(addprefix modules/, $(include_modules) )) \
209                         $(modules)
210 endif
211 modules_names=$(shell echo $(modules)| \
212                                 sed -e 's/modules\/\([^/ ]*\)\/*/\1.so/g' )
213 modules_basenames=$(shell echo $(modules)| \
214                                 sed -e 's/modules\/\([^/ ]*\)\/*/\1/g' )
215 #modules_names=$(patsubst modules/%, %.so, $(modules))
216 modules_full_path=$(join  $(modules), $(addprefix /, $(modules_names)))
217
218
219 # which utils need compilation (directory path) and which to install
220 # (full path including file name)
221 utils_compile=  utils/gen_ha1 utils/serunix utils/sercmd
222 utils_install=  utils/gen_ha1/gen_ha1 utils/serunix/serunix \
223                                 scripts/sc scripts/mysql/ser_mysql.sh utils/sercmd/sercmd
224
225
226 ALLDEP=Makefile Makefile.sources Makefile.defs Makefile.rules
227
228 #include general defs (like CC, CFLAGS  a.s.o)
229 # hack to force makefile.defs re-inclusion (needed when make calls itself with
230 # other options -- e.g. make bin)
231 makefile_defs=0
232 DEFS:=
233 include Makefile.defs
234
235 NAME=$(MAIN_NAME)
236
237 tar_name=$(NAME)-$(RELEASE)_src
238
239 tar_extra_args+=$(addprefix --exclude=$(notdir $(CURDIR))/, \
240                                         $(auto_gen) $(auto_gen_others))
241 ifeq ($(CORE_TLS), 1)
242         tar_extra_args+=
243 else
244         tar_extra_args+=--exclude=$(notdir $(CURDIR))/tls/* 
245 endif
246
247 ifneq ($(nodeb),)
248         tar_extra_args+=--exclude=$(notdir $(CURDIR))/debian 
249         tar_name:=$(tar_name)_nodeb
250 endif
251
252 # sanity checks
253 ifneq ($(TLS),)
254         $(warning "make TLS option is obsoleted, try TLS_HOOKS or CORE_TLS")
255 endif
256
257 # include the common rules
258 include Makefile.rules
259
260 #extra targets 
261
262 $(NAME): $(extra_objs) # static_modules
263
264 lex.yy.c: cfg.lex cfg.tab.h $(ALLDEP)
265         $(LEX) $<
266
267 cfg.tab.c cfg.tab.h: cfg.y  $(ALLDEP)
268         $(YACC) $(YACC_FLAGS) $<
269
270 .PHONY: all
271 all: $(NAME) modules
272
273 .PHONY: print-modules
274 print-modules:
275         @echo The following modules was chosen to be included: $(include_modules) ; \
276         echo ---------------------------------------------------------- ; \
277         echo The following modules will be excluded: $(exclude_modules) ; \
278         echo ---------------------------------------------------------- ; \
279         echo The following modules will be made: $(modules_basenames) ; \
280
281 .PHONY: modules
282 modules:
283         @for r in $(modules) "" ; do \
284                 if [ -n "$$r" -a -r "$$r/Makefile" ]; then \
285                         echo  "" ; \
286                         echo  "" ; \
287                         if  $(MAKE) -C $$r || [ ${err_fail} != 1 ] ; then \
288                                 :; \
289                         else \
290                                 exit 1; \
291                         fi ; \
292                 fi ; \
293         done; true
294
295 $(extra_objs):
296         @echo "Extra objs: $(extra_objs)" 
297         @for r in $(static_modules_path) "" ; do \
298                 if [ -n "$$r" -a -r "$$r/Makefile"  ]; then \
299                         echo  "" ; \
300                         echo  "Making static module $r" ; \
301                         if $(MAKE) -C $$r static ; then  \
302                                 :; \
303                         else \
304                                 exit 1; \
305                         fi ;  \
306                 fi ; \
307         done
308
309 .PHONY: utils
310 utils:
311         @for r in $(utils_compile) "" ; do \
312                 if [ -n "$$r" ]; then \
313                         echo  "" ; \
314                         echo  "" ; \
315                         if  $(MAKE) -C $$r || [ ${err_fail} != 1 ] ; then \
316                                 :; \
317                         else \
318                                 exit 1; \
319                         fi ; \
320                 fi ; \
321         done; true
322
323
324 dbg: ser
325         gdb -command debug.gdb
326
327 .PHONY: tar
328 .PHONY: dist
329
330 dist: tar
331
332 tar: 
333         $(TAR) -C .. \
334                 --exclude=$(notdir $(CURDIR))/test* \
335                 --exclude=$(notdir $(CURDIR))/tmp* \
336                 --exclude=$(notdir $(CURDIR))/debian/ser \
337                 --exclude=$(notdir $(CURDIR))/debian/ser-* \
338                 --exclude=$(notdir $(CURDIR))/ser_tls* \
339                 --exclude=CVS* \
340                 --exclude=.svn* \
341                 --exclude=.cvsignore \
342                 --exclude=librpath.lst \
343                 --exclude=*.[do] \
344                 --exclude=*.so \
345                 --exclude=*.il \
346                 --exclude=$(notdir $(CURDIR))/ser \
347                 --exclude=*.gz \
348                 --exclude=*.bz2 \
349                 --exclude=*.tar \
350                 --exclude=*.patch \
351                 --exclude=.\#* \
352                 --exclude=*.swp \
353                 ${tar_extra_args} \
354                 -cf - $(notdir $(CURDIR)) | \
355                         (mkdir -p tmp/_tar1; mkdir -p tmp/_tar2 ; \
356                             cd tmp/_tar1; $(TAR) -xf - ) && \
357                             mv tmp/_tar1/$(notdir $(CURDIR)) \
358                                tmp/_tar2/"$(NAME)-$(RELEASE)" && \
359                             (cd tmp/_tar2 && $(TAR) \
360                                             -zcf ../../"$(tar_name)".tar.gz \
361                                                        "$(NAME)-$(RELEASE)" ) ; \
362                             rm -rf tmp/_tar1; rm -rf tmp/_tar2
363
364 # binary dist. tar.gz
365 .PHONY: bin
366 bin:
367         mkdir -p tmp/ser/usr/local
368         $(MAKE) install basedir=tmp/ser prefix=/usr/local 
369         $(TAR) -C tmp/ser/ -zcf ../$(NAME)-$(RELEASE)_$(OS)_$(ARCH).tar.gz .
370         rm -rf tmp/ser
371
372 .PHONY: deb
373 deb:
374         -@if [ -d debian ]; then \
375                 dpkg-buildpackage -rfakeroot -tc; \
376         else \
377                 ln -s pkg/debian debian; \
378                 dpkg-buildpackage -rfakeroot -tc; \
379                 rm debian; \
380         fi
381
382 .PHONY: sunpkg
383 sunpkg:
384         mkdir -p tmp/ser
385         mkdir -p tmp/ser_sun_pkg
386         $(MAKE) install basedir=tmp/ser prefix=/usr/local
387         (cd pkg/solaris; \
388         pkgmk -r ../../tmp/ser/usr/local -o -d ../../tmp/ser_sun_pkg/ -v "$(RELEASE)" ;\
389         cd ../..)
390         cat /dev/null > ../$(NAME)-$(RELEASE)-$(OS)-$(ARCH)-local
391         pkgtrans -s tmp/ser_sun_pkg/ ../$(NAME)-$(RELEASE)-$(OS)-$(ARCH)-local \
392                 IPTELser
393         gzip -9 ../$(NAME)-$(RELEASE)-$(OS)-$(ARCH)-local
394         rm -rf tmp/ser
395         rm -rf tmp/ser_sun_pkg
396
397 .PHONY: modules-doc
398 modules-doc:
399         -@for r in $(modules) "" ; do \
400                 if [ -n "$$r" ]; then \
401                         echo  "" ; \
402                         echo  "" ; \
403                         $(MAKE) -C $$r/doc $(doc_format) ; \
404                 fi ; \
405         done 
406
407 .PHONY: install
408 install: install-bin install-modules install-cfg \
409         install-doc install-man install-utils
410                 mv -f $(bin_prefix)/$(bin_dir)/sc $(bin_prefix)/$(bin_dir)/serctl #fix
411
412 .PHONY: dbinstall
413 dbinstall:
414         -@echo "Initializing ser database"
415         scripts/mysql/ser_mysql.sh create
416         -@echo "Done"
417
418 mk-install_dirs: $(cfg_prefix)/$(cfg_dir) $(bin_prefix)/$(bin_dir) \
419                         $(modules_prefix)/$(modules_dir) $(doc_prefix)/$(doc_dir) \
420                         $(man_prefix)/$(man_dir)/man8 $(man_prefix)/$(man_dir)/man5
421
422
423 $(cfg_prefix)/$(cfg_dir): 
424                 mkdir -p $(cfg_prefix)/$(cfg_dir)
425
426 $(bin_prefix)/$(bin_dir):
427                 mkdir -p $(bin_prefix)/$(bin_dir)
428
429 $(modules_prefix)/$(modules_dir):
430                 mkdir -p $(modules_prefix)/$(modules_dir)
431
432
433 $(doc_prefix)/$(doc_dir):
434                 mkdir -p $(doc_prefix)/$(doc_dir)
435
436 $(man_prefix)/$(man_dir)/man8:
437                 mkdir -p $(man_prefix)/$(man_dir)/man8
438
439 $(man_prefix)/$(man_dir)/man5:
440                 mkdir -p $(man_prefix)/$(man_dir)/man5
441                 
442 # note: on solaris 8 sed: ? or \(...\)* (a.s.o) do not work
443 install-cfg: $(cfg_prefix)/$(cfg_dir)
444                 sed -e "s#/usr/.*lib/ser/modules/#$(modules_target)#g" \
445                         < etc/ser.cfg > $(cfg_prefix)/$(cfg_dir)ser.cfg.sample
446                 chmod 644 $(cfg_prefix)/$(cfg_dir)ser.cfg.sample
447                 if [ -z "${skip_cfg_install}" -a \
448                                 ! -f $(cfg_prefix)/$(cfg_dir)ser.cfg ]; then \
449                         mv -f $(cfg_prefix)/$(cfg_dir)ser.cfg.sample \
450                                 $(cfg_prefix)/$(cfg_dir)ser.cfg; \
451                 fi
452                 # radius dictionary
453                 $(INSTALL_TOUCH) $(cfg_prefix)/$(cfg_dir)/dictionary.ser 
454                 $(INSTALL_CFG) etc/dictionary.ser $(cfg_prefix)/$(cfg_dir)
455 #               $(INSTALL_CFG) etc/ser.cfg $(cfg_prefix)/$(cfg_dir)
456
457 install-bin: $(bin_prefix)/$(bin_dir) $(NAME)
458                 $(INSTALL_TOUCH) $(bin_prefix)/$(bin_dir)/$(NAME)
459                 $(INSTALL_BIN) $(NAME) $(bin_prefix)/$(bin_dir)
460
461
462 export INSTALL_TOUCH RELEASE
463
464 install-modules: $(modules_prefix)/$(modules_dir)
465         @for r in $(modules) "" ; do \
466                 if [ -n "$$r" -a -r "$$r/Makefile" ]; then \
467                         echo  "" ; \
468                         echo  "" ; \
469                         if  $(MAKE) -C $$r install || [ ${err_fail} != 1 ] ; then \
470                                 :; \
471                         else \
472                                 exit 1; \
473                         fi ; \
474                 fi ; \
475         done; true
476
477 install-utils: utils $(bin_prefix)/$(bin_dir)
478         @for r in $(utils_install) "" ; do \
479                 if [ -n "$$r" ]; then \
480                         if [ -f "$$r" ]; then \
481                                 $(INSTALL_TOUCH) \
482                                         $(bin_prefix)/$(bin_dir)/`basename "$$r"` ; \
483                                 $(INSTALL_BIN)  "$$r"  $(bin_prefix)/$(bin_dir) ; \
484                         else \
485                                 echo "ERROR: $$r not compiled" ; \
486                                 if [ ${err_fail} = 1 ] ; then \
487                                         exit 1; \
488                                 fi ; \
489                         fi ;\
490                 fi ; \
491         done; true
492
493
494
495 install-modules-all: install-modules install-modules-doc
496
497
498 install-doc: $(doc_prefix)/$(doc_dir) install-modules-doc
499         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/INSTALL 
500         $(INSTALL_DOC) INSTALL $(doc_prefix)/$(doc_dir)
501         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/README-MODULES 
502         $(INSTALL_DOC) README-MODULES $(doc_prefix)/$(doc_dir)
503         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/AUTHORS 
504         $(INSTALL_DOC) AUTHORS $(doc_prefix)/$(doc_dir)
505         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/NEWS
506         $(INSTALL_DOC) NEWS $(doc_prefix)/$(doc_dir)
507         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/README 
508         $(INSTALL_DOC) README $(doc_prefix)/$(doc_dir)
509
510
511 install-modules-doc: $(doc_prefix)/$(doc_dir)
512         @for r in $(modules_basenames) "" ; do \
513                 if [ -n "$$r" ]; then \
514                         if [ -f modules/"$$r"/README ]; then \
515                                 $(INSTALL_TOUCH)  $(doc_prefix)/$(doc_dir)/README ; \
516                                 $(INSTALL_DOC)  modules/"$$r"/README  \
517                                                                         $(doc_prefix)/$(doc_dir)/README ; \
518                                 mv -f $(doc_prefix)/$(doc_dir)/README \
519                                                 $(doc_prefix)/$(doc_dir)/README."$$r" ; \
520                         fi ; \
521                 fi ; \
522         done 
523
524
525 install-man: $(man_prefix)/$(man_dir)/man8 $(man_prefix)/$(man_dir)/man5
526                 sed -e "s#/etc/ser/ser\.cfg#$(cfg_target)ser.cfg#g" \
527                         -e "s#/usr/sbin/#$(bin_target)#g" \
528                         -e "s#/usr/lib/ser/modules/#$(modules_target)#g" \
529                         -e "s#/usr/share/doc/ser/#$(doc_target)#g" \
530                         < ser.8 >  $(man_prefix)/$(man_dir)/man8/ser.8
531                 chmod 644  $(man_prefix)/$(man_dir)/man8/ser.8
532                 sed -e "s#/etc/ser/ser\.cfg#$(cfg_target)ser.cfg#g" \
533                         -e "s#/usr/sbin/#$(bin_target)#g" \
534                         -e "s#/usr/lib/ser/modules/#$(modules_target)#g" \
535                         -e "s#/usr/share/doc/ser/#$(doc_target)#g" \
536                         < ser.cfg.5 >  $(man_prefix)/$(man_dir)/man5/ser.cfg.5
537                 chmod 644  $(man_prefix)/$(man_dir)/man5/ser.cfg.5
538
539
540 .PHONY: clean_libs
541
542 clean_libs:
543                         $(MAKE) -C lib proper
544
545
546 # cleaning in libs always when cleaning ser
547 clean:  clean_libs
548