Added SILC Thread Queue API
[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     orig=$i
569
570     ad_debug "Processing $i to be $fname"
571     ad_log "  $i into $fname"
572
573     # Run the distribution processing for this file
574     ad_process_file $i $fname false
575
576     if test '!' -f "$fname"; then
577       cp -p $orig $fname || exit 1
578     fi
579   done
580   ad_log ""
581
582   ad_debug "Ending processing .ad files"
583 }
584
585 #
586 # Includes files specified in the distribution for inclusion.  Used when
587 # creating the distribution for packaging.
588 #
589 # include has the following format in distfile:
590 #
591 #   include <path> [<dest path>]
592 #
593 # If only source path, which may be file, directory or regular expression,
594 # is specified the path will be same in distribution.  If the destination
595 # path is specified that will be the new name and/or new location of the
596 # source path.  This, in effect, is a cp utility with ability to create
597 # directories if they do not exist.
598 #
599 # Arguments: ad_dist_includes <includeslist> <recursive> <log>
600 #
601 ad_dist_includes()
602 {
603   local incs
604
605   ad_debug "Starting running includes: $1 $2"
606
607   if test x$3 = xtrue; then
608     ad_log ""
609     ad_log "Following files and directories were included in distribution:"
610     ad_log "--------------------------------------------------------------"
611   fi
612
613   # By default do not expand pathnames
614   set -f
615
616   # Add : separator at the end
617   incs="`echo "$1" | sed 's/$/ : /'`"
618
619   src=
620   dst=
621   for i in $incs
622   do
623     if test "$i" = ":" && test -z "$src"; then
624       continue
625     fi
626     if test -z "$src"; then
627       src=$i
628       continue
629     fi
630     if test -z "$dst" && test "$i" != ":"; then
631       dst=$i
632     else
633       dst=$src
634     fi
635
636     ad_debug "Including $src into $dst"
637
638     if test -f "$src"; then
639       # Add file
640
641       if test "$src" = "$dst"; then
642         # Add to same location
643         d=`echo $src | sed 's,/[^/]*$,,'`
644         if test "$d" != "$src" && test "$d" != "." && \
645            test '!' -d $am_distdir/$d; then
646           mkdir -p -- $am_distdir/$d || exit 1
647         fi
648       else
649         # Add to different location
650         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
651         if test "$check" != "$dst"; then
652           ad_fatal "Invalid destination in 'include $src $dst'"
653         fi
654
655         d=`echo $dst | sed 's,/[^/]*$,,'`
656         if test "$d" != "$dst" && test "$d" != "." && \
657            test '!' -d $am_distdir/$d; then
658           mkdir -p -- $am_distdir/$d || exit 1
659         fi
660       fi
661
662       if test x$3 = xtrue; then
663         ad_log "  $src into $am_distdir/$d"
664       fi
665       cp -p $src $am_distdir/$d || exit 1
666
667     elif test -d "$src"; then
668       # Add directory
669
670       if test "$src" = "$dst"; then
671         # Add to same location
672         d=`echo $src | sed 's,/[^/]*$,,'`
673         ds=`echo $src | sed 's/\/$//'`
674         if test "$ds" = "$d"; then
675           d=`echo $d | sed 's,/[^/]*$,,'`
676         fi
677         if test "$ds" = "$d"; then
678           d=""
679         fi
680         if test '!' -d $am_distdir/$d && test "$ds" != "$d"; then
681           mkdir -p -- $am_distdir/$d || exit 1
682         fi
683
684         if test x$3 = xtrue; then
685           ad_log "  $src into $am_distdir/$d"
686         fi
687         cp -pR $src $am_distdir/$d || exit 1
688       else
689         # Add to different location
690         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
691         if test "$check" != "$dst"; then
692           ad_fatal "Invalid destination in 'include $src $dst'"
693         fi
694
695         d=`echo $dst | sed 's,/[^/]*$,,'`
696         ds=`echo $dst | sed 's/\/$//'`
697         if test "$ds" = "$d"; then
698           d=`echo $d | sed 's,/[^/]*$,,'`
699         fi
700         if test '!' -d $am_distdir/$d && test "$dst" != "$d"; then
701           mkdir -p -- $am_distdir/$d || exit 1
702         fi
703
704         if test x$3 = xtrue; then
705           ad_log "  $src into $am_distdir/$dst"
706         fi
707         cp -pR $src $am_distdir/$dst || exit 1
708       fi
709
710     elif test x$2 != xtrue; then
711       # We assume regular expression in filename
712       check=`echo "$src" | sed 's/?//; s/*//; s/\[//; s/\]//'`
713       if test "$check" == "$src"; then
714         if test '!' -a $src; then
715           ad_fatal "Including $src: No such file or directory"
716         fi
717         src=
718         dst=
719         continue
720       fi
721
722       # Recursively call this function with expanded pathnames.  The
723       # reason why we don't let sh by default expand pathnames is that
724       # the include's destination is optional.  If sh expands by default
725       # we don't know the destination.  For this reason, we handle the
726       # expansion here ourselves.
727
728       # If src and dst are same, then expand the pathname as we'll copy
729       # matches to their own locations.
730       if test "$src" = "$dst"; then
731         # Expand pathnames, and format to our include format
732         set +f
733         srcs=`echo $src | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
734         set -f
735       else
736         # Destination is new, and it has to be a directory.
737         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
738         if test "$check" != "$dst"; then
739           ad_fatal "Invalid destination in 'include $src $dst'"
740         fi
741
742         # Make sure dst has / at the end, as this must be a directory
743         dst=`echo $dst | sed 's/\/$//; s/$/\//'`
744
745         # Escape dst for sed
746         dste=`echo $dst | sed 's/\\//\\\\\//g'` || exit 1
747
748         # Expand pathnames, and format to our include format
749         set +f
750         srcs=`echo $src | sed -e "s/ / $dste : /g" \
751           -e 's/^/ : /' -e "s/$/ $dste/"` || exit 1
752         set -f
753       fi
754
755       # Include recursively
756       ad_dist_includes "$srcs" true
757
758     elif test '!' -a $src; then
759       ad_fatal "Including $src: No such file or directory"
760     fi
761
762     src=
763     dst=
764   done
765
766   if test x$3 = xtrue; then
767     ad_log ""
768   fi
769
770   set +f
771
772   ad_debug "Ending running includes: $1 $2"
773 }
774
775 #
776 # Excludes files specified in the distribution for exclusion.  Used when
777 # creating the distribution for packaging.
778 #
779 # exclude has the following format in distfile:
780 #
781 #  exclude <path>
782 #
783 # The path may be file, directory or regular expression.
784 #
785 # Arguments: ad_dist_includes <excludelist> <log>
786 #
787 ad_dist_excludes()
788 {
789   ad_debug "Starting running excludes: $1"
790
791   if test x$2 = xtrue; then
792     ad_log ""
793     ad_log "Following files and directories were excluded from distribution:"
794     ad_log "----------------------------------------------------------------"
795   fi
796
797   cur=`pwd`
798   cd $am_distdir || exit 1
799   for i in $1
800   do
801     ad_debug "Excluding $i"
802     if test x$2 = xtrue; then
803       ad_log "  $i"
804     fi
805     rm -rf $i
806   done
807   cd $cur || exit 1
808
809   if test x$2 = xtrue; then
810     ad_log ""
811   fi
812
813   ad_debug "Ending running excludes: $1"
814 }
815
816 #
817 # Processes the entire tree for distribution.  This inspects files other
818 # than source and header files, with exception of any file with .ad
819 # suffix, and performs distribution processing for the file.  The original
820 # file is replaced with the processed file.  This function is used when
821 # creating the distribution for packaging.
822 #
823 # Arguments: ad_process_tree <directory>
824 #
825 ad_process_tree()
826 {
827   ad_debug "Starting processing non-source files: $1"
828
829   # Take files, except source and .ad files.
830   files=`find $am_distdir -type f \! -name \*\.ad \( \
831         \! -name \*\.[cC] -a \
832         \! -name \*\.[cC][cCpP] -a \
833         \! -name \*\.[cC][xX][xX] -a \
834         \! -name \*\.[cC][pP][pP] -a \
835         \! -name \*\.[cC]++ -a \
836         \! -name \*\.m -a \
837         \! -name \*\.mm -o \
838         \! -name \*\.M -o \
839         \! -name \*\.S -o \
840         \! -name \*\.[hH] -a \
841         \! -name \*\.hh -a \
842         \! -name \*\.[cC]\.in -a \
843         \! -name \*\.[cC][cCpP]\.in -a \
844         \! -name \*\.[cC][xX][xX]\.in -a \
845         \! -name \*\.[cC][pP][pP]\.in -a \
846         \! -name \*\.[cC]++\.in -a \
847         \! -name \*\.m\.in -a \
848         \! -name \*\.[hH]\.in -a \
849         \! -name \*\.hh\.in \)`
850   files=`echo $files | sed 's/$am_distdir//'`
851
852   for ff in $files
853   do
854     ad_process_file $ff $ff.tmp true
855     if test -f $ff.tmp; then
856       rm -f $ff || exit 1
857       mv -f $ff.tmp $ff || exit 1
858     fi
859   done
860
861   ad_debug "Ending processing non-source files: $1"
862 }
863
864 #
865 # Processes the entire source tree for distribution.  This inspects files
866 # in the source tree, with exception of any file with .ad suffix, and
867 # performs distribution processing for the file.  The original file is
868 # replaced with the processed file.  This function is used when creating
869 # the distribution for packaging.
870 #
871 # Call this before ad_process_tree().
872 #
873 # Arguments: ad_process_source_tree <directory>
874 #
875 ad_process_source_tree()
876 {
877   ad_debug "Starting processing source files: $1"
878
879   # We take only C/C++ (and other files that are run through traditional
880   # preprocessor) files since they use the C compiler friendly version
881   # of distdefs.  Other files are not assumed to use them.
882   files=`find $am_distdir -type f \! -name \*\.ad \( \
883         -name \*\.[cC] -o \
884         -name \*\.[cC][cCpP] -o \
885         -name \*\.[cC][xX][xX] -o \
886         -name \*\.[cC][pP][pP] -o \
887         -name \*\.[cC]++ -o \
888         -name \*\.m -o \
889         -name \*\.mm -o \
890         -name \*\.M -o \
891         -name \*\.S -o \
892         -name \*\.[hH] -o \
893         -name \*\.hh -o \
894         -name \*\.[cC]\.in -o \
895         -name \*\.[cC][cCpP]\.in -o \
896         -name \*\.[cC][xX][xX]\.in -o \
897         -name \*\.[cC][pP][pP]\.in -o \
898         -name \*\.[cC]++\.in -o \
899         -name \*\.m\.in -o \
900         -name \*\.[hH]\.in -o \
901         -name \*\.hh\.in \)`
902
903   for ff in $files
904   do
905     ad_process_source_file $ff $ff.tmp true
906     if test -f $ff.tmp; then
907       rm -f $ff || exit 1
908       mv -f $ff.tmp $ff || exit 1
909     fi
910   done
911
912   ad_debug "Ending processing source files: $1"
913 }
914
915 #
916 # Removes Autodist dependencies, as they cannot be delivered to distribution.
917 #
918 # Arguments: ad_remove_dependencies <distdir>
919 #
920 ad_remove_dependencies()
921 {
922   ad_debug "Removing dependencies"
923
924   ams=`find $1 -type f -name Makefile\.\*`
925   for i in $ams
926   do
927     sed -e "/^# S_AD_ENABLE_DEPENDENCIES/,/^# E_AD_ENABLE_DEPENDENCIES/d" $i > $i.tmp
928     mv $i.tmp $i
929   done
930 }
931
932 #
933 # Makes distribution sane, ala modtimes.  Since we modify the distribution
934 # we need to make it sane after that.
935 #
936 # Arguments: ad_makedist_makesane
937 #
938 ad_makedist_makesane()
939 {
940   ad_debug "Making distribution file modtimes sane"
941
942   # DO NOT change these order unless you know what you are doing.
943   if test -f $am_distdir/configure.ac; then
944     touch $am_distdir/configure.ac
945   fi
946
947   if test -f $am_distdir/aclocal.m4; then
948     touch $am_distdir/aclocal.m4
949   fi
950
951   if test '!' -f Makefile; then
952     ad_fatal "Makefile: No such file or directory"
953   fi
954
955   configh=`grep "^CONFIG_HEADER" Makefile | cut -d= -f2 | sed 's/^[     ]*//'`
956   touch $am_distdir/$configh.in 1>/dev/null 2>/dev/null
957
958   files=`find $am_distdir -type f -name Makefile\.in`
959   for i in $files
960   do
961     touch $i
962   done
963
964   if test -f $am_distdir/configure; then
965     touch $am_distdir/configure
966   fi
967
968   if test -f $am_distdir/config.status; then
969     touch $am_distdir/config.status
970   fi
971
972   ad_debug "Distribution made sane"
973 }
974
975 #
976 # Creates distribution of the source tree.  All files in the distribution
977 # will be processed and the distribution will be packaged.
978 #
979 # Arguments: ad_makedist
980 #
981 ad_makedist()
982 {
983   ad_log_open "makedist.log"
984   ad_debug "Starting distribution creation"
985
986   ad_log "Created distribution"
987   ad_log "--------------------"
988   ad_log ""
989
990   if test '!' -f autodist.dist; then
991     ad_fatal "Autodist has not been run yet to prepare source tree"
992   fi
993
994   if test -z $MAKE; then
995     ad_fatal "The MAKE variable is not set in autodist.conf"
996   fi
997
998   # Get distdir from Makefile
999   if test '!' -f Makefile; then
1000     ad_fatal "The source tree is not configured, run ./configure first"
1001   fi
1002
1003   # Parse the requested distribution
1004   distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
1005   dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
1006   am_distdir=`grep "distdir:" < autodist.dist | cut -d: -f2` || exit 1
1007   params=`grep "params:" < autodist.dist | cut -d: -f2` || exit 1
1008   ad_parse_distribution $distribution false
1009   ad_log "  Distribution: $distribution $dist_version"
1010   ad_log "  Destination directory: $am_distdir"
1011   ad_log ""
1012   ad_process_distdefs
1013
1014   if test x$opt_no_dist = xtrue; then
1015     ad_fatal "The '$distribution' distribution cannot be packaged"
1016   fi
1017
1018   # Run pre-dist-hooks
1019   ad_run_dist_hooks "$pre_dist_hooks" "$params"
1020
1021   # Create distribution directory
1022   ad_debug "Creating distribution directory $am_distdir"
1023   $MAKE distdir || exit 1
1024   chmod -R a+r $am_distdir
1025
1026   if test '!' -d $am_distdir; then
1027     ad_fatal "Distribution directory $am_distdir not created"
1028   fi
1029
1030   # Run pre-process-dist-hooks
1031   ad_run_dist_hooks "$pre_p_dist_hooks" "$params"
1032
1033   # Run excludes
1034   ad_dist_excludes "$excludes" true
1035
1036   # Run includes
1037   ad_dist_includes "$includes" false true
1038
1039   # Include specific license file if specified
1040   if test "$license" != ""; then
1041     ad_log ""
1042     ad_log "License file in distribution:"
1043     ad_log "-----------------------------"
1044     ad_log "  $license into $am_distdir/COPYING"
1045     ad_log ""
1046     cp -p $license $am_distdir/COPYING || exit 1
1047   fi
1048
1049   # Remove dependencies
1050   ad_remove_dependencies $am_distdir
1051
1052   # Process noprocesses, first pass
1053   ad_process_noprocess true
1054
1055   ad_log ""
1056   ad_log "Following files were not re-licensed:"
1057   ad_log "-------------------------------------"
1058
1059   # Process source files
1060   ad_debug "Process distribution source tree"
1061   ad_process_source_tree $am_distdir
1062
1063   # Process non-source files
1064   ad_debug "Process distribution tree"
1065   ad_process_tree $am_distdir
1066
1067   ad_log ""
1068
1069   # Process noprocesses, second pass
1070   ad_process_noprocess false
1071
1072   # Run post-process_dist-hooks
1073   ad_run_dist_hooks "$post_p_dist_hooks" "$params"
1074
1075   # Make distribution sane
1076   ad_makedist_makesane
1077
1078   # Package
1079   ad_debug "Packaging distribution"
1080   tar chof $am_distdir.tar $am_distdir || exit 1
1081
1082   # Compress
1083   ad_debug "Compressing distribution package"
1084   if test x$ad_gzip = xtrue; then
1085     ad_debug "Compressing distribution package $am_distdir.tar.gz"
1086     gzip -9 -c $am_distdir.tar > $am_distdir.tar.gz || exit 1
1087   fi
1088   if test x$ad_bzip2 = xtrue; then
1089     ad_debug "Compressing distribution package $am_distdir.tar.bz2"
1090     bzip2 -9 -c $am_distdir.tar > $am_distdir.tar.bz2 || exit 1
1091   fi
1092   if test x$ad_compress = xtrue; then
1093     ad_debug "Compressing distribution package $am_distdir.tar.Z"
1094     compress -c $am_distdir.tar > $am_distdir.tar.Z || exit 1
1095   fi
1096   if test x$ad_zip = xtrue; then
1097     rm -f $am_distdir.zip
1098     ad_debug "Compressing distribution package $am_distdir.zip"
1099     zip -rq $am_distdir.zip $am_distdir || exit 1
1100   fi
1101   rm -f $am_distdir.tar
1102
1103   # Run post-dist-hooks
1104   ad_run_dist_hooks "$post_dist_hooks" "$params"
1105
1106   # Cleanup
1107   rm -rf $am_distdir
1108
1109   ad_log "Distribution created successfully."
1110
1111   ad_debug "Ending distribution creation"
1112 }
1113
1114 #
1115 # Handles distribution options.
1116 #
1117 # option has the following format in distfile:
1118 #
1119 #   option <option>
1120 #
1121 # Following options are supported:
1122 #
1123 #   template
1124 #   no-dist
1125 #   no-inherit
1126 #
1127 # Arguments: ad_handle_options <options>
1128 #
1129 ad_handle_options()
1130 {
1131   ad_debug "Handling options: $1"
1132
1133   for i in $1
1134   do
1135     if test "$i" = "template"; then
1136       opt_template=true
1137       continue
1138     elif test "$i" = "no-dist"; then
1139       opt_no_dist=true
1140       continue
1141     elif test "$i" = "no-inherit"; then
1142       opt_no_inherit=true
1143       continue
1144     fi
1145   done
1146 }
1147
1148 #
1149 # Clears set options
1150 #
1151 # Arguments: ad_clear_options
1152 #
1153 ad_clear_options()
1154 {
1155   opt_template=false
1156   opt_no_dist=false
1157   opt_no_inherit=false
1158 }
1159
1160 #
1161 # Parses the distribution.  Gets all distribution defines from the
1162 # distribution.  This also expands all inherited distributions recursively
1163 # to get all inherited distribution defines.  From inherited distributions
1164 # their name and package name is not inherited.
1165 #
1166 # Arguments: ad_parse_distribution <distribution name> <inherit>
1167 #
1168 ad_parse_distribution()
1169 {
1170   local inhs
1171   local defs
1172   local undefs
1173   local incs
1174   local excs
1175   local nops
1176   local opts
1177   local dname
1178   local dpname
1179   local bugr
1180   local prh
1181   local poh
1182   local prdh
1183   local podh
1184   local prpdh
1185   local popdh
1186
1187   ad_debug "Starting parsing distribution: $1 $2"
1188
1189   if test '!' -f $distdir/$1; then
1190     ad_fatal "Distribution '$1' is not declared"
1191   fi
1192
1193   # Get and enforce prereq version
1194   prereq=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1195     | grep "prereq " | cut -d' ' -f2- | sort | uniq`
1196   if test '!' -z $prereq; then
1197     if test "$ver" \< "$prereq"; then
1198       ad_fatal "Autodist $prereq or newer is required for distribution $1"
1199     fi
1200   fi
1201
1202   # Get inherited
1203   inhs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1204     | grep "inherit " | cut -d' ' -f2 | sort | uniq`
1205
1206   # Get distdefs
1207   defs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1208    | grep "define " | cut -d' ' -f2 | sort | uniq`
1209
1210   if test "$inhs" = "" && test "$defs" = ""; then
1211     ad_fatal "Distribution '$1' does not define anything"
1212   fi
1213
1214   # Get undefined distdefs
1215   undefs=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1216    | grep "undef " | cut -d' ' -f2 | sort | uniq`
1217
1218   # Get includes
1219   incs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1220     | grep "include " | sed 's/include / : /'`
1221
1222   # Get excludes
1223   excs=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1224     | grep "exclude " | cut -d' ' -f2- | sort | uniq`
1225
1226   # Get noprocesses
1227   nops=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1228     | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
1229
1230   # Get options
1231   opts=`sed 's/^[       ]*//' < $distdir/$1 | grep -v "^#" \
1232     | grep "option " | cut -d' ' -f2- | sort | uniq`
1233
1234   # Check options
1235   ad_handle_options "$opts"
1236   if test x$2 = xtrue && test x$opt_no_inherit = xtrue; then
1237     ad_fatal "Distribution '$1' cannot be inherited"
1238   fi
1239   if test x$2 = xfalse && test x$opt_template = xtrue; then
1240     ad_fatal "Template distribution '$1' cannot be prepared or packaged"
1241   fi
1242
1243   ad_debug "inherits: $inhs"
1244   ad_debug "distdefs: $defs"
1245   ad_debug "includes: $incs"
1246   ad_debug "excludes: $excs"
1247   ad_debug "noprocess: $nops"
1248   ad_debug "undistdefs: $undefs"
1249   ad_debug "options: $opts"
1250
1251   # Expand distdefs from inherited distributions
1252   for i in $inhs
1253   do
1254     if test x$1 = x$i; then
1255       ad_fatal "Infinite recursion detected.  Fix the '$distdir/$1' \
1256             distribution to not have 'inherit $i' declared."
1257     fi
1258
1259     if test '!' -f $distdir/$i; then
1260       ad_fatal "Distribution '$i' is not declared (inherited from '$1')"
1261     fi
1262
1263     ad_parse_distribution $i true
1264     ad_clear_options
1265   done
1266
1267   # Get license
1268   license=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1269     | grep "license " | cut -d' ' -f2`
1270   licenseh=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1271     | grep "license-header " | sed 's/license-header / : /'`
1272
1273   ad_debug "license: $license"
1274   ad_debug "licenseh: $licenseh"
1275
1276   if test x$2 = xfalse; then
1277     # Take rest of the stuff from top distribution
1278
1279     # We take precedence on defined and undefined distdefs.  Remove
1280     # undefined distdefs if we have defined them.
1281     for d in $defs
1282     do
1283       ad_debug "defining undefined $d distdef"
1284       undistdefs=`echo $undistdefs | sed s/$d//g`
1285     done
1286
1287     # Get distribution name
1288     dname=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1289       | grep "name " | cut -d' ' -f2-`
1290
1291     if test "$dname"; then
1292       distribution=$dname
1293     fi
1294
1295     # Get distribution package name (optional)
1296     dpname=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
1297      | grep "package " | cut -d' ' -f2`
1298
1299     if test "$dpname"; then
1300       package=$dpname
1301     else
1302       package=$distribution
1303     fi
1304
1305     # Get Bug-report email address (optional)
1306     bugr=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1307      | grep "bug-report " | cut -d' ' -f2-`
1308
1309     if test "$bugr"; then
1310       bug_report=$bugr
1311     fi
1312
1313     ad_debug "distribution: $distribution"
1314     ad_debug "package: $package"
1315     ad_debug "bug-report: $bug_report"
1316
1317     # Get hooks (optional)
1318     prh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1319      | grep "pre-hook " | cut -d' ' -f2-`
1320     poh=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
1321      | grep "post-hook " | cut -d' ' -f2-`
1322     prdh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1323      | grep "pre-dist-hook " | cut -d' ' -f2-`
1324     podh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
1325      | grep "post-dist-hook " | cut -d' ' -f2-`
1326     prpdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1327      | grep "pre-process-dist-hook " | cut -d' ' -f2-`
1328     popdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
1329      | grep "post-process-dist-hook " | cut -d' ' -f2-`
1330
1331     pre_hooks="$pre_hooks $prh"
1332     post_hooks="$post_hooks $poh"
1333     pre_dist_hooks="$pre_dist_hooks $prdh"
1334     post_dist_hooks="$post_dist_hooks $podh"
1335     pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
1336     post_p_dist_hooks="$post_p_dist_hooks $popdh"
1337     doptions="$doptions $opts"
1338
1339     ad_handle_options "$doptions"
1340     ad_debug "options: $doptions"
1341   fi
1342
1343   # Return to caller
1344   inherits="$inherits $inhs"
1345   distdefs="$distdefs $defs"
1346   includes="$includes $incs"
1347   excludes="$excludes $excs"
1348   noprocess="$noprocess $nops"
1349   undistdefs="$undistdefs $undefs"
1350
1351   ad_debug "Ending parsing distribution: $1 $2"
1352 }
1353
1354 #
1355 # Processes parsed distdefs.  Removes duplicates, and undefined distdefs
1356 # from the distdefs.
1357 #
1358 # Arguments: ad_process_distdefs
1359 #
1360 ad_process_distdefs()
1361 {
1362   ad_debug "Starting processing distdefs"
1363
1364   ad_log ""
1365   ad_log "Following distdefs were processed:"
1366   ad_log "----------------------------------"
1367
1368   # Remove all undefined distribution defines
1369   for i in $undistdefs
1370   do
1371     ad_debug "undefining $i distdef"
1372     distdefs=`echo $distdefs | sed s/$i//g`
1373   done
1374
1375   rm -f autodist.tmp.defs
1376
1377   # Remove duplicate distdefs
1378   for i in $distdefs
1379   do
1380     echo $i >>autodist.tmp.defs
1381   done
1382   distdefs=`sort < autodist.tmp.defs | uniq`
1383   distdefs=`echo $distdefs`
1384   rm -f autodist.tmp.defs
1385
1386   # Log
1387   for i in $distdefs
1388   do
1389     ad_log "  $i"
1390   done
1391   ad_log ""
1392
1393   ad_debug "distdefs=$distdefs"
1394
1395   ad_debug "Ending processing distdefs"
1396 }
1397
1398 #
1399 # Processes for a license header change.
1400 #
1401 # Arguments: ad_process_license_header <scriptfile> <sourcefile>
1402 #
1403 ad_process_license_header()
1404 {
1405   ad_debug "Starting license header processing"
1406
1407   # Add : separator at the end
1408   lics=`echo "$licenseh" | sed 's/$/ : /'`
1409
1410   src=
1411   dst=
1412   for i in $lics
1413   do
1414     if test "$i" = ":" && test -z "$src"; then
1415       continue
1416     fi
1417     if test -z "$src"; then
1418       src=$i
1419       continue
1420     fi
1421     if test -z "$dst" && test "$i" != ":"; then
1422       dst=$i
1423     else
1424       ad_fatal "Missing argument in 'license-header $src'"
1425     fi
1426
1427     ad_debug "Replacing $src license with $dst license"
1428
1429     if test '!' -f $src; then
1430       ad_fatal "License header $src: No such file or directory"
1431     fi
1432
1433     if test '!' -f $dst; then
1434       ad_fatal "License header $dst: No such file or directory"
1435     fi
1436
1437     # Awk script to replace the license header
1438     fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
1439     ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
1440     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
1441     rm -f autodist.lsrc autodist.ldst
1442
1443     src=
1444     dst=
1445   done
1446
1447   ad_debug "Ending license header processing"
1448 }
1449
1450 #
1451 # Process specified noprocesses.  This is called during makedist.
1452 # The noprocess first copies the noprocess files and dirs into a temp
1453 # directory, and then removes them from the distdir.  This way they are
1454 # not processed by Autodist.  After processing they are returned to their
1455 # correct locations from the temp dir.  Dirty, yeah, but the way we do
1456 # this until better one comes along.
1457 #
1458 # Arguments: ad_process_noprocess <process>
1459 #
1460 # If <process> is true this excludes and if false this includes.
1461 #
1462 ad_process_noprocess()
1463 {
1464   ad_debug "Starting running noprocesses"
1465
1466   set -f
1467
1468   cur=`pwd`
1469
1470   if test x$1 = xtrue; then
1471     ad_log ""
1472     ad_log "Following files and directories were not processed:"
1473     ad_log "---------------------------------------------------"
1474
1475     f="$cur/autodist__noprocess"
1476     rm -rf $f
1477     mkdir -p -- $f || exit 1
1478
1479     # First, include them to new location with correct directory structure.
1480     old_am_distdir="$am_distdir"
1481     cd $am_distdir || exit 1
1482     am_distdir="$f"
1483     nops=" $noprocess"
1484     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1485     ad_dist_includes "$nops" false false
1486     am_distdir="$old_am_distdir"
1487
1488     # Then, remove from distdir (they are in temp dir now)
1489     for i in $noprocess
1490     do
1491       ad_log "  $i"
1492       rm -rf $i
1493     done
1494     cd $cur || exit 1
1495
1496     ad_log ""
1497   else
1498     # Copy from the temp dir back to distdir
1499     cd autodist__noprocess || exit 1
1500     old_am_distdir="$am_distdir"
1501     am_distdir="$cur/$old_am_distdir"
1502     nops=" $noprocess"
1503     nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
1504
1505     ad_dist_includes "$nops" false false
1506
1507     am_distdir="$old_am_distdir"
1508     cd $cur || exit 1
1509     rm -rf autodist__noprocess
1510   fi
1511
1512   set +f
1513
1514   ad_debug "Ending running noprocesses"
1515 }
1516
1517 #
1518 # Process a file given as argument for the distribution.
1519 #
1520 # Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
1521 #
1522 ad_process_file()
1523 {
1524   local found=false
1525   local f
1526   local defs
1527   local ndefs
1528
1529   # Process only regular files
1530   if test '!' -f $1; then
1531     return
1532   fi
1533
1534   ad_debug "Starting processing file: $1 $2"
1535
1536   f="autodist.tmp.script"
1537   rm -f $f
1538
1539   # If license header is provided, replace the license header in the file.
1540   if test x$3 = xtrue; then
1541     ad_process_license_header $f $1
1542   fi
1543
1544   # Get defined distribution defines
1545   defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
1546     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1547
1548   # Get explicitly not-defined distribution defines
1549   ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
1550     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1551
1552   ad_debug "defs in $1: $defs"
1553   ad_debug "ndefs in $1: $ndefs"
1554
1555   # Create the script to include and exclude stuff in the file according
1556   # to the distribution defines
1557
1558   # ifdefs
1559   ad_debug "processing ifdefs"
1560   for d in $defs
1561   do
1562     found=false
1563     for i in $distdefs
1564     do
1565       if test x$d = x$i; then
1566         found=true
1567         break
1568       fi
1569     done
1570
1571     # If distribution define was not found exclude those lines from the file.
1572     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1573     if test x$found = xfalse; then
1574       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1575       echo "/^#ifdef $d$/,/^#else !$d$|^#endif $d$/ { next; }" >> $f
1576     else
1577       echo "/^#else !$d$/,/^#endif $d$/ { next; }" >> $f
1578     fi
1579   done
1580
1581   # ifndefs
1582   ad_debug "processing ifndefs"
1583   for d in $ndefs
1584   do
1585     found=false
1586     for i in $distdefs
1587     do
1588       if test x$d = x$i; then
1589         found=true
1590         break
1591       fi
1592     done
1593
1594     # If distribution define was found exclude those lines from the file.
1595     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1596     if test x$found = xtrue; then
1597       ad_debug "ifndef $d will be excluded (it IS defined)"
1598       echo "/^#ifndef $d$/,/^#else $d$|^#endif $d$/ { next; }" >> $f
1599     else
1600       echo "/^#else $d$/,/^#endif $d$/ { next; }" >> $f
1601     fi
1602   done
1603
1604   # Now process the file with the script
1605   if test -f $f; then
1606
1607     # Those distdef lines that remain in the file are removed to make
1608     # the appearance prettier
1609     echo "/^#ifdef "$DP"_DIST_|^#endif "$DP"_DIST_|^#else "$DP"_DIST_|^#else !"$DP"_DIST_|^#ifndef "$DP"_DIST_/ { next; }" >> $f
1610     echo "{ print; }" >> $f
1611
1612     # Execute the script
1613     cp -p $1 $2 || exit 1
1614     awk -f $f $1 > $2 || exit 1
1615   fi
1616
1617   rm -f $f
1618
1619   # Log if file was not relicensed
1620   if test -f "$1.norelicense"; then
1621     ad_log "  $1"
1622     rm -f $1.norelicense
1623   fi
1624
1625   ad_debug "Ending processing file: $1 $2"
1626 }
1627
1628 #
1629 # Process a source file given as argument for the distribution.
1630 #
1631 # Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
1632 #
1633 ad_process_source_file()
1634 {
1635   local found=false
1636   local f
1637   local defs
1638   local ndefs
1639
1640   # Process only regular files
1641   if test '!' -f $1; then
1642     return
1643   fi
1644
1645   ad_debug "Starting processing source file: $1 $2"
1646
1647   f="autodist.tmp.script"
1648   rm -f $f
1649
1650   # If license header is provided, replace the license header in the file.
1651   if test x$3 = xtrue; then
1652     ad_process_license_header $f $1
1653   fi
1654
1655   # Get defined distribution defines
1656   defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
1657     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1658
1659   # Get explicitly not-defined distribution defines
1660   ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
1661     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1662
1663   ad_debug "defs in $1: $defs"
1664   ad_debug "ndefs in $1: $ndefs"
1665
1666   # Create the script to include and exclude stuff in the file according
1667   # to the distribution defines
1668
1669   # ifdefs
1670   ad_debug "processing ifdefs"
1671   for d in $defs
1672   do
1673     found=false
1674     for i in $distdefs
1675     do
1676       if test x$d = x$i; then
1677         found=true
1678         break
1679       fi
1680     done
1681
1682     # If distribution define was not found exclude those lines from the file.
1683     # This also handles the #ifdef's #else (ie. #ifndef) branch.
1684     if test x$found = xfalse; then
1685       ad_debug "ifdef $d will be excluded (it is NOT defined)"
1686       echo "/^#ifdef $d$/,/^#else \/\* \!$d |^#endif \/\* $d / { next; }" >> $f
1687     else
1688       echo "/^#else \/\* \!$d /,/^#endif \/\* $d / { next; }" >> $f
1689     fi
1690   done
1691
1692   # ifndefs
1693   ad_debug "processing ifndefs"
1694   for d in $ndefs
1695   do
1696     found=false
1697     for i in $distdefs
1698     do
1699       if test x$d = x$i; then
1700         found=true
1701         break
1702       fi
1703     done
1704
1705     # If distribution define was found exclude those lines from the file.
1706     # This also handles the #ifndef's #else (ie. #ifdef) branch.
1707     if test x$found = xtrue; then
1708       ad_debug "ifndef $d will be excluded (it IS defined)"
1709       echo "/^#ifndef $d$/,/^#else \/\* $d |^#endif \/\* $d / { next; }" >> $f
1710     else
1711       echo "/^#else \/\* $d /,/^#endif \/\* $d / { next; }" >> $f
1712     fi
1713   done
1714
1715   # Now process the file with the script
1716   if test -f $f; then
1717
1718     # Those distdef lines that remain in the file are removed to make
1719     # the appearance prettier
1720     echo "/^#ifdef SILC_DIST_|^#endif \/\* SILC_DIST_|^#else \/\* SILC_DIST_|^#else \/\* \!SILC_DIST_|^#ifndef SILC_DIST_/ { next; }" >> $f
1721     echo "{ print; }" >> $f
1722
1723     # Execute the script
1724     cp -p $1 $2 || exit 1
1725     awk -f $f $1 > $2 || exit 1
1726   fi
1727
1728   rm -f $f
1729
1730   # Log if file was not relicensed
1731   if test -f "$1.norelicense"; then
1732     ad_log "  $1"
1733     rm -f $1.norelicense
1734   fi
1735
1736   ad_debug "Ending processing source file: $1 $2"
1737 }
1738
1739 #
1740 # Processes a file.  This is the -p, --process option.
1741 #
1742 # Arguments: ad_process <type> <src> <dst>
1743 #
1744 ad_process()
1745 {
1746   ad_debug "Starting process: $1 $2 $3"
1747
1748   nolog=true
1749
1750   if test '!' -f autodist.dist; then
1751     ad_fatal "Autodist has not been run yet to prepare source tree"
1752   fi
1753
1754   # Parse distribution
1755   distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
1756   dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
1757   ad_parse_distribution $distribution false
1758   ad_process_distdefs
1759
1760   # Process file
1761   case "$1" in
1762     makefile)
1763       if test -z $3; then
1764         ad_fatal "File type $1 requires <dst> argument"
1765       fi
1766       ad_make_makefile_am $2 $3
1767       exit 0;;
1768
1769     configure)
1770       ad_make_configure_ac $2
1771       exit 0;;
1772
1773     non-source)
1774       if test -z $3; then
1775         ad_fatal "File type $1 requires <dst> argument"
1776       fi
1777       ad_process_file $2 $3 false
1778       exit 0;;
1779
1780     source)
1781       if test -z $3; then
1782         ad_fatal "File type $1 requires <dst> argument"
1783       fi
1784       ad_process_source_file $2 $3 false
1785       exit 0;;
1786
1787     *)
1788       ad_fatal "Unknown file type: $1";
1789       ;;
1790   esac
1791 }
1792
1793 #
1794 # Run hooks
1795 #
1796 # Arguments: ad_run_hooks <hooks> <params>
1797 #
1798 ad_run_hooks()
1799 {
1800   ad_debug "Running hooks: $1"
1801
1802   ad_log ""
1803   ad_log "Hooks executed:"
1804   ad_log "--------------"
1805
1806   for i in $1
1807   do
1808     if test '!' -f $i; then
1809       ad_fatal "Hook script $i does not exist"
1810     fi
1811     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$2\""
1812     sh $i "$distribution" "$dist_version" "$package" "$2" || exit 1
1813   done
1814   ad_log ""
1815
1816   ad_debug "Ending running hooks: $1"
1817 }
1818
1819 #
1820 # Run dist hooks
1821 #
1822 # Arguments: ad_run_dist_hooks <hooks> <params>
1823 #
1824 ad_run_dist_hooks()
1825 {
1826   ad_debug "Starting running distributions hooks: $1"
1827
1828   ad_log ""
1829   ad_log "Distribution hooks executed:"
1830   ad_log "----------------------------"
1831
1832   for i in $1
1833   do
1834     if test '!' -f $i; then
1835       ad_fatal "Dist hook script $i does not exist"
1836     fi
1837
1838     ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\" \"$2\""
1839     sh $i "$distribution" "$dist_version" "$package" "$am_distdir" "$2" || exit 1
1840   done
1841   ad_log ""
1842
1843   ad_debug "Ending running distribution hooks"
1844 }
1845
1846 ###############################################################################
1847 # Autodist code
1848
1849 usage="Usage: autodist [options] [distribution] [version] [params]"
1850 help="\
1851 Autodist prepares source tree for configuration, compilation and
1852 distribution.  Generates Automake.am files from Automake.ad files,
1853 configure.ac file from configure.ad file(s), generates the configure
1854 script by running Autoconf tool, and generates Makefile.in files by
1855 running Automake tool.
1856
1857 Operation modes:
1858   -h, --help                print this help, then exit
1859   -V, --version             print version number, then exit
1860   -v, --verbose             verbosely report processing
1861   -d, --distdir <dir>       search distributions from <dir>
1862   -s, --distdefs [<dist>]   print distribution defines of <dist>, then exit
1863   -i, --init                initialize Autodist environment, create default
1864                             distribution directory and distribution, then exit
1865   -p, --process <type> <src> [<dst>]
1866                             process file <src> into <dst> for distribution,
1867                             <type> is 'makefile', 'configure', 'non-source'
1868                             or 'source' and defines the type of <src>
1869   -m, --makedist            create and package distribution
1870       --gzip                create package compressed with gzip (default)
1871       --bzip2               create also package compressed with bzip2
1872       --compress            create also package compressed with compress
1873       --zip                 create also package compressed with zip"
1874
1875 #
1876 # Process command line arguments
1877 #
1878 while test $# -gt 0; do
1879   case "${1}" in
1880
1881   -d |--distdir)
1882     shift;
1883     test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
1884     distdir="${1}";
1885     shift;;
1886
1887   --list)
1888     exit 0;;
1889
1890   -s | --distdefs)
1891     shift;
1892     if test $# -eq 0; then
1893       ad_parse_distribution $distribution false
1894       echo "Distribution: ${distribution}" 1>&2;
1895     else
1896       ad_parse_distribution $1 false
1897       echo "Distribution: ${1}" 1>&2;
1898     fi
1899     ad_process_distdefs
1900     echo "Distdefs:" 1>&2;
1901     for i in $distdefs
1902     do
1903       echo "$i";
1904     done
1905     exit 0;;
1906
1907   -i | --init)
1908     ad_initialize;
1909     exit 0;;
1910
1911   -p | --process)
1912     shift;
1913     if test $# -ge 2; then
1914       ad_process $1 $2 $3
1915     else
1916       echo "${usage}" 1>&2;
1917     fi
1918     exit 0;;
1919
1920   -m | --makedist)
1921     ad_makedist
1922     exit 0;;
1923
1924   --gzip)
1925     ad_gzip=true
1926     shift;;
1927
1928   --bzip2)
1929     ad_bzip2=true
1930     shift;;
1931
1932   --compress)
1933     ad_compress=true
1934     shift;;
1935
1936   --zip)
1937     ad_zip=true
1938     shift;;
1939
1940   -v | --verbose)
1941     debug=true
1942     shift;;
1943
1944   -h | --help | --h*)
1945     echo "${usage}" 1>&2;
1946     echo 1>&2;
1947     echo "${help}" 1>&2;
1948     echo 1>&2;
1949     exit 0;;
1950
1951   -V | --version)
1952     echo "@PACKAGE@ (@PACKAGE_NAME@) $ver" 1>&2;
1953     echo "Written by Pekka Riikonen" 1>&2;
1954     echo 1>&2;
1955     echo "Copyright (C) 2004 - 2007 SILC Project" 1>&2;
1956     echo "\
1957 This is free software; see the source for copying conditions.  There is NO
1958 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>&2;
1959     exit 0;;
1960
1961   --)
1962     shift;
1963     break;;
1964
1965   -*)
1966     echo "${usage}" 1>&2;
1967     exit 1;;
1968
1969   *)
1970     break;;
1971
1972   esac
1973 done
1974
1975 # Open log file
1976 ad_log_open "autodist.log"
1977
1978 ad_log "Processing source tree for compilation and configuration"
1979 ad_log "--------------------------------------------------------"
1980 ad_log ""
1981
1982 #
1983 # Parse the requested distribution
1984 #
1985 if test $# != 0; then
1986   distribution="${1}";
1987   distfile=$distribution
1988   shift
1989 fi
1990
1991 ad_parse_distribution $distribution false
1992
1993 if test $# != 0; then
1994   dist_version="${1}";
1995 fi
1996
1997 ad_log "  Distribution: $distribution $dist_version"
1998 ad_log ""
1999
2000 ad_process_distdefs
2001
2002 ad_debug "Preparing source tree for configuration and compilation..."
2003 ad_debug "Preparing $distribution distribution version $dist_version"
2004
2005 #
2006 # Create the distribution defines header file
2007 #
2008 if test "$DISTDEFS"; then
2009   ad_create_distdefs_h
2010 else
2011   ad_fatal "DISTDEFS not defined in $distdir/autodist.conf"
2012 fi
2013
2014 # Get extra parameters from command line
2015 if test $# != 0; then
2016   shift
2017 fi
2018
2019 #
2020 # Run pre-hooks
2021 #
2022 ad_run_hooks "$pre_hooks" "$@"
2023
2024 #
2025 # Generate the Makefile.am files from Makefile.ad files
2026 #
2027 ad_make_makefile_ams
2028
2029 #
2030 # Generate the configure.ac from configure.ad file(s)
2031 #
2032 ad_make_configure_ac ./configure.ad
2033
2034 #
2035 # Process all files with .ad suffix for distribution processing
2036 #
2037 ad_process_ads
2038
2039 #
2040 # Generate configure script
2041 #
2042 ad_make_configure
2043
2044 #
2045 # Generate Makefile.in files
2046 #
2047 ad_make_makefile_ins
2048
2049 #
2050 # Create autodist.dist
2051 #
2052 ad_debug "Creating autodist.dist"
2053 echo "dist:$distfile" > autodist.dist
2054 echo "ver:$dist_version" >> autodist.dist
2055 echo "distdir:$package-$dist_version" >> autodist.dist
2056 echo "params:$@" >> autodist.dist
2057
2058 #
2059 # Run post-hooks
2060 #
2061 ad_run_hooks "$post_hooks" "$@"
2062
2063 ad_log "Source tree processed successfully."
2064 ad_debug "Done, now run ./configure and make."
2065
2066 exit 0