3a399a671fde5b19877937af4ffb1aea529d94c2
[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 #  2008-06-23  added 2 new targets: README and man (re-generate the README
49 #              or manpages for all the modules) (andrei)
50 #  2008-06-25  make cfg support (use a pre-built cfg.: config.mak) (andrei)
51 #  2008-06-28  added clean-all, proper-all, install-modules-man and error 
52 #               checks for install-utils & doc (andrei)
53 #  2008-07-01  split module list from config.mak into modules.lst so that
54 #               the modules list can be changed without rebuilding the whole
55 #               ser (andrei)
56 #              added cfg-defs, new target that only rebuilds config.mak
57 #  2009-03-10  replaced DEFS with C_DEFS (DEFS are now used only for
58 #              "temporary" defines inside modules or libs) (andrei)
59 #  2009-03-27  multiple modules directory support, see modules_dirs (andrei)
60 #  2009-04-02  workaround for export not supported in gnu make 3.80
61 #               target specific variables: use mk_params for each
62 #               $(MAKE) invocation (andrei)
63 #  2009-04-22  don't rebuild config.mak or modules.lst if not needed
64 #              (e.g. on clean) (andrei)
65 #  2009-06-24  auto-generate autover.h, containing the REPO_VER macro, defined
66 #               to the top git commit sha (if git is found) (andrei)
67 #
68
69 # check make version
70 # everything works with 3.80, except evals inside ifeq/endif
71 # (see https://savannah.gnu.org/bugs/index.php?func=detailitem&item_id=1516).
72 # recommended 3.81
73 req_ver=3.81
74 # the check below works for version number of the type x.yy or x.yy.z*
75 # (from the GNU Make Cookbook)
76 ifeq (,$(filter $(req_ver),$(firstword $(sort $(MAKE_VERSION) $(req_ver)))))
77 $(error make version $(MAKE_VERSION) not supported, use at least $(req_ver))
78 endif
79
80
81 auto_gen=lex.yy.c cfg.tab.c #lexx, yacc etc
82 auto_gen_others=cfg.tab.h # auto generated, non-c
83 auto_gen_keep=autover.h # auto generated, should be included in archives
84
85 COREPATH=.
86 #include  source related defs
87 include Makefile.sources
88 #include special targets lists
89 include Makefile.targets
90
91 # whether or not the entire build process should fail if building a module or
92 #  an utility fails
93 err_fail?=1
94
95 # whether or not to install $(MAIN_NAME).cfg or just $(MAIN_NAME).cfg.default
96 # ($(MAIN_NAME).cfg will never be overwritten by make install, this is usefull
97 #  when creating packages)
98 skip_cfg_install?=
99
100 #extra modules to exclude
101 skip_modules?=
102
103 # see Makefile.dirs for the directories used for the modules
104 include Makefile.dirs
105
106 # Set document format
107 # Alternatives are txt, html, xhtml, and pdf (see Makefile.doc)
108 doc_format?=html
109
110 # don't force modules.lst generation if the makefile goals do not
111 # require it (but if present use it)
112 ifeq (,$(strip $(filter-out $(clean_targets) $(aux_targets),$(MAKECMDGOALS))))
113 ifneq (,$(strip $(wildcard modules.lst)))
114 -include modules.lst
115 endif
116 else
117 include modules.lst
118 endif # ifneq (,$(strip $(filter-out ...,$(MAKECMDGOALS))))
119
120 #if called with group_include, ignore the modules from modules.lst
121 ifneq ($(group_include),)
122         include_modules=
123         exclude_modules=
124         modules_configured:=0
125 endif
126
127 # Module group definitions, default only include the standard group
128 # Make backwards compatible, don't set group_include default...
129 #group_include?="standard"
130
131 # Modules in this group are considered a standard part of SER (due to 
132 # widespread usage) and have no external compile or link dependencies (note 
133 # that some of these interplay with external systems).
134 module_group_standard=acc_syslog auth avp ctl dispatcher diversion enum\
135                                 eval exec fifo db_flatstore gflags maxfwd mediaproxy \
136                                 nathelper options pdt permissions pike print ratelimit \
137                                 registrar rr sanity sl textops timer tm uac unixsock uri \
138                                 usrloc xlog cfg_rpc
139
140 # Modules in this group are considered a standard part of SER (due to 
141 # widespread usage) but they have dependencies that must be satisfied for 
142 # compilation.
143 # acc_radius, auth_radius, misc_radius => radiusclient-ng
144 # acc_db, auth_db, avp_db, db_ops, domain, lcr, msilo, dialog, speeddial,
145 # uri_db => database module (db_mysql, db_postgres, dbtext ...)
146 # mysql, postgres => mysql server and client libraries or postgres server and
147 #  client libraries or other database back-end (ex. mysql-devel)
148 # pa, xmlrpc => libxml2
149 # rls => pa
150 #
151 # NOTE! All presence modules (dialog, pa, presence_b2b, rls, xcap) have been
152 # included in this group due to interdependencies
153 module_group_standard_dep=acc_db acc_radius auth_db auth_radius avp_db \
154                                 auth_identity db_ops domain lcr misc_radius \
155                                 msilo dialog pa \
156                                 presence_b2b rls speeddial uri_db xcap xmlrpc
157
158 # For db use (db modules, excluding drivers)
159 module_group_db=acc_db auth_db avp_db db_ops db_flatstore db_text \
160                                 uri_db domain lcr msilo speeddial
161                                 #dbtext (s) not migrated yet to the new db interface
162
163 # For mysql
164 module_group_mysql_driver=db_mysql
165 module_group_mysql=$(module_group_mysql_driver) $(module_group_db)
166
167 # For postgress
168 module_group_postgres_driver=db_postgres
169 module_group_postgres=$(module_group_postgres_driver) $(module_group_db)
170
171 # For radius
172 module_group_radius=acc_radius auth_radius misc_radius peering
173
174 # For presence
175 module_group_presence=dialog pa presence_b2b rls xcap
176
177 # Modules in this group satisfy specific or niche applications, but are 
178 # considered stable for production use. They may or may not have dependencies
179 # cpl-c => libxml2
180 # jabber => expat (library)
181 # osp => OSP Toolkit (sipfoundry)
182 # sms => none (external modem)
183 module_group_stable=cpl-c dbtext jabber osp sms pdb
184
185 # Modules in this group are either not complete, untested, or without enough
186 # reports of usage to allow the module into the stable group. They may or may
187 # not have dependencies
188 module_group_experimental=tls oracle iptrtpproxy
189
190 # if not set on the cmd. line, env or in the modules.lst (cfg_group_include)
191 # exclude the below modules.
192 ifneq ($(group_include)$(cfg_group_include),)
193         # For group_include, default all modules are excluded except those in 
194         # include_modules
195         exclude_modules?=
196 else
197         # Old defaults for backwards compatibility
198         # excluded because they depend on external libraries
199         exclude_modules?=               cpl mangler postgres jabber mysql cpl-c \
200                                                         auth_radius misc_radius \
201                                                         acc_radius dialog pa rls presence_b2b xcap xmlrpc\
202                                                         osp tls oracle \
203                                                         unixsock dbg print_lib auth_identity ldap \
204                                                         db_berkeley db_mysql db_postgres db_oracle \
205                                                         db_unixodbc memcached mi_xmlrpc \
206                                                         nat_traversal perl perlvdb purple seas siptrace \
207                                                         snmpstats uac_redirect xmpp \
208                                                         carrierroute misc_radius peering \
209                                                         dialplan lcr utils presence \
210                                                         presence_dialoginfo presence_xml pua pua_bla \
211                                                         pua_dialoginfo pua_usrloc pua_xmpp \
212                                                         regex xcap_client
213         #excluded because they depend on external *.h files
214         exclude_modules+= h350
215         # excluded because they do not compile (remove them only after they are
216         #  fixed) -- andrei
217         exclude_modules+= bdb dbtext iptrtpproxy pa rls
218 endif
219
220 # always exclude the CVS dir
221 override exclude_modules+= CVS $(skip_modules)
222
223 # Test for the groups and add to include_modules
224 ifneq (,$(group_include))
225 $(eval override include_modules+= $(foreach grp, $(group_include), \
226                                                                                 $(module_group_$(grp)) ))
227 endif
228
229 # first 2 lines are excluded because of the experimental or incomplete
230 # status of the modules
231 # the rest is excluded because it depends on external libraries
232 #
233 static_modules:=
234
235 ALLDEP=config.mak Makefile Makefile.dirs Makefile.sources Makefile.rules
236
237 #include general defs (like CC, CFLAGS  a.s.o)
238 # hack to force makefile.defs re-inclusion (needed when make calls itself with
239 # other options -- e.g. make bin)
240 #makefile_defs=0
241 #C_DEFS:=
242
243
244 # try saved cfg, unless we are in the process of building it or if we're doing
245 # a clean
246 ifeq (,$(strip \
247         $(filter config.mak config cfg cfg-defs $(clean_targets),$(MAKECMDGOALS))))
248 include config.mak
249 ifeq ($(makefile_defs),1)
250 $(info config.mak loaded)
251 # config_make valid & used
252 config_mak=1
253 ifeq ($(MAIN_NAME),)
254 $(error "bad config.mak, try re-running make cfg")
255 endif
256 endif
257 else # config.mak doesn't need to be used
258 ifneq (,$(filter cfg config cfg-defs,$(word 1,$(MAKECMDGOALS))))
259 # needed here to avoid starting a config submake 
260 # (e.g. rm -f config.mak; make config.mak), which would either require 
261 # double Makefile.defs defines execution (suboptimal), would loose
262 # $(value ...) expansion or would cause some warning (if Makefile.defs exec. 
263 # is skipped in the "main" makefile invocation).
264 $(shell rm -rf config.mak)
265 config_mak=0
266 makefile_defs=0
267 exported_vars=0
268 endif
269 endif
270
271
272 main_makefile=1
273 include Makefile.defs
274
275 static_modules_path=$(addprefix modules/, $(static_modules))
276 extra_sources=$(wildcard $(addsuffix /*.c, $(static_modules_path)))
277 extra_objs=$(extra_sources:.c=.o)
278
279 static_defs:= $(foreach  mod, $(static_modules), \
280                 -DSTATIC_$(shell echo $(mod) | tr [:lower:] [:upper:]) )
281
282 override extra_defs+=$(static_defs) $(EXTRA_DEFS)
283 export extra_defs
284
285 # Historically, the resultant set of modules is: modules/* - exclude_modules +
286 # include_modules
287 # When group_include is used, we want: include_modules (based on group_include)
288 # - exclude_modules
289
290 ifneq ($(modules_configured),1) 
291 #modules_all=$(filter-out modules/CVS,$(wildcard modules/*))
292
293 # create modules*_all vars
294 $(foreach mods,$(modules_dirs),$(eval \
295         $(mods)_all=$$(filter-out $(mods)/CVS,$$(wildcard $(mods)/*))))
296 #debugging
297 #$(foreach mods,$(modules_dirs),$(info "$(mods)_all=$($(mods)_all)"))
298
299 ifneq ($(group_include),)
300 $(foreach mods,$(modules_dirs),$(eval \
301         $(mods)=$$(filter-out $$(addprefix $(mods)/, \
302                         $$(exclude_modules) $$(static_modules)), \
303                         $$(addprefix $(mods)/, $$(include_modules) )) ))
304 else    
305         # Standard, old resultant set
306 $(foreach mods,$(modules_dirs),$(eval \
307         $(mods)_noinc=$$(filter-out $$(addprefix $(mods)/, \
308                         $$(exclude_modules) $$(static_modules)), $$($(mods)_all)) \
309 ))
310 $(foreach mods,$(modules_dirs),$(eval \
311         $(mods)=$$(filter-out $$(modules_noinc), \
312                         $$(addprefix $(mods)/, $$(include_modules) )) $$($(mods)_noinc) \
313 ))
314 endif # ifneq($(group_include),)
315 endif # ifneq($(modules_configured),1)
316
317 $(foreach mods,$(modules_dirs),$(eval \
318         $(mods)_names=$$(shell echo $$($(mods))| \
319                                 sed -e "s/$(mods)"'\/\([^/ ]*\)\/*/\1.so/g' ) \
320 ))
321 $(foreach mods,$(modules_dirs),$(eval \
322         $(mods)_basenames:=$$(shell echo $$($(mods))| \
323                                 sed -e "s/$(mods)"'\/\([^/ ]*\)\/*/\1/g' ) \
324 ))
325
326 # all modules from all the $(modules_dirs)
327 all_modules_lst=$(foreach mods,$(modules_dirs), $($(mods)_all))
328
329 # compile modules list (all the compiled mods from  $(modules_dirs))
330 cmodules=$(foreach mods,$(modules_dirs), $($(mods)))
331
332 #modules_names=$(patsubst modules/%, %.so, $(modules))
333 #modules_full_path=$(join  $(modules), $(addprefix /, $(modules_names)))
334
335
336 # which utils need compilation (directory path) and which to install
337 # (full path including file name)
338 utils_compile=  utils/gen_ha1 utils/sercmd
339 utils_bin_install=      utils/gen_ha1/gen_ha1 # sercmd is now installed by ctl
340 utils_script_install=
341
342 # This is the list of files to be installed into the arch-independent
343 # shared directory (by default /usr/local/share/$(MAIN_NAME))
344 share_install=
345
346
347
348 NAME=$(MAIN_NAME)
349
350 tar_name=$(NAME)-$(RELEASE)_src
351
352 tar_extra_args+=$(addprefix --exclude=$(notdir $(CURDIR))/, \
353                                         $(auto_gen) $(auto_gen_others))
354 ifeq ($(CORE_TLS), 1)
355         tar_extra_args+=
356 else
357         tar_extra_args+=--exclude=$(notdir $(CURDIR))/tls/* 
358 endif
359
360 ifneq ($(nodeb),)
361         tar_extra_args+=--exclude=$(notdir $(CURDIR))/debian 
362         tar_name:=$(tar_name)_nodeb
363 endif
364
365 # sanity checks
366 ifneq ($(TLS),)
367         $(warning "make TLS option is obsoleted, try TLS_HOOKS or CORE_TLS")
368 endif
369
370 # include the common rules
371 include Makefile.rules
372
373 #extra targets 
374
375 $(NAME): $(extra_objs) # static_modules
376
377 lex.yy.c: cfg.lex cfg.tab.h $(ALLDEP)
378         $(LEX) $<
379
380 cfg.tab.c cfg.tab.h: cfg.y  $(ALLDEP)
381         $(YACC) $(YACC_FLAGS) $<
382
383 nullstring=
384 space=$(nullstring) $(nullstring)
385
386 modules_search_path=$(subst $(space),:,$(strip\
387                                                 $(foreach m,$(modules_dirs),$($(m)_target))))
388                 #                               $(addprefix $(modules_target),$(modules_dirs))))
389
390 # special depends for main.o
391 main.d main.o: autover.h
392 main.o: DEFS+=-DMODS_DIR='"$(modules_search_path)"'
393
394
395 #special depends for core_cmd.o
396 core_cmd.d core_cmd.o: autover.h
397
398 include Makefile.shared
399
400 ifeq ($(config_mak),1)
401
402 include Makefile.cfg
403
404 else
405
406 config.mak: Makefile.defs
407         @echo making config...
408         @echo "# this file is autogenerated by make cfg" >$@
409         @$(call mapf2,cfg_save_var,saved_fixed_vars,$(@))
410         @$(call mapf2,cfg_save_var2,saved_chg_vars,$(@))
411         @echo "override makefile_defs:=1" >>$@
412         @echo "C_DEFS:=\$$(filter-out \$$(DEFS_RM) \$$(extra_defs),\$$(C_DEFS))" \
413                                         "\$$(extra_defs)"  >>$@
414         @echo "CFLAGS:=\$$(filter-out \$$(CFLAGS_RM) \$$(CC_EXTRA_OPTS)," \
415                                                 "\$$(CFLAGS)) \$$(CC_EXTRA_OPTS)" >>$@
416
417 endif # ifeq ($(config_mak),1)
418
419 modules.lst:
420         @echo  saving modules list...
421         @echo "# this file is autogenerated by make modules-cfg" >$@
422         @echo "modules_dirs:=$(modules_dirs)" >>$@
423         @echo "cfg_group_include=$(group_include)" >>$@
424         @$(call cfg_save_var2,include_modules,$@)
425         @$(call cfg_save_var2,static_modules,$@)
426         @$(call cfg_save_var2,skip_modules,$@)
427         @$(call cfg_save_var2,exclude_modules,$@)
428         @$(foreach mods,$(modules_dirs), \
429                 $(call cfg_save_var2,$(mods)_all,$@))
430         @$(foreach mods,$(modules_dirs), \
431                 $(call cfg_save_var2,$(mods)_noinc,$@))
432         @$(foreach mods,$(modules_dirs), \
433                 $(call cfg_save_var2,$(mods),$@))
434         @echo "modules_configured:=1" >>$@
435
436
437 .PHONY: cfg config cfg-defs
438 cfg-defs: config.mak
439
440 cfg config: cfg-defs modules-cfg
441
442 .PHONY: modules-cfg modules-list modules-lst
443 modules-cfg modules-list modules-lst:
444         rm -f modules.lst
445         $(MAKE) modules.lst
446
447 ifneq ($(wildcard .git),)
448 # if .git/ exists
449 repo_ver=$(shell  RV=`git rev-parse --verify --short=6 HEAD 2>/dev/null`;\
450                                         [ -n "$$RV" ] && \
451                                         test -n "`git update-index --refresh --unmerged >/dev/null\
452                                                         ; git diff-index --name-only HEAD 2>/dev/null | \
453                                                                 grep -v Makefile`" &&\
454                                                 RV="$$RV"-dirty; echo "$$RV")
455 autover_h_dep=.git $(filter-out $(auto_gen), $(sources)) cfg.y cfg.lex
456 else
457 # else if .git/ does not exist
458 repo_ver=
459 autover_h_dep=
460 endif
461
462
463 autover.h: $(autover_h_dep)
464         @echo  "generating autover.h ..."
465         @echo "/* this file is autogenerated by make autover.h" >$@
466         @echo " * DO NOT EDIT IT" >>$@
467         @echo " */" >>$@
468         @echo "" >>$@
469         @echo "#define REPO_VER \"$(repo_ver)\"" >>$@
470
471 .PHONY: all
472 all: $(NAME) every-module
473
474 .PHONY: print-modules
475 print-modules:
476         @echo The following modules were chosen to be included: \
477                 $(include_modules) ; \
478         echo ---------------------------------------------------------- ; \
479         echo The following modules will be excluded: $(exclude_modules) ; \
480         echo ---------------------------------------------------------- ; \
481         echo The following modules will be made; \
482         $(foreach mods,$(modules_dirs), \
483                 echo $(mods)/: $($(mods)_basenames) ; ) \
484         #echo DBG: The following modules will be made: $(modules_basenames) ; \
485
486
487 # modules templates (instantiated based on modules_dirs contents)
488 define MODULES_RULES_template
489
490 $(1)_dst=$(modules_prefix)/$(modules_dir)$(1)
491 $(1)_target=$(prefix)/$(modules_dir)$(1)
492
493 .PHONY: $(1)
494 $(1): modules.lst
495         @for r in $($(1)) "" ; do \
496                 if [ -n "$$$$r" -a -r "$$$$r/Makefile" ]; then \
497                         echo  "" ; \
498                         echo  "" ; \
499                         if  $(MAKE) -C $$$$r $$(mk_params) || [ ${err_fail} != 1 ] ; then \
500                                 :; \
501                         else \
502                                 exit 1; \
503                         fi ; \
504                 fi ; \
505         done; true
506
507 .PHONY: $(1)-doc
508 $(1)-doc: modules.lst
509         @for r in $($(1)) "" ; do \
510                 if [ -n "$$$$r" ]; then \
511                         echo  "" ; \
512                         echo  "" ; \
513                         $(MAKE) -C $$$$r/doc $(doc_format) $$(mk_params); \
514                 fi ; \
515         done
516
517 .PHONY: $(1)-readme
518
519 $(1)-readme: modules.lst
520         -@for r in $($(1)) "" ; do \
521                 if [ -n "$$$$r" ]; then \
522                         echo  "" ; \
523                         echo  "" ; \
524                         if  $(MAKE) -C $$$$r $$(mk_params) README || [ ${err_fail} != 1 ];\
525                         then \
526                                 :; \
527                         else \
528                                 exit 1; \
529                         fi ; \
530                 fi ; \
531         done; true
532
533 .PHONY: $(1)-man
534 $(1)-man: modules.lst
535         -@for r in $($(1)) "" ; do \
536                 if [ -n "$$$$r" ]; then \
537                         echo  "" ; \
538                         echo  "" ; \
539                         if  $(MAKE) -C $$$$r $$(mk_params) man || [ ${err_fail} != 1 ] ;\
540                         then \
541                                 :; \
542                         else \
543                                 exit 1; \
544                         fi ; \
545                 fi ; \
546         done; true
547
548 .PHONY: install-$(1)
549
550 install-$(1): modules.lst $$($(1)_dst)
551         @for r in $($(1)) "" ; do \
552                 if [ -n "$$$$r" -a -r "$$$$r/Makefile" ]; then \
553                         echo  "" ; \
554                         echo  "" ; \
555                         if  $(MAKE) -C $$$$r install mods_dst=$$($(1)_dst) $$(mk_params) \
556                                 || [ ${err_fail} != 1 ] ; then \
557                                 :; \
558                         else \
559                                 exit 1; \
560                         fi ; \
561                 fi ; \
562         done; true
563
564
565 .PHONY: install-$(1)-doc
566
567 install-$(1)-doc: modules.lst $(doc_prefix)/$(doc_dir)$(1)
568         @for r in $($(1)_basenames) "" ; do \
569                 if [ -n "$$$$r" ]; then \
570                         if [ -f $(1)/"$$$$r"/README ]; then \
571                                 $$(call try_err,\
572                                         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)$(1)/README ); \
573                                 $$(call try_err,\
574                                         $(INSTALL_DOC)  $(1)/"$$$$r"/README  \
575                                                                         $(doc_prefix)/$(doc_dir)$(1)/README ); \
576                                 $$(call try_err,\
577                                         mv -f $(doc_prefix)/$(doc_dir)$(1)/README \
578                                                         $(doc_prefix)/$(doc_dir)$(1)/README."$$$$r" ); \
579                         fi ; \
580                 fi ; \
581         done; true
582
583 .PHONY: install-$(1)-man
584
585 install-$(1)-man: $(1)-man $(man_prefix)/$(man_dir)/man7
586         @for r in $($(1)_basenames) "" ; do \
587                 if [ -n "$$$$r" ]; then \
588                         if [ -f $(1)/"$$$$r"/"$$$$r".7 ]; then \
589                                 $$(call try_err,\
590                                   $(INSTALL_TOUCH) $(man_prefix)/$(man_dir)/man7/"$$$$r".7 );\
591                                 $$(call try_err,\
592                                         $(INSTALL_MAN)  $(1)/"$$$$r"/"$$$$r".7  \
593                                                                         $(man_prefix)/$(man_dir)/man7 ); \
594                         fi ; \
595                 fi ; \
596         done; true
597
598
599 $(modules_prefix)/$(modules_dir)$(1):
600                 mkdir -p $$(@)
601
602 $(doc_prefix)/$(doc_dir)$(1):
603                 mkdir -p $$(@)
604
605
606 endef
607
608 # instantiate the template
609 $(foreach mods,$(modules_dirs),$(eval $(call MODULES_RULES_template,$(mods))))
610
611 #$(foreach mods,$(modules_dirs),$(eval  $(info DUMP: $(call MODULES_RULES_template,$(mods)))))
612
613 # build all the modules
614 modules-all every-module: $(modules_dirs)
615
616 $(extra_objs):
617         @echo "Extra objs: $(extra_objs)" 
618         @for r in $(static_modules_path) "" ; do \
619                 if [ -n "$$r" -a -r "$$r/Makefile"  ]; then \
620                         echo  "" ; \
621                         echo  "Making static module $r" ; \
622                         if $(MAKE) -C $$r static $(mk_params) ; then  \
623                                 :; \
624                         else \
625                                 exit 1; \
626                         fi ;  \
627                 fi ; \
628         done
629
630 .PHONY: utils
631 utils:
632         @for r in $(utils_compile) "" ; do \
633                 if [ -n "$$r" ]; then \
634                         echo  "" ; \
635                         echo  "" ; \
636                         if  $(MAKE) -C $$r $(mk_params) || [ ${err_fail} != 1 ] ; \
637                         then \
638                                 :; \
639                         else \
640                                 exit 1; \
641                         fi ; \
642                 fi ; \
643         done; true
644
645
646 dbg: sip-router
647         gdb -command debug.gdb
648
649 .PHONY: tar
650 .PHONY: dist
651
652 dist: tar
653
654 tar: $(auto_gen_keep)
655         $(TAR) -C .. \
656                 --exclude=$(notdir $(CURDIR))/test* \
657                 --exclude=$(notdir $(CURDIR))/tmp* \
658                 --exclude=$(notdir $(CURDIR))/debian/$(MAIN_NAME) \
659                 --exclude=$(notdir $(CURDIR))/debian/$(MAIN_NAME)-* \
660                 --exclude=$(notdir $(CURDIR))/$(MAIN_NAME)_tls* \
661                 --exclude=.git* \
662                 --exclude=CVS* \
663                 --exclude=.svn* \
664                 --exclude=.cvsignore \
665                 --exclude=librpath.lst \
666                 --exclude=libiname.lst \
667                 --exclude=makecfg.lst \
668                 --exclude=config.mak \
669                 --exclude=modules.lst \
670                 --exclude=*.[do] \
671                 --exclude=*.so \
672                 --exclude=*.il \
673                 --exclude=$(notdir $(CURDIR))/$(MAIN_NAME) \
674                 --exclude=*.gz \
675                 --exclude=*.bz2 \
676                 --exclude=*.tar \
677                 --exclude=*.patch \
678                 --exclude=.\#* \
679                 --exclude=*.swp \
680                 --exclude=*.swo \
681                 ${tar_extra_args} \
682                 -cf - $(notdir $(CURDIR)) | \
683                         (mkdir -p tmp/_tar1; mkdir -p tmp/_tar2 ; \
684                             cd tmp/_tar1; $(TAR) -xf - ) && \
685                             mv tmp/_tar1/$(notdir $(CURDIR)) \
686                                tmp/_tar2/"$(NAME)-$(RELEASE)" && \
687                             (cd tmp/_tar2 && $(TAR) \
688                                             -zcf ../../"$(tar_name)".tar.gz \
689                                                        "$(NAME)-$(RELEASE)" ) ; \
690                             rm -rf tmp/_tar1; rm -rf tmp/_tar2
691
692 # binary dist. tar.gz
693 .PHONY: bin
694 bin:
695         mkdir -p tmp/$(MAIN_NAME)/usr/local
696         $(MAKE) install basedir=tmp/$(MAIN_NAME) $(mk_params)
697         $(TAR) -C tmp/$(MAIN_NAME)/ -zcf ../$(NAME)-$(RELEASE)_$(OS)_$(ARCH).tar.gz .
698         rm -rf tmp/$(MAIN_NAME)
699
700 .PHONY: deb
701 deb:
702         -@if [ -d debian ]; then \
703                 dpkg-buildpackage -rfakeroot -tc; \
704         else \
705                 ln -s pkg/debian debian; \
706                 dpkg-buildpackage -rfakeroot -tc; \
707                 rm debian; \
708         fi
709
710 .PHONY: sunpkg
711 sunpkg:
712         mkdir -p tmp/$(MAIN_NAME)
713         mkdir -p tmp/$(MAIN_NAME)_sun_pkg
714         $(MAKE) install basedir=tmp/$(MAIN_NAME) prefix=/usr/local $(mk_params)
715         (cd pkg/solaris; \
716         pkgmk -r ../../tmp/$(MAIN_NAME)/usr/local -o -d ../../tmp/$(MAIN_NAME)_sun_pkg/ -v "$(RELEASE)" ;\
717         cd ../..)
718         cat /dev/null > ../$(NAME)-$(RELEASE)-$(OS)-$(ARCH)-local
719         pkgtrans -s tmp/$(MAIN_NAME)_sun_pkg/ ../$(NAME)-$(RELEASE)-$(OS)-$(ARCH)-local \
720                 IPTEL$(MAIN_NAME)
721         gzip -9 ../$(NAME)-$(RELEASE)-$(OS)-$(ARCH)-local
722         rm -rf tmp/$(MAIN_NAME)
723         rm -rf tmp/$(MAIN_NAME)_sun_pkg
724
725
726 .PHONY: install
727 install: mk_params="compile_for_install=yes"
728 install: install-bin install-every-module install-cfg \
729         install-doc install-man install-utils install-share
730
731 .PHONY: dbinstall
732 dbinstall:
733         -@echo "Initializing $(MAIN_NAME) database"
734         scripts/mysql/$(SCR_NAME)_mysql.sh create
735         -@echo "Done"
736
737 .PHONY: README
738 README: $(foreach mods,$(modules_dirs),$(mods)-readme)
739
740 .PHONY: man
741 man: $(foreach mods,$(modules_dirs),$(mods)-man)
742
743 mk-install_dirs: $(cfg_prefix)/$(cfg_dir) $(bin_prefix)/$(bin_dir) \
744                         $(modules_prefix)/$(modules_dir) $(doc_prefix)/$(doc_dir) \
745                         $(man_prefix)/$(man_dir)/man8 $(man_prefix)/$(man_dir)/man5 \
746                         $(share_prefix)/$(share_dir) \
747                         $(foreach mods,$(modules_dirs),\
748                                 $(modules_prefix)/$(modules_dir)$(mods) \
749                                 $(doc_prefix)/$(doc_dir)$(mods) )
750
751 $(cfg_prefix)/$(cfg_dir): 
752                 mkdir -p $(cfg_prefix)/$(cfg_dir)
753
754 $(bin_prefix)/$(bin_dir):
755                 mkdir -p $(bin_prefix)/$(bin_dir)
756
757 $(share_prefix)/$(share_dir):
758                 mkdir -p $(share_prefix)/$(share_dir)
759
760 $(modules_prefix)/$(modules_dir):
761                 mkdir -p $(modules_prefix)/$(modules_dir)
762
763 $(doc_prefix)/$(doc_dir):
764                 mkdir -p $(doc_prefix)/$(doc_dir)
765
766 $(man_prefix)/$(man_dir)/man8:
767                 mkdir -p $(man_prefix)/$(man_dir)/man8
768
769 $(man_prefix)/$(man_dir)/man7:
770                 mkdir -p $(man_prefix)/$(man_dir)/man7
771
772 $(man_prefix)/$(man_dir)/man5:
773                 mkdir -p $(man_prefix)/$(man_dir)/man5
774
775 # note: sed with POSIX.1 regex doesn't support |, + or ? (darwin, solaris ...) 
776 install-cfg: $(cfg_prefix)/$(cfg_dir)
777                 sed $(foreach m,$(modules_dirs),\
778                                 -e "s#/usr/[^:]*lib/$(CFG_NAME)/$(m)\([:/\"]\)#$($(m)_target)\1#g") \
779                         < etc/$(CFG_NAME)-basic.cfg > \
780                         $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME).cfg.sample
781                 chmod 644 $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME).cfg.sample
782                 if [ -z "${skip_cfg_install}" -a \
783                                 ! -f $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME).cfg ]; then \
784                         mv -f $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME).cfg.sample \
785                                 $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME).cfg; \
786                 fi
787                 sed $(foreach m,$(modules_dirs),\
788                         -e "s#/usr/[^:]*lib/$(CFG_NAME)/$(m)\([:/\"]\)#$($(m)_target)\1#g") \
789                         < etc/$(CFG_NAME)-oob.cfg \
790                         > $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-advanced.cfg.sample
791                 chmod 644 $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-advanced.cfg.sample
792                 if [ -z "${skip_cfg_install}" -a \
793                                 ! -f $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-advanced.cfg ]; \
794                 then \
795                         mv -f $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-advanced.cfg.sample \
796                                 $(cfg_prefix)/$(cfg_dir)$(MAIN_NAME)-advanced.cfg; \
797                 fi
798                 # radius dictionary
799                 $(INSTALL_TOUCH) $(cfg_prefix)/$(cfg_dir)/dictionary.$(CFG_NAME)
800                 $(INSTALL_CFG) etc/dictionary.$(CFG_NAME) $(cfg_prefix)/$(cfg_dir)
801
802 install-bin: $(bin_prefix)/$(bin_dir) $(NAME)
803                 $(INSTALL_TOUCH) $(bin_prefix)/$(bin_dir)/$(NAME)
804                 $(INSTALL_BIN) $(NAME) $(bin_prefix)/$(bin_dir)
805
806
807 install-share: $(share_prefix)/$(share_dir)
808         @for r in $(share_install) "" ; do \
809                 if [ -n "$$r" ]; then \
810                         if [ -f "$$r" ]; then \
811                                 $(call try_err, $(INSTALL_TOUCH) \
812                                                 $(share_prefix)/$(share_dir)/`basename "$$r"` ); \
813                                 $(call try_err, \
814                                         $(INSTALL_SHARE)  "$$r"  $(share_prefix)/$(share_dir) );\
815                         else \
816                                 echo "ERROR: $$r not found" ; \
817                                 if [ ${err_fail} = 1 ] ; then \
818                                         exit 1; \
819                                 fi ; \
820                         fi ;\
821                 fi ; \
822         done; true
823
824
825 install-every-module: $(foreach mods,$(modules_dirs),install-$(mods))
826
827 install-every-module-doc: $(foreach mods,$(modules_dirs),install-$(mods)-doc)
828
829 install-every-module-man: $(foreach mods,$(modules_dirs),install-$(mods)-man)
830
831 install-utils: utils $(bin_prefix)/$(bin_dir)
832         @for r in $(utils_bin_install) "" ; do \
833                 if [ -n "$$r" ]; then \
834                         if [ -f "$$r" ]; then \
835                                 $(call try_err, $(INSTALL_TOUCH) \
836                                                 $(bin_prefix)/$(bin_dir)/`basename "$$r"` ); \
837                                 $(call try_err,\
838                                         $(INSTALL_BIN)  "$$r"  $(bin_prefix)/$(bin_dir) ); \
839                         else \
840                                 echo "ERROR: $$r not compiled" ; \
841                                 if [ ${err_fail} = 1 ] ; then \
842                                         exit 1; \
843                                 fi ; \
844                         fi ;\
845                 fi ; \
846         done; true
847         @for r in $(utils_script_install) "" ; do \
848                 if [ -n "$$r" ]; then \
849                         if [ -f "$$r" ]; then \
850                                 $(call try_err, $(INSTALL_TOUCH) \
851                                                 $(bin_prefix)/$(bin_dir)/`basename "$$r"` ); \
852                                 $(call try_err,\
853                                         $(INSTALL_SCRIPT)  "$$r"  $(bin_prefix)/$(bin_dir) ); \
854                         else \
855                                 echo "ERROR: $$r not compiled" ; \
856                                 if [ ${err_fail} = 1 ] ; then \
857                                         exit 1; \
858                                 fi ; \
859                         fi ;\
860                 fi ; \
861         done; true
862
863
864 install-modules-all: install-every-module install-every-module-doc
865
866
867 install-doc: $(doc_prefix)/$(doc_dir) install-every-module-doc
868         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/INSTALL 
869         $(INSTALL_DOC) INSTALL $(doc_prefix)/$(doc_dir)
870         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/README-MODULES 
871         $(INSTALL_DOC) README-MODULES $(doc_prefix)/$(doc_dir)
872         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/AUTHORS 
873         $(INSTALL_DOC) AUTHORS $(doc_prefix)/$(doc_dir)
874         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/NEWS
875         $(INSTALL_DOC) NEWS $(doc_prefix)/$(doc_dir)
876         $(INSTALL_TOUCH) $(doc_prefix)/$(doc_dir)/README 
877         $(INSTALL_DOC) README $(doc_prefix)/$(doc_dir)
878
879
880 install-sr-man: $(man_prefix)/$(man_dir)/man8 $(man_prefix)/$(man_dir)/man5
881                 sed -e "s#/etc/$(CFG_NAME)/$(CFG_NAME)\.cfg#$(cfg_target)$(MAIN_NAME).cfg#g" \
882                         -e "s#/usr/sbin/#$(bin_target)#g" \
883                         $(foreach m,$(modules_dirs),\
884                                 -e "s#/usr/lib/$(CFG_NAME)/$(m)\([^_]\)#$($(m)_target)\1#g") \
885                         -e "s#/usr/share/doc/$(CFG_NAME)/#$(doc_target)#g" \
886                         < $(CFG_NAME).8 >  \
887                                                         $(man_prefix)/$(man_dir)/man8/$(MAIN_NAME).8
888                 chmod 644  $(man_prefix)/$(man_dir)/man8/$(MAIN_NAME).8
889                 sed -e "s#/etc/$(CFG_NAME)/$(CFG_NAME)\.cfg#$(cfg_target)$(MAIN_NAME).cfg#g" \
890                         -e "s#/usr/sbin/#$(bin_target)#g" \
891                         $(foreach m,$(modules_dirs),\
892                                 -e "s#/usr/lib/$(CFG_NAME)/$(m)\([^_]\)#$($(m)_target)\1#g") \
893                         -e "s#/usr/share/doc/$(CFG_NAME)/#$(doc_target)#g" \
894                         < $(CFG_NAME).cfg.5 >  \
895                         $(man_prefix)/$(man_dir)/man5/$(MAIN_NAME).cfg.5
896                 chmod 644  $(man_prefix)/$(man_dir)/man5/$(MAIN_NAME).cfg.5
897
898 install-man:  install-sr-man install-every-module-man
899
900
901
902 # libs cleaning targets
903 .PHONY: clean-libs
904 clean-libs:
905                         $(MAKE) -C lib clean
906
907 .PHONY: proper-libs realclean-libs distclean-libs maintainer-clean-libs
908 proper-libs realclean-libs distclean-libs maintainer-clean-libs:
909                         $(MAKE) -C lib $(patsubst %-libs,%,$@)
910
911
912 # clean modules on make clean
913 clean: clean-modules
914 # clean utils on make clean
915 clean: clean-utils
916 # cleaning in libs always when cleaning sip-router
917 clean: clean-libs
918
919 # proper/distclean a.s.o modules, utils and libs too
920
921 proper: proper-modules proper-utils proper-libs
922 distclean: distclean-modules distclean-utils distclean-libs
923 realclean: realclean-modules realclean-utils realclean-libs
924 maintainer-clean: maintainer-clean-modules maintainer-clean-utils \
925  maintainer-clean-libs
926
927 #try to clean everything (including all the modules, even ones that are not
928 # configured/compiled normally
929 .PHONY: clean-all
930 clean-all: cmodules=$(all_modules_lst)
931 clean-all: clean
932 maintainer-clean: modules=$(modules_all)
933
934 # on make proper clean also the build config (w/o module list)
935 proper realclean distclean maintainer-clean: clean_cfg
936
937 # on maintainer clean, remove also the configured module list
938 maintainer-clean: clean_modules_cfg
939
940 .PHONY: proper-all realclean-all distclean-all
941 proper-all realclean-all distclean-all: cmodules=$(all_modules_lst)
942 proper-all realclean-all distclean-all: proper
943
944
945 .PHONY: clean_cfg clean-cfg
946 clean_cfg clean-cfg:
947         rm -f config.mak
948
949 .PHONY: clean_modules_cfg clean-modules-cfg
950 clean_modules_cfg clean-modules-cfg:
951         rm -f modules.lst
952
953 .PHONY: dbschema
954 dbschema:
955         -@echo "Build database schemas"
956         $(MAKE) -C lib/srdb1/schema
957         -@echo "Done"