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