b54eb358753954181de984c99b6988527e5541ce
[asterisk/asterisk.git] / Makefile
1 #
2 # Asterisk -- An open source telephony toolkit.
3 #
4 # Top level Makefile
5 #
6 # Copyright (C) 1999-2010, Digium, Inc.
7 #
8 # Mark Spencer <markster@digium.com>
9 #
10 # This program is free software, distributed under the terms of
11 # the GNU General Public License
12 #
13
14 # All Makefiles use the following variables:
15 #
16 # ASTCFLAGS - compiler options provided by the user (if any)
17 # _ASTCFLAGS - compiler options provided by the build system
18 # ASTLDFLAGS - linker flags (not libraries) provided by the user (if any)
19 # _ASTLDFLAGS - linker flags (not libraries) provided by the build system
20 # LIBS - additional libraries, at top-level for all links,
21 #      on a single object just for that object
22 # SOLINK - linker flags used only for creating dynamically loadable modules
23 #          as .so files
24 # DYLINK - linker flags used only for creating shared libaries
25 #          (.so files on Unix-type platforms, .dylib on Darwin)
26 #
27 # Values for ASTCFLAGS and ASTLDFLAGS can be specified in the
28 # environment when running make, as follows:
29 #
30 #       $ ASTCFLAGS="-Werror" make ...
31 #
32 # or as a variable value on the make command line itself:
33 #
34 #       $ make ASTCFLAGS="-Werror" ...
35
36 export ASTTOPDIR                # Top level dir, used in subdirs' Makefiles
37 export ASTERISKVERSION
38 export ASTERISKVERSIONNUM
39
40 #--- values used for default paths
41
42 # DESTDIR is the staging (or final) directory where files are copied
43 # during the install process. Define it before 'export', otherwise
44 # export will set it to the empty string making ?= fail.
45 # Trying to run asterisk from the DESTDIR is completely unsupported
46 # behavior.
47 # WARNING: do not put spaces or comments after the value.
48 DESTDIR?=$(INSTALL_PATH)
49 export DESTDIR
50
51 export INSTALL_PATH       # Additional prefix for the following paths
52 export ASTETCDIR          # Path for config files
53 export ASTVARRUNDIR
54 export ASTSPOOLDIR
55 export ASTVARLIBDIR
56 export ASTDATADIR
57 export ASTDBDIR
58 export ASTLOGDIR
59 export ASTLIBDIR
60 export ASTMODDIR
61 export ASTMANDIR
62 export ASTHEADERDIR
63 export ASTSBINDIR
64 export AGI_DIR
65 export ASTCONFPATH
66 export ASTKEYDIR
67
68 export OSARCH             # Operating system
69
70 export NOISY_BUILD        # Used in Makefile.rules
71 export MENUSELECT_CFLAGS  # Options selected in menuselect.
72 export AST_DEVMODE        # Set to "yes" for additional compiler
73                           # and runtime checks
74 export AST_DEVMODE_STRICT # Enables shadow warnings (-Wshadow)
75
76 export _SOLINK            # linker flags for all shared objects
77 export SOLINK             # linker flags for loadable modules
78 export DYLINK             # linker flags for shared libraries
79 export STATIC_BUILD       # Additional cflags, set to -static
80                           # for static builds. Probably
81                           # should go directly to ASTLDFLAGS
82
83 #--- paths to various commands
84 # The makeopts include below tries to set these if they're found during
85 # configure.
86 export CC
87 export CXX
88 export AR
89 export RANLIB
90 export HOST_CC
91 export BUILD_CC
92 export INSTALL
93 export STRIP
94 export DOWNLOAD
95 export AWK
96 export GREP
97 export MD5
98 export WGET_EXTRA_ARGS
99 export LDCONFIG
100 export LDCONFIG_FLAGS
101 export PYTHON
102
103 -include makeopts
104
105 # start the primary CFLAGS and LDFLAGS with any that were provided
106 # to the configure script
107 _ASTCFLAGS:=$(CONFIG_CFLAGS)
108 _ASTLDFLAGS:=$(CONFIG_LDFLAGS)
109
110 # Some build systems, such as the one in openwrt, like to pass custom target
111 # CFLAGS and LDFLAGS in the COPTS and LDOPTS variables; these should also
112 # go before any build-system computed flags, since they are defaults, not
113 # overrides
114 _ASTCFLAGS+=$(COPTS)
115 _ASTLDFLAGS+=$(LDOPTS)
116
117 # libxml2 cflags
118 _ASTCFLAGS+=$(LIBXML2_INCLUDE)
119
120 #Uncomment this to see all build commands instead of 'quiet' output
121 #NOISY_BUILD=yes
122
123 empty:=
124 space:=$(empty) $(empty)
125 ASTTOPDIR:=$(subst $(space),\$(space),$(CURDIR))
126
127 # Overwite config files on "make samples"
128 OVERWRITE=y
129
130 # Include debug and macro symbols in the executables (-g) and profiling info (-pg)
131 DEBUG=-g3
132
133 # Asterisk.conf is located in ASTETCDIR or by using the -C flag
134 # when starting Asterisk
135 ASTCONFPATH=$(ASTETCDIR)/asterisk.conf
136 AGI_DIR=$(ASTDATADIR)/agi-bin
137
138 # If you use Apache, you may determine by a grep 'DocumentRoot' of your httpd.conf file
139 HTTP_DOCSDIR=/var/www/html
140 # Determine by a grep 'ScriptAlias' of your Apache httpd.conf file
141 HTTP_CGIDIR=/var/www/cgi-bin
142
143 # If your platform's linker expects a prefix on symbols generated from compiling C
144 # source files, set LINKER_SYMBOL_PREFIX to that value. On some systems, exported symbols
145 # from C source files are prefixed with '_', for example. If this value is not set
146 # properly, the linker scripts that live in the '*.exports' files in various places
147 # in this tree will unintentionally suppress symbols that should be visible
148 # in the final binary objects.
149 LINKER_SYMBOL_PREFIX=
150
151 # Uncomment this to use the older DSP routines
152 #_ASTCFLAGS+=-DOLD_DSP_ROUTINES
153
154 # If the file .asterisk.makeopts is present in your home directory, you can
155 # include all of your favorite menuselect options so that every time you download
156 # a new version of Asterisk, you don't have to run menuselect to set them.
157 # The file /etc/asterisk.makeopts will also be included but can be overridden
158 # by the file in your home directory.
159
160 GLOBAL_MAKEOPTS=$(wildcard /etc/asterisk.makeopts)
161 USER_MAKEOPTS=$(wildcard ~/.asterisk.makeopts)
162
163 MOD_SUBDIR_CFLAGS="-I$(ASTTOPDIR)/include"
164 OTHER_SUBDIR_CFLAGS="-I$(ASTTOPDIR)/include"
165
166 # Create OPTIONS variable, but probably we can assign directly to ASTCFLAGS
167 OPTIONS=
168
169 ifeq ($(OSARCH),linux-gnu)
170   # flag to tell 'ldconfig' to only process specified directories
171   LDCONFIG_FLAGS=-n
172 endif
173
174 ifeq ($(findstring -save-temps,$(_ASTCFLAGS) $(ASTCFLAGS)),)
175   ifeq ($(findstring -pipe,$(_ASTCFLAGS) $(ASTCFLAGS)),)
176     _ASTCFLAGS+=-pipe
177   endif
178 endif
179
180 ifeq ($(findstring -Wall,$(_ASTCFLAGS) $(ASTCFLAGS)),)
181   _ASTCFLAGS+=-Wall
182 endif
183
184 _ASTCFLAGS+=-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(AST_NESTED_FUNCTIONS) $(DEBUG)
185 ADDL_TARGETS=
186
187 ifeq ($(AST_DEVMODE),yes)
188   _ASTCFLAGS+=-Werror
189   _ASTCFLAGS+=-Wunused
190   _ASTCFLAGS+=$(AST_DECLARATION_AFTER_STATEMENT)
191   _ASTCFLAGS+=$(AST_FORTIFY_SOURCE)
192   _ASTCFLAGS+=$(AST_TRAMPOLINES)
193   _ASTCFLAGS+=-Wundef
194   _ASTCFLAGS+=-Wmissing-format-attribute
195   _ASTCFLAGS+=-Wformat=2
196   ifeq ($(AST_DEVMODE_STRICT),yes)
197     _ASTCFLAGS+=-Wshadow
198   endif
199   ADDL_TARGETS+=validate-docs
200 endif
201
202 ifneq ($(findstring BSD,$(OSARCH)),)
203   _ASTCFLAGS+=-isystem /usr/local/include
204 endif
205
206 ifeq ($(OSARCH),FreeBSD)
207   # -V is understood by BSD Make, not by GNU make.
208   BSDVERSION=$(shell make -V OSVERSION -f /usr/share/mk/bsd.port.subdir.mk)
209   _ASTCFLAGS+=$(shell if test $(BSDVERSION) -lt 500016 ; then echo "-D_THREAD_SAFE"; fi)
210   # flag to tell 'ldconfig' to only process specified directories
211   LDCONFIG_FLAGS=-m
212 endif
213
214 ifeq ($(OSARCH),NetBSD)
215   _ASTCFLAGS+=-pthread -I/usr/pkg/include
216 endif
217
218 ifeq ($(OSARCH),OpenBSD)
219   _ASTCFLAGS+=-pthread -ftrampolines
220 endif
221
222 ifeq ($(OSARCH),SunOS)
223   _ASTCFLAGS+=-Wcast-align -DSOLARIS -I../include/solaris-compat -I/opt/ssl/include -I/usr/local/ssl/include -D_XPG4_2 -D__EXTENSIONS__
224 endif
225
226 ifneq ($(GREP),)
227   ASTERISKVERSION:=$(shell GREP=$(GREP) AWK=$(AWK) GIT=$(GIT) build_tools/make_version .)
228 endif
229 ifneq ($(AWK),)
230   ifneq ($(wildcard .version),)
231     ASTERISKVERSIONNUM:=$(shell $(AWK) -F. '{printf "%01d%02d%02d", $$1, $$2, $$3}' .version)
232   endif
233 endif
234
235 ifneq ($(wildcard .svn),)
236   ASTERISKVERSIONNUM:=999999
237 endif
238
239 _ASTCFLAGS+=$(OPTIONS)
240
241 MOD_SUBDIRS:=channels pbx apps codecs formats cdr cel bridges funcs tests main res addons $(LOCAL_MOD_SUBDIRS)
242 OTHER_SUBDIRS:=utils agi
243 SUBDIRS:=$(OTHER_SUBDIRS) $(MOD_SUBDIRS)
244 SUBDIRS_INSTALL:=$(SUBDIRS:%=%-install)
245 SUBDIRS_CLEAN:=$(SUBDIRS:%=%-clean)
246 SUBDIRS_DIST_CLEAN:=$(SUBDIRS:%=%-dist-clean)
247 SUBDIRS_UNINSTALL:=$(SUBDIRS:%=%-uninstall)
248 MOD_SUBDIRS_EMBED_LDSCRIPT:=$(MOD_SUBDIRS:%=%-embed-ldscript)
249 MOD_SUBDIRS_EMBED_LDFLAGS:=$(MOD_SUBDIRS:%=%-embed-ldflags)
250 MOD_SUBDIRS_EMBED_LIBS:=$(MOD_SUBDIRS:%=%-embed-libs)
251 MOD_SUBDIRS_MENUSELECT_TREE:=$(MOD_SUBDIRS:%=%-menuselect-tree)
252
253 ifneq ($(findstring darwin,$(OSARCH)),)
254   _ASTCFLAGS+=-D__Darwin__ -mmacosx-version-min=10.6
255   _SOLINK=-mmacosx-version-min=10.6 -Xlinker -undefined -Xlinker dynamic_lookup
256   _SOLINK+=/usr/lib/bundle1.o
257   SOLINK=-bundle $(_SOLINK)
258   DYLINK=-Xlinker -dylib $(_SOLINK)
259   _ASTLDFLAGS+=-L/usr/local/lib
260 else
261 # These are used for all but Darwin
262   SOLINK=-shared
263   DYLINK=$(SOLINK)
264   ifneq ($(findstring BSD,$(OSARCH)),)
265     _ASTLDFLAGS+=-L/usr/local/lib
266   endif
267 endif
268
269 # Include rpath settings
270 _ASTLDFLAGS+=$(AST_RPATH)
271
272 ifeq ($(OSARCH),SunOS)
273   SOLINK=-shared -fpic -L/usr/local/ssl/lib -lrt
274   DYLINK=$(SOLINK)
275 endif
276
277 ifeq ($(OSARCH),OpenBSD)
278   SOLINK=-shared -fpic
279   DYLINK=$(SOLINK)
280 endif
281
282 # comment to print directories during submakes
283 #PRINT_DIR=yes
284
285 ifneq ($(INSIDE_EMACS),)
286 PRINT_DIR=yes
287 endif
288
289 SILENTMAKE:=$(MAKE) --quiet --no-print-directory
290 ifneq ($(PRINT_DIR)$(NOISY_BUILD),)
291 SUBMAKE:=$(MAKE)
292 else
293 SUBMAKE:=$(MAKE) --quiet --no-print-directory
294 endif
295
296 # $(MAKE) is printed in several places, and we want it to be a
297 # fixed size string. Define a variable whose name has also the
298 # same size, so we can easily align text.
299 ifeq ($(MAKE), gmake)
300         mK="gmake"
301 else
302         mK=" make"
303 endif
304
305 all: _all
306         @echo " +--------- Asterisk Build Complete ---------+"
307         @echo " + Asterisk has successfully been built, and +"
308         @echo " + can be installed by running:              +"
309         @echo " +                                           +"
310         @echo " +               $(mK) install               +"
311         @echo " +-------------------------------------------+"
312
313 full: _full
314         @echo " +--------- Asterisk Build Complete ---------+"
315         @echo " + Asterisk has successfully been built, and +"
316         @echo " + can be installed by running:              +"
317         @echo " +                                           +"
318         @echo " +               $(mK) install               +"
319         @echo " +-------------------------------------------+"
320
321
322 _all: makeopts $(SUBDIRS) doc/core-en_US.xml $(ADDL_TARGETS)
323
324 _full: makeopts $(SUBDIRS) doc/full-en_US.xml $(ADDL_TARGETS)
325
326 makeopts: configure
327         @echo "****"
328         @echo "**** The configure script must be executed before running '$(MAKE)'."
329         @echo "****               Please run \"./configure\"."
330         @echo "****"
331         @exit 1
332
333 menuselect.makeopts: menuselect/menuselect menuselect-tree makeopts build_tools/menuselect-deps $(GLOBAL_MAKEOPTS) $(USER_MAKEOPTS)
334 ifeq ($(filter %menuselect,$(MAKECMDGOALS)),)
335         menuselect/menuselect --check-deps $@
336         menuselect/menuselect --check-deps $@ $(GLOBAL_MAKEOPTS) $(USER_MAKEOPTS)
337 endif
338
339 $(MOD_SUBDIRS_EMBED_LDSCRIPT):
340         +@echo "EMBED_LDSCRIPTS+="`$(SILENTMAKE) -C $(@:-embed-ldscript=) SUBDIR=$(@:-embed-ldscript=) __embed_ldscript` >> makeopts.embed_rules
341
342 $(MOD_SUBDIRS_EMBED_LDFLAGS):
343         +@echo "EMBED_LDFLAGS+="`$(SILENTMAKE) -C $(@:-embed-ldflags=) SUBDIR=$(@:-embed-ldflags=) __embed_ldflags` >> makeopts.embed_rules
344
345 $(MOD_SUBDIRS_EMBED_LIBS):
346         +@echo "EMBED_LIBS+="`$(SILENTMAKE) -C $(@:-embed-libs=) SUBDIR=$(@:-embed-libs=) __embed_libs` >> makeopts.embed_rules
347
348 $(MOD_SUBDIRS_MENUSELECT_TREE):
349         +@$(SUBMAKE) -C $(@:-menuselect-tree=) SUBDIR=$(@:-menuselect-tree=) moduleinfo
350         +@$(SUBMAKE) -C $(@:-menuselect-tree=) SUBDIR=$(@:-menuselect-tree=) makeopts
351
352 makeopts.embed_rules: menuselect.makeopts
353         @echo "Generating embedded module rules ..."
354         @rm -f $@
355         +@$(SUBMAKE) $(MOD_SUBDIRS_EMBED_LDSCRIPT)
356         +@$(SUBMAKE) $(MOD_SUBDIRS_EMBED_LDFLAGS)
357         +@$(SUBMAKE) $(MOD_SUBDIRS_EMBED_LIBS)
358
359 $(SUBDIRS): makeopts .lastclean main/version.c include/asterisk/build.h include/asterisk/buildopts.h defaults.h makeopts.embed_rules
360
361 ifeq ($(findstring $(OSARCH), mingw32 cygwin ),)
362     # Non-windows:
363     # ensure that all module subdirectories are processed before 'main' during
364     # a parallel build, since if there are modules selected to be embedded the
365     # directories containing them must be completed before the main Asterisk
366     # binary can be built
367 main: $(filter-out main,$(MOD_SUBDIRS))
368 else
369     # Windows: we need to build main (i.e. the asterisk dll) first,
370     # followed by res, followed by the other directories, because
371     # dll symbols must be resolved during linking and not at runtime.
372 D1:= $(filter-out main,$(MOD_SUBDIRS))
373 D1:= $(filter-out res,$(D1))
374
375 $(D1): res
376 res:    main
377 endif
378
379 $(MOD_SUBDIRS): makeopts
380         +@_ASTCFLAGS="$(MOD_SUBDIR_CFLAGS) $(_ASTCFLAGS)" ASTCFLAGS="$(ASTCFLAGS)" _ASTLDFLAGS="$(_ASTLDFLAGS)" ASTLDFLAGS="$(ASTLDFLAGS)" $(SUBMAKE) --no-builtin-rules -C $@ SUBDIR=$@ all
381
382 $(OTHER_SUBDIRS): makeopts
383         +@_ASTCFLAGS="$(OTHER_SUBDIR_CFLAGS) $(_ASTCFLAGS)" ASTCFLAGS="$(ASTCFLAGS)" _ASTLDFLAGS="$(_ASTLDFLAGS)" ASTLDFLAGS="$(ASTLDFLAGS)" $(SUBMAKE) --no-builtin-rules -C $@ SUBDIR=$@ all
384
385 defaults.h: makeopts .lastclean build_tools/make_defaults_h
386         @build_tools/make_defaults_h > $@.tmp
387         @cmp -s $@.tmp $@ || mv $@.tmp $@
388         @rm -f $@.tmp
389
390 main/version.c: FORCE .lastclean
391         @build_tools/make_version_c > $@.tmp
392         @cmp -s $@.tmp $@ || mv $@.tmp $@
393         @rm -f $@.tmp
394
395 include/asterisk/buildopts.h: menuselect.makeopts .lastclean
396         @build_tools/make_buildopts_h > $@.tmp
397         @cmp -s $@.tmp $@ || mv $@.tmp $@
398         @rm -f $@.tmp
399
400 # build.h must depend on .lastclean, or parallel make may wipe it out after it's
401 # been created.
402 include/asterisk/build.h: .lastclean
403         @build_tools/make_build_h > $@
404
405 $(SUBDIRS_CLEAN):
406         +@$(SUBMAKE) -C $(@:-clean=) clean
407
408 $(SUBDIRS_DIST_CLEAN):
409         +@$(SUBMAKE) -C $(@:-dist-clean=) dist-clean
410
411 clean: $(SUBDIRS_CLEAN) _clean
412
413 _clean:
414         rm -f defaults.h
415         rm -f include/asterisk/build.h
416         rm -f main/version.c
417         rm -f doc/core-en_US.xml
418         rm -f doc/full-en_US.xml
419         rm -f doc/rest-api/*.wiki
420         rm -f rest-api-templates/*.pyc
421         @$(MAKE) -C menuselect clean
422         cp -f .cleancount .lastclean
423
424 dist-clean: distclean
425
426 distclean: $(SUBDIRS_DIST_CLEAN) _clean
427         @$(MAKE) -C menuselect dist-clean
428         @$(MAKE) -C sounds dist-clean
429         rm -f menuselect.makeopts makeopts menuselect-tree menuselect.makedeps
430         rm -f makeopts.embed_rules
431         rm -f config.log config.status config.cache
432         rm -rf autom4te.cache
433         rm -f include/asterisk/autoconfig.h
434         rm -f include/asterisk/buildopts.h
435         rm -rf doc/api
436         rm -f build_tools/menuselect-deps
437
438 datafiles: _all doc/core-en_US.xml
439         CFLAGS="$(_ASTCFLAGS) $(ASTCFLAGS)" build_tools/mkpkgconfig "$(DESTDIR)$(libdir)/pkgconfig";
440 # Should static HTTP be installed during make samples or even with its own target ala
441 # webvoicemail?  There are portions here that *could* be customized but might also be
442 # improved a lot.  I'll put it here for now.
443
444         for x in static-http/*; do \
445                 $(INSTALL) -m 644 $$x "$(DESTDIR)$(ASTDATADIR)/static-http" ; \
446         done
447         $(INSTALL) -m 644 doc/core-en_US.xml "$(DESTDIR)$(ASTDATADIR)/static-http";
448         $(INSTALL) -m 644 doc/snapshots.xslt "$(DESTDIR)$(ASTDATADIR)/static-http";
449         if [ -d doc/tex/asterisk ] ; then \
450                 $(INSTALL) -d "$(DESTDIR)$(ASTDATADIR)/static-http/docs" ; \
451                 for n in doc/tex/asterisk/* ; do \
452                         $(INSTALL) -m 644 $$n "$(DESTDIR)$(ASTDATADIR)/static-http/docs" ; \
453                 done \
454         fi
455         for x in images/*.jpg; do \
456                 $(INSTALL) -m 644 $$x "$(DESTDIR)$(ASTDATADIR)/images" ; \
457         done
458         $(MAKE) -C sounds install
459         find rest-api -name "*.json" | while read x; do \
460                 $(INSTALL) -m 644 $$x "$(DESTDIR)$(ASTDATADIR)/rest-api" ; \
461         done
462
463 ifneq ($(GREP),)
464   XML_core_en_US = $(foreach dir,$(MOD_SUBDIRS),$(shell $(GREP) -l "language=\"en_US\"" $(dir)/*.c $(dir)/*.cc 2>/dev/null))
465 endif
466
467 doc/core-en_US.xml: makeopts .lastclean $(XML_core_en_US)
468         @printf "Building Documentation For: "
469         @echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $@
470         @echo "<!DOCTYPE docs SYSTEM \"appdocsxml.dtd\">" >> $@
471         @echo "<?xml-stylesheet type=\"text/xsl\" href=\"snapshots.xslt\"?>" > $@
472         @echo "<docs xmlns:xi=\"http://www.w3.org/2001/XInclude\">" >> $@
473         @for x in $(MOD_SUBDIRS); do \
474                 printf "$$x " ; \
475                 for i in `find $$x -name '*.c'`; do \
476                         $(AWK) -f build_tools/get_documentation $$i >> $@ ; \
477                 done ; \
478         done
479         @echo
480         @echo "</docs>" >> $@
481
482 ifneq ($(GREP),)
483   XML_full_en_US = $(foreach dir,$(MOD_SUBDIRS),$(shell $(GREP) -l "language=\"en_US\"" $(dir)/*.c $(dir)/*.cc 2>/dev/null))
484 endif
485
486 doc/full-en_US.xml: makeopts .lastclean $(XML_full_en_US)
487 ifeq ($(PYTHON),:)
488         @echo "--------------------------------------------------------------------------"
489         @echo "---        Please install python to build full documentation           ---"
490         @echo "--------------------------------------------------------------------------"
491 else
492         @printf "Building Documentation For: "
493         @echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $@
494         @echo "<!DOCTYPE docs SYSTEM \"appdocsxml.dtd\">" >> $@
495         @echo "<?xml-stylesheet type=\"text/xsl\" href=\"snapshots.xslt\"?>" > $@
496         @echo "<docs xmlns:xi=\"http://www.w3.org/2001/XInclude\">" >> $@
497         @for x in $(MOD_SUBDIRS); do \
498                 printf "$$x " ; \
499                 for i in `find $$x -name '*.c'`; do \
500                         $(PYTHON) build_tools/get_documentation.py < $$i >> $@ ; \
501                 done ; \
502         done
503         @echo
504         @echo "</docs>" >> $@
505         @$(PYTHON) build_tools/post_process_documentation.py -i $@ -o "doc/core-en_US.xml"
506 endif
507
508 validate-docs: doc/core-en_US.xml
509 ifeq ($(XMLSTARLET)$(XMLLINT),::)
510         @echo "--------------------------------------------------------------------------"
511         @echo "--- Please install xmllint or xmlstarlet to validate the documentation ---"
512         @echo "--------------------------------------------------------------------------"
513 else
514   ifneq ($(XMLLINT),:)
515         $(XMLLINT) --dtdvalid doc/appdocsxml.dtd --noout $<
516   else
517         $(XMLSTARLET) val -d doc/appdocsxml.dtd $<
518   endif
519 endif
520
521 update:
522         @if [ -d .svn ]; then \
523                 echo "Updating from Subversion..." ; \
524                 fromrev="`svn info | $(AWK) '/Revision: / {print $$2}'`"; \
525                 svn update | tee update.out; \
526                 torev="`svn info | $(AWK) '/Revision: / {print $$2}'`"; \
527                 echo "`date`  Updated from revision $${fromrev} to $${torev}." >> update.log; \
528                 rm -f .version; \
529                 if [ `grep -c ^C update.out` -gt 0 ]; then \
530                         echo ; echo "The following files have conflicts:" ; \
531                         grep ^C update.out | cut -b4- ; \
532                 fi ; \
533                 rm -f update.out; \
534         else \
535                 echo "Not under version control";  \
536         fi
537
538 NEWHEADERS=$(notdir $(wildcard include/asterisk/*.h))
539 OLDHEADERS=$(filter-out $(NEWHEADERS) $(notdir $(DESTDIR)$(ASTHEADERDIR)),$(notdir $(wildcard $(DESTDIR)$(ASTHEADERDIR)/*.h)))
540 INSTALLDIRS="$(ASTLIBDIR)" "$(ASTMODDIR)" "$(ASTSBINDIR)" "$(ASTETCDIR)" "$(ASTVARRUNDIR)" \
541         "$(ASTSPOOLDIR)" "$(ASTSPOOLDIR)/dictate" "$(ASTSPOOLDIR)/meetme" \
542         "$(ASTSPOOLDIR)/monitor" "$(ASTSPOOLDIR)/system" "$(ASTSPOOLDIR)/tmp" \
543         "$(ASTSPOOLDIR)/voicemail" "$(ASTSPOOLDIR)/recording" \
544         "$(ASTHEADERDIR)" "$(ASTHEADERDIR)/doxygen" \
545         "$(ASTLOGDIR)" "$(ASTLOGDIR)/cdr-csv" "$(ASTLOGDIR)/cdr-custom" \
546         "$(ASTLOGDIR)/cel-custom" "$(ASTDATADIR)" "$(ASTDATADIR)/documentation" \
547         "$(ASTDATADIR)/documentation/thirdparty" "$(ASTDATADIR)/firmware" \
548         "$(ASTDATADIR)/firmware/iax" "$(ASTDATADIR)/images" "$(ASTDATADIR)/keys" \
549         "$(ASTDATADIR)/phoneprov" "$(ASTDATADIR)/rest-api" "$(ASTDATADIR)/static-http" \
550         "$(ASTDATADIR)/sounds" "$(ASTDATADIR)/moh" "$(ASTMANDIR)/man8" "$(AGI_DIR)" "$(ASTDBDIR)"
551
552 installdirs:
553         @for i in $(INSTALLDIRS); do \
554                 if [ ! -z "$${i}" -a ! -d "$(DESTDIR)$${i}" ]; then \
555                         $(INSTALL) -d "$(DESTDIR)$${i}"; \
556                 fi; \
557         done
558
559 main-bininstall:
560         +@DESTDIR="$(DESTDIR)" ASTSBINDIR="$(ASTSBINDIR)" ASTLIBDIR="$(ASTLIBDIR)" $(SUBMAKE) -C main bininstall
561
562 bininstall: _all installdirs $(SUBDIRS_INSTALL) main-bininstall
563         $(INSTALL) -m 755 contrib/scripts/astgenkey "$(DESTDIR)$(ASTSBINDIR)/"
564         $(INSTALL) -m 755 contrib/scripts/autosupport "$(DESTDIR)$(ASTSBINDIR)/"
565         if [ ! -f "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk" -a ! -f /sbin/launchd ]; then \
566                 cat contrib/scripts/safe_asterisk | sed 's|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;s|__ASTERISK_LOG_DIR__|$(ASTLOGDIR)|;' > contrib/scripts/safe.tmp ; \
567                 $(INSTALL) -m 755 contrib/scripts/safe.tmp "$(DESTDIR)$(ASTSBINDIR)/safe_asterisk" ; \
568                 rm -f contrib/scripts/safe.tmp ; \
569         fi
570         $(INSTALL) -m 644 include/asterisk.h "$(DESTDIR)$(includedir)"
571         $(INSTALL) -m 644 include/asterisk/*.h "$(DESTDIR)$(ASTHEADERDIR)"
572         $(INSTALL) -m 644 include/asterisk/doxygen/*.h "$(DESTDIR)$(ASTHEADERDIR)/doxygen"
573         if [ -n "$(OLDHEADERS)" ]; then \
574                 for h in $(OLDHEADERS); do rm -f "$(DESTDIR)$(ASTHEADERDIR)/$$h"; done \
575         fi
576
577         $(INSTALL) -m 644 doc/core-*.xml "$(DESTDIR)$(ASTDATADIR)/documentation"
578         $(INSTALL) -m 644 doc/snapshots.xslt "$(DESTDIR)$(ASTDATADIR)/documentation"
579         $(INSTALL) -m 644 doc/appdocsxml.dtd "$(DESTDIR)$(ASTDATADIR)/documentation"
580         $(INSTALL) -m 644 doc/asterisk.8 "$(DESTDIR)$(ASTMANDIR)/man8"
581         $(INSTALL) -m 644 doc/astdb*.8 "$(DESTDIR)$(ASTMANDIR)/man8"
582         $(INSTALL) -m 644 contrib/scripts/astgenkey.8 "$(DESTDIR)$(ASTMANDIR)/man8"
583         $(INSTALL) -m 644 contrib/scripts/autosupport.8 "$(DESTDIR)$(ASTMANDIR)/man8"
584         $(INSTALL) -m 644 contrib/scripts/safe_asterisk.8 "$(DESTDIR)$(ASTMANDIR)/man8"
585         if [ -f contrib/firmware/iax/iaxy.bin ] ; then \
586                 $(INSTALL) -m 644 contrib/firmware/iax/iaxy.bin "$(DESTDIR)$(ASTDATADIR)/firmware/iax/iaxy.bin"; \
587         fi
588
589 $(SUBDIRS_INSTALL):
590         +@DESTDIR="$(DESTDIR)" ASTSBINDIR="$(ASTSBINDIR)" $(SUBMAKE) -C $(@:-install=) install
591
592 NEWMODS:=$(foreach d,$(MOD_SUBDIRS),$(notdir $(wildcard $(d)/*.so)))
593 OLDMODS=$(filter-out $(NEWMODS) $(notdir $(DESTDIR)$(ASTMODDIR)),$(notdir $(wildcard $(DESTDIR)$(ASTMODDIR)/*.so)))
594
595 oldmodcheck:
596         @if [ -n "$(OLDMODS)" ]; then \
597                 echo " WARNING WARNING WARNING" ;\
598                 echo "" ;\
599                 echo " Your Asterisk modules directory, located at" ;\
600                 echo " $(DESTDIR)$(ASTMODDIR)" ;\
601                 echo " contains modules that were not installed by this " ;\
602                 echo " version of Asterisk. Please ensure that these" ;\
603                 echo " modules are compatible with this version before" ;\
604                 echo " attempting to run Asterisk." ;\
605                 echo "" ;\
606                 for f in $(OLDMODS); do \
607                         echo "    $$f" ;\
608                 done ;\
609                 echo "" ;\
610                 echo " WARNING WARNING WARNING" ;\
611         fi
612
613 badshell:
614 ifneq ($(findstring ~,$(DESTDIR)),)
615         @echo "Your shell doesn't do ~ expansion when expected (specifically, when doing \"make install DESTDIR=~/path\")."
616         @echo "Try replacing ~ with \$$HOME, as in \"make install DESTDIR=\$$HOME/path\"."
617         @exit 1
618 endif
619
620 install: badshell bininstall datafiles
621         @if [ -x /usr/sbin/asterisk-post-install ]; then \
622                 /usr/sbin/asterisk-post-install "$(DESTDIR)" . ; \
623         fi
624         @echo " +---- Asterisk Installation Complete -------+"
625         @echo " +                                           +"
626         @echo " +    YOU MUST READ THE SECURITY DOCUMENT    +"
627         @echo " +                                           +"
628         @echo " + Asterisk has successfully been installed. +"
629         @echo " + If you would like to install the sample   +"
630         @echo " + configuration files (overwriting any      +"
631         @echo " + existing config files), run:              +"
632         @echo " +                                           +"
633         @echo " +               $(mK) samples               +"
634         @echo " +                                           +"
635         @echo " +-----------------  or ---------------------+"
636         @echo " +                                           +"
637         @echo " + You can go ahead and install the asterisk +"
638         @echo " + program documentation now or later run:   +"
639         @echo " +                                           +"
640         @echo " +              $(mK) progdocs               +"
641         @echo " +                                           +"
642         @echo " + **Note** This requires that you have      +"
643         @echo " + doxygen installed on your local system    +"
644         @echo " +-------------------------------------------+"
645         @$(MAKE) -s oldmodcheck
646
647 isntall: install
648
649 upgrade: bininstall
650
651 # XXX why *.adsi is installed first ?
652 adsi:
653         @echo Installing adsi config files...
654         $(INSTALL) -d "$(DESTDIR)$(ASTETCDIR)"
655         @for x in configs/*.adsi; do \
656                 dst="$(DESTDIR)$(ASTETCDIR)/`$(BASENAME) $$x`" ; \
657                 if [ -f "$${dst}" ] ; then \
658                         echo "Overwriting $$x" ; \
659                 else \
660                         echo "Installing $$x" ; \
661                 fi ; \
662                 $(INSTALL) -m 644 "$$x" "$(DESTDIR)$(ASTETCDIR)/`$(BASENAME) $$x`" ; \
663         done
664
665 samples: adsi
666         @echo Installing other config files...
667         @for x in configs/*.sample; do \
668                 dst="$(DESTDIR)$(ASTETCDIR)/`$(BASENAME) $$x .sample`" ;        \
669                 if [ -f "$${dst}" ]; then \
670                         if [ "$(OVERWRITE)" = "y" ]; then \
671                                 if cmp -s "$${dst}" "$$x" ; then \
672                                         echo "Config file $$x is unchanged"; \
673                                         continue; \
674                                 fi ; \
675                                 mv -f "$${dst}" "$${dst}.old" ; \
676                         else \
677                                 echo "Skipping config file $$x"; \
678                                 continue; \
679                         fi ;\
680                 fi ; \
681                 echo "Installing file $$x"; \
682                 $(INSTALL) -m 644 "$$x" "$${dst}" ;\
683         done
684         if [ "$(OVERWRITE)" = "y" ]; then \
685                 echo "Updating asterisk.conf" ; \
686                 sed -e 's|^astetcdir.*$$|astetcdir => $(ASTETCDIR)|' \
687                         -e 's|^astmoddir.*$$|astmoddir => $(ASTMODDIR)|' \
688                         -e 's|^astvarlibdir.*$$|astvarlibdir => $(ASTVARLIBDIR)|' \
689                         -e 's|^astdbdir.*$$|astdbdir => $(ASTDBDIR)|' \
690                         -e 's|^astkeydir.*$$|astkeydir => $(ASTKEYDIR)|' \
691                         -e 's|^astdatadir.*$$|astdatadir => $(ASTDATADIR)|' \
692                         -e 's|^astagidir.*$$|astagidir => $(AGI_DIR)|' \
693                         -e 's|^astspooldir.*$$|astspooldir => $(ASTSPOOLDIR)|' \
694                         -e 's|^astrundir.*$$|astrundir => $(ASTVARRUNDIR)|' \
695                         -e 's|^astlogdir.*$$|astlogdir => $(ASTLOGDIR)|' \
696                         -e 's|^astsbindir.*$$|astsbindir => $(ASTSBINDIR)|' \
697                         "$(DESTDIR)$(ASTCONFPATH)" > "$(DESTDIR)$(ASTCONFPATH).tmp" ; \
698                 $(INSTALL) -m 644 "$(DESTDIR)$(ASTCONFPATH).tmp" "$(DESTDIR)$(ASTCONFPATH)" ; \
699                 rm -f "$(DESTDIR)$(ASTCONFPATH).tmp" ; \
700         fi ; \
701         $(INSTALL) -d "$(DESTDIR)$(ASTSPOOLDIR)/voicemail/default/1234/INBOX"
702         build_tools/make_sample_voicemail "$(DESTDIR)/$(ASTDATADIR)" "$(DESTDIR)/$(ASTSPOOLDIR)"
703
704         @for x in phoneprov/*; do \
705                 dst="$(DESTDIR)$(ASTDATADIR)/$$x" ;     \
706                 if [ -f "$${dst}" ]; then \
707                         if [ "$(OVERWRITE)" = "y" ]; then \
708                                 if cmp -s "$${dst}" "$$x" ; then \
709                                         echo "Config file $$x is unchanged"; \
710                                         continue; \
711                                 fi ; \
712                                 mv -f "$${dst}" "$${dst}.old" ; \
713                         else \
714                                 echo "Skipping config file $$x"; \
715                                 continue; \
716                         fi ;\
717                 fi ; \
718                 echo "Installing file $$x"; \
719                 $(INSTALL) -m 644 "$$x" "$${dst}" ;\
720         done
721
722 webvmail:
723         @[ -d "$(DESTDIR)$(HTTP_DOCSDIR)/" ] || ( printf "http docs directory not found.\nUpdate assignment of variable HTTP_DOCSDIR in Makefile!\n" && exit 1 )
724         @[ -d "$(DESTDIR)$(HTTP_CGIDIR)" ] || ( printf "cgi-bin directory not found.\nUpdate assignment of variable HTTP_CGIDIR in Makefile!\n" && exit 1 )
725         $(INSTALL) -m 4755 contrib/scripts/vmail.cgi "$(DESTDIR)$(HTTP_CGIDIR)/vmail.cgi"
726         $(INSTALL) -d "$(DESTDIR)$(HTTP_DOCSDIR)/_asterisk"
727         for x in images/*.gif; do \
728                 $(INSTALL) -m 644 $$x "$(DESTDIR)$(HTTP_DOCSDIR)/_asterisk/"; \
729         done
730         @echo " +--------- Asterisk Web Voicemail ----------+"
731         @echo " +                                           +"
732         @echo " + Asterisk Web Voicemail is installed in    +"
733         @echo " + your cgi-bin directory:                   +"
734         @echo " + $(DESTDIR)$(HTTP_CGIDIR)"
735         @echo " + IT USES A SETUID ROOT PERL SCRIPT, SO     +"
736         @echo " + IF YOU DON'T LIKE THAT, UNINSTALL IT!     +"
737         @echo " +                                           +"
738         @echo " + Other static items have been stored in:   +"
739         @echo " + $(DESTDIR)$(HTTP_DOCSDIR)"
740         @echo " +                                           +"
741         @echo " + If these paths do not match your httpd    +"
742         @echo " + installation, correct the definitions     +"
743         @echo " + in your Makefile of HTTP_CGIDIR and       +"
744         @echo " + HTTP_DOCSDIR                              +"
745         @echo " +                                           +"
746         @echo " +-------------------------------------------+"
747
748 progdocs:
749         # Note, Makefile conditionals must not be tabbed out. Wasted hours with that.
750 ifeq ($(DOXYGEN),:)
751         @echo "Doxygen is not installed.  Please install and re-run the configuration script."
752 else
753 ifeq ($(DOT),:)
754         @echo "DOT is not installed. Doxygen will not produce any diagrams. Please install and re-run the configuration script."
755 else
756         # Enable DOT
757         @echo "HAVE_DOT = YES" >> contrib/asterisk-ng-doxygen
758 endif
759         # Set Doxygen PROJECT_NUMBER variable
760 ifneq ($(ASTERISKVERSION),UNKNOWN__and_probably_unsupported)
761         @echo "PROJECT_NUMBER = $(ASTERISKVERSION)" >> contrib/asterisk-ng-doxygen
762 else
763         echo "Asterisk Version is unknown, not configuring Doxygen PROJECT_NUMBER."
764 endif
765         # Validate Doxygen Configuration
766         @doxygen -u contrib/asterisk-ng-doxygen
767         # Run Doxygen
768         @doxygen contrib/asterisk-ng-doxygen
769         # Remove configuration backup file
770         @rm -f contrib/asterisk-ng-doxygen.bak
771 endif
772
773 install-logrotate:
774         if [ ! -d "$(DESTDIR)$(ASTETCDIR)/../logrotate.d" ]; then \
775                 $(INSTALL) -d "$(DESTDIR)$(ASTETCDIR)/../logrotate.d" ; \
776         fi
777         sed 's#__LOGDIR__#$(ASTLOGDIR)#g' < contrib/scripts/asterisk.logrotate | sed 's#__SBINDIR__#$(ASTSBINDIR)#g' > contrib/scripts/asterisk.logrotate.tmp
778         $(INSTALL) -m 0644 contrib/scripts/asterisk.logrotate.tmp "$(DESTDIR)$(ASTETCDIR)/../logrotate.d/asterisk"
779         rm -f contrib/scripts/asterisk.logrotate.tmp
780
781 config:
782         @if [ "${OSARCH}" = "linux-gnu" ]; then \
783                 if [ -f /etc/redhat-release -o -f /etc/fedora-release ]; then \
784                         cat contrib/init.d/rc.redhat.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
785                         $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/rc.d/init.d/asterisk" ; \
786                         rm -f contrib/init.d/rc.asterisk.tmp ; \
787                         if [ ! -f "$(DESTDIR)/etc/sysconfig/asterisk" ] ; then \
788                                 $(INSTALL) -m 644 contrib/init.d/etc_default_asterisk "$(DESTDIR)/etc/sysconfig/asterisk" ; \
789                         fi ; \
790                         if [ -z "$(DESTDIR)" ] ; then \
791                                 /sbin/chkconfig --add asterisk ; \
792                         fi ; \
793                 elif [ -f /etc/debian_version ] ; then \
794                         cat contrib/init.d/rc.debian.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
795                         $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/init.d/asterisk" ; \
796                         rm -f contrib/init.d/rc.asterisk.tmp ; \
797                         if [ ! -f "$(DESTDIR)/etc/default/asterisk" ] ; then \
798                                 $(INSTALL) -m 644 contrib/init.d/etc_default_asterisk "$(DESTDIR)/etc/default/asterisk" ; \
799                         fi ; \
800                         if [ -z "$(DESTDIR)" ] ; then \
801                                 /usr/sbin/update-rc.d asterisk defaults 50 91 ; \
802                         fi ; \
803                 elif [ -f /etc/gentoo-release ] ; then \
804                         cat contrib/init.d/rc.gentoo.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
805                         $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/init.d/asterisk" ; \
806                         rm -f contrib/init.d/rc.asterisk.tmp ; \
807                         if [ -z "$(DESTDIR)" ] ; then \
808                                 /sbin/rc-update add asterisk default ; \
809                         fi ; \
810                 elif [ -f /etc/mandrake-release -o -f /etc/mandriva-release ] ; then \
811                         cat contrib/init.d/rc.mandriva.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
812                         $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/rc.d/init.d/asterisk" ; \
813                         rm -f contrib/init.d/rc.asterisk.tmp ; \
814                         if [ ! -f /etc/sysconfig/asterisk ] ; then \
815                                 $(INSTALL) -m 644 contrib/init.d/etc_default_asterisk "$(DESTDIR)/etc/sysconfig/asterisk" ; \
816                         fi ; \
817                         if [ -z "$(DESTDIR)" ] ; then \
818                                 /sbin/chkconfig --add asterisk ; \
819                         fi ; \
820                 elif [ -f /etc/SuSE-release -o -f /etc/novell-release ] ; then \
821                         cat contrib/init.d/rc.suse.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
822                         $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/init.d/asterisk" ;\
823                         rm -f contrib/init.d/rc.asterisk.tmp ; \
824                         if [ ! -f /etc/sysconfig/asterisk ] ; then \
825                                 $(INSTALL) -m 644 contrib/init.d/etc_default_asterisk "$(DESTDIR)/etc/sysconfig/asterisk" ; \
826                         fi ; \
827                         if [ -z "$(DESTDIR)" ] ; then \
828                                 /sbin/chkconfig --add asterisk ; \
829                         fi ; \
830                 elif [ -f /etc/arch-release -o -f /etc/arch-release ] ; then \
831                         cat contrib/init.d/rc.archlinux.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \
832                         $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp "$(DESTDIR)/etc/rc.d/asterisk" ; \
833                         rm -f contrib/init.d/rc.asterisk.tmp ; \
834                 elif [ -d "$(DESTDIR)/Library/LaunchDaemons" ]; then \
835                         if [ ! -f "$(DESTDIR)/Library/LaunchDaemons/org.asterisk.asterisk.plist" ]; then \
836                                 sed 's|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;' < contrib/init.d/org.asterisk.asterisk.plist > asterisk.plist ; \
837                                 $(INSTALL) -m 644 asterisk.plist "$(DESTDIR)/Library/LaunchDaemons/org.asterisk.asterisk.plist"; \
838                                 rm -f asterisk.plist; \
839                         fi; \
840                         if [ ! -f "$(DESTDIR)/Library/LaunchDaemons/org.asterisk.muted.plist" ]; then \
841                                 sed 's|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;' < contrib/init.d/org.asterisk.muted.plist > muted.plist ; \
842                                 $(INSTALL) -m 644 muted.plist "$(DESTDIR)/Library/LaunchDaemons/org.asterisk.muted.plist"; \
843                                 rm -f muted.plist; \
844                         fi; \
845                 elif [ -f /etc/slackware-version ]; then \
846                         echo "Slackware is not currently supported, although an init script does exist for it."; \
847                 else \
848                         echo "We could not install init scripts for your distribution." ; \
849                 fi \
850         else \
851                 echo "We could not install init scripts for your operating system." ; \
852         fi
853
854 sounds:
855         $(MAKE) -C sounds all
856
857 # If the cleancount has been changed, force a make clean.
858 # .cleancount is the global clean count, and .lastclean is the
859 # last clean count we had
860
861 .lastclean: .cleancount
862         @$(MAKE) clean
863         @[ -f "$(DESTDIR)$(ASTDBDIR)/astdb.sqlite3" ] || [ ! -f "$(DESTDIR)$(ASTDBDIR)/astdb" ] || [ ! -f menuselect.makeopts ] || grep -q MENUSELECT_UTILS=.*astdb2sqlite3 menuselect.makeopts || (sed -i.orig -e's/MENUSELECT_UTILS=\(.*\)/MENUSELECT_UTILS=\1 astdb2sqlite3/' menuselect.makeopts && echo "Updating menuselect.makeopts to include astdb2sqlite3" && echo "Original version backed up to menuselect.makeopts.orig")
864
865 $(SUBDIRS_UNINSTALL):
866         +@$(SUBMAKE) -C $(@:-uninstall=) uninstall
867
868 main-binuninstall:
869         +@DESTDIR="$(DESTDIR)" ASTSBINDIR="$(ASTSBINDIR)" ASTLIBDIR="$(ASTLIBDIR)" $(SUBMAKE) -C main binuninstall
870
871 _uninstall: $(SUBDIRS_UNINSTALL) main-binuninstall
872         rm -f "$(DESTDIR)$(ASTMODDIR)/"*
873         rm -f "$(DESTDIR)$(ASTSBINDIR)/astgenkey"
874         rm -f "$(DESTDIR)$(ASTSBINDIR)/autosupport"
875         rm -rf "$(DESTDIR)$(ASTHEADERDIR)"
876         rm -rf "$(DESTDIR)$(ASTDATADIR)/firmware"
877         rm -f "$(DESTDIR)$(ASTMANDIR)/man8/asterisk.8"
878         rm -f "$(DESTDIR)$(ASTMANDIR)/man8/astgenkey.8"
879         rm -f "$(DESTDIR)$(ASTMANDIR)/man8/autosupport.8"
880         rm -f "$(DESTDIR)$(ASTMANDIR)/man8/safe_asterisk.8"
881         $(MAKE) -C sounds uninstall
882
883 uninstall: _uninstall
884         @echo " +--------- Asterisk Uninstall Complete -----+"
885         @echo " + Asterisk binaries, sounds, man pages,     +"
886         @echo " + headers, modules, and firmware builds,    +"
887         @echo " + have all been uninstalled.                +"
888         @echo " +                                           +"
889         @echo " + To remove ALL traces of Asterisk,         +"
890         @echo " + including configuration, spool            +"
891         @echo " + directories, and logs, run the following  +"
892         @echo " + command:                                  +"
893         @echo " +                                           +"
894         @echo " +            $(mK) uninstall-all            +"
895         @echo " +-------------------------------------------+"
896
897 uninstall-all: _uninstall
898         rm -rf "$(DESTDIR)$(ASTMODDIR)"
899         rm -rf "$(DESTDIR)$(ASTVARLIBDIR)"
900         rm -rf "$(DESTDIR)$(ASTDATADIR)"
901         rm -rf "$(DESTDIR)$(ASTSPOOLDIR)"
902         rm -rf "$(DESTDIR)$(ASTETCDIR)"
903         rm -rf "$(DESTDIR)$(ASTLOGDIR)"
904
905 menuconfig: menuselect
906
907 cmenuconfig: cmenuselect
908
909 gmenuconfig: gmenuselect
910
911 nmenuconfig: nmenuselect
912
913 menuselect: menuselect/cmenuselect menuselect/nmenuselect menuselect/gmenuselect
914         @if [ -x menuselect/nmenuselect ]; then \
915                 $(MAKE) nmenuselect; \
916         elif [ -x menuselect/cmenuselect ]; then \
917                 $(MAKE) cmenuselect; \
918         elif [ -x menuselect/gmenuselect ]; then \
919                 $(MAKE) gmenuselect; \
920         else \
921                 echo "No menuselect user interface found. Install ncurses,"; \
922                 echo "newt or GTK libraries to build one and re-rerun"; \
923                 echo "'./configure' and 'make menuselect'."; \
924         fi
925
926 cmenuselect: menuselect/cmenuselect menuselect-tree menuselect.makeopts
927         -@menuselect/cmenuselect menuselect.makeopts && (echo "menuselect changes saved!"; rm -f channels/h323/Makefile.ast main/asterisk) || echo "menuselect changes NOT saved!"
928
929 gmenuselect: menuselect/gmenuselect menuselect-tree menuselect.makeopts
930         -@menuselect/gmenuselect menuselect.makeopts && (echo "menuselect changes saved!"; rm -f channels/h323/Makefile.ast main/asterisk) || echo "menuselect changes NOT saved!"
931
932 nmenuselect: menuselect/nmenuselect menuselect-tree menuselect.makeopts
933         -@menuselect/nmenuselect menuselect.makeopts && (echo "menuselect changes saved!"; rm -f channels/h323/Makefile.ast main/asterisk) || echo "menuselect changes NOT saved!"
934
935 # options for make in menuselect/
936 MAKE_MENUSELECT=CC="$(BUILD_CC)" CXX="" LD="" AR="" RANLIB="" \
937                 CFLAGS="$(BUILD_CFLAGS)" LDFLAGS="$(BUILD_LDFLAGS)" \
938                 $(MAKE) -C menuselect CONFIGURE_SILENT="--silent"
939
940 menuselect/menuselect: menuselect/makeopts .lastclean
941         +$(MAKE_MENUSELECT) menuselect
942
943 menuselect/cmenuselect: menuselect/makeopts .lastclean
944         +$(MAKE_MENUSELECT) cmenuselect
945
946 menuselect/gmenuselect: menuselect/makeopts .lastclean
947         +$(MAKE_MENUSELECT) gmenuselect
948
949 menuselect/nmenuselect: menuselect/makeopts .lastclean
950         +$(MAKE_MENUSELECT) nmenuselect
951
952 menuselect/makeopts: makeopts .lastclean
953         +$(MAKE_MENUSELECT) makeopts
954
955 menuselect-tree: $(foreach dir,$(filter-out main,$(MOD_SUBDIRS)),$(wildcard $(dir)/*.c) $(wildcard $(dir)/*.cc)) build_tools/cflags.xml build_tools/cflags-devmode.xml sounds/sounds.xml build_tools/embed_modules.xml utils/utils.xml agi/agi.xml configure makeopts
956         @echo "Generating input for menuselect ..."
957         @echo "<?xml version=\"1.0\"?>" > $@
958         @echo >> $@
959         @echo "<menu name=\"Asterisk Module and Build Option Selection\">" >> $@
960         +@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
961         @cat build_tools/cflags.xml >> $@
962         +@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
963         @if [ "${AST_DEVMODE}" = "yes" ]; then \
964                 cat build_tools/cflags-devmode.xml >> $@; \
965         fi
966         @cat utils/utils.xml >> $@
967         @cat agi/agi.xml >> $@
968         @cat build_tools/embed_modules.xml >> $@
969         @cat sounds/sounds.xml >> $@
970         @echo "</menu>" >> $@
971
972 # We don't want to require Python or Pystache for every build, so this is its
973 # own target.
974 ari-stubs:
975 ifeq ($(PYTHON),:)
976         @echo "--------------------------------------------------------------------------"
977         @echo "---        Please install python to build ARI stubs            ---"
978         @echo "--------------------------------------------------------------------------"
979         @false
980 else
981         $(PYTHON) rest-api-templates/make_ari_stubs.py \
982                 rest-api/resources.json .
983 endif
984
985 .PHONY: menuselect
986 .PHONY: main
987 .PHONY: sounds
988 .PHONY: clean
989 .PHONY: dist-clean
990 .PHONY: distclean
991 .PHONY: all
992 .PHONY: _all
993 .PHONY: full
994 .PHONY: _full
995 .PHONY: prereqs
996 .PHONY: uninstall
997 .PHONY: _uninstall
998 .PHONY: uninstall-all
999 .PHONY: dont-optimize
1000 .PHONY: badshell
1001 .PHONY: installdirs
1002 .PHONY: validate-docs
1003 .PHONY: _clean
1004 .PHONY: ari-stubs
1005 .PHONY: $(SUBDIRS_INSTALL)
1006 .PHONY: $(SUBDIRS_DIST_CLEAN)
1007 .PHONY: $(SUBDIRS_CLEAN)
1008 .PHONY: $(SUBDIRS_UNINSTALL)
1009 .PHONY: $(SUBDIRS)
1010 .PHONY: $(MOD_SUBDIRS_EMBED_LDSCRIPT)
1011 .PHONY: $(MOD_SUBDIRS_EMBED_LDFLAGS)
1012 .PHONY: $(MOD_SUBDIRS_EMBED_LIBS)
1013
1014 FORCE:
1015