Don't log with -s option.
[autodist.git] / apps / autodist / autodist.in
1 #!/bin/sh
2 #
3 # Author: Pekka Riikonen <priikone@silcnet.org>
4 #
5 # Copyright (C) 2005 Pekka Riikonen
6 # All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions are
10 # met:
11 #
12 #   1. Redistributions of source code must retain the above copyright
13 #      notice, this list of conditions and the following disclaimer.
14 #   2. Redistributions in binary form must reproduce the above copyright
15 #      notice, this list of conditions and the following disclaimer in the
16 #      documentation and/or other materials provided with the distribution.
17 #   3. The name of the author may not be used to endorse or promote
18 #      products derived from this software without specific prior written
19 #      permission.
20 #
21 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
24 # NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
26 # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #
32
33 ###############################################################################
34 # Shell compatibility
35
36 # Be Bourne compatible
37 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
38   # Despite of this, we have managed to segfault some zsh's.
39   emulate sh
40   NULLCMD=:
41   # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
42   # is contrary to our usage.  Disable this feature.
43   alias -g '${1+"$@"}'='"$@"'
44 fi
45 DUALCASE=1; export DUALCASE # for MKS sh
46
47 # Support unset when possible.
48 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
49   as_unset=unset
50 else
51   as_unset=false
52 fi
53
54 # Work around bugs in pre-3.0 UWIN ksh.
55 $as_unset ENV MAIL MAILPATH
56 PS1='$ '
57 PS2='> '
58 PS4='+ '
59
60 # NLS nuisances.
61 for as_var in \
62   LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
63   LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
64   LC_TELEPHONE LC_TIME
65 do
66   if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
67     eval $as_var=C; export $as_var
68   else
69     $as_unset $as_var
70   fi
71 done
72
73
74 ###############################################################################
75 # Global variables
76
77 # Packaging and compressing
78 ad_gzip=true
79 ad_bzip2=false
80 ad_compress=false
81 ad_zip=false
82
83 # Distribution subdirectory
84 distdir="distdir"
85 am_distdir=
86
87 # This current distribution
88 distribution=default
89 distfile=$distribution
90 dist_version=0.0
91 package=
92 bug_report=
93
94 # All inherited distributions in this distribution
95 inherits=
96
97 # All distribution defines for this distribution
98 distdefs=
99
100 # All distribution undefines for this distribution
101 undistdefs=
102
103 # All distribution options
104 doptions=
105 opt_template=false
106 opt_no_dist=false
107 opt_no_inherit=false
108
109 # All includes
110 includes=
111
112 # All excludes
113 excludes=
114
115 # All noprocesses
116 noprocess=
117
118 # All hooks
119 pre_hooks=
120 post_hooks=
121 pre_dist_hooks=
122 post_dist_hooks=
123 pre_p_dist_hooks=
124 post_p_dist_hooks=
125
126 # Distribution license and license header
127 license=
128 licenseh=
129
130 # Whether to output ad_debug information
131 debug=false
132 nolog=false
133
134 # Autodist version
135 ver=@VERSION@
136
137 ###############################################################################
138 # Configuration file
139 if test -f "$distdir/autodist.conf"; then
140   . $distdir/autodist.conf
141 fi
142
143 DP=$DISTPREFIX
144
145
146 ###############################################################################
147 # Functions
148
149 #
150 # Print out debug information if debugging is enabled.  To enable debugging
151 # set the global variable "debug" to true value.
152 #
153 # Arguments: ad_debug <ad_debug string>
154 #
155 ad_debug()
156 {
157   if test x$debug = xtrue; then
158     set -f
159     echo autodist: $1
160     set +f
161   fi
162 }
163
164 #
165 # Prints out error message and exits the script.
166 #
167 # Arguments: ad_fatal <error message>
168 #
169 ad_fatal()
170 {
171   set -f
172   ad_log "error: $1"
173   echo autodist: error: $1
174   set +f
175   exit 1
176 }
177
178 #
179 # Prints out warning message
180 #
181 # Arguments: ad_warning <warning message>
182 #
183 ad_warning()
184 {
185   set -f
186   ad_log "warning: $1"
187   echo autodist: warning: $1
188   set +f
189 }
190
191 #
192 # Opens a log file.
193 #
194 # Arguments: ad_log_open <logfile>
195 #
196 ad_log_open()
197 {
198   rm -rf $1
199   exec 5> $1
200
201   cat >&5 << EOF
202 This file contains messages produced by the Autodist $ver.
203
204 EOF
205 }
206
207 #
208 # Prints to an open log file
209 #
210 # Arguments: ad_log
211 #
212 ad_log()
213 {
214   if test x$nolog = xfalse; then
215     echo "$1" >&5
216   fi
217 }
218
219 #
220 # Initializes the Autodist environment, creates default distribution
221 # directory, and default distribution.
222 #
223 # Arguments: ad_initialize
224 #
225 ad_initialize()
226 {
227   ad_debug "Initializing Autodist environment"
228
229   # Create default distdir
230   if test '!' -f $distdir; then
231     mkdir -p -- $distdir
232   fi
233
234   # Create Autodist configuration file
235   if test -f @AUTODISTDIR@/autodist.conf; then
236     cp -p @AUTODISTDIR@/autodist.conf $distdir
237   fi
238
239   # Create default distribution
240   if test -f @AUTODISTDIR@/default; then
241     cp -p @AUTODISTDIR@/default $distdir
242   fi
243
244   ad_debug "Autodist environment initialized"
245 }
246
247 #
248 # Creates the distdefs header file including defined distdefs
249 #
250 # Arguments: ad_create_distdefs_h
251 #
252 ad_create_distdefs_h()
253 {
254   ad_debug "Creating distdef header file"
255
256   fname=$DISTDEFS
257   rm -f $fname
258   cat > $fname <<EOF
259 /*
260   Automatically generated by Autodist $ver.  Do not edit.
261
262   Generated: `date` by `whoami`
263   Distribution: $distribution
264   License: $license
265 */
266
267 #ifndef _`echo $DP`_DISTDEFS_H
268 #define _`echo $DP`_DISTDEFS_H
269
270 EOF
271
272   for i in $distdefs
273   do
274     echo "#define $i 1" >>$fname
275   done
276
277   cat >> $fname <<EOF
278
279 #endif /* _`echo $DP`_DISTDEFS_H */
280 EOF
281
282   ad_debug "Distdef header file created"
283 }
284
285 #
286 # Creates the main configure script for the distribution.  This runs
287 # the aclocal, autoheader and autoconf tools.
288 #
289 # Arguments: ad_make_configure
290 #
291 ad_make_configure()
292 {
293   local run_autoconf=false
294
295   ad_debug "Starting configure creation"
296
297   rm -f configure
298
299   if test "$ACLOCAL"; then
300     ad_debug "Running aclocal"
301     if test x$debug = xtrue; then
302       $ACLOCAL
303     else
304       $ACLOCAL 1>/dev/null 2>/dev/null
305     fi
306     if test $? != 0; then
307       ad_fatal "aclocal failed"
308     fi
309   fi
310
311   if test "$AUTOCONF"; then
312     ad_debug "Running autoconf"
313     $AUTOCONF
314     if test $? != 0; then
315       ad_fatal "autoconf failed"
316     fi
317     run_autoconf=true
318   fi
319
320   if test "$AUTOHEADER"; then
321     ad_debug "Running autoheader"
322     $AUTOHEADER
323     if test $? != 0; then
324       ad_fatal "autoheader failed"
325     fi
326   fi
327
328   if test "$LIBTOOLIZE"; then
329     ad_debug "Running libtoolize"
330     $LIBTOOLIZE
331     if test $? != 0; then
332       ad_fatal "libtoolize failed"
333     fi
334   fi
335
336   if test x$run_autoconf = xtrue; then
337     if test '!' -f configure; then
338       ad_fatal "creating configure script failed"
339     fi
340   fi
341
342   ad_debug "Ending configure creation"
343 }
344
345 #
346 # Creates the configure.ac script from the configure.ad fragments in
347 # the source tree.  Takes the source configure file as argument which
348 # is used to create the actual configure.ac.
349 #
350 # Arguments: ad_make_configure_ac <configure_ac_source>
351 #
352 ad_make_configure_ac()
353 {
354   local check
355
356   ad_debug "Starting creating configure.ac: $1"
357
358   ad_log ""
359   ad_log "Following configure.ad files were processed into configure.ac:"
360   ad_log "--------------------------------------------------------------"
361
362   if test '!' -f $1; then
363     ad_fatal "The configure file '$1' does not exist"
364   fi
365
366   check="`sed 's/^[     ]*//' < $1 | grep -v "^#" | grep -e "AD_INIT"`"
367   if test -z $check; then
368     rm -f configure.ad.cfs
369     rm -f $fname $fname.tmp
370     ad_fatal "The 'AD_INIT' macro has not been set in configure.ac"
371   fi
372
373   rm -f configure.ac configure.ad.cfs
374
375   cfs=`find . -type f -name configure\*\.ad`
376   for i in $cfs
377   do
378     if test "x$i" = "x$1"; then
379       continue
380     fi
381
382     ad_debug "including $i"
383     ad_log "  $i"
384
385     cat $i >> configure.ad.cfs
386   done
387
388   if test -f configure.ad.cfs; then
389     check="`sed 's/^[   ]*//' < $1 | grep -v "^#" | grep -e "AD_INCLUDE_CONFIGURE"`"
390     if test -z $check; then
391       rm -f configure.ad.cfs
392       ad_warning "configure.ad fragments found but 'AD_INCLUDE_CONFIGURE' is not set"
393     fi
394   fi
395
396   # Header for configure.ac
397   fname="configure.tmp.ac"
398   cat > $fname <<EOF
399 # Automatically generated by Autodist $ver.  Do not edit.
400 # To make changes edit the configure.ad file in the source tree.
401
402 # Source: configure.ad
403 # Generated: `date` by `whoami`
404 # Distribution: $distribution
405 # License: $license
406
407 EOF
408
409   ad_debug "creating configure.ac"
410   if test -f configure.ad.cfs; then
411     sed '/^AD_INCLUDE_CONFIGURE/ r configure.ad.cfs' $1 > $fname.tmp
412     sed -e "/^AD_INCLUDE_CONFIGURE/d" $fname.tmp >> $fname
413     rm -f configure.ad.cfs $fname.tmp
414   else
415     cat $1 >> $fname
416   fi
417
418   # Process AD_INIT
419   sed -e "/AD_INIT/s//AC_INIT([$distribution], [$dist_version], [$bug_report], [$package])/" $fname > $fname.tmp
420
421   # Remove AD_DISABLE_DEPENDENCIES
422   sed -e "/^AD_DISABLE_DEPENDENCIES/d" $fname.tmp > $fname
423
424   # Process for distribution
425   rm -f $fname.tmp
426   ad_process_file $fname $fname.tmp false
427
428   # Remove any trailing backslashes
429   if test -f "$fname.tmp"; then
430     sed -e :a -e '/\\$/N; s/[   ]*\\\n//; ta' < $fname.tmp > configure.ac
431   else
432     cp -p $fname configure.ac
433   fi
434   rm -f $fname $fname.tmp
435
436   ad_log "  ./configure.ad"
437   ad_log ""
438
439   ad_debug "Ending creating configure.ac: $1"
440 }
441
442 #
443 # Creates the Makefile.in files by running the automake tool.
444 #
445 # Arguments: ad_make_makefile_ins
446 #
447 ad_make_makefile_ins()
448 {
449   ad_debug "Starting creating Makefile.in files"
450
451   if test "$AUTOMAKE"; then
452     ad_debug "Running automake"
453     $AUTOMAKE
454     if test $? != 0; then
455       ad_fatal "automake failed"
456     fi
457   fi
458
459   ad_debug "Ending creating Makefile.in files"
460 }
461
462 #
463 # Creates the Makefile.am files from the Makefile.ad files in the
464 # source tree.  This runs the distribution specific processing for the
465 # Makefile.ad files.
466 #
467 # Arguments: ad_make_makefile_ams
468 #
469 ad_make_makefile_ams()
470 {
471   ad_debug "Starting creating Makefile.am files"
472
473   ad_log ""
474   ad_log "Following Makefile.ad files were processed into Makefile.am files:"
475   ad_log "------------------------------------------------------------------"
476
477   files=`find . -type f -name Makefile\.ad`
478   for ff in $files
479   do
480     ad_log "  $ff"
481     fname=`echo $ff | sed s/\.ad//`
482     ad_make_makefile_am $ff $fname.am
483   done
484   ad_log ""
485
486   ad_debug "Ending creating Makefile.am files"
487 }
488
489 #
490 # Creates Makefile.am file from the Makefile.ad file.
491 #
492 # Arguments: ad_make_makefile_am <src> <dst>
493 #
494 ad_make_makefile_am()
495 {
496   local am_deps=true
497   local f=$1
498   local fname=$2
499
500   # Disable dependencies if requested
501   dc=`sed 's/^[         ]*//' < configure.ad | grep -v "^#" \
502     | grep "AD_DISABLE_DEPENDENCIES"`
503   if test "$dc" = "AD_DISABLE_DEPENDENCIES"; then
504     am_deps=false
505   fi
506
507   # Header for the Makefile.am
508   cat > $fname <<EOF
509 # Automatically generated by Autodist $ver from Makefile.ad.  Do not edit.
510 # To make changes edit the $f file in the source tree.
511
512 # Source: $f
513 # Generated: `date` by `whoami`
514 # Distribution: $distribution
515 # License: $license
516
517 EOF
518
519   # Run the distribution processing for this Makefile.ad
520   ad_debug "Processing $f to be $fname"
521   ad_process_file $f $fname.tmp false
522
523   # Remove any trailing backslashes
524   if test -f "$fname.tmp"; then
525     sed -e :a -e '/\\$/N; s/[   ]*\\\n//; ta' < $fname.tmp >> $fname
526   else
527     cat $f >> $fname
528   fi
529
530   # Enable dependencies if requested
531   if test x$am_deps = xtrue; then
532     # Get list of configure.ad's to get them into deps also
533     cfs=`find . -type f -name configure\*\.ad`
534     cfs=`echo $cfs | sed 's/\.\///g'`
535
536     cat >> $fname <<EOF
537
538 # S_AD_ENABLE_DEPENDENCIES
539 \$(srcdir)/Makefile.am: Makefile.ad
540         cd \$(top_srcdir) && autodist -p makefile \$(subdir)/Makefile.ad \$(subdir)/Makefile.am && cd \$(subdir)
541 \$(srcdir)/configure.ac: $cfs
542         cd \$(top_srcdir) && autodist -p configure \$(top_srcdir)/configure.ad && cd \$(subdir)
543 # E_AD_ENABLE_DEPENDENCIES
544 EOF
545   fi
546
547   rm -f $fname.tmp
548 }
549
550 #
551 # Processes all files with .ad suffix, with exception of configure*.ad
552 # and Makefile.ad files, for distribution from the source tree.
553 #
554 # Arguments: ad_process_ads false
555 #
556 ad_process_ads()
557 {
558   ad_debug "Starting processing .ad files"
559
560   ad_log ""
561   ad_log "Following .ad files were processed:"
562   ad_log "-----------------------------------"
563
564   files=`find . -type f -name \*\.ad \! -name configure\*\.ad \! -name Makefile\.ad`
565   for i in $files
566   do
567     fname=`echo $i | sed s/\.ad//`
568
569     ad_debug "Processing $i to be $fname"
570     ad_log "  $i into $fname"
571
572     # Run the distribution processing for this file
573     ad_process_file $i $fname false
574     if test -f $fname; then
575       cp -p $i $fname || exit 1
576     fi
577
578   done
579   ad_log ""
580
581   ad_debug "Ending processing .ad files"
582 }
583
584 #
585 # Includes files specified in the distribution for inclusion.  Used when
586 # creating the distribution for packaging.
587 #
588 # include has the following format in distfile:
589 #
590 #   include <path> [<dest path>]
591 #
592 # If only source path, which may be file, directory or regular expression,
593 # is specified the path will be same in distribution.  If the destination
594 # path is specified that will be the new name and/or new location of the
595 # source path.  This, in effect, is a cp utility with ability to create
596 # directories if they do not exist.
597 #
598 # Arguments: ad_dist_includes <includeslist> <recursive> <log>
599 #
600 ad_dist_includes()
601 {
602   local incs
603
604   ad_debug "Starting running includes: $1 $2"
605
606   if test x$3 = xtrue; then
607     ad_log ""
608     ad_log "Following files and directories were included in distribution:"
609     ad_log "--------------------------------------------------------------"
610   fi
611
612   # By default do not expand pathnames
613   set -f
614
615   # Add : separator at the end
616   incs="`echo "$1" | sed 's/$/ : /'`"
617
618   src=
619   dst=
620   for i in $incs
621   do
622     if test "$i" = ":" && test -z "$src"; then
623       continue
624     fi
625     if test -z "$src"; then
626       src=$i
627       continue
628     fi
629     if test -z "$dst" && test "$i" != ":"; then
630       dst=$i
631     else
632       dst=$src
633     fi
634
635     ad_debug "Including $src into $dst"
636
637     if test -f "$src"; then
638       # Add file
639
640       if test "$src" = "$dst"; then
641         # Add to same location
642         d=`echo $src | sed 's,/[^/]*$,,'`
643         if test "$d" != "$src" && test "$d" != "." && \
644            test '!' -d $am_distdir/$d; then
645           mkdir -p -- $am_distdir/$d || exit 1
646         fi
647       else
648         # Add to different location
649         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
650         if test "$check" != "$dst"; then
651           ad_fatal "Invalid destination in 'include $src $dst'"
652         fi
653
654         d=`echo $dst | sed 's,/[^/]*$,,'`
655         if test "$d" != "$dst" && test "$d" != "." && \
656            test '!' -d $am_distdir/$d; then
657           mkdir -p -- $am_distdir/$d || exit 1
658         fi
659       fi
660
661       if test x$3 = xtrue; then
662         ad_log "  $src into $am_distdir/$d"
663       fi
664       cp -p $src $am_distdir/$d || exit 1
665
666     elif test -d "$src"; then
667       # Add directory
668
669       if test "$src" = "$dst"; then
670         # Add to same location
671         d=`echo $src | sed 's,/[^/]*$,,'`
672         ds=`echo $src | sed 's/\/$//'`
673         if test "$ds" = "$d"; then
674           d=`echo $d | sed 's,/[^/]*$,,'`
675         fi
676         if test "$ds" = "$d"; then
677           d=""
678         fi
679         if test '!' -d $am_distdir/$d && test "$ds" != "$d"; then
680           mkdir -p -- $am_distdir/$d || exit 1
681         fi
682
683         if test x$3 = xtrue; then
684           ad_log "  $src into $am_distdir/$d"
685         fi
686         cp -pR $src $am_distdir/$d || exit 1
687       else
688         # Add to different location
689         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
690         if test "$check" != "$dst"; then
691           ad_fatal "Invalid destination in 'include $src $dst'"
692         fi
693
694         d=`echo $dst | sed 's,/[^/]*$,,'`
695         ds=`echo $dst | sed 's/\/$//'`
696         if test "$ds" = "$d"; then
697           d=`echo $d | sed 's,/[^/]*$,,'`
698         fi
699         if test '!' -d $am_distdir/$d && test "$dst" != "$d"; then
700           mkdir -p -- $am_distdir/$d || exit 1
701         fi
702
703         if test x$3 = xtrue; then
704           ad_log "  $src into $am_distdir/$dst"
705         fi
706         cp -pR $src $am_distdir/$dst || exit 1
707       fi
708
709     elif test x$2 != xtrue; then
710       # We assume regular expression in filename
711       check=`echo "$src" | sed 's/?//; s/*//; s/\[//; s/\]//'`
712       if test "$check" == "$src"; then
713         if test '!' -a $src; then
714           ad_fatal "Including $src: No such file or directory"
715         fi
716         src=
717         dst=
718         continue
719       fi
720
721       # Recursively call this function with expanded pathnames.  The
722       # reason why we don't let sh by default expand pathnames is that
723       # the include's destination is optional.  If sh expands by default
724       # we don't know the destination.  For this reason, we handle the
725       # expansion here ourselves.
726
727       # If src and dst are same, then expand the pathname as we'll copy
728       # matches to their own locations.
729       if test "$src" = "$dst"; then
730         # Expand pathnames, and format to our include format
731         set +f
732         srcs=`echo $src | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
733         set -f
734       else
735         # Destination is new, and it has to be a directory.
736         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
737         if test "$check" != "$dst"; then
738           ad_fatal "Invalid destination in 'include $src $dst'"
739         fi
740
741         # Make sure dst has / at the end, as this must be a directory
742         dst=`echo $dst | sed 's/\/$//; s/$/\//'`
743
744         # Escape dst for sed
745         dste=`echo $dst | sed 's/\\//\\\\\//g'` || exit 1
746
747         # Expand pathnames, and format to our include format
748         set +f
749         srcs=`echo $src | sed -e "s/ / $dste : /g" \
750           -e 's/^/ : /' -e "s/$/ $dste/"` || exit 1
751         set -f
752       fi
753
754       # Include recursively
755       ad_dist_includes "$srcs" true
756
757     elif test '!' -a $src; then
758       ad_fatal "Including $src: No such file or directory"
759     fi
760
761     src=
762     dst=
763   done
764
765   if test x$3 = xtrue; then
766     ad_log ""
767   fi
768
769   set +f
770
771   ad_debug "Ending running includes: $1 $2"
772 }
773
774 #
775 # Excludes files specified in the distribution for exclusion.  Used when
776 # creating the distribution for packaging.
777 #
778 # exclude has the following format in distfile:
779 #
780 #  exclude <path>
781 #
782 # The path may be file, directory or regular expression.
783 #
784 # Arguments: ad_dist_includes <excludelist> <log>
785 #
786 ad_dist_excludes()
787 {
788   ad_debug "Starting running excludes: $1"
789
790   if test x$2 = xtrue; then
791     ad_log ""
792     ad_log "Following files and directories were excluded from distribution:"
793     ad_log "----------------------------------------------------------------"
794   fi
795
796   cur=`pwd`
797   cd $am_distdir || exit 1
798   for i in $1
799   do
800     ad_debug "Excluding $i"
801     if test x$2 = xtrue; then
802       ad_log "  $i"
803     fi
804     rm -rf $i
805   done
806   cd $cur || exit 1
807
808   if test x$2 = xtrue; then
809     ad_log ""
810   fi
811
812   ad_debug "Ending running excludes: $1"
813 }
814
815 #
816 # Processes the entire tree for distribution.  This inspects files other
817 # than source and header files, with exception of any file with .ad
818 # suffix, and performs distribution processing for the file.  The original
819 # file is replaced with the processed file.  This function is used when
820 # creating the distribution for packaging.
821 #
822 # Arguments: ad_process_tree <directory>
823 #
824 ad_process_tree()
825 {
826   ad_debug "Starting processing non-source files: $1"
827
828   # Take files, except source and .ad files.
829   files=`find $am_distdir -type f \! -name \*\.ad \( \
830         \! -name \*\.[cC] -a \
831         \! -name \*\.[cC][cCpP] -a \
832         \! -name \*\.[cC][xX][xX] -a \
833         \! -name \*\.[cC][pP][pP] -a \
834         \! -name \*\.[cC]++ -a \
835         \! -name \*\.m -a \
836         \! -name \*\.[hH] -a \
837         \! -name \*\.hh -a \
838         \! -name \*\.[cC]\.in -a \
839         \! -name \*\.[cC][cCpP]\.in -a \
840         \! -name \*\.[cC][xX][xX]\.in -a \
841         \! -name \*\.[cC][pP][pP]\.in -a \
842         \! -name \*\.[cC]++\.in -a \
843         \! -name \*\.m\.in -a \
844         \! -name \*\.[hH]\.in -a \
845         \! -name \*\.hh\.in \)`
846   files=`echo $files | sed 's/$am_distdir//'`
847
848   for ff in $files
849   do
850     ad_process_file $ff $ff.tmp true
851     if test -f $ff.tmp; then
852       rm -f $ff || exit 1
853       mv -f $ff.tmp $ff || exit 1
854     fi
855   done
856
857   ad_debug "Ending processing non-source files: $1"
858 }
859
860 #
861 # Processes the entire source tree for distribution.  This inspects files
862 # in the source tree, with exception of any file with .ad suffix, and
863 # performs distribution processing for the file.  The original file is
864 # replaced with the processed file.  This function is used when creating
865 # the distribution for packaging.
866 #
867 # Call this before ad_process_tree().
868 #
869 # Arguments: ad_process_source_tree <directory>
870 #
871 ad_process_source_tree()
872 {
873   ad_debug "Starting processing source files: $1"
874
875   # We take only C/C++ files since they use the C compiler friendly
876   # version of distdefs.  Other files are not assumed to use them.
877   files=`find $am_distdir -type f \! -name \*\.ad \( \
878         -name \*\.[cC] -o \
879         -name \*\.[cC][cCpP] -o \
880         -name \*\.[cC][xX][xX] -o \
881         -name \*\.[cC][pP][pP] -o \
882         -name \*\.[cC]++ -o \
883         -name \*\.m -o \
884         -name \*\.[hH] -o \
885         -name \*\.hh -o \
886         -name \*\.[cC]\.in -o \
887         -name \*\.[cC][cCpP]\.in -o \
888         -name \*\.[cC][xX][xX]\.in -o \
889         -name \*\.[cC][pP][pP]\.in -o \
890         -name \*\.[cC]++\.in -o \
891         -name \*\.m\.in -o \
892         -name \*\.[hH]\.in -o \
893         -name \*\.hh\.in \)`
894
895   for ff in $files
896   do
897     ad_process_source_file $ff $ff.tmp true
898     if test -f $ff.tmp; then
899       rm -f $ff || exit 1
900       mv -f $ff.tmp $ff || exit 1
901     fi
902   done
903
904   ad_debug "Ending processing source files: $1"
905 }
906
907 #
908 # Removes Autodist dependencies, as they cannot be delivered to distribution.
909 #
910 # Arguments: ad_remove_dependencies <distdir>
911 #
912 ad_remove_dependencies()
913 {
914   ad_debug "Removing dependencies"
915
916   ams=`find $1 -type f -name Makefile\.\*`
917   for i in $ams
918   do
919     sed -e "/^# S_AD_ENABLE_DEPENDENCIES/,/^# E_AD_ENABLE_DEPENDENCIES/d" $i > $i.tmp
920     mv $i.tmp $i
921   done
922 }
923
924 #
925 # Makes distribution sane, ala modtimes.  Since we modify the distribution
926 # we need to make it sane after that.
927 #
928 # Arguments: ad_makedist_makesane
929 #
930 ad_makedist_makesane()
931 {
932   ad_debug "Making distribution file modtimes sane"
933
934   # DO NOT change these order unless you know what you are doing.
935   if test -f $am_distdir/configure.ac; then
936     touch $am_distdir/configure.ac
937   fi
938
939   if test -f $am_distdir/aclocal.m4; then
940     touch $am_distdir/aclocal.m4
941   fi
942
943   if test '!' -f Makefile; then
944     ad_fatal "Makefile: No such file or directory"
945   fi
946
947   configh=`grep "^CONFIG_HEADER" Makefile | cut -d= -f2 | sed 's/^[     ]*//'`
948   touch $am_distdir/$configh.in 1>/dev/null 2>/dev/null
949
950   files=`find $am_distdir -type f -name Makefile\.in`
951   for i in $files
952   do
953     touch $i
954   done
955
956   if test -f $am_distdir/configure; then
957     touch $am_distdir/configure
958   fi
959
960   if test -f $am_distdir/config.status; then
961     touch $am_distdir/config.status
962   fi
963
964   ad_debug "Distribution made sane"
965 }
966
967 #
968 # Creates distribution of the source tree.  All files in the distribution
969 # will be processed and the distribution will be packaged.
970 #
971 # Arguments: ad_makedist
972 #
973 ad_makedist()
974 {
975   ad_log_open "makedist.log"
976   ad_debug "Starting distribution creation"
977
978   ad_log "Created distribution"
979   ad_log "--------------------"
980   ad_log ""
981
982   if test '!' -f autodist.dist; then
983     ad_fatal "Autodist has not been run yet to prepare source tree"
984   fi
985
986   if test -z $MAKE; then
987     ad_fatal "The MAKE variable is not set in autodist.conf"
988   fi
989
990   # Get distdir from Makefile
991   if test '!' -f Makefile; then
992     ad_fatal "The source tree is not configured, run ./configure first"
993   fi
994
995   # Parse the requested distribution
996   distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
997   dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
998   am_distdir=`grep "distdir:" < autodist.dist | cut -d: -f2` || exit 1
999   ad_parse_distribution $distribution false
1000   ad_log "  Distribution: $distribution $dist_version"
1001   ad_log "  Destination directory: $am_distdir"
1002   ad_log ""
1003   ad_process_distdefs
1004
1005   if test x$opt_no_dist = xtrue; then
1006     ad_fatal "The '$distribution' distribution cannot be packaged"
1007   fi
1008
1009   # Run pre-dist-hooks
1010   ad_run_dist_hooks "$pre_dist_hooks"
1011
1012   # Create distribution directory
1013   ad_debug "Creating distribution directory $am_distdir"
1014   $MAKE distdir || exit 1
1015   chmod -R a+r $am_distdir
1016
1017   if test '!' -d $am_distdir; then
1018     ad_fatal "Distribution directory $am_distdir not created"
1019   fi
1020
1021   # Run pre-process-dist-hooks
1022   ad_run_dist_hooks "$pre_p_dist_hooks"
1023
1024   # Run excludes
1025   ad_dist_excludes "$excludes" true
1026
1027   # Run includes
1028   ad_dist_includes "$includes" false true
1029
1030   # Include specific license file if specified
1031   if test "$license" != ""; then
1032     ad_log ""
1033     ad_log "License file in distribution:"
1034     ad_log "-----------------------------"
1035     ad_log "  $license into $am_distdir/COPYING"
1036     ad_log ""
1037     cp -p $license $am_distdir/COPYING || exit 1
1038   fi
1039
1040   # Remove dependencies
1041   ad_remove_dependencies $am_distdir
1042
1043   # Process noprocesses, first pass
1044   ad_process_noprocess true
1045
1046   ad_log ""
1047   ad_log "Following files were not re-licensed:"
1048   ad_log "-------------------------------------"
1049
1050   # Process source files
1051   ad_debug "Process distribution source tree"
1052   ad_process_source_tree $am_distdir
1053
1054   # Process non-source files
1055   ad_debug "Process distribution tree"
1056   ad_process_tree $am_distdir
1057
1058   ad_log ""
1059
1060   # Process noprocesses, second pass
1061   ad_process_noprocess false
1062
1063   # Run post-process_dist-hooks
1064   ad_run_dist_hooks "$post_p_dist_hooks"
1065
1066   # Make distribution sane
1067   ad_makedist_makesane
1068
1069   # Package
1070   ad_debug "Packaging distribution"
1071   tar chof $am_distdir.tar $am_distdir || exit 1
1072
1073   # Compress
1074   ad_debug "Compressing distribution package"
1075   if test x$ad_gzip = xtrue; then
1076     ad_debug "Compressing distribution package $am_distdir.tar.gz"
1077     gzip -9 -c $am_distdir.tar > $am_distdir.tar.gz || exit 1
1078   fi
1079   if test x$ad_bzip2 = xtrue; then
1080     ad_debug "Compressing distribution package $am_distdir.tar.bz2"
1081     bzip2 -9 -c $am_distdir.tar > $am_distdir.tar.bz2 || exit 1
1082   fi
1083   if test x$ad_compress = xtrue; then
1084     ad_debug "Compressing distribution package $am_distdir.tar.Z"
1085     compress -c $am_distdir.tar > $am_distdir.tar.Z || exit 1
1086   fi
1087   if test x$ad_zip = xtrue; then
1088     rm -f $am_distdir.zip
1089     ad_debug "Compressing distribution package $am_distdir.zip"
1090     zip -rq $am_distdir.zip $am_distdir || exit 1
1091   fi
1092   rm -f $am_distdir.tar
1093
1094   # Run post-dist-hooks
1095   ad_run_dist_hooks "$post_dist_hooks"
1096
1097   # Cleanup
1098   rm -rf $am_distdir
1099
1100   ad_log "Distribution created successfully."
1101
1102   ad_debug "Ending distribution creation"
1103 }
1104
1105 #
1106 # Handles distribution options.
1107 #
1108 # option has the following format in distfile:
1109 #
1110 #   option <option>
1111 #
1112 # Following options are supported:
1113 #
1114 #   template
1115 #   no-dist
1116 #   no-inherit
1117 #
1118 # Arguments: ad_handle_options <options>
1119 #
1120 ad_handle_options()
1121 {
1122   ad_debug "Handling options: $1"
1123
1124   for i in $1
1125   do
1126     if test "$i" = "template"; then
1127       opt_template=true
1128       continue
1129     elif test "$i" = "no-dist"; then
1130       opt_no_dist=true
1131       continue
1132     elif test "$i" = "no-inherit"; then
1133       opt_no_inherit=true
1134       continue
1135     fi
1136   done
1137 }
1138
1139 #
1140 # Clears set options
1141 #
1142 # Arguments: ad_clear_options
1143 #
1144 ad_clear_options()
1145 {
1146   opt_template=false
1147   opt_no_dist=false
1148   opt_no_inherit=false
1149 }
1150
1151 #
1152 # Parses the distribution.  Gets all distribution defines from the
1153 # distribution.  This also expands all inherited distributions recursively
1154 # to get all inherited distribution defines.  From inherited distributions
1155 # their name and package name is not inherited.
1156 #
1157 # Arguments: ad_parse_distribution <distribution name> <inherit>
1158 #
1159 ad_parse_distribution()
1160 {
1161   local inhs
1162   local defs
1163   local undefs
1164   local incs
1165   local excs
1166   local nops
1167   local opts
1168   local dname
1169   local dpname
1170   local bugr
1171   local prh
1172   local poh
1173   local prdh
1174   local podh
1175   local prpdh
1176   local popdh
1177
1178   ad_debug "Starting parsing distribution: $1 $2"
1179
1180   if test '!' -f $distdir/$1; then
1181     ad_fatal "Distribution '$1' is not declared"
1182   fi
1183
1184   # Get inherited
1185   inhs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1186     | grep "inherit " | cut -d' ' -f2 | sort | uniq`
1187
1188   # Get distdefs
1189   defs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1190    | grep "define " | cut -d' ' -f2 | sort | uniq`
1191
1192   if test "$inhs" = "" && test "$defs" = ""; then
1193     ad_fatal "Distribution '$1' does not define anything"
1194   fi
1195
1196   # Get undefined distdefs
1197   undefs=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1198    | grep "undef " | cut -d' ' -f2 | sort | uniq`
1199
1200   # Get includes
1201   incs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1202     | grep "include " | sed 's/include / : /'`
1203
1204   # Get excludes
1205   excs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1206     | grep "exclude " | cut -d' ' -f2- | sort | uniq`
1207
1208   # Get noprocesses
1209   nops=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1210     | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
1211
1212   # Get options
1213   opts=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1214     | grep "option " | cut -d' ' -f2- | sort | uniq`
1215
1216   # Check options
1217   ad_handle_options "$opts"
1218   if test x$2 = xtrue && test x$opt_no_inherit = xtrue; then
1219     ad_fatal "Distribution '$1' cannot be inherited"
1220   fi
1221   if test x$2 = xfalse && test x$opt_template = xtrue; then
1222     ad_fatal "Template distribution '$1' cannot be prepared or packaged"
1223   fi
1224
1225   ad_debug "inherits: $inhs"
1226   ad_debug "distdefs: $defs"
1227   ad_debug "includes: $incs"
1228   ad_debug "excludes: $excs"
1229   ad_debug "noprocess: $nops"
1230   ad_debug "undistdefs: $undefs"
1231   ad_debug "options: $opts"
1232
1233   # Expand distdefs from inherited distributions
1234   for i in $inhs
1235   do
1236     if test x$1 = x$i; then
1237       ad_fatal "Infinite recursion detected.  Fix the '$distdir/$1' \
1238             distribution to not have 'inherit $i' declared."
1239     fi
1240
1241     if test '!' -f $distdir/$i; then
1242       ad_fatal "Distribution '$i' is not declared (inherited from '$1')"
1243     fi
1244
1245     ad_parse_distribution $i true
1246     ad_clear_options
1247   done
1248
1249   # Get license
1250   license=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1251     | grep "license " | cut -d' ' -f2`
1252   licenseh=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1253     | grep "license-header " | sed 's/license-header / : /'`
1254
1255   ad_debug "license: $license"
1256   ad_debug "licenseh: $licenseh"
1257
1258   if test x$2 = xfalse; then
1259     # Take rest of the stuff from top distribution
1260
1261     # We take precedence on defined and undefined distdefs.  Remove
1262     # undefined distdefs if we have defined them.
1263     for d in $defs
1264     do
1265       ad_debug "defining undefined $d distdef"
1266       undistdefs=`echo $undistdefs | sed s/$d//g`
1267     done
1268
1269     # Get distribution name
1270     dname=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1271       | grep "name " | cut -d' ' -f2-`
1272
1273     if test "$dname"; then
1274       distribution=$dname
1275     fi
1276
1277     # Get distribution package name (optional)
1278     dpname=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1279      | grep "package " | cut -d' ' -f2`
1280
1281     if test "$dpname"; then
1282       package=$dpname
1283     else
1284       package=$distribution
1285     fi
1286
1287     # Get Bug-report email address (optional)
1288     bugr=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1289      | grep "bug-report " | cut -d' ' -f2-`
1290
1291     if test "$bugr"; then
1292       bug_report=$bugr
1293     fi
1294
1295     ad_debug "distribution: $distribution"
1296     ad_debug "package: $package"
1297     ad_debug "bug-report: $bug_report"
1298
1299     # Get hooks (optional)
1300     prh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1301      | grep "pre-hook " | cut -d' ' -f2-`
1302     poh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1303      | grep "post-hook " | cut -d' ' -f2-`
1304     prdh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1305      | grep "pre-dist-hook " | cut -d' ' -f2-`
1306     podh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1307      | grep "post-dist-hook " | cut -d' ' -f2-`
1308     prpdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1309      | grep "pre-process-dist-hook " | cut -d' ' -f2-`
1310     popdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1311      | grep "post-process-dist-hook " | cut -d' ' -f2-`
1312
1313     pre_hooks="$pre_hooks $prh"
1314     post_hooks="$post_hooks $poh"
1315     pre_dist_hooks="$pre_dist_hooks $prdh"
1316     post_dist_hooks="$post_dist_hooks $podh"
1317     pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
1318     post_p_dist_hooks="$post_p_dist_hooks $popdh"
1319     doptions="$doptions $opts"
1320
1321     ad_handle_options "$doptions"
1322     ad_debug "options: $doptions"
1323   fi
1324
1325   # Return to caller
1326   inherits="$inherits $inhs"
1327   distdefs="$distdefs $defs"
1328   includes="$includes $incs"
1329   excludes="$excludes $excs"
1330   noprocess="$noprocess $nops"
1331   undistdefs="$undistdefs $undefs"
1332
1333   ad_debug "Ending parsing distribution: $1 $2"
1334 }
1335
1336 #
1337 # Processes parsed distdefs.  Removes duplicates, and undefined distdefs
1338 # from the distdefs.
1339 #
1340 # Arguments: ad_process_distdefs
1341 #
1342 ad_process_distdefs()
1343 {
1344   ad_debug "Starting processing distdefs"
1345
1346   ad_log ""
1347   ad_log "Following distdefs were processed:"
1348   ad_log "----------------------------------"
1349
1350   # Remove all undefined distribution defines
1351   for i in $undistdefs
1352   do
1353     ad_debug "undefining $i distdef"
1354     distdefs=`echo $distdefs | sed s/$i//g`
1355   done
1356
1357   rm -f autodist.tmp.defs
1358
1359   # Remove duplicate distdefs
1360   for i in $distdefs
1361   do
1362     echo $i >>autodist.tmp.defs
1363   done
1364   distdefs=`sort < autodist.tmp.defs | uniq`
1365   distdefs=`echo $distdefs`
1366   rm -f autodist.tmp.defs
1367
1368   # Log
1369   for i in $distdefs
1370   do
1371     ad_log "  $i"
1372   done
1373   ad_log ""
1374
1375   ad_debug "distdefs=$distdefs"
1376
1377   ad_debug "Ending processing distdefs"
1378 }
1379
1380 #
1381 # Processes for a license header change.
1382 #
1383 # Arguments: ad_process_license_header <scriptfile> <sourcefile>
1384 #
1385 ad_process_license_header()
1386 {
1387   ad_debug "Starting license header processing"
1388
1389   # Add : separator at the end
1390   lics=`echo "$licenseh" | sed 's/$/ : /'`
1391
1392   src=
1393   dst=
1394   for i in $lics
1395   do
1396     if test "$i" = ":" && test -z "$src"; then
1397       continue
1398     fi
1399     if test -z "$src"; then
1400       src=$i
1401       continue
1402     fi
1403     if test -z "$dst" && test "$i" != ":"; then
1404       dst=$i
1405     else
1406       ad_fatal "Missing argument in 'license-header $src'"
1407     fi
1408
1409     ad_debug "Replacing $src license with $dst license"
1410
1411     if test '!' -f $src; then
1412       ad_fatal "License header $src: No such file or directory"
1413     fi
1414
1415     if test '!' -f $dst; then
1416       ad_fatal "License header $dst: No such file or directory"
1417     fi
1418
1419     # Awk script to replace the license header
1420     fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
1421     ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
1422     echo "BEGIN { N=0; } /`cat autodist.lsrc`/,/`cat autodist.ldst`/ { FILE1=\"$src\"; FILE2=\"$dst\"; getline F1 < FILE1; getline F2 < FILE2; if (F1) { N=sub(F1, F2); } else { F1=\"\$\"; N=sub(F1, F2); } if (N == 0) print 0 > \"$2.norelicense\"; } END { if (N == 0) print 0 > \"$2.norelicense\"; }" >> $1
1423     rm -f autodist.lsrc autodist.ldst
1424
1425     src=
1426     dst=
1427   done
1428
1429   ad_debug "Ending license header processing"
1430 }
1431
1432 #
1433 # Process specified noprocesses.  This is called during makedist.
1434 # The noprocess first copies the noprocess files and dirs into a temp
1435 # directory, and then removes them from the distdir.  This way they are
1436 # not processed by Autodist.  After processing they are returned to their
1437 # correct locations from the temp dir.  Dirty, yeah, but the way we do
1438 # this until better one comes along.
1439 #
1440 # Arguments: ad_process_noprocess <process>
1441 #
1442 # If <process> is true this excludes and if false this includes.
1443 #
1444 ad_process_noprocess()
1445 {
1446   ad_debug "Starting running noprocesses"
1447
1448   set -f
1449
1450   cur=`pwd`
1451
1452   if test x$1 = xtrue; then
1453     ad_log ""
1454     ad_log "Following files and directories were not processed:"
1455     ad_log "---------------------------------------------------"
1456
1457     f="$cur/autodist__noprocess"
1458     rm -rf $f
1459     mkdir -p -- $f || exit 1
1460
1461     # First, include them to new location with correct directory structure.
1462     old_am_distdir="$am_distdir"
1463     cd $am_distdir || exit 1
1464     am_distdir="$f"
1465     nops=" $noprocess"
1466     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1467     ad_dist_includes "$nops" false false
1468     am_distdir="$old_am_distdir"
1469
1470     # Then, remove from distdir (they are in temp dir now)
1471     for i in $noprocess
1472     do
1473       ad_log "  $i"
1474       rm -rf $i
1475     done
1476     cd $cur || exit 1
1477
1478     ad_log ""
1479   else
1480     # Copy from the temp dir back to distdir
1481     cd autodist__noprocess || exit 1
1482     old_am_distdir="$am_distdir"
1483     am_distdir="$cur/$old_am_distdir"
1484     nops=" $noprocess"
1485     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1486
1487     ad_dist_includes "$nops" false false
1488
1489     am_distdir="$old_am_distdir"
1490     cd $cur || exit 1
1491     rm -rf autodist__noprocess
1492   fi
1493
1494   set +f
1495
1496   ad_debug "Ending running noprocesses"
1497 }
1498
1499 #
1500 # Process a file given as argument for the distribution.
1501 #
1502 # Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
1503 #
1504 ad_process_file()
1505 {
1506   local found=false
1507   local f
1508   local defs
1509   local ndefs
1510
1511   # Process only regular files
1512   if test '!' -f $1; then
1513     return
1514   fi
1515
1516   ad_debug "Starting processing file: $1 $2"
1517
1518   f="autodist.tmp.script"
1519   rm -f $f
1520
1521   # If license header is provided, replace the license header in the file.
1522   if test x$3 = xtrue; then
1523     ad_process_license_header $f $1
1524   fi
1525
1526   # Get defined distribution defines
1527   defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
1528     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1529
1530   # Get explicitly not-defined distribution defines
1531   ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
1532     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1533
1534   ad_debug "defs in $1: $defs"
1535   ad_debug "ndefs in $1: $ndefs"
1536
1537   # Create the script to include and exclude stuff in the file according
1538   # to the distribution defines
1539
1540   # ifdefs
1541   ad_debug "processing ifdefs"
1542   for d in $defs
1543   do
1544     found=false
1545     for i in $distdefs
1546     do
1547       if test x$d = x$i; then
1548         found=true
1549         break
1550       fi
1551     done
1552
1553     # If distribution define was not found exclude those lines from the file.
1554     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1555     if test x$found = xfalse; then
1556       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1557       echo "/^#ifdef $d/,/^#else !$d|^#endif $d/ { next; }" >> $f
1558     else
1559       echo "/^#else !$d/,/^#endif $d/ { next; }" >> $f
1560     fi
1561   done
1562
1563   # ifndefs
1564   ad_debug "processing ifndefs"
1565   for d in $ndefs
1566   do
1567     found=false
1568     for i in $distdefs
1569     do
1570       if test x$d = x$i; then
1571         found=true
1572         break
1573       fi
1574     done
1575
1576     # If distribution define was found exclude those lines from the file.
1577     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1578     if test x$found = xtrue; then
1579       ad_debug "ifndef $d will be excluded (it IS defined)"
1580       echo "/^#ifndef $d/,/^#else $d|^#endif $d/ { next; }" >> $f
1581     else
1582       echo "/^#else $d/,/^#endif $d/ { next; }" >> $f
1583     fi
1584   done
1585
1586   # Now process the file with the script
1587   if test -f $f; then
1588
1589     # Those distdef lines that remain in the file are removed to make
1590     # the appearance prettier
1591     echo "/^#ifdef "$DP"_DIST_|^#endif "$DP"_DIST_|^#else "$DP"_DIST_|^#else !"$DP"_DIST_|^#ifndef "$DP"_DIST_/ { next; }" >> $f
1592     echo "{ print; }" >> $f
1593
1594     # Execute the script
1595     cp -p $1 $2 || exit 1
1596     awk -f $f $1 > $2 || exit 1
1597   fi
1598
1599   rm -f $f
1600
1601   # Log if file was not relicensed
1602   if test -f "$1.norelicense"; then
1603     ad_log "  $1"
1604     rm -f $1.norelicense
1605   fi
1606
1607   ad_debug "Ending processing file: $1 $2"
1608 }
1609
1610 #
1611 # Process a source file given as argument for the distribution.
1612 #
1613 # Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
1614 #
1615 ad_process_source_file()
1616 {
1617   local found=false
1618   local f
1619   local defs
1620   local ndefs
1621
1622   # Process only regular files
1623   if test '!' -f $1; then
1624     return
1625   fi
1626
1627   ad_debug "Starting processing source file: $1 $2"
1628
1629   f="autodist.tmp.script"
1630   rm -f $f
1631
1632   # If license header is provided, replace the license header in the file.
1633   if test x$3 = xtrue; then
1634     ad_process_license_header $f $1
1635   fi
1636
1637   # Get defined distribution defines
1638   defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
1639     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1640
1641   # Get explicitly not-defined distribution defines
1642   ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
1643     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1644
1645   ad_debug "defs in $1: $defs"
1646   ad_debug "ndefs in $1: $ndefs"
1647
1648   # Create the script to include and exclude stuff in the file according
1649   # to the distribution defines
1650
1651   # ifdefs
1652   ad_debug "processing ifdefs"
1653   for d in $defs
1654   do
1655     found=false
1656     for i in $distdefs
1657     do
1658       if test x$d = x$i; then
1659         found=true
1660         break
1661       fi
1662     done
1663
1664     # If distribution define was not found exclude those lines from the file.
1665     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1666     if test x$found = xfalse; then
1667       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1668       echo "/^#ifdef $d/,/^#else \/\* \!$d|^#endif \/\* $d/ { next; }" >> $f
1669     else
1670       echo "/^#else \/\* \!$d/,/^#endif \/\* $d/ { next; }" >> $f
1671     fi
1672   done
1673
1674   # ifndefs
1675   ad_debug "processing ifndefs"
1676   for d in $ndefs
1677   do
1678     found=false
1679     for i in $distdefs
1680     do
1681       if test x$d = x$i; then
1682         found=true
1683         break
1684       fi
1685     done
1686
1687     # If distribution define was found exclude those lines from the file.
1688     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1689     if test x$found = xtrue; then
1690       ad_debug "ifndef $d will be excluded (it IS defined)"
1691       echo "/^#ifndef $d/,/^#else \/\* $d|^#endif \/\* $d/ { next; }" >> $f
1692     else
1693       echo "/^#else \/\* $d/,/^#endif \/\* $d/ { next; }" >> $f
1694     fi
1695   done
1696
1697   # Now process the file with the script
1698   if test -f $f; then
1699
1700     # Those distdef lines that remain in the file are removed to make
1701     # the appearance prettier
1702     echo "/^#ifdef SILC_DIST_|^#endif \/\* SILC_DIST_|^#else \/\* SILC_DIST_|^#else \/\* \!SILC_DIST_|^#ifndef SILC_DIST_/ { next; }" >> $f
1703     echo "{ print; }" >> $f
1704
1705     # Execute the script
1706     cp -p $1 $2 || exit 1
1707     awk -f $f $1 > $2 || exit 1
1708   fi
1709
1710   rm -f $f
1711
1712   # Log if file was not relicensed
1713   if test -f "$1.norelicense"; then
1714     ad_log "  $1"
1715     rm -f $1.norelicense
1716   fi
1717
1718   ad_debug "Ending processing source file: $1 $2"
1719 }
1720
1721 #
1722 # Processes a file.  This is the -p, --process option.
1723 #
1724 # Arguments: ad_process <type> <src> <dst>
1725 #
1726 ad_process()
1727 {
1728   ad_debug "Starting process: $1 $2 $3"
1729
1730   nolog=true
1731
1732   if test '!' -f autodist.dist; then
1733     ad_fatal "Autodist has not been run yet to prepare source tree"
1734   fi
1735
1736   # Parse distribution
1737   distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
1738   dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
1739   ad_parse_distribution $distribution false
1740   ad_process_distdefs
1741
1742   # Process file
1743   case "$1" in
1744     makefile)
1745       if test -z $3; then
1746         ad_fatal "File type $1 requires <dst> argument"
1747       fi
1748       ad_make_makefile_am $2 $3
1749       exit 0;;
1750
1751     configure)
1752       ad_make_configure_ac $2
1753       exit 0;;
1754
1755     non-source)
1756       if test -z $3; then
1757         ad_fatal "File type $1 requires <dst> argument"
1758       fi
1759       ad_process_file $2 $3 false
1760       exit 0;;
1761
1762     source)
1763       if test -z $3; then
1764         ad_fatal "File type $1 requires <dst> argument"
1765       fi
1766       ad_process_source_file $2 $3 false
1767       exit 0;;
1768
1769     *)
1770       ad_fatal "Unknown file type: $1";
1771       ;;
1772   esac
1773 }
1774
1775 #
1776 # Run hooks
1777 #
1778 # Arguments: ad_run_hooks <hooks>
1779 #
1780 ad_run_hooks()
1781 {
1782   ad_debug "Running hooks: $1"
1783
1784   ad_log ""
1785   ad_log "Hooks executed:"
1786   ad_log "--------------"
1787
1788   for i in $1
1789   do
1790     if test '!' -f $i; then
1791       ad_fatal "Hook script $i does not exist"
1792     fi
1793     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\""
1794     sh $i "$distribution" "$dist_version" "$package" || exit 1
1795   done
1796   ad_log ""
1797
1798   ad_debug "Ending running hooks: $1"
1799 }
1800
1801 #
1802 # Run dist hooks
1803 #
1804 # Arguments: ad_run_dist_hooks <hooks>
1805 #
1806 ad_run_dist_hooks()
1807 {
1808   ad_debug "Starting running distributions hooks: $1"
1809
1810   ad_log ""
1811   ad_log "Distribution hooks executed:"
1812   ad_log "----------------------------"
1813
1814   for i in $1
1815   do
1816     if test '!' -f $i; then
1817       ad_fatal "Dist hook script $i does not exist"
1818     fi
1819
1820     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\""
1821     sh $i "$distribution" "$dist_version" "$package" "$am_distdir" || exit 1
1822   done
1823   ad_log ""
1824
1825   ad_debug "Ending running distribution hooks"
1826 }
1827
1828 ###############################################################################
1829 # Autodist code
1830
1831 usage="Usage: autodist [options] [distribution] [version]"
1832 help="\
1833 Autodist prepares source tree for configuration, compilation and
1834 distribution.  Generates Automake.am files from Automake.ad files, 
1835 configure.ac file from configure.ad file(s), generates the configure 
1836 script by running Autoconf tool, and generates Makefile.in files by 
1837 running Automake tool.
1838
1839 Operation modes:
1840   -h, --help                print this help, then exit
1841   -V, --version             print version number, then exit
1842   -v, --verbose             verbosely report processing
1843   -d, --distdir <dir>       search distributions from <dir>
1844   -s, --distdefs [<dist>]   print distribution defines of <dist>, then exit
1845   -i, --init                initialize Autodist environment, create default
1846                             distribution directory and distribution, then exit
1847   -p, --process <type> <src> [<dst>]
1848                             process file <src> into <dst> for distribution,
1849                             <type> is 'makefile', 'configure', 'non-source'
1850                             or 'source' and defines the type of <src>
1851   -m, --makedist            create and package distribution
1852       --gzip                create package compressed with gzip (default)
1853       --bzip2               create also package compressed with bzip2
1854       --compress            create also package compressed with compress
1855       --zip                 create also package compressed with zip"
1856
1857 #
1858 # Process command line arguments
1859 #
1860 while test $# -gt 0; do
1861   case "${1}" in
1862
1863   -d |--distdir)
1864     shift;
1865     test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
1866     distdir="${1}";
1867     shift;;
1868
1869   --list)
1870     exit 0;;
1871
1872   -s | --distdefs)
1873     shift;
1874     nolog=true
1875     if test $# -eq 0; then
1876       ad_parse_distribution $distribution false
1877       echo "Distribution: ${distribution}" 1>&2;
1878     else
1879       ad_parse_distribution $1 false
1880       echo "Distribution: ${1}" 1>&2;
1881     fi
1882     ad_process_distdefs
1883     echo "Distdefs:" 1>&2;
1884     for i in $distdefs
1885     do
1886       echo "$i";
1887     done
1888     exit 0;;
1889
1890   -i | --init)
1891     ad_initialize;
1892     exit 0;;
1893
1894   -p | --process)
1895     shift;
1896     if test $# -ge 2; then
1897       ad_process $1 $2 $3
1898     else
1899       echo "${usage}" 1>&2;
1900     fi
1901     exit 0;;
1902
1903   -m | --makedist)
1904     ad_makedist
1905     exit 0;;
1906
1907   --gzip)
1908     ad_gzip=true
1909     shift;;
1910
1911   --bzip2)
1912     ad_bzip2=true
1913     shift;;
1914
1915   --compress)
1916     ad_compress=true
1917     shift;;
1918
1919   --zip)
1920     ad_zip=true
1921     shift;;
1922
1923   -v | --verbose)
1924     debug=true
1925     shift;;
1926
1927   -h | --help | --h*)
1928     echo "${usage}" 1>&2;
1929     echo 1>&2;
1930     echo "${help}" 1>&2;
1931     echo 1>&2;
1932     exit 0;;
1933
1934   -V | --version)
1935     echo "@PACKAGE@ (@PACKAGE_NAME@) $ver" 1>&2;
1936     echo "Written by Pekka Riikonen" 1>&2;
1937     echo 1>&2;
1938     echo "Copyright (C) 2004 - 2005 SILC Project" 1>&2;
1939     echo "\
1940 This is free software; see the source for copying conditions.  There is NO
1941 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>&2;
1942     exit 0;;
1943
1944   --)
1945     shift;
1946     break;;
1947
1948   -*)
1949     echo "${usage}" 1>&2;
1950     exit 1;;
1951
1952   *)
1953     break;;
1954
1955   esac
1956 done
1957
1958 # Open log file
1959 ad_log_open "autodist.log"
1960
1961 ad_log "Processing source tree for compilation and configuration"
1962 ad_log "--------------------------------------------------------"
1963 ad_log ""
1964
1965 #
1966 # Parse the requested distribution
1967 #
1968 if test $# != 0; then
1969   distribution="${1}";
1970   distfile=$distribution
1971   shift
1972 fi
1973
1974 ad_parse_distribution $distribution false
1975
1976 if test $# != 0; then
1977   dist_version="${1}";
1978 fi
1979
1980 ad_log "  Distribution: $distribution $dist_version"
1981 ad_log ""
1982
1983 ad_process_distdefs
1984
1985 ad_debug "Preparing source tree for configuration and compilation..."
1986 ad_debug "Preparing $distribution distribution version $dist_version"
1987
1988 #
1989 # Create the distribution defines header file
1990 #
1991 if test "$DISTDEFS"; then
1992   ad_create_distdefs_h
1993 else
1994   ad_fatal "DISTDEFS not defined in $distdir/autodist.conf"
1995 fi
1996
1997 #
1998 # Run pre-hooks
1999 #
2000 ad_run_hooks "$pre_hooks"
2001
2002 #
2003 # Generate the Makefile.am files from Makefile.ad files
2004 #
2005 ad_make_makefile_ams
2006
2007 #
2008 # Generate the configure.ac from configure.ad file(s)
2009 #
2010 ad_make_configure_ac ./configure.ad
2011
2012 #
2013 # Process all files with .ad suffix for distribution processing
2014 #
2015 ad_process_ads
2016
2017 #
2018 # Generate configure script
2019 #
2020 ad_make_configure
2021
2022 #
2023 # Generate Makefile.in files
2024 #
2025 ad_make_makefile_ins
2026
2027 #
2028 # Create autodist.dist
2029 #
2030 ad_debug "Creating autodist.dist"
2031 echo "dist:$distfile" > autodist.dist
2032 echo "ver:$dist_version" >> autodist.dist
2033 echo "distdir:$package-$dist_version" >> autodist.dist
2034
2035 #
2036 # Run post-hooks
2037 #
2038 ad_run_hooks "$post_hooks"
2039
2040 ad_log "Source tree processed successfully."
2041 ad_debug "Done, now run ./configure and make."
2042
2043 exit 0