Added support for passing extra parameters for autodist and
[autodist.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 inherited
1186   inhs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1187     | grep "inherit " | cut -d' ' -f2 | sort | uniq`
1188
1189   # Get distdefs
1190   defs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1191    | grep "define " | cut -d' ' -f2 | sort | uniq`
1192
1193   if test "$inhs" = "" && test "$defs" = ""; then
1194     ad_fatal "Distribution '$1' does not define anything"
1195   fi
1196
1197   # Get undefined distdefs
1198   undefs=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1199    | grep "undef " | cut -d' ' -f2 | sort | uniq`
1200
1201   # Get includes
1202   incs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1203     | grep "include " | sed 's/include / : /'`
1204
1205   # Get excludes
1206   excs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1207     | grep "exclude " | cut -d' ' -f2- | sort | uniq`
1208
1209   # Get noprocesses
1210   nops=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1211     | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
1212
1213   # Get options
1214   opts=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1215     | grep "option " | cut -d' ' -f2- | sort | uniq`
1216
1217   # Check options
1218   ad_handle_options "$opts"
1219   if test x$2 = xtrue && test x$opt_no_inherit = xtrue; then
1220     ad_fatal "Distribution '$1' cannot be inherited"
1221   fi
1222   if test x$2 = xfalse && test x$opt_template = xtrue; then
1223     ad_fatal "Template distribution '$1' cannot be prepared or packaged"
1224   fi
1225
1226   ad_debug "inherits: $inhs"
1227   ad_debug "distdefs: $defs"
1228   ad_debug "includes: $incs"
1229   ad_debug "excludes: $excs"
1230   ad_debug "noprocess: $nops"
1231   ad_debug "undistdefs: $undefs"
1232   ad_debug "options: $opts"
1233
1234   # Expand distdefs from inherited distributions
1235   for i in $inhs
1236   do
1237     if test x$1 = x$i; then
1238       ad_fatal "Infinite recursion detected.  Fix the '$distdir/$1' \
1239             distribution to not have 'inherit $i' declared."
1240     fi
1241
1242     if test '!' -f $distdir/$i; then
1243       ad_fatal "Distribution '$i' is not declared (inherited from '$1')"
1244     fi
1245
1246     ad_parse_distribution $i true
1247     ad_clear_options
1248   done
1249
1250   # Get license
1251   license=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1252     | grep "license " | cut -d' ' -f2`
1253   licenseh=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1254     | grep "license-header " | sed 's/license-header / : /'`
1255
1256   ad_debug "license: $license"
1257   ad_debug "licenseh: $licenseh"
1258
1259   if test x$2 = xfalse; then
1260     # Take rest of the stuff from top distribution
1261
1262     # We take precedence on defined and undefined distdefs.  Remove
1263     # undefined distdefs if we have defined them.
1264     for d in $defs
1265     do
1266       ad_debug "defining undefined $d distdef"
1267       undistdefs=`echo $undistdefs | sed s/$d//g`
1268     done
1269
1270     # Get distribution name
1271     dname=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1272       | grep "name " | cut -d' ' -f2-`
1273
1274     if test "$dname"; then
1275       distribution=$dname
1276     fi
1277
1278     # Get distribution package name (optional)
1279     dpname=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1280      | grep "package " | cut -d' ' -f2`
1281
1282     if test "$dpname"; then
1283       package=$dpname
1284     else
1285       package=$distribution
1286     fi
1287
1288     # Get Bug-report email address (optional)
1289     bugr=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1290      | grep "bug-report " | cut -d' ' -f2-`
1291
1292     if test "$bugr"; then
1293       bug_report=$bugr
1294     fi
1295
1296     ad_debug "distribution: $distribution"
1297     ad_debug "package: $package"
1298     ad_debug "bug-report: $bug_report"
1299
1300     # Get hooks (optional)
1301     prh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1302      | grep "pre-hook " | cut -d' ' -f2-`
1303     poh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1304      | grep "post-hook " | cut -d' ' -f2-`
1305     prdh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1306      | grep "pre-dist-hook " | cut -d' ' -f2-`
1307     podh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1308      | grep "post-dist-hook " | cut -d' ' -f2-`
1309     prpdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1310      | grep "pre-process-dist-hook " | cut -d' ' -f2-`
1311     popdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1312      | grep "post-process-dist-hook " | cut -d' ' -f2-`
1313
1314     pre_hooks="$pre_hooks $prh"
1315     post_hooks="$post_hooks $poh"
1316     pre_dist_hooks="$pre_dist_hooks $prdh"
1317     post_dist_hooks="$post_dist_hooks $podh"
1318     pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
1319     post_p_dist_hooks="$post_p_dist_hooks $popdh"
1320     doptions="$doptions $opts"
1321
1322     ad_handle_options "$doptions"
1323     ad_debug "options: $doptions"
1324   fi
1325
1326   # Return to caller
1327   inherits="$inherits $inhs"
1328   distdefs="$distdefs $defs"
1329   includes="$includes $incs"
1330   excludes="$excludes $excs"
1331   noprocess="$noprocess $nops"
1332   undistdefs="$undistdefs $undefs"
1333
1334   ad_debug "Ending parsing distribution: $1 $2"
1335 }
1336
1337 #
1338 # Processes parsed distdefs.  Removes duplicates, and undefined distdefs
1339 # from the distdefs.
1340 #
1341 # Arguments: ad_process_distdefs
1342 #
1343 ad_process_distdefs()
1344 {
1345   ad_debug "Starting processing distdefs"
1346
1347   ad_log ""
1348   ad_log "Following distdefs were processed:"
1349   ad_log "----------------------------------"
1350
1351   # Remove all undefined distribution defines
1352   for i in $undistdefs
1353   do
1354     ad_debug "undefining $i distdef"
1355     distdefs=`echo $distdefs | sed s/$i//g`
1356   done
1357
1358   rm -f autodist.tmp.defs
1359
1360   # Remove duplicate distdefs
1361   for i in $distdefs
1362   do
1363     echo $i >>autodist.tmp.defs
1364   done
1365   distdefs=`sort < autodist.tmp.defs | uniq`
1366   distdefs=`echo $distdefs`
1367   rm -f autodist.tmp.defs
1368
1369   # Log
1370   for i in $distdefs
1371   do
1372     ad_log "  $i"
1373   done
1374   ad_log ""
1375
1376   ad_debug "distdefs=$distdefs"
1377
1378   ad_debug "Ending processing distdefs"
1379 }
1380
1381 #
1382 # Processes for a license header change.
1383 #
1384 # Arguments: ad_process_license_header <scriptfile> <sourcefile>
1385 #
1386 ad_process_license_header()
1387 {
1388   ad_debug "Starting license header processing"
1389
1390   # Add : separator at the end
1391   lics=`echo "$licenseh" | sed 's/$/ : /'`
1392
1393   src=
1394   dst=
1395   for i in $lics
1396   do
1397     if test "$i" = ":" && test -z "$src"; then
1398       continue
1399     fi
1400     if test -z "$src"; then
1401       src=$i
1402       continue
1403     fi
1404     if test -z "$dst" && test "$i" != ":"; then
1405       dst=$i
1406     else
1407       ad_fatal "Missing argument in 'license-header $src'"
1408     fi
1409
1410     ad_debug "Replacing $src license with $dst license"
1411
1412     if test '!' -f $src; then
1413       ad_fatal "License header $src: No such file or directory"
1414     fi
1415
1416     if test '!' -f $dst; then
1417       ad_fatal "License header $dst: No such file or directory"
1418     fi
1419
1420     # Awk script to replace the license header
1421     fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
1422     ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
1423     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
1424     rm -f autodist.lsrc autodist.ldst
1425
1426     src=
1427     dst=
1428   done
1429
1430   ad_debug "Ending license header processing"
1431 }
1432
1433 #
1434 # Process specified noprocesses.  This is called during makedist.
1435 # The noprocess first copies the noprocess files and dirs into a temp
1436 # directory, and then removes them from the distdir.  This way they are
1437 # not processed by Autodist.  After processing they are returned to their
1438 # correct locations from the temp dir.  Dirty, yeah, but the way we do
1439 # this until better one comes along.
1440 #
1441 # Arguments: ad_process_noprocess <process>
1442 #
1443 # If <process> is true this excludes and if false this includes.
1444 #
1445 ad_process_noprocess()
1446 {
1447   ad_debug "Starting running noprocesses"
1448
1449   set -f
1450
1451   cur=`pwd`
1452
1453   if test x$1 = xtrue; then
1454     ad_log ""
1455     ad_log "Following files and directories were not processed:"
1456     ad_log "---------------------------------------------------"
1457
1458     f="$cur/autodist__noprocess"
1459     rm -rf $f
1460     mkdir -p -- $f || exit 1
1461
1462     # First, include them to new location with correct directory structure.
1463     old_am_distdir="$am_distdir"
1464     cd $am_distdir || exit 1
1465     am_distdir="$f"
1466     nops=" $noprocess"
1467     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1468     ad_dist_includes "$nops" false false
1469     am_distdir="$old_am_distdir"
1470
1471     # Then, remove from distdir (they are in temp dir now)
1472     for i in $noprocess
1473     do
1474       ad_log "  $i"
1475       rm -rf $i
1476     done
1477     cd $cur || exit 1
1478
1479     ad_log ""
1480   else
1481     # Copy from the temp dir back to distdir
1482     cd autodist__noprocess || exit 1
1483     old_am_distdir="$am_distdir"
1484     am_distdir="$cur/$old_am_distdir"
1485     nops=" $noprocess"
1486     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1487
1488     ad_dist_includes "$nops" false false
1489
1490     am_distdir="$old_am_distdir"
1491     cd $cur || exit 1
1492     rm -rf autodist__noprocess
1493   fi
1494
1495   set +f
1496
1497   ad_debug "Ending running noprocesses"
1498 }
1499
1500 #
1501 # Process a file given as argument for the distribution.
1502 #
1503 # Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
1504 #
1505 ad_process_file()
1506 {
1507   local found=false
1508   local f
1509   local defs
1510   local ndefs
1511
1512   # Process only regular files
1513   if test '!' -f $1; then
1514     return
1515   fi
1516
1517   ad_debug "Starting processing file: $1 $2"
1518
1519   f="autodist.tmp.script"
1520   rm -f $f
1521
1522   # If license header is provided, replace the license header in the file.
1523   if test x$3 = xtrue; then
1524     ad_process_license_header $f $1
1525   fi
1526
1527   # Get defined distribution defines
1528   defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
1529     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1530
1531   # Get explicitly not-defined distribution defines
1532   ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
1533     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1534
1535   ad_debug "defs in $1: $defs"
1536   ad_debug "ndefs in $1: $ndefs"
1537
1538   # Create the script to include and exclude stuff in the file according
1539   # to the distribution defines
1540
1541   # ifdefs
1542   ad_debug "processing ifdefs"
1543   for d in $defs
1544   do
1545     found=false
1546     for i in $distdefs
1547     do
1548       if test x$d = x$i; then
1549         found=true
1550         break
1551       fi
1552     done
1553
1554     # If distribution define was not found exclude those lines from the file.
1555     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1556     if test x$found = xfalse; then
1557       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1558       echo "/^#ifdef $d$/,/^#else !$d$|^#endif $d$/ { next; }" >> $f
1559     else
1560       echo "/^#else !$d$/,/^#endif $d$/ { next; }" >> $f
1561     fi
1562   done
1563
1564   # ifndefs
1565   ad_debug "processing ifndefs"
1566   for d in $ndefs
1567   do
1568     found=false
1569     for i in $distdefs
1570     do
1571       if test x$d = x$i; then
1572         found=true
1573         break
1574       fi
1575     done
1576
1577     # If distribution define was found exclude those lines from the file.
1578     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1579     if test x$found = xtrue; then
1580       ad_debug "ifndef $d will be excluded (it IS defined)"
1581       echo "/^#ifndef $d$/,/^#else $d$|^#endif $d$/ { next; }" >> $f
1582     else
1583       echo "/^#else $d$/,/^#endif $d$/ { next; }" >> $f
1584     fi
1585   done
1586
1587   # Now process the file with the script
1588   if test -f $f; then
1589
1590     # Those distdef lines that remain in the file are removed to make
1591     # the appearance prettier
1592     echo "/^#ifdef "$DP"_DIST_|^#endif "$DP"_DIST_|^#else "$DP"_DIST_|^#else !"$DP"_DIST_|^#ifndef "$DP"_DIST_/ { next; }" >> $f
1593     echo "{ print; }" >> $f
1594
1595     # Execute the script
1596     cp -p $1 $2 || exit 1
1597     awk -f $f $1 > $2 || exit 1
1598   fi
1599
1600   rm -f $f
1601
1602   # Log if file was not relicensed
1603   if test -f "$1.norelicense"; then
1604     ad_log "  $1"
1605     rm -f $1.norelicense
1606   fi
1607
1608   ad_debug "Ending processing file: $1 $2"
1609 }
1610
1611 #
1612 # Process a source file given as argument for the distribution.
1613 #
1614 # Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
1615 #
1616 ad_process_source_file()
1617 {
1618   local found=false
1619   local f
1620   local defs
1621   local ndefs
1622
1623   # Process only regular files
1624   if test '!' -f $1; then
1625     return
1626   fi
1627
1628   ad_debug "Starting processing source file: $1 $2"
1629
1630   f="autodist.tmp.script"
1631   rm -f $f
1632
1633   # If license header is provided, replace the license header in the file.
1634   if test x$3 = xtrue; then
1635     ad_process_license_header $f $1
1636   fi
1637
1638   # Get defined distribution defines
1639   defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
1640     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1641
1642   # Get explicitly not-defined distribution defines
1643   ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
1644     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1645
1646   ad_debug "defs in $1: $defs"
1647   ad_debug "ndefs in $1: $ndefs"
1648
1649   # Create the script to include and exclude stuff in the file according
1650   # to the distribution defines
1651
1652   # ifdefs
1653   ad_debug "processing ifdefs"
1654   for d in $defs
1655   do
1656     found=false
1657     for i in $distdefs
1658     do
1659       if test x$d = x$i; then
1660         found=true
1661         break
1662       fi
1663     done
1664
1665     # If distribution define was not found exclude those lines from the file.
1666     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1667     if test x$found = xfalse; then
1668       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1669       echo "/^#ifdef $d$/,/^#else \/\* \!$d |^#endif \/\* $d / { next; }" >> $f
1670     else
1671       echo "/^#else \/\* \!$d /,/^#endif \/\* $d / { next; }" >> $f
1672     fi
1673   done
1674
1675   # ifndefs
1676   ad_debug "processing ifndefs"
1677   for d in $ndefs
1678   do
1679     found=false
1680     for i in $distdefs
1681     do
1682       if test x$d = x$i; then
1683         found=true
1684         break
1685       fi
1686     done
1687
1688     # If distribution define was found exclude those lines from the file.
1689     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1690     if test x$found = xtrue; then
1691       ad_debug "ifndef $d will be excluded (it IS defined)"
1692       echo "/^#ifndef $d$/,/^#else \/\* $d |^#endif \/\* $d / { next; }" >> $f
1693     else
1694       echo "/^#else \/\* $d /,/^#endif \/\* $d / { next; }" >> $f
1695     fi
1696   done
1697
1698   # Now process the file with the script
1699   if test -f $f; then
1700
1701     # Those distdef lines that remain in the file are removed to make
1702     # the appearance prettier
1703     echo "/^#ifdef SILC_DIST_|^#endif \/\* SILC_DIST_|^#else \/\* SILC_DIST_|^#else \/\* \!SILC_DIST_|^#ifndef SILC_DIST_/ { next; }" >> $f
1704     echo "{ print; }" >> $f
1705
1706     # Execute the script
1707     cp -p $1 $2 || exit 1
1708     awk -f $f $1 > $2 || exit 1
1709   fi
1710
1711   rm -f $f
1712
1713   # Log if file was not relicensed
1714   if test -f "$1.norelicense"; then
1715     ad_log "  $1"
1716     rm -f $1.norelicense
1717   fi
1718
1719   ad_debug "Ending processing source file: $1 $2"
1720 }
1721
1722 #
1723 # Processes a file.  This is the -p, --process option.
1724 #
1725 # Arguments: ad_process <type> <src> <dst>
1726 #
1727 ad_process()
1728 {
1729   ad_debug "Starting process: $1 $2 $3"
1730
1731   nolog=true
1732
1733   if test '!' -f autodist.dist; then
1734     ad_fatal "Autodist has not been run yet to prepare source tree"
1735   fi
1736
1737   # Parse distribution
1738   distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
1739   dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
1740   ad_parse_distribution $distribution false
1741   ad_process_distdefs
1742
1743   # Process file
1744   case "$1" in
1745     makefile)
1746       if test -z $3; then
1747         ad_fatal "File type $1 requires <dst> argument"
1748       fi
1749       ad_make_makefile_am $2 $3
1750       exit 0;;
1751
1752     configure)
1753       ad_make_configure_ac $2
1754       exit 0;;
1755
1756     non-source)
1757       if test -z $3; then
1758         ad_fatal "File type $1 requires <dst> argument"
1759       fi
1760       ad_process_file $2 $3 false
1761       exit 0;;
1762
1763     source)
1764       if test -z $3; then
1765         ad_fatal "File type $1 requires <dst> argument"
1766       fi
1767       ad_process_source_file $2 $3 false
1768       exit 0;;
1769
1770     *)
1771       ad_fatal "Unknown file type: $1";
1772       ;;
1773   esac
1774 }
1775
1776 #
1777 # Run hooks
1778 #
1779 # Arguments: ad_run_hooks <hooks> <params>
1780 #
1781 ad_run_hooks()
1782 {
1783   ad_debug "Running hooks: $1"
1784
1785   ad_log ""
1786   ad_log "Hooks executed:"
1787   ad_log "--------------"
1788
1789   for i in $1
1790   do
1791     if test '!' -f $i; then
1792       ad_fatal "Hook script $i does not exist"
1793     fi
1794     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$2\""
1795     sh $i "$distribution" "$dist_version" "$package" "$2" || exit 1
1796   done
1797   ad_log ""
1798
1799   ad_debug "Ending running hooks: $1"
1800 }
1801
1802 #
1803 # Run dist hooks
1804 #
1805 # Arguments: ad_run_dist_hooks <hooks> <params>
1806 #
1807 ad_run_dist_hooks()
1808 {
1809   ad_debug "Starting running distributions hooks: $1"
1810
1811   ad_log ""
1812   ad_log "Distribution hooks executed:"
1813   ad_log "----------------------------"
1814
1815   for i in $1
1816   do
1817     if test '!' -f $i; then
1818       ad_fatal "Dist hook script $i does not exist"
1819     fi
1820
1821     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\" \"$2\""
1822     sh $i "$distribution" "$dist_version" "$package" "$am_distdir" "$2" || exit 1
1823   done
1824   ad_log ""
1825
1826   ad_debug "Ending running distribution hooks"
1827 }
1828
1829 ###############################################################################
1830 # Autodist code
1831
1832 usage="Usage: autodist [options] [distribution] [version] [params]"
1833 help="\
1834 Autodist prepares source tree for configuration, compilation and
1835 distribution.  Generates Automake.am files from Automake.ad files, 
1836 configure.ac file from configure.ad file(s), generates the configure 
1837 script by running Autoconf tool, and generates Makefile.in files by 
1838 running Automake tool.
1839
1840 Operation modes:
1841   -h, --help                print this help, then exit
1842   -V, --version             print version number, then exit
1843   -v, --verbose             verbosely report processing
1844   -d, --distdir <dir>       search distributions from <dir>
1845   -s, --distdefs [<dist>]   print distribution defines of <dist>, then exit
1846   -i, --init                initialize Autodist environment, create default
1847                             distribution directory and distribution, then exit
1848   -p, --process <type> <src> [<dst>]
1849                             process file <src> into <dst> for distribution,
1850                             <type> is 'makefile', 'configure', 'non-source'
1851                             or 'source' and defines the type of <src>
1852   -m, --makedist            create and package distribution
1853       --gzip                create package compressed with gzip (default)
1854       --bzip2               create also package compressed with bzip2
1855       --compress            create also package compressed with compress
1856       --zip                 create also package compressed with zip"
1857
1858 #
1859 # Process command line arguments
1860 #
1861 while test $# -gt 0; do
1862   case "${1}" in
1863
1864   -d |--distdir)
1865     shift;
1866     test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
1867     distdir="${1}";
1868     shift;;
1869
1870   --list)
1871     exit 0;;
1872
1873   -s | --distdefs)
1874     shift;
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 - 2007 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 # Get extra parameters from command line
1998 shift
1999
2000 #
2001 # Run pre-hooks
2002 #
2003 ad_run_hooks "$pre_hooks" "$@"
2004
2005 #
2006 # Generate the Makefile.am files from Makefile.ad files
2007 #
2008 ad_make_makefile_ams
2009
2010 #
2011 # Generate the configure.ac from configure.ad file(s)
2012 #
2013 ad_make_configure_ac ./configure.ad
2014
2015 #
2016 # Process all files with .ad suffix for distribution processing
2017 #
2018 ad_process_ads
2019
2020 #
2021 # Generate configure script
2022 #
2023 ad_make_configure
2024
2025 #
2026 # Generate Makefile.in files
2027 #
2028 ad_make_makefile_ins
2029
2030 #
2031 # Create autodist.dist
2032 #
2033 ad_debug "Creating autodist.dist"
2034 echo "dist:$distfile" > autodist.dist
2035 echo "ver:$dist_version" >> autodist.dist
2036 echo "distdir:$package-$dist_version" >> autodist.dist
2037 echo "params:$@" >> autodist.dist
2038
2039 #
2040 # Run post-hooks
2041 #
2042 ad_run_hooks "$post_hooks" "$@"
2043
2044 ad_log "Source tree processed successfully."
2045 ad_debug "Done, now run ./configure and make."
2046
2047 exit 0