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