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