Merged silc_1_1_branch to trunk.
[silc.git] / apps / autodist / autodist.in
1 #!/bin/sh
2 #
3 # Author: Pekka Riikonen <priikone@silcnet.org>
4 #
5 # Copyright (C) 2005 - 2007 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   params=`grep "params:" < autodist.dist | cut -d: -f2` || exit 1
1000   ad_parse_distribution $distribution false
1001   ad_log "  Distribution: $distribution $dist_version"
1002   ad_log "  Destination directory: $am_distdir"
1003   ad_log ""
1004   ad_process_distdefs
1005
1006   if test x$opt_no_dist = xtrue; then
1007     ad_fatal "The '$distribution' distribution cannot be packaged"
1008   fi
1009
1010   # Run pre-dist-hooks
1011   ad_run_dist_hooks "$pre_dist_hooks" "$params"
1012
1013   # Create distribution directory
1014   ad_debug "Creating distribution directory $am_distdir"
1015   $MAKE distdir || exit 1
1016   chmod -R a+r $am_distdir
1017
1018   if test '!' -d $am_distdir; then
1019     ad_fatal "Distribution directory $am_distdir not created"
1020   fi
1021
1022   # Run pre-process-dist-hooks
1023   ad_run_dist_hooks "$pre_p_dist_hooks" "$params"
1024
1025   # Run excludes
1026   ad_dist_excludes "$excludes" true
1027
1028   # Run includes
1029   ad_dist_includes "$includes" false true
1030
1031   # Include specific license file if specified
1032   if test "$license" != ""; then
1033     ad_log ""
1034     ad_log "License file in distribution:"
1035     ad_log "-----------------------------"
1036     ad_log "  $license into $am_distdir/COPYING"
1037     ad_log ""
1038     cp -p $license $am_distdir/COPYING || exit 1
1039   fi
1040
1041   # Remove dependencies
1042   ad_remove_dependencies $am_distdir
1043
1044   # Process noprocesses, first pass
1045   ad_process_noprocess true
1046
1047   ad_log ""
1048   ad_log "Following files were not re-licensed:"
1049   ad_log "-------------------------------------"
1050
1051   # Process source files
1052   ad_debug "Process distribution source tree"
1053   ad_process_source_tree $am_distdir
1054
1055   # Process non-source files
1056   ad_debug "Process distribution tree"
1057   ad_process_tree $am_distdir
1058
1059   ad_log ""
1060
1061   # Process noprocesses, second pass
1062   ad_process_noprocess false
1063
1064   # Run post-process_dist-hooks
1065   ad_run_dist_hooks "$post_p_dist_hooks" "$params"
1066
1067   # Make distribution sane
1068   ad_makedist_makesane
1069
1070   # Package
1071   ad_debug "Packaging distribution"
1072   tar chof $am_distdir.tar $am_distdir || exit 1
1073
1074   # Compress
1075   ad_debug "Compressing distribution package"
1076   if test x$ad_gzip = xtrue; then
1077     ad_debug "Compressing distribution package $am_distdir.tar.gz"
1078     gzip -9 -c $am_distdir.tar > $am_distdir.tar.gz || exit 1
1079   fi
1080   if test x$ad_bzip2 = xtrue; then
1081     ad_debug "Compressing distribution package $am_distdir.tar.bz2"
1082     bzip2 -9 -c $am_distdir.tar > $am_distdir.tar.bz2 || exit 1
1083   fi
1084   if test x$ad_compress = xtrue; then
1085     ad_debug "Compressing distribution package $am_distdir.tar.Z"
1086     compress -c $am_distdir.tar > $am_distdir.tar.Z || exit 1
1087   fi
1088   if test x$ad_zip = xtrue; then
1089     rm -f $am_distdir.zip
1090     ad_debug "Compressing distribution package $am_distdir.zip"
1091     zip -rq $am_distdir.zip $am_distdir || exit 1
1092   fi
1093   rm -f $am_distdir.tar
1094
1095   # Run post-dist-hooks
1096   ad_run_dist_hooks "$post_dist_hooks" "$params"
1097
1098   # Cleanup
1099   rm -rf $am_distdir
1100
1101   ad_log "Distribution created successfully."
1102
1103   ad_debug "Ending distribution creation"
1104 }
1105
1106 #
1107 # Handles distribution options.
1108 #
1109 # option has the following format in distfile:
1110 #
1111 #   option <option>
1112 #
1113 # Following options are supported:
1114 #
1115 #   template
1116 #   no-dist
1117 #   no-inherit
1118 #
1119 # Arguments: ad_handle_options <options>
1120 #
1121 ad_handle_options()
1122 {
1123   ad_debug "Handling options: $1"
1124
1125   for i in $1
1126   do
1127     if test "$i" = "template"; then
1128       opt_template=true
1129       continue
1130     elif test "$i" = "no-dist"; then
1131       opt_no_dist=true
1132       continue
1133     elif test "$i" = "no-inherit"; then
1134       opt_no_inherit=true
1135       continue
1136     fi
1137   done
1138 }
1139
1140 #
1141 # Clears set options
1142 #
1143 # Arguments: ad_clear_options
1144 #
1145 ad_clear_options()
1146 {
1147   opt_template=false
1148   opt_no_dist=false
1149   opt_no_inherit=false
1150 }
1151
1152 #
1153 # Parses the distribution.  Gets all distribution defines from the
1154 # distribution.  This also expands all inherited distributions recursively
1155 # to get all inherited distribution defines.  From inherited distributions
1156 # their name and package name is not inherited.
1157 #
1158 # Arguments: ad_parse_distribution <distribution name> <inherit>
1159 #
1160 ad_parse_distribution()
1161 {
1162   local inhs
1163   local defs
1164   local undefs
1165   local incs
1166   local excs
1167   local nops
1168   local opts
1169   local dname
1170   local dpname
1171   local bugr
1172   local prh
1173   local poh
1174   local prdh
1175   local podh
1176   local prpdh
1177   local popdh
1178
1179   ad_debug "Starting parsing distribution: $1 $2"
1180
1181   if test '!' -f $distdir/$1; then
1182     ad_fatal "Distribution '$1' is not declared"
1183   fi
1184
1185   # Get and enforce prereq version
1186   prereq=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1187     | grep "prereq " | cut -d' ' -f2- | sort | uniq`
1188   if test '!' -z $prereq; then
1189     if [[ $ver < $prereq ]]; then
1190       ad_fatal "Autodist $prereq or newer is required for distribution $1"
1191     fi
1192   fi
1193
1194   # Get inherited
1195   inhs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1196     | grep "inherit " | cut -d' ' -f2 | sort | uniq`
1197
1198   # Get distdefs
1199   defs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1200    | grep "define " | cut -d' ' -f2 | sort | uniq`
1201
1202   if test "$inhs" = "" && test "$defs" = ""; then
1203     ad_fatal "Distribution '$1' does not define anything"
1204   fi
1205
1206   # Get undefined distdefs
1207   undefs=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1208    | grep "undef " | cut -d' ' -f2 | sort | uniq`
1209
1210   # Get includes
1211   incs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1212     | grep "include " | sed 's/include / : /'`
1213
1214   # Get excludes
1215   excs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1216     | grep "exclude " | cut -d' ' -f2- | sort | uniq`
1217
1218   # Get noprocesses
1219   nops=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1220     | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
1221
1222   # Get options
1223   opts=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1224     | grep "option " | cut -d' ' -f2- | sort | uniq`
1225
1226   # Check options
1227   ad_handle_options "$opts"
1228   if test x$2 = xtrue && test x$opt_no_inherit = xtrue; then
1229     ad_fatal "Distribution '$1' cannot be inherited"
1230   fi
1231   if test x$2 = xfalse && test x$opt_template = xtrue; then
1232     ad_fatal "Template distribution '$1' cannot be prepared or packaged"
1233   fi
1234
1235   ad_debug "inherits: $inhs"
1236   ad_debug "distdefs: $defs"
1237   ad_debug "includes: $incs"
1238   ad_debug "excludes: $excs"
1239   ad_debug "noprocess: $nops"
1240   ad_debug "undistdefs: $undefs"
1241   ad_debug "options: $opts"
1242
1243   # Expand distdefs from inherited distributions
1244   for i in $inhs
1245   do
1246     if test x$1 = x$i; then
1247       ad_fatal "Infinite recursion detected.  Fix the '$distdir/$1' \
1248             distribution to not have 'inherit $i' declared."
1249     fi
1250
1251     if test '!' -f $distdir/$i; then
1252       ad_fatal "Distribution '$i' is not declared (inherited from '$1')"
1253     fi
1254
1255     ad_parse_distribution $i true
1256     ad_clear_options
1257   done
1258
1259   # Get license
1260   license=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1261     | grep "license " | cut -d' ' -f2`
1262   licenseh=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1263     | grep "license-header " | sed 's/license-header / : /'`
1264
1265   ad_debug "license: $license"
1266   ad_debug "licenseh: $licenseh"
1267
1268   if test x$2 = xfalse; then
1269     # Take rest of the stuff from top distribution
1270
1271     # We take precedence on defined and undefined distdefs.  Remove
1272     # undefined distdefs if we have defined them.
1273     for d in $defs
1274     do
1275       ad_debug "defining undefined $d distdef"
1276       undistdefs=`echo $undistdefs | sed s/$d//g`
1277     done
1278
1279     # Get distribution name
1280     dname=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1281       | grep "name " | cut -d' ' -f2-`
1282
1283     if test "$dname"; then
1284       distribution=$dname
1285     fi
1286
1287     # Get distribution package name (optional)
1288     dpname=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1289      | grep "package " | cut -d' ' -f2`
1290
1291     if test "$dpname"; then
1292       package=$dpname
1293     else
1294       package=$distribution
1295     fi
1296
1297     # Get Bug-report email address (optional)
1298     bugr=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1299      | grep "bug-report " | cut -d' ' -f2-`
1300
1301     if test "$bugr"; then
1302       bug_report=$bugr
1303     fi
1304
1305     ad_debug "distribution: $distribution"
1306     ad_debug "package: $package"
1307     ad_debug "bug-report: $bug_report"
1308
1309     # Get hooks (optional)
1310     prh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1311      | grep "pre-hook " | cut -d' ' -f2-`
1312     poh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1313      | grep "post-hook " | cut -d' ' -f2-`
1314     prdh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1315      | grep "pre-dist-hook " | cut -d' ' -f2-`
1316     podh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1317      | grep "post-dist-hook " | cut -d' ' -f2-`
1318     prpdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1319      | grep "pre-process-dist-hook " | cut -d' ' -f2-`
1320     popdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1321      | grep "post-process-dist-hook " | cut -d' ' -f2-`
1322
1323     pre_hooks="$pre_hooks $prh"
1324     post_hooks="$post_hooks $poh"
1325     pre_dist_hooks="$pre_dist_hooks $prdh"
1326     post_dist_hooks="$post_dist_hooks $podh"
1327     pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
1328     post_p_dist_hooks="$post_p_dist_hooks $popdh"
1329     doptions="$doptions $opts"
1330
1331     ad_handle_options "$doptions"
1332     ad_debug "options: $doptions"
1333   fi
1334
1335   # Return to caller
1336   inherits="$inherits $inhs"
1337   distdefs="$distdefs $defs"
1338   includes="$includes $incs"
1339   excludes="$excludes $excs"
1340   noprocess="$noprocess $nops"
1341   undistdefs="$undistdefs $undefs"
1342
1343   ad_debug "Ending parsing distribution: $1 $2"
1344 }
1345
1346 #
1347 # Processes parsed distdefs.  Removes duplicates, and undefined distdefs
1348 # from the distdefs.
1349 #
1350 # Arguments: ad_process_distdefs
1351 #
1352 ad_process_distdefs()
1353 {
1354   ad_debug "Starting processing distdefs"
1355
1356   ad_log ""
1357   ad_log "Following distdefs were processed:"
1358   ad_log "----------------------------------"
1359
1360   # Remove all undefined distribution defines
1361   for i in $undistdefs
1362   do
1363     ad_debug "undefining $i distdef"
1364     distdefs=`echo $distdefs | sed s/$i//g`
1365   done
1366
1367   rm -f autodist.tmp.defs
1368
1369   # Remove duplicate distdefs
1370   for i in $distdefs
1371   do
1372     echo $i >>autodist.tmp.defs
1373   done
1374   distdefs=`sort < autodist.tmp.defs | uniq`
1375   distdefs=`echo $distdefs`
1376   rm -f autodist.tmp.defs
1377
1378   # Log
1379   for i in $distdefs
1380   do
1381     ad_log "  $i"
1382   done
1383   ad_log ""
1384
1385   ad_debug "distdefs=$distdefs"
1386
1387   ad_debug "Ending processing distdefs"
1388 }
1389
1390 #
1391 # Processes for a license header change.
1392 #
1393 # Arguments: ad_process_license_header <scriptfile> <sourcefile>
1394 #
1395 ad_process_license_header()
1396 {
1397   ad_debug "Starting license header processing"
1398
1399   # Add : separator at the end
1400   lics=`echo "$licenseh" | sed 's/$/ : /'`
1401
1402   src=
1403   dst=
1404   for i in $lics
1405   do
1406     if test "$i" = ":" && test -z "$src"; then
1407       continue
1408     fi
1409     if test -z "$src"; then
1410       src=$i
1411       continue
1412     fi
1413     if test -z "$dst" && test "$i" != ":"; then
1414       dst=$i
1415     else
1416       ad_fatal "Missing argument in 'license-header $src'"
1417     fi
1418
1419     ad_debug "Replacing $src license with $dst license"
1420
1421     if test '!' -f $src; then
1422       ad_fatal "License header $src: No such file or directory"
1423     fi
1424
1425     if test '!' -f $dst; then
1426       ad_fatal "License header $dst: No such file or directory"
1427     fi
1428
1429     # Awk script to replace the license header
1430     fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
1431     ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
1432     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
1433     rm -f autodist.lsrc autodist.ldst
1434
1435     src=
1436     dst=
1437   done
1438
1439   ad_debug "Ending license header processing"
1440 }
1441
1442 #
1443 # Process specified noprocesses.  This is called during makedist.
1444 # The noprocess first copies the noprocess files and dirs into a temp
1445 # directory, and then removes them from the distdir.  This way they are
1446 # not processed by Autodist.  After processing they are returned to their
1447 # correct locations from the temp dir.  Dirty, yeah, but the way we do
1448 # this until better one comes along.
1449 #
1450 # Arguments: ad_process_noprocess <process>
1451 #
1452 # If <process> is true this excludes and if false this includes.
1453 #
1454 ad_process_noprocess()
1455 {
1456   ad_debug "Starting running noprocesses"
1457
1458   set -f
1459
1460   cur=`pwd`
1461
1462   if test x$1 = xtrue; then
1463     ad_log ""
1464     ad_log "Following files and directories were not processed:"
1465     ad_log "---------------------------------------------------"
1466
1467     f="$cur/autodist__noprocess"
1468     rm -rf $f
1469     mkdir -p -- $f || exit 1
1470
1471     # First, include them to new location with correct directory structure.
1472     old_am_distdir="$am_distdir"
1473     cd $am_distdir || exit 1
1474     am_distdir="$f"
1475     nops=" $noprocess"
1476     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1477     ad_dist_includes "$nops" false false
1478     am_distdir="$old_am_distdir"
1479
1480     # Then, remove from distdir (they are in temp dir now)
1481     for i in $noprocess
1482     do
1483       ad_log "  $i"
1484       rm -rf $i
1485     done
1486     cd $cur || exit 1
1487
1488     ad_log ""
1489   else
1490     # Copy from the temp dir back to distdir
1491     cd autodist__noprocess || exit 1
1492     old_am_distdir="$am_distdir"
1493     am_distdir="$cur/$old_am_distdir"
1494     nops=" $noprocess"
1495     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1496
1497     ad_dist_includes "$nops" false false
1498
1499     am_distdir="$old_am_distdir"
1500     cd $cur || exit 1
1501     rm -rf autodist__noprocess
1502   fi
1503
1504   set +f
1505
1506   ad_debug "Ending running noprocesses"
1507 }
1508
1509 #
1510 # Process a file given as argument for the distribution.
1511 #
1512 # Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
1513 #
1514 ad_process_file()
1515 {
1516   local found=false
1517   local f
1518   local defs
1519   local ndefs
1520
1521   # Process only regular files
1522   if test '!' -f $1; then
1523     return
1524   fi
1525
1526   ad_debug "Starting processing file: $1 $2"
1527
1528   f="autodist.tmp.script"
1529   rm -f $f
1530
1531   # If license header is provided, replace the license header in the file.
1532   if test x$3 = xtrue; then
1533     ad_process_license_header $f $1
1534   fi
1535
1536   # Get defined distribution defines
1537   defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
1538     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1539
1540   # Get explicitly not-defined distribution defines
1541   ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
1542     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1543
1544   ad_debug "defs in $1: $defs"
1545   ad_debug "ndefs in $1: $ndefs"
1546
1547   # Create the script to include and exclude stuff in the file according
1548   # to the distribution defines
1549
1550   # ifdefs
1551   ad_debug "processing ifdefs"
1552   for d in $defs
1553   do
1554     found=false
1555     for i in $distdefs
1556     do
1557       if test x$d = x$i; then
1558         found=true
1559         break
1560       fi
1561     done
1562
1563     # If distribution define was not found exclude those lines from the file.
1564     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1565     if test x$found = xfalse; then
1566       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1567       echo "/^#ifdef $d$/,/^#else !$d$|^#endif $d$/ { next; }" >> $f
1568     else
1569       echo "/^#else !$d$/,/^#endif $d$/ { next; }" >> $f
1570     fi
1571   done
1572
1573   # ifndefs
1574   ad_debug "processing ifndefs"
1575   for d in $ndefs
1576   do
1577     found=false
1578     for i in $distdefs
1579     do
1580       if test x$d = x$i; then
1581         found=true
1582         break
1583       fi
1584     done
1585
1586     # If distribution define was found exclude those lines from the file.
1587     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1588     if test x$found = xtrue; then
1589       ad_debug "ifndef $d will be excluded (it IS defined)"
1590       echo "/^#ifndef $d$/,/^#else $d$|^#endif $d$/ { next; }" >> $f
1591     else
1592       echo "/^#else $d$/,/^#endif $d$/ { next; }" >> $f
1593     fi
1594   done
1595
1596   # Now process the file with the script
1597   if test -f $f; then
1598
1599     # Those distdef lines that remain in the file are removed to make
1600     # the appearance prettier
1601     echo "/^#ifdef "$DP"_DIST_|^#endif "$DP"_DIST_|^#else "$DP"_DIST_|^#else !"$DP"_DIST_|^#ifndef "$DP"_DIST_/ { next; }" >> $f
1602     echo "{ print; }" >> $f
1603
1604     # Execute the script
1605     cp -p $1 $2 || exit 1
1606     awk -f $f $1 > $2 || exit 1
1607   fi
1608
1609   rm -f $f
1610
1611   # Log if file was not relicensed
1612   if test -f "$1.norelicense"; then
1613     ad_log "  $1"
1614     rm -f $1.norelicense
1615   fi
1616
1617   ad_debug "Ending processing file: $1 $2"
1618 }
1619
1620 #
1621 # Process a source file given as argument for the distribution.
1622 #
1623 # Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
1624 #
1625 ad_process_source_file()
1626 {
1627   local found=false
1628   local f
1629   local defs
1630   local ndefs
1631
1632   # Process only regular files
1633   if test '!' -f $1; then
1634     return
1635   fi
1636
1637   ad_debug "Starting processing source file: $1 $2"
1638
1639   f="autodist.tmp.script"
1640   rm -f $f
1641
1642   # If license header is provided, replace the license header in the file.
1643   if test x$3 = xtrue; then
1644     ad_process_license_header $f $1
1645   fi
1646
1647   # Get defined distribution defines
1648   defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
1649     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1650
1651   # Get explicitly not-defined distribution defines
1652   ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
1653     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1654
1655   ad_debug "defs in $1: $defs"
1656   ad_debug "ndefs in $1: $ndefs"
1657
1658   # Create the script to include and exclude stuff in the file according
1659   # to the distribution defines
1660
1661   # ifdefs
1662   ad_debug "processing ifdefs"
1663   for d in $defs
1664   do
1665     found=false
1666     for i in $distdefs
1667     do
1668       if test x$d = x$i; then
1669         found=true
1670         break
1671       fi
1672     done
1673
1674     # If distribution define was not found exclude those lines from the file.
1675     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1676     if test x$found = xfalse; then
1677       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1678       echo "/^#ifdef $d$/,/^#else \/\* \!$d |^#endif \/\* $d / { next; }" >> $f
1679     else
1680       echo "/^#else \/\* \!$d /,/^#endif \/\* $d / { next; }" >> $f
1681     fi
1682   done
1683
1684   # ifndefs
1685   ad_debug "processing ifndefs"
1686   for d in $ndefs
1687   do
1688     found=false
1689     for i in $distdefs
1690     do
1691       if test x$d = x$i; then
1692         found=true
1693         break
1694       fi
1695     done
1696
1697     # If distribution define was found exclude those lines from the file.
1698     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1699     if test x$found = xtrue; then
1700       ad_debug "ifndef $d will be excluded (it IS defined)"
1701       echo "/^#ifndef $d$/,/^#else \/\* $d |^#endif \/\* $d / { next; }" >> $f
1702     else
1703       echo "/^#else \/\* $d /,/^#endif \/\* $d / { next; }" >> $f
1704     fi
1705   done
1706
1707   # Now process the file with the script
1708   if test -f $f; then
1709
1710     # Those distdef lines that remain in the file are removed to make
1711     # the appearance prettier
1712     echo "/^#ifdef SILC_DIST_|^#endif \/\* SILC_DIST_|^#else \/\* SILC_DIST_|^#else \/\* \!SILC_DIST_|^#ifndef SILC_DIST_/ { next; }" >> $f
1713     echo "{ print; }" >> $f
1714
1715     # Execute the script
1716     cp -p $1 $2 || exit 1
1717     awk -f $f $1 > $2 || exit 1
1718   fi
1719
1720   rm -f $f
1721
1722   # Log if file was not relicensed
1723   if test -f "$1.norelicense"; then
1724     ad_log "  $1"
1725     rm -f $1.norelicense
1726   fi
1727
1728   ad_debug "Ending processing source file: $1 $2"
1729 }
1730
1731 #
1732 # Processes a file.  This is the -p, --process option.
1733 #
1734 # Arguments: ad_process <type> <src> <dst>
1735 #
1736 ad_process()
1737 {
1738   ad_debug "Starting process: $1 $2 $3"
1739
1740   nolog=true
1741
1742   if test '!' -f autodist.dist; then
1743     ad_fatal "Autodist has not been run yet to prepare source tree"
1744   fi
1745
1746   # Parse distribution
1747   distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
1748   dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
1749   ad_parse_distribution $distribution false
1750   ad_process_distdefs
1751
1752   # Process file
1753   case "$1" in
1754     makefile)
1755       if test -z $3; then
1756         ad_fatal "File type $1 requires <dst> argument"
1757       fi
1758       ad_make_makefile_am $2 $3
1759       exit 0;;
1760
1761     configure)
1762       ad_make_configure_ac $2
1763       exit 0;;
1764
1765     non-source)
1766       if test -z $3; then
1767         ad_fatal "File type $1 requires <dst> argument"
1768       fi
1769       ad_process_file $2 $3 false
1770       exit 0;;
1771
1772     source)
1773       if test -z $3; then
1774         ad_fatal "File type $1 requires <dst> argument"
1775       fi
1776       ad_process_source_file $2 $3 false
1777       exit 0;;
1778
1779     *)
1780       ad_fatal "Unknown file type: $1";
1781       ;;
1782   esac
1783 }
1784
1785 #
1786 # Run hooks
1787 #
1788 # Arguments: ad_run_hooks <hooks> <params>
1789 #
1790 ad_run_hooks()
1791 {
1792   ad_debug "Running hooks: $1"
1793
1794   ad_log ""
1795   ad_log "Hooks executed:"
1796   ad_log "--------------"
1797
1798   for i in $1
1799   do
1800     if test '!' -f $i; then
1801       ad_fatal "Hook script $i does not exist"
1802     fi
1803     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$2\""
1804     sh $i "$distribution" "$dist_version" "$package" "$2" || exit 1
1805   done
1806   ad_log ""
1807
1808   ad_debug "Ending running hooks: $1"
1809 }
1810
1811 #
1812 # Run dist hooks
1813 #
1814 # Arguments: ad_run_dist_hooks <hooks> <params>
1815 #
1816 ad_run_dist_hooks()
1817 {
1818   ad_debug "Starting running distributions hooks: $1"
1819
1820   ad_log ""
1821   ad_log "Distribution hooks executed:"
1822   ad_log "----------------------------"
1823
1824   for i in $1
1825   do
1826     if test '!' -f $i; then
1827       ad_fatal "Dist hook script $i does not exist"
1828     fi
1829
1830     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\" \"$2\""
1831     sh $i "$distribution" "$dist_version" "$package" "$am_distdir" "$2" || exit 1
1832   done
1833   ad_log ""
1834
1835   ad_debug "Ending running distribution hooks"
1836 }
1837
1838 ###############################################################################
1839 # Autodist code
1840
1841 usage="Usage: autodist [options] [distribution] [version] [params]"
1842 help="\
1843 Autodist prepares source tree for configuration, compilation and
1844 distribution.  Generates Automake.am files from Automake.ad files, 
1845 configure.ac file from configure.ad file(s), generates the configure 
1846 script by running Autoconf tool, and generates Makefile.in files by 
1847 running Automake tool.
1848
1849 Operation modes:
1850   -h, --help                print this help, then exit
1851   -V, --version             print version number, then exit
1852   -v, --verbose             verbosely report processing
1853   -d, --distdir <dir>       search distributions from <dir>
1854   -s, --distdefs [<dist>]   print distribution defines of <dist>, then exit
1855   -i, --init                initialize Autodist environment, create default
1856                             distribution directory and distribution, then exit
1857   -p, --process <type> <src> [<dst>]
1858                             process file <src> into <dst> for distribution,
1859                             <type> is 'makefile', 'configure', 'non-source'
1860                             or 'source' and defines the type of <src>
1861   -m, --makedist            create and package distribution
1862       --gzip                create package compressed with gzip (default)
1863       --bzip2               create also package compressed with bzip2
1864       --compress            create also package compressed with compress
1865       --zip                 create also package compressed with zip"
1866
1867 #
1868 # Process command line arguments
1869 #
1870 while test $# -gt 0; do
1871   case "${1}" in
1872
1873   -d |--distdir)
1874     shift;
1875     test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
1876     distdir="${1}";
1877     shift;;
1878
1879   --list)
1880     exit 0;;
1881
1882   -s | --distdefs)
1883     shift;
1884     if test $# -eq 0; then
1885       ad_parse_distribution $distribution false
1886       echo "Distribution: ${distribution}" 1>&2;
1887     else
1888       ad_parse_distribution $1 false
1889       echo "Distribution: ${1}" 1>&2;
1890     fi
1891     ad_process_distdefs
1892     echo "Distdefs:" 1>&2;
1893     for i in $distdefs
1894     do
1895       echo "$i";
1896     done
1897     exit 0;;
1898
1899   -i | --init)
1900     ad_initialize;
1901     exit 0;;
1902
1903   -p | --process)
1904     shift;
1905     if test $# -ge 2; then
1906       ad_process $1 $2 $3
1907     else
1908       echo "${usage}" 1>&2;
1909     fi
1910     exit 0;;
1911
1912   -m | --makedist)
1913     ad_makedist
1914     exit 0;;
1915
1916   --gzip)
1917     ad_gzip=true
1918     shift;;
1919
1920   --bzip2)
1921     ad_bzip2=true
1922     shift;;
1923
1924   --compress)
1925     ad_compress=true
1926     shift;;
1927
1928   --zip)
1929     ad_zip=true
1930     shift;;
1931
1932   -v | --verbose)
1933     debug=true
1934     shift;;
1935
1936   -h | --help | --h*)
1937     echo "${usage}" 1>&2;
1938     echo 1>&2;
1939     echo "${help}" 1>&2;
1940     echo 1>&2;
1941     exit 0;;
1942
1943   -V | --version)
1944     echo "@PACKAGE@ (@PACKAGE_NAME@) $ver" 1>&2;
1945     echo "Written by Pekka Riikonen" 1>&2;
1946     echo 1>&2;
1947     echo "Copyright (C) 2004 - 2007 SILC Project" 1>&2;
1948     echo "\
1949 This is free software; see the source for copying conditions.  There is NO
1950 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>&2;
1951     exit 0;;
1952
1953   --)
1954     shift;
1955     break;;
1956
1957   -*)
1958     echo "${usage}" 1>&2;
1959     exit 1;;
1960
1961   *)
1962     break;;
1963
1964   esac
1965 done
1966
1967 # Open log file
1968 ad_log_open "autodist.log"
1969
1970 ad_log "Processing source tree for compilation and configuration"
1971 ad_log "--------------------------------------------------------"
1972 ad_log ""
1973
1974 #
1975 # Parse the requested distribution
1976 #
1977 if test $# != 0; then
1978   distribution="${1}";
1979   distfile=$distribution
1980   shift
1981 fi
1982
1983 ad_parse_distribution $distribution false
1984
1985 if test $# != 0; then
1986   dist_version="${1}";
1987 fi
1988
1989 ad_log "  Distribution: $distribution $dist_version"
1990 ad_log ""
1991
1992 ad_process_distdefs
1993
1994 ad_debug "Preparing source tree for configuration and compilation..."
1995 ad_debug "Preparing $distribution distribution version $dist_version"
1996
1997 #
1998 # Create the distribution defines header file
1999 #
2000 if test "$DISTDEFS"; then
2001   ad_create_distdefs_h
2002 else
2003   ad_fatal "DISTDEFS not defined in $distdir/autodist.conf"
2004 fi
2005
2006 # Get extra parameters from command line
2007 shift
2008
2009 #
2010 # Run pre-hooks
2011 #
2012 ad_run_hooks "$pre_hooks" "$@"
2013
2014 #
2015 # Generate the Makefile.am files from Makefile.ad files
2016 #
2017 ad_make_makefile_ams
2018
2019 #
2020 # Generate the configure.ac from configure.ad file(s)
2021 #
2022 ad_make_configure_ac ./configure.ad
2023
2024 #
2025 # Process all files with .ad suffix for distribution processing
2026 #
2027 ad_process_ads
2028
2029 #
2030 # Generate configure script
2031 #
2032 ad_make_configure
2033
2034 #
2035 # Generate Makefile.in files
2036 #
2037 ad_make_makefile_ins
2038
2039 #
2040 # Create autodist.dist
2041 #
2042 ad_debug "Creating autodist.dist"
2043 echo "dist:$distfile" > autodist.dist
2044 echo "ver:$dist_version" >> autodist.dist
2045 echo "distdir:$package-$dist_version" >> autodist.dist
2046 echo "params:$@" >> autodist.dist
2047
2048 #
2049 # Run post-hooks
2050 #
2051 ad_run_hooks "$post_hooks" "$@"
2052
2053 ad_log "Source tree processed successfully."
2054 ad_debug "Done, now run ./configure and make."
2055
2056 exit 0