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