Added SILC Thread Queue API
[silc.git] / apps / autodist / autodist.in
index 27e6c22247dc15ee1b04c3fd2a7ad71919c88bfa..e3b67b7ab99f1de45ce67145c682c9549283b7de 100755 (executable)
@@ -2,7 +2,7 @@
 #
 # Author: Pekka Riikonen <priikone@silcnet.org>
 #
-# Copyright (C) 2005 Pekka Riikonen
+# Copyright (C) 2005 - 2007 Pekka Riikonen
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 
+###############################################################################
+# Shell compatibility
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  # Despite of this, we have managed to segfault some zsh's.
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+
 ###############################################################################
 # Global variables
 
@@ -60,7 +101,7 @@ distdefs=
 undistdefs=
 
 # All distribution options
-options=
+doptions=
 opt_template=false
 opt_no_dist=false
 opt_no_inherit=false
@@ -74,11 +115,13 @@ excludes=
 # All noprocesses
 noprocess=
 
-# All pre, post pre-dist and post-dist hooks
+# All hooks
 pre_hooks=
 post_hooks=
 pre_dist_hooks=
 post_dist_hooks=
+pre_p_dist_hooks=
+post_p_dist_hooks=
 
 # Distribution license and license header
 license=
@@ -86,6 +129,7 @@ licenseh=
 
 # Whether to output ad_debug information
 debug=false
+nolog=false
 
 # Autodist version
 ver=@VERSION@
@@ -125,6 +169,7 @@ ad_debug()
 ad_fatal()
 {
   set -f
+  ad_log "error: $1"
   echo autodist: error: $1
   set +f
   exit 1
@@ -138,10 +183,39 @@ ad_fatal()
 ad_warning()
 {
   set -f
+  ad_log "warning: $1"
   echo autodist: warning: $1
   set +f
 }
 
+#
+# Opens a log file.
+#
+# Arguments: ad_log_open <logfile>
+#
+ad_log_open()
+{
+  rm -rf $1
+  exec 5> $1
+
+  cat >&5 << EOF
+This file contains messages produced by the Autodist $ver.
+
+EOF
+}
+
+#
+# Prints to an open log file
+#
+# Arguments: ad_log
+#
+ad_log()
+{
+  if test x$nolog = xfalse; then
+    echo "$1" >&5
+  fi
+}
+
 #
 # Initializes the Autodist environment, creates default distribution
 # directory, and default distribution.
@@ -150,11 +224,11 @@ ad_warning()
 #
 ad_initialize()
 {
-  ad_debug ">ad_initialize"
+  ad_debug "Initializing Autodist environment"
 
   # Create default distdir
   if test '!' -f $distdir; then
-    mkdir -p $distdir
+    mkdir -p -- $distdir
   fi
 
   # Create Autodist configuration file
@@ -167,7 +241,7 @@ ad_initialize()
     cp -p @AUTODISTDIR@/default $distdir
   fi
 
-  ad_debug "<ad_initialize"
+  ad_debug "Autodist environment initialized"
 }
 
 #
@@ -177,31 +251,35 @@ ad_initialize()
 #
 ad_create_distdefs_h()
 {
-  ad_debug ">ad_create_distdefs_h"
+  ad_debug "Creating distdef header file"
 
   fname=$DISTDEFS
   rm -f $fname
-  echo "/*" > $fname
-  echo "  Automatically generated by Autodist $ver.  Do not edit." >> $fname
-  echo >> $fname
-  echo "  Generated: `date` by `whoami`" >> $fname
-  echo "  Distribution: $distribution" >> $fname
-  echo "  License: $license" >> $fname
-  echo "*/" >> $fname
-  echo >> $fname
-  echo "#ifndef _"$DP"_DISTDEFS_H" >> $fname
-  echo "#define _"$DP"_DISTDEFS_H" >> $fname
-  echo >> $fname
+  cat > $fname <<EOF
+/*
+  Automatically generated by Autodist $ver.  Do not edit.
+
+  Generated: `date` by `whoami`
+  Distribution: $distribution
+  License: $license
+*/
+
+#ifndef _`echo $DP`_DISTDEFS_H
+#define _`echo $DP`_DISTDEFS_H
+
+EOF
 
   for i in $distdefs
   do
     echo "#define $i 1" >>$fname
   done
 
-  echo >> $fname
-  echo "#endif /* _"$DP"_DISTDEFS_H */" >> $fname
+  cat >> $fname <<EOF
+
+#endif /* _`echo $DP`_DISTDEFS_H */
+EOF
 
-  ad_debug "<ad_create_distdefs_h"
+  ad_debug "Distdef header file created"
 }
 
 #
@@ -212,14 +290,19 @@ ad_create_distdefs_h()
 #
 ad_make_configure()
 {
-  ad_debug ">ad_make_configure"
   local run_autoconf=false
 
+  ad_debug "Starting configure creation"
+
   rm -f configure
 
   if test "$ACLOCAL"; then
     ad_debug "Running aclocal"
-    $ACLOCAL 1>/dev/null 2>/dev/null
+    if test x$debug = xtrue; then
+      $ACLOCAL
+    else
+      $ACLOCAL 1>/dev/null 2>/dev/null
+    fi
     if test $? != 0; then
       ad_fatal "aclocal failed"
     fi
@@ -256,7 +339,7 @@ ad_make_configure()
     fi
   fi
 
-  ad_debug "<ad_make_configure"
+  ad_debug "Ending configure creation"
 }
 
 #
@@ -268,13 +351,19 @@ ad_make_configure()
 #
 ad_make_configure_ac()
 {
-  ad_debug ">ad_make_configure_ac: $1"
+  local check
+
+  ad_debug "Starting creating configure.ac: $1"
+
+  ad_log ""
+  ad_log "Following configure.ad files were processed into configure.ac:"
+  ad_log "--------------------------------------------------------------"
 
   if test '!' -f $1; then
     ad_fatal "The configure file '$1' does not exist"
   fi
 
-  local check="`cat $1 | sed 's/^[     ]*//' | grep -v "^#" | grep -e "AD_INIT"`"
+  check="`sed 's/^[    ]*//' < $1 | grep -v "^#" | grep -e "AD_INIT"`"
   if test -z $check; then
     rm -f configure.ad.cfs
     rm -f $fname $fname.tmp
@@ -283,18 +372,21 @@ ad_make_configure_ac()
 
   rm -f configure.ac configure.ad.cfs
 
-  cfs=`find . -name configure\*\.ad`
+  cfs=`find . -type f -name configure\*\.ad`
   for i in $cfs
   do
     if test "x$i" = "x$1"; then
       continue
     fi
+
     ad_debug "including $i"
+    ad_log "  $i"
+
     cat $i >> configure.ad.cfs
   done
 
   if test -f configure.ad.cfs; then
-    local check="`cat $1 | sed 's/^[   ]*//' | grep -v "^#" | grep -e "AD_INCLUDE_CONFIGURE"`"
+    check="`sed 's/^[  ]*//' < $1 | grep -v "^#" | grep -e "AD_INCLUDE_CONFIGURE"`"
     if test -z $check; then
       rm -f configure.ad.cfs
       ad_warning "configure.ad fragments found but 'AD_INCLUDE_CONFIGURE' is not set"
@@ -303,40 +395,48 @@ ad_make_configure_ac()
 
   # Header for configure.ac
   fname="configure.tmp.ac"
-  echo "# Automatically generated by Autodist $ver.  Do not edit." > $fname
-  echo "# To make changes edit the $i file in the source tree." >> $fname
-  echo >> $fname
-  echo "# Source: $i" >> $fname
-  echo "# Generated: `date` by `whoami`" >> $fname
-  echo "# Distribution: $distribution" >> $fname
-  echo "# License: $license" >> $fname
-  echo >> $fname
+  cat > $fname <<EOF
+# Automatically generated by Autodist $ver.  Do not edit.
+# To make changes edit the configure.ad file in the source tree.
+
+# Source: configure.ad
+# Generated: `date` by `whoami`
+# Distribution: $distribution
+# License: $license
+
+EOF
 
   ad_debug "creating configure.ac"
   if test -f configure.ad.cfs; then
-    sed '/AD_INCLUDE_CONFIGURE/ r configure.ad.cfs' $1 > $fname.tmp
-    sed -e "/AD_INCLUDE_CONFIGURE/s///" $fname.tmp >> $fname
+    sed '/^AD_INCLUDE_CONFIGURE/ r configure.ad.cfs' $1 > $fname.tmp
+    sed -e "/^AD_INCLUDE_CONFIGURE/d" $fname.tmp >> $fname
     rm -f configure.ad.cfs $fname.tmp
   else
-    cat $1 >> $fname.tmp
+    cat $1 >> $fname
   fi
 
   # Process AD_INIT
   sed -e "/AD_INIT/s//AC_INIT([$distribution], [$dist_version], [$bug_report], [$package])/" $fname > $fname.tmp
 
+  # Remove AD_DISABLE_DEPENDENCIES
+  sed -e "/^AD_DISABLE_DEPENDENCIES/d" $fname.tmp > $fname
+
   # Process for distribution
-  rm -f $fname
-  ad_process_file $fname.tmp $fname
+  rm -f $fname.tmp
+  ad_process_file $fname $fname.tmp false
 
   # Remove any trailing backslashes
-  if test -f "$fname"; then
-    cat $fname | sed -e :a -e '/\\$/N; s/\\\n//; ta' > configure.ac
+  if test -f "$fname.tmp"; then
+    sed -e :a -e '/\\$/N; s/[  ]*\\\n//; ta' < $fname.tmp > configure.ac
   else
-    cp -p $fname.tmp configure.ac
+    cp -p $fname configure.ac
   fi
   rm -f $fname $fname.tmp
 
-  ad_debug "<ad_make_configure_ac: $1"
+  ad_log "  ./configure.ad"
+  ad_log ""
+
+  ad_debug "Ending creating configure.ac: $1"
 }
 
 #
@@ -346,7 +446,7 @@ ad_make_configure_ac()
 #
 ad_make_makefile_ins()
 {
-  ad_debug ">ad_make_makefile_ins"
+  ad_debug "Starting creating Makefile.in files"
 
   if test "$AUTOMAKE"; then
     ad_debug "Running automake"
@@ -356,7 +456,7 @@ ad_make_makefile_ins()
     fi
   fi
 
-  ad_debug "<ad_make_makefile_ins"
+  ad_debug "Ending creating Makefile.in files"
 }
 
 #
@@ -368,71 +468,118 @@ ad_make_makefile_ins()
 #
 ad_make_makefile_ams()
 {
-  ad_debug ">ad_make_makefile_ams"
+  ad_debug "Starting creating Makefile.am files"
+
+  ad_log ""
+  ad_log "Following Makefile.ad files were processed into Makefile.am files:"
+  ad_log "------------------------------------------------------------------"
 
-  files=`find . -name Makefile\.ad`
+  files=`find . -type f -name Makefile\.ad`
   for ff in $files
   do
+    ad_log "  $ff"
     fname=`echo $ff | sed s/\.ad//`
+    ad_make_makefile_am $ff $fname.am
+  done
+  ad_log ""
 
-    # Header for the Makefile.am
-    echo "# Automatically generated by Autodist $ver from Makefile.ad.  Do not edit." > $fname.am
-    echo "# To make changes edit the $ff file in the source tree." >> $fname.am
-    echo >> $fname.am
-    echo "# Source: $ff" >> $fname.am
-    echo "# Generated: `date` by `whoami`" >> $fname.am
-    echo "# Distribution: $distribution" >> $fname.am
-    echo "# License: $license" >> $fname.am
-    echo >> $fname.am
-
-    # Run the distribution processing for this Makefile.ad
-    ad_debug "Processing $ff to be $fname.am"
-    ad_process_file $ff $fname.tmp
-
-    # Remove any trailing backslashes
-    if test -f "$fname.tmp"; then
-      cat $fname.tmp | sed -e :a -e '/\\$/N; s/\\\n//; ta' >> $fname.am
-    else
-      cat $ff >> $fname.am
-    fi
+  ad_debug "Ending creating Makefile.am files"
+}
 
-    rm -f $fname.tmp
-  done
+#
+# Creates Makefile.am file from the Makefile.ad file.
+#
+# Arguments: ad_make_makefile_am <src> <dst>
+#
+ad_make_makefile_am()
+{
+  local am_deps=true
+  local f=$1
+  local fname=$2
+
+  # Disable dependencies if requested
+  dc=`sed 's/^[        ]*//' < configure.ad | grep -v "^#" \
+    | grep "AD_DISABLE_DEPENDENCIES"`
+  if test "$dc" = "AD_DISABLE_DEPENDENCIES"; then
+    am_deps=false
+  fi
+
+  # Header for the Makefile.am
+  cat > $fname <<EOF
+# Automatically generated by Autodist $ver from Makefile.ad.  Do not edit.
+# To make changes edit the $f file in the source tree.
+
+# Source: $f
+# Generated: `date` by `whoami`
+# Distribution: $distribution
+# License: $license
+
+EOF
 
-  ad_debug "<ad_make_makefile_ams"
+  # Run the distribution processing for this Makefile.ad
+  ad_debug "Processing $f to be $fname"
+  ad_process_file $f $fname.tmp false
+
+  # Remove any trailing backslashes
+  if test -f "$fname.tmp"; then
+    sed -e :a -e '/\\$/N; s/[  ]*\\\n//; ta' < $fname.tmp >> $fname
+  else
+    cat $f >> $fname
+  fi
+
+  # Enable dependencies if requested
+  if test x$am_deps = xtrue; then
+    # Get list of configure.ad's to get them into deps also
+    cfs=`find . -type f -name configure\*\.ad`
+    cfs=`echo $cfs | sed 's/\.\///g'`
+
+    cat >> $fname <<EOF
+
+# S_AD_ENABLE_DEPENDENCIES
+\$(srcdir)/Makefile.am: Makefile.ad
+       cd \$(top_srcdir) && autodist -p makefile \$(subdir)/Makefile.ad \$(subdir)/Makefile.am && cd \$(subdir)
+\$(srcdir)/configure.ac: $cfs
+       cd \$(top_srcdir) && autodist -p configure \$(top_srcdir)/configure.ad && cd \$(subdir)
+# E_AD_ENABLE_DEPENDENCIES
+EOF
+  fi
+
+  rm -f $fname.tmp
 }
 
 #
 # Processes all files with .ad suffix, with exception of configure*.ad
 # and Makefile.ad files, for distribution from the source tree.
 #
-# Arguments: ad_process_ads
+# Arguments: ad_process_ads false
 #
 ad_process_ads()
 {
-  ad_debug ">ad_process_ads"
+  ad_debug "Starting processing .ad files"
+
+  ad_log ""
+  ad_log "Following .ad files were processed:"
+  ad_log "-----------------------------------"
 
-  files=`find . -name \*\.ad \! -name configure\*\.ad \! -name Makefile\.ad`
+  files=`find . -type f -name \*\.ad \! -name configure\*\.ad \! -name Makefile\.ad`
   for i in $files
   do
     fname=`echo $i | sed s/\.ad//`
+    orig=$i
 
-    # Header
-    echo "# Automatically generated by Autodist $ver.  Do not edit." > $fname
-    echo "# To make changes edit the $i file in the source tree." >> $fname
-    echo >> $fname
-    echo "# Source: $i" >> $fname
-    echo "# Generated: `date` by `whoami`" >> $fname
-    echo "# Distribution: $distribution" >> $fname
-    echo "# License: $license" >> $fname
-    echo >> $fname
+    ad_debug "Processing $i to be $fname"
+    ad_log "  $i into $fname"
 
     # Run the distribution processing for this file
-    ad_debug "Processing $i to be $fname"
-    ad_process_file $i $fname
+    ad_process_file $i $fname false
+
+    if test '!' -f "$fname"; then
+      cp -p $orig $fname || exit 1
+    fi
   done
+  ad_log ""
 
-  ad_debug "<ad_process_ads"
+  ad_debug "Ending processing .ad files"
 }
 
 #
@@ -449,17 +596,25 @@ ad_process_ads()
 # source path.  This, in effect, is a cp utility with ability to create
 # directories if they do not exist.
 #
-# Arguments: ad_dist_includes <includeslist> <recursive>
+# Arguments: ad_dist_includes <includeslist> <recursive> <log>
 #
 ad_dist_includes()
 {
-  ad_debug ">ad_dist_includes: $1 $2"
+  local incs
+
+  ad_debug "Starting running includes: $1 $2"
+
+  if test x$3 = xtrue; then
+    ad_log ""
+    ad_log "Following files and directories were included in distribution:"
+    ad_log "--------------------------------------------------------------"
+  fi
 
   # By default do not expand pathnames
   set -f
 
   # Add : separator at the end
-  local incs="`echo "$1" | sed 's/$/ : /'`"
+  incs="`echo "$1" | sed 's/$/ : /'`"
 
   src=
   dst=
@@ -488,7 +643,7 @@ ad_dist_includes()
         d=`echo $src | sed 's,/[^/]*$,,'`
         if test "$d" != "$src" && test "$d" != "." && \
           test '!' -d $am_distdir/$d; then
-          mkdir -p $am_distdir/$d || exit 1
+          mkdir -p -- $am_distdir/$d || exit 1
         fi
       else
         # Add to different location
@@ -500,10 +655,13 @@ ad_dist_includes()
         d=`echo $dst | sed 's,/[^/]*$,,'`
         if test "$d" != "$dst" && test "$d" != "." && \
           test '!' -d $am_distdir/$d; then
-          mkdir -p $am_distdir/$d || exit 1
+          mkdir -p -- $am_distdir/$d || exit 1
         fi
       fi
 
+      if test x$3 = xtrue; then
+       ad_log "  $src into $am_distdir/$d"
+      fi
       cp -p $src $am_distdir/$d || exit 1
 
     elif test -d "$src"; then
@@ -511,16 +669,22 @@ ad_dist_includes()
 
       if test "$src" = "$dst"; then
        # Add to same location
-        d=`echo $src | sed 's,/[^/]*$,,'`
-        ds=`echo $src | sed 's/\/$//'`
-        if test "$ds" = "$d"; then
+       d=`echo $src | sed 's,/[^/]*$,,'`
+       ds=`echo $src | sed 's/\/$//'`
+       if test "$ds" = "$d"; then
           d=`echo $d | sed 's,/[^/]*$,,'`
-        fi
-        if test '!' -d $am_distdir/$d && test "$ds" != "$d"; then
-          mkdir -p $am_distdir/$d || exit 1
-        fi
+       fi
+       if test "$ds" = "$d"; then
+         d=""
+       fi
+       if test '!' -d $am_distdir/$d && test "$ds" != "$d"; then
+          mkdir -p -- $am_distdir/$d || exit 1
+       fi
 
-        cp -pR $src $am_distdir/$d || exit 1
+       if test x$3 = xtrue; then
+         ad_log "  $src into $am_distdir/$d"
+       fi
+       cp -pR $src $am_distdir/$d || exit 1
       else
        # Add to different location
         check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
@@ -534,9 +698,12 @@ ad_dist_includes()
           d=`echo $d | sed 's,/[^/]*$,,'`
         fi
         if test '!' -d $am_distdir/$d && test "$dst" != "$d"; then
-          mkdir -p $am_distdir/$d || exit 1
+          mkdir -p -- $am_distdir/$d || exit 1
         fi
 
+       if test x$3 = xtrue; then
+         ad_log "  $src into $am_distdir/$dst"
+       fi
         cp -pR $src $am_distdir/$dst || exit 1
       fi
 
@@ -553,7 +720,7 @@ ad_dist_includes()
       fi
 
       # Recursively call this function with expanded pathnames.  The
-      # reason why we don't let sh by default expand patnames is that
+      # reason why we don't let sh by default expand pathnames is that
       # the include's destination is optional.  If sh expands by default
       # we don't know the destination.  For this reason, we handle the
       # expansion here ourselves.
@@ -596,9 +763,13 @@ ad_dist_includes()
     dst=
   done
 
+  if test x$3 = xtrue; then
+    ad_log ""
+  fi
+
   set +f
 
-  ad_debug "<ad_dist_includes: $1 $2"
+  ad_debug "Ending running includes: $1 $2"
 }
 
 #
@@ -611,19 +782,35 @@ ad_dist_includes()
 #
 # The path may be file, directory or regular expression.
 #
-# Arguments: ad_dist_includes <excludelist>
+# Arguments: ad_dist_includes <excludelist> <log>
 #
 ad_dist_excludes()
 {
-  ad_debug ">ad_dist_excludes: $1"
+  ad_debug "Starting running excludes: $1"
+
+  if test x$2 = xtrue; then
+    ad_log ""
+    ad_log "Following files and directories were excluded from distribution:"
+    ad_log "----------------------------------------------------------------"
+  fi
 
+  cur=`pwd`
+  cd $am_distdir || exit 1
   for i in $1
   do
     ad_debug "Excluding $i"
-    rm -rf $am_distdir/$i
+    if test x$2 = xtrue; then
+      ad_log "  $i"
+    fi
+    rm -rf $i
   done
+  cd $cur || exit 1
+
+  if test x$2 = xtrue; then
+    ad_log ""
+  fi
 
-  ad_debug "<ad_dist_excludes: $1"
+  ad_debug "Ending running excludes: $1"
 }
 
 #
@@ -637,30 +824,41 @@ ad_dist_excludes()
 #
 ad_process_tree()
 {
-  ad_debug ">ad_process_tree: $1"
-
-  # We take all files, other than *.ad, including source files, in case
-  # they use the non-C-compiler-friendly format of distdefs, which is
-  # possible.
-
-  files=`find $am_distdir \! -name \*\.ad`
+  ad_debug "Starting processing non-source files: $1"
+
+  # Take files, except source and .ad files.
+  files=`find $am_distdir -type f \! -name \*\.ad \( \
+       \! -name \*\.[cC] -a \
+       \! -name \*\.[cC][cCpP] -a \
+       \! -name \*\.[cC][xX][xX] -a \
+       \! -name \*\.[cC][pP][pP] -a \
+       \! -name \*\.[cC]++ -a \
+       \! -name \*\.m -a \
+       \! -name \*\.mm -o \
+       \! -name \*\.M -o \
+       \! -name \*\.S -o \
+       \! -name \*\.[hH] -a \
+       \! -name \*\.hh -a \
+       \! -name \*\.[cC]\.in -a \
+       \! -name \*\.[cC][cCpP]\.in -a \
+       \! -name \*\.[cC][xX][xX]\.in -a \
+       \! -name \*\.[cC][pP][pP]\.in -a \
+       \! -name \*\.[cC]++\.in -a \
+       \! -name \*\.m\.in -a \
+       \! -name \*\.[hH]\.in -a \
+       \! -name \*\.hh\.in \)`
   files=`echo $files | sed 's/$am_distdir//'`
 
-  # Take away noprocess list
-  if test -f autodist.noprocess; then
-    files=`echo $files | sh autodist.noprocess` || exit 1
-  fi
-
   for ff in $files
   do
-    ad_process_file $ff $ff.tmp
+    ad_process_file $ff $ff.tmp true
     if test -f $ff.tmp; then
       rm -f $ff || exit 1
       mv -f $ff.tmp $ff || exit 1
     fi
   done
 
-  ad_debug "<ad_process_tree: $1"
+  ad_debug "Ending processing non-source files: $1"
 }
 
 #
@@ -676,35 +874,59 @@ ad_process_tree()
 #
 ad_process_source_tree()
 {
-  ad_debug ">ad_process_source_tree: $1"
+  ad_debug "Starting processing source files: $1"
 
-  # We take only C/C++ files since they use the C compiler friendly
-  # version of distdefs.  Other files are not assumed to use them.
-  files=`find $am_distdir \! -name \*\.ad \( \
+  # We take only C/C++ (and other files that are run through traditional
+  # preprocessor) files since they use the C compiler friendly version
+  # of distdefs.  Other files are not assumed to use them.
+  files=`find $am_distdir -type f \! -name \*\.ad \( \
        -name \*\.[cC] -o \
        -name \*\.[cC][cCpP] -o \
        -name \*\.[cC][xX][xX] -o \
        -name \*\.[cC][pP][pP] -o \
        -name \*\.[cC]++ -o \
        -name \*\.m -o \
+       -name \*\.mm -o \
+       -name \*\.M -o \
+       -name \*\.S -o \
        -name \*\.[hH] -o \
-       -name \*\.hh \)`
-
-  # Take away noprocess list
-  if test -f autodist.noprocess; then
-    files=`echo $files | sh autodist.noprocess` || exit 1
-  fi
+       -name \*\.hh -o \
+       -name \*\.[cC]\.in -o \
+       -name \*\.[cC][cCpP]\.in -o \
+       -name \*\.[cC][xX][xX]\.in -o \
+       -name \*\.[cC][pP][pP]\.in -o \
+       -name \*\.[cC]++\.in -o \
+       -name \*\.m\.in -o \
+       -name \*\.[hH]\.in -o \
+       -name \*\.hh\.in \)`
 
   for ff in $files
   do
-    ad_process_source_file $ff $ff.tmp
+    ad_process_source_file $ff $ff.tmp true
     if test -f $ff.tmp; then
       rm -f $ff || exit 1
       mv -f $ff.tmp $ff || exit 1
     fi
   done
 
-  ad_debug "<ad_process_source_tree: $1"
+  ad_debug "Ending processing source files: $1"
+}
+
+#
+# Removes Autodist dependencies, as they cannot be delivered to distribution.
+#
+# Arguments: ad_remove_dependencies <distdir>
+#
+ad_remove_dependencies()
+{
+  ad_debug "Removing dependencies"
+
+  ams=`find $1 -type f -name Makefile\.\*`
+  for i in $ams
+  do
+    sed -e "/^# S_AD_ENABLE_DEPENDENCIES/,/^# E_AD_ENABLE_DEPENDENCIES/d" $i > $i.tmp
+    mv $i.tmp $i
+  done
 }
 
 #
@@ -715,7 +937,7 @@ ad_process_source_tree()
 #
 ad_makedist_makesane()
 {
-  ad_debug ">ad_makedist_makesane:"
+  ad_debug "Making distribution file modtimes sane"
 
   # DO NOT change these order unless you know what you are doing.
   if test -f $am_distdir/configure.ac; then
@@ -730,10 +952,10 @@ ad_makedist_makesane()
     ad_fatal "Makefile: No such file or directory"
   fi
 
-  configh=`grep "^CONFIG_HEADER" Makefile | cut -d= -f2 | sed 's/^[ \t]//'`
+  configh=`grep "^CONFIG_HEADER" Makefile | cut -d= -f2 | sed 's/^[    ]*//'`
   touch $am_distdir/$configh.in 1>/dev/null 2>/dev/null
 
-  files=`find $am_distdir -name Makefile\.in`
+  files=`find $am_distdir -type f -name Makefile\.in`
   for i in $files
   do
     touch $i
@@ -747,7 +969,7 @@ ad_makedist_makesane()
     touch $am_distdir/config.status
   fi
 
-  ad_debug "<ad_makedist_makesane:"
+  ad_debug "Distribution made sane"
 }
 
 #
@@ -758,7 +980,12 @@ ad_makedist_makesane()
 #
 ad_makedist()
 {
-  ad_debug ">ad_makedist"
+  ad_log_open "makedist.log"
+  ad_debug "Starting distribution creation"
+
+  ad_log "Created distribution"
+  ad_log "--------------------"
+  ad_log ""
 
   if test '!' -f autodist.dist; then
     ad_fatal "Autodist has not been run yet to prepare source tree"
@@ -774,16 +1001,23 @@ ad_makedist()
   fi
 
   # Parse the requested distribution
-  distribution=`cat autodist.dist | grep "dist:" | cut -d: -f2`
-  dist_version=`cat autodist.dist | grep "ver:" | cut -d: -f2`
+  distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
+  dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
+  am_distdir=`grep "distdir:" < autodist.dist | cut -d: -f2` || exit 1
+  params=`grep "params:" < autodist.dist | cut -d: -f2` || exit 1
   ad_parse_distribution $distribution false
+  ad_log "  Distribution: $distribution $dist_version"
+  ad_log "  Destination directory: $am_distdir"
+  ad_log ""
   ad_process_distdefs
-  am_distdir="$package-$dist_version"
 
   if test x$opt_no_dist = xtrue; then
     ad_fatal "The '$distribution' distribution cannot be packaged"
   fi
 
+  # Run pre-dist-hooks
+  ad_run_dist_hooks "$pre_dist_hooks" "$params"
+
   # Create distribution directory
   ad_debug "Creating distribution directory $am_distdir"
   $MAKE distdir || exit 1
@@ -793,22 +1027,34 @@ ad_makedist()
     ad_fatal "Distribution directory $am_distdir not created"
   fi
 
-  # Run pre-dist-hooks
-  ad_run_dist_hooks "$pre_dist_hooks"
+  # Run pre-process-dist-hooks
+  ad_run_dist_hooks "$pre_p_dist_hooks" "$params"
 
   # Run excludes
-  ad_dist_excludes "$excludes"
+  ad_dist_excludes "$excludes" true
 
   # Run includes
-  ad_dist_includes "$includes"
+  ad_dist_includes "$includes" false true
 
   # Include specific license file if specified
   if test "$license" != ""; then
+    ad_log ""
+    ad_log "License file in distribution:"
+    ad_log "-----------------------------"
+    ad_log "  $license into $am_distdir/COPYING"
+    ad_log ""
     cp -p $license $am_distdir/COPYING || exit 1
   fi
 
-  # Process noprocesses
-  ad_process_noprocess
+  # Remove dependencies
+  ad_remove_dependencies $am_distdir
+
+  # Process noprocesses, first pass
+  ad_process_noprocess true
+
+  ad_log ""
+  ad_log "Following files were not re-licensed:"
+  ad_log "-------------------------------------"
 
   # Process source files
   ad_debug "Process distribution source tree"
@@ -818,8 +1064,13 @@ ad_makedist()
   ad_debug "Process distribution tree"
   ad_process_tree $am_distdir
 
-  # Run post-dist-hooks
-  ad_run_dist_hooks "$post_dist_hooks"
+  ad_log ""
+
+  # Process noprocesses, second pass
+  ad_process_noprocess false
+
+  # Run post-process_dist-hooks
+  ad_run_dist_hooks "$post_p_dist_hooks" "$params"
 
   # Make distribution sane
   ad_makedist_makesane
@@ -831,25 +1082,33 @@ ad_makedist()
   # Compress
   ad_debug "Compressing distribution package"
   if test x$ad_gzip = xtrue; then
+    ad_debug "Compressing distribution package $am_distdir.tar.gz"
     gzip -9 -c $am_distdir.tar > $am_distdir.tar.gz || exit 1
   fi
   if test x$ad_bzip2 = xtrue; then
+    ad_debug "Compressing distribution package $am_distdir.tar.bz2"
     bzip2 -9 -c $am_distdir.tar > $am_distdir.tar.bz2 || exit 1
   fi
   if test x$ad_compress = xtrue; then
+    ad_debug "Compressing distribution package $am_distdir.tar.Z"
     compress -c $am_distdir.tar > $am_distdir.tar.Z || exit 1
   fi
   if test x$ad_zip = xtrue; then
     rm -f $am_distdir.zip
+    ad_debug "Compressing distribution package $am_distdir.zip"
     zip -rq $am_distdir.zip $am_distdir || exit 1
   fi
   rm -f $am_distdir.tar
 
+  # Run post-dist-hooks
+  ad_run_dist_hooks "$post_dist_hooks" "$params"
+
   # Cleanup
   rm -rf $am_distdir
-  rm -f autodist.noprocess
 
-  ad_debug "<ad_makedist"
+  ad_log "Distribution created successfully."
+
+  ad_debug "Ending distribution creation"
 }
 
 #
@@ -869,7 +1128,7 @@ ad_makedist()
 #
 ad_handle_options()
 {
-  ad_debug ">ad_handle_options: $1"
+  ad_debug "Handling options: $1"
 
   for i in $1
   do
@@ -884,8 +1143,6 @@ ad_handle_options()
       continue
     fi
   done
-
-  ad_debug "<ad_handle_options: $1"
 }
 
 #
@@ -895,11 +1152,9 @@ ad_handle_options()
 #
 ad_clear_options()
 {
-  ad_debug ">ad_clear_options"
   opt_template=false
   opt_no_dist=false
   opt_no_inherit=false
-  ad_debug "<ad_clear_options"
 }
 
 #
@@ -912,18 +1167,44 @@ ad_clear_options()
 #
 ad_parse_distribution()
 {
-  ad_debug ">ad_parse_distribution: $1 $2"
+  local inhs
+  local defs
+  local undefs
+  local incs
+  local excs
+  local nops
+  local opts
+  local dname
+  local dpname
+  local bugr
+  local prh
+  local poh
+  local prdh
+  local podh
+  local prpdh
+  local popdh
+
+  ad_debug "Starting parsing distribution: $1 $2"
 
   if test '!' -f $distdir/$1; then
     ad_fatal "Distribution '$1' is not declared"
   fi
 
+  # Get and enforce prereq version
+  prereq=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
+    | grep "prereq " | cut -d' ' -f2- | sort | uniq`
+  if test '!' -z $prereq; then
+    if test "$ver" \< "$prereq"; then
+      ad_fatal "Autodist $prereq or newer is required for distribution $1"
+    fi
+  fi
+
   # Get inherited
-  local inhs=`cat $distdir/$1 | sed 's/^[      ]*//' | grep -v "^#" \
+  inhs=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "inherit " | cut -d' ' -f2 | sort | uniq`
 
   # Get distdefs
-  local defs=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  defs=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
    | grep "define " | cut -d' ' -f2 | sort | uniq`
 
   if test "$inhs" = "" && test "$defs" = ""; then
@@ -931,23 +1212,23 @@ ad_parse_distribution()
   fi
 
   # Get undefined distdefs
-  local undefs=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  undefs=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
    | grep "undef " | cut -d' ' -f2 | sort | uniq`
 
   # Get includes
-  local incs=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  incs=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "include " | sed 's/include / : /'`
 
   # Get excludes
-  local excs=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  excs=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "exclude " | cut -d' ' -f2- | sort | uniq`
 
   # Get noprocesses
-  local nops=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  nops=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
 
   # Get options
-  local opts=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  opts=`sed 's/^[      ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "option " | cut -d' ' -f2- | sort | uniq`
 
   # Check options
@@ -959,13 +1240,13 @@ ad_parse_distribution()
     ad_fatal "Template distribution '$1' cannot be prepared or packaged"
   fi
 
-  ad_debug "inherits=$inhs"
-  ad_debug "distdefs=$defs"
-  ad_debug "includes=$incs"
-  ad_debug "excludes=$excs"
-  ad_debug "noprocess=$nops"
-  ad_debug "undistdefs=$undefs"
-  ad_debug "options=$opts"
+  ad_debug "inherits$inhs"
+  ad_debug "distdefs$defs"
+  ad_debug "includes$incs"
+  ad_debug "excludes$excs"
+  ad_debug "noprocess$nops"
+  ad_debug "undistdefs$undefs"
+  ad_debug "options$opts"
 
   # Expand distdefs from inherited distributions
   for i in $inhs
@@ -984,17 +1265,27 @@ ad_parse_distribution()
   done
 
   # Get license
-  license=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  license=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "license " | cut -d' ' -f2`
-  licenseh=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+  licenseh=`sed 's/^[  ]*//' < $distdir/$1 | grep -v "^#" \
     | grep "license-header " | sed 's/license-header / : /'`
 
-  ad_debug "license=$license"
-  ad_debug "licenseh=$licenseh"
+  ad_debug "license$license"
+  ad_debug "licenseh$licenseh"
 
   if test x$2 = xfalse; then
+    # Take rest of the stuff from top distribution
+
+    # We take precedence on defined and undefined distdefs.  Remove
+    # undefined distdefs if we have defined them.
+    for d in $defs
+    do
+      ad_debug "defining undefined $d distdef"
+      undistdefs=`echo $undistdefs | sed s/$d//g`
+    done
+
     # Get distribution name
-    local dname=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+    dname=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
       | grep "name " | cut -d' ' -f2-`
 
     if test "$dname"; then
@@ -1002,7 +1293,7 @@ ad_parse_distribution()
     fi
 
     # Get distribution package name (optional)
-    local dpname=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+    dpname=`sed 's/^[  ]*//' < $distdir/$1 | grep -v "^#" \
      | grep "package " | cut -d' ' -f2`
 
     if test "$dpname"; then
@@ -1012,35 +1303,41 @@ ad_parse_distribution()
     fi
 
     # Get Bug-report email address (optional)
-    local bugr=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+    bugr=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
      | grep "bug-report " | cut -d' ' -f2-`
 
     if test "$bugr"; then
       bug_report=$bugr
     fi
 
-    ad_debug "distribution=$distribution"
-    ad_debug "package=$package"
-    ad_debug "bug-report=$bug_report"
+    ad_debug "distribution$distribution"
+    ad_debug "package$package"
+    ad_debug "bug-report$bug_report"
 
     # Get hooks (optional)
-    local prh=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+    prh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
      | grep "pre-hook " | cut -d' ' -f2-`
-    local poh=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
+    poh=`sed 's/^[     ]*//' < $distdir/$1 | grep -v "^#" \
      | grep "post-hook " | cut -d' ' -f2-`
-    local prdh=`cat $distdir/$1 | sed 's/^[       ]*//' | grep -v "^#" \
-     | grep "pre-dist-hook " | sed 's/^[       ]*//' | cut -d' ' -f2-`
-    local podh=`cat $distdir/$1 | grep -v "^#" \
-     | grep "post-dist-hook " | sed 's/^[       ]*//' | cut -d' ' -f2-`
+    prdh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
+     | grep "pre-dist-hook " | cut -d' ' -f2-`
+    podh=`sed 's/^[    ]*//' < $distdir/$1 | grep -v "^#" \
+     | grep "post-dist-hook " | cut -d' ' -f2-`
+    prpdh=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
+     | grep "pre-process-dist-hook " | cut -d' ' -f2-`
+    popdh=`sed 's/^[   ]*//' < $distdir/$1 | grep -v "^#" \
+     | grep "post-process-dist-hook " | cut -d' ' -f2-`
 
     pre_hooks="$pre_hooks $prh"
     post_hooks="$post_hooks $poh"
     pre_dist_hooks="$pre_dist_hooks $prdh"
     post_dist_hooks="$post_dist_hooks $podh"
-    options="$options $opts"
+    pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
+    post_p_dist_hooks="$post_p_dist_hooks $popdh"
+    doptions="$doptions $opts"
 
-    ad_handle_options "$options"
-    ad_debug "options=$options"
+    ad_handle_options "$doptions"
+    ad_debug "options: $doptions"
   fi
 
   # Return to caller
@@ -1051,7 +1348,7 @@ ad_parse_distribution()
   noprocess="$noprocess $nops"
   undistdefs="$undistdefs $undefs"
 
-  ad_debug "<ad_parse_distribution: $1 $2"
+  ad_debug "Ending parsing distribution: $1 $2"
 }
 
 #
@@ -1062,40 +1359,50 @@ ad_parse_distribution()
 #
 ad_process_distdefs()
 {
-  ad_debug ">ad_process_distdefs"
+  ad_debug "Starting processing distdefs"
+
+  ad_log ""
+  ad_log "Following distdefs were processed:"
+  ad_log "----------------------------------"
 
   # Remove all undefined distribution defines
   for i in $undistdefs
   do
     ad_debug "undefining $i distdef"
-    distdefs=`echo $distdefs | sed s/$i//`
+    distdefs=`echo $distdefs | sed s/$i//g`
   done
 
-  rm -f autodist.tmp.defs autodist.pre.hooks autodist.post.hooks
-  rm -f autodist.pre.dist.hooks autodist.post.dist.hooks
+  rm -f autodist.tmp.defs
 
   # Remove duplicate distdefs
   for i in $distdefs
   do
     echo $i >>autodist.tmp.defs
   done
-  distdefs=`cat autodist.tmp.defs | sort | uniq`
+  distdefs=`sort < autodist.tmp.defs | uniq`
   distdefs=`echo $distdefs`
   rm -f autodist.tmp.defs
 
+  # Log
+  for i in $distdefs
+  do
+    ad_log "  $i"
+  done
+  ad_log ""
+
   ad_debug "distdefs=$distdefs"
 
-  ad_debug "<ad_process_distdefs"
+  ad_debug "Ending processing distdefs"
 }
 
 #
 # Processes for a license header change.
 #
-# Arguments: ad_process_license_header <scriptfile>
+# Arguments: ad_process_license_header <scriptfile> <sourcefile>
 #
 ad_process_license_header()
 {
-  ad_debug ">ad_process_license_header"
+  ad_debug "Starting license header processing"
 
   # Add : separator at the end
   lics=`echo "$licenseh" | sed 's/$/ : /'`
@@ -1130,79 +1437,120 @@ ad_process_license_header()
     # Awk script to replace the license header
     fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
     ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
-    echo "/`cat autodist.lsrc`/,/`cat autodist.ldst`/ { FILE1=\"$src\"; FILE2=\"$dst\"; getline F1 < FILE1; getline F2 < FILE2; if (F1) sub(F1, F2); else { F1=\"\$\"; sub(F1, F2); } }" >> $1
+    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
     rm -f autodist.lsrc autodist.ldst
 
     src=
     dst=
   done
 
-  ad_debug "<ad_process_license_header"
+  ad_debug "Ending license header processing"
 }
 
 #
 # Process specified noprocesses.  This is called during makedist.
+# The noprocess first copies the noprocess files and dirs into a temp
+# directory, and then removes them from the distdir.  This way they are
+# not processed by Autodist.  After processing they are returned to their
+# correct locations from the temp dir.  Dirty, yeah, but the way we do
+# this until better one comes along.
 #
-# Arguments: ad_process_noprocess
+# Arguments: ad_process_noprocess <process>
+#
+# If <process> is true this excludes and if false this includes.
 #
 ad_process_noprocess()
 {
-  ad_debug ">ad_process_noprocess"
-  local np=false
+  ad_debug "Starting running noprocesses"
 
-  local n="sed "
+  set -f
 
-  for i in $noprocess
-  do
-    # Escape
-    ie=`echo $i | sed 's/\\//\\\\\//g'` || exit 1
+  cur=`pwd`
 
-    n="$n -e 's/$am_distdir\\/$ie//'"
-    np=true
-  done
+  if test x$1 = xtrue; then
+    ad_log ""
+    ad_log "Following files and directories were not processed:"
+    ad_log "---------------------------------------------------"
 
-  rm -f autodist.noprocess
-  if test x$np = xtrue; then
-    echo $n > autodist.noprocess || exit 1
+    f="$cur/autodist__noprocess"
+    rm -rf $f
+    mkdir -p -- $f || exit 1
+
+    # First, include them to new location with correct directory structure.
+    old_am_distdir="$am_distdir"
+    cd $am_distdir || exit 1
+    am_distdir="$f"
+    nops=" $noprocess"
+    nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
+    ad_dist_includes "$nops" false false
+    am_distdir="$old_am_distdir"
+
+    # Then, remove from distdir (they are in temp dir now)
+    for i in $noprocess
+    do
+      ad_log "  $i"
+      rm -rf $i
+    done
+    cd $cur || exit 1
+
+    ad_log ""
+  else
+    # Copy from the temp dir back to distdir
+    cd autodist__noprocess || exit 1
+    old_am_distdir="$am_distdir"
+    am_distdir="$cur/$old_am_distdir"
+    nops=" $noprocess"
+    nops=`echo $nops | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
+
+    ad_dist_includes "$nops" false false
+
+    am_distdir="$old_am_distdir"
+    cd $cur || exit 1
+    rm -rf autodist__noprocess
   fi
 
-  ad_debug "<ad_process_noprocess"
+  set +f
+
+  ad_debug "Ending running noprocesses"
 }
 
 #
 # Process a file given as argument for the distribution.
 #
-# Arguments: ad_process_file <filepath> <dest_filepath>
+# Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
 #
 ad_process_file()
 {
   local found=false
+  local f
+  local defs
+  local ndefs
 
   # Process only regular files
   if test '!' -f $1; then
     return
   fi
 
-  ad_debug ">ad_process_file: $1 $2"
+  ad_debug "Starting processing file: $1 $2"
 
-  local f="autodist.tmp.script"
+  f="autodist.tmp.script"
   rm -f $f
 
   # If license header is provided, replace the license header in the file.
-  ad_process_license_header $f
-
-  ad_debug "Getting #ifdef's and #ifndef's"
+  if test x$3 = xtrue; then
+    ad_process_license_header $f $1
+  fi
 
   # Get defined distribution defines
-  local defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
+  defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
 
   # Get explicitly not-defined distribution defines
-  local ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
+  ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
 
-  ad_debug "defs=$defs"
-  ad_debug "ndefs=$ndefs"
+  ad_debug "defs in $1: $defs"
+  ad_debug "ndefs in $1: $ndefs"
 
   # Create the script to include and exclude stuff in the file according
   # to the distribution defines
@@ -1224,9 +1572,9 @@ ad_process_file()
     # This also handles the #ifdef's #else (ie. #ifndef) branch.
     if test x$found = xfalse; then
       ad_debug "ifdef $d will be excluded (it is NOT defined)"
-      echo "/^#ifdef $d/,/^#else !$d|^#endif $d/ { next; }" >> $f
+      echo "/^#ifdef $d$/,/^#else !$d$|^#endif $d$/ { next; }" >> $f
     else
-      echo "/^#else !$d/,/^#endif $d/ { next; }" >> $f
+      echo "/^#else !$d$/,/^#endif $d$/ { next; }" >> $f
     fi
   done
 
@@ -1247,9 +1595,9 @@ ad_process_file()
     # This also handles the #ifndef's #else (ie. #ifdef) branch.
     if test x$found = xtrue; then
       ad_debug "ifndef $d will be excluded (it IS defined)"
-      echo "/^#ifndef $d/,/^#else $d|^#endif $d/ { next; }" >> $f
+      echo "/^#ifndef $d$/,/^#else $d$|^#endif $d$/ { next; }" >> $f
     else
-      echo "/^#else $d/,/^#endif $d/ { next; }" >> $f
+      echo "/^#else $d$/,/^#endif $d$/ { next; }" >> $f
     fi
   done
 
@@ -1268,42 +1616,52 @@ ad_process_file()
 
   rm -f $f
 
-  ad_debug "<ad_process_file: $1 $2"
+  # Log if file was not relicensed
+  if test -f "$1.norelicense"; then
+    ad_log "  $1"
+    rm -f $1.norelicense
+  fi
+
+  ad_debug "Ending processing file: $1 $2"
 }
 
 #
 # Process a source file given as argument for the distribution.
 #
-# Arguments: ad_process_source_file <filepath> <dest_filepath>
+# Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
 #
 ad_process_source_file()
 {
   local found=false
+  local f
+  local defs
+  local ndefs
 
   # Process only regular files
   if test '!' -f $1; then
     return
   fi
 
-  ad_debug ">ad_process_source_file: $1 $2"
+  ad_debug "Starting processing source file: $1 $2"
 
-  local f="autodist.tmp.script"
+  f="autodist.tmp.script"
   rm -f $f
 
   # If license header is provided, replace the license header in the file.
-  ad_process_license_header $f
-
-  ad_debug "Getting #ifdef's and #ifndef's"
+  if test x$3 = xtrue; then
+    ad_process_license_header $f $1
+  fi
 
   # Get defined distribution defines
-  local defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
+  defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
     $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
 
   # Get explicitly not-defined distribution defines
-  local ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
+  ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
     $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
 
-  ad_debug "defs=$defs ndefs=$ndefs"
+  ad_debug "defs in $1: $defs"
+  ad_debug "ndefs in $1: $ndefs"
 
   # Create the script to include and exclude stuff in the file according
   # to the distribution defines
@@ -1325,9 +1683,9 @@ ad_process_source_file()
     # This also handles the #ifdef's #else (ie. #ifndef) branch.
     if test x$found = xfalse; then
       ad_debug "ifdef $d will be excluded (it is NOT defined)"
-      echo "/^#ifdef $d/,/^#else \/\* \!$d|^#endif \/\* $d/ { next; }" >> $f
+      echo "/^#ifdef $d$/,/^#else \/\* \!$d |^#endif \/\* $d / { next; }" >> $f
     else
-      echo "/^#else \/\* \!$d/,/^#endif \/\* $d/ { next; }" >> $f
+      echo "/^#else \/\* \!$d /,/^#endif \/\* $d / { next; }" >> $f
     fi
   done
 
@@ -1348,9 +1706,9 @@ ad_process_source_file()
     # This also handles the #ifndef's #else (ie. #ifdef) branch.
     if test x$found = xtrue; then
       ad_debug "ifndef $d will be excluded (it IS defined)"
-      echo "/^#ifndef $d/,/^#else \/\* $d|^#endif \/\* $d/ { next; }" >> $f
+      echo "/^#ifndef $d$/,/^#else \/\* $d |^#endif \/\* $d / { next; }" >> $f
     else
-      echo "/^#else \/\* $d/,/^#endif \/\* $d/ { next; }" >> $f
+      echo "/^#else \/\* $d /,/^#endif \/\* $d / { next; }" >> $f
     fi
   done
 
@@ -1369,60 +1727,132 @@ ad_process_source_file()
 
   rm -f $f
 
-  ad_debug "<ad_process_source_file: $1 $2"
+  # Log if file was not relicensed
+  if test -f "$1.norelicense"; then
+    ad_log "  $1"
+    rm -f $1.norelicense
+  fi
+
+  ad_debug "Ending processing source file: $1 $2"
+}
+
+#
+# Processes a file.  This is the -p, --process option.
+#
+# Arguments: ad_process <type> <src> <dst>
+#
+ad_process()
+{
+  ad_debug "Starting process: $1 $2 $3"
+
+  nolog=true
+
+  if test '!' -f autodist.dist; then
+    ad_fatal "Autodist has not been run yet to prepare source tree"
+  fi
+
+  # Parse distribution
+  distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
+  dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
+  ad_parse_distribution $distribution false
+  ad_process_distdefs
+
+  # Process file
+  case "$1" in
+    makefile)
+      if test -z $3; then
+       ad_fatal "File type $1 requires <dst> argument"
+      fi
+      ad_make_makefile_am $2 $3
+      exit 0;;
+
+    configure)
+      ad_make_configure_ac $2
+      exit 0;;
+
+    non-source)
+      if test -z $3; then
+       ad_fatal "File type $1 requires <dst> argument"
+      fi
+      ad_process_file $2 $3 false
+      exit 0;;
+
+    source)
+      if test -z $3; then
+       ad_fatal "File type $1 requires <dst> argument"
+      fi
+      ad_process_source_file $2 $3 false
+      exit 0;;
+
+    *)
+      ad_fatal "Unknown file type: $1";
+      ;;
+  esac
 }
 
 #
 # Run hooks
 #
-# Arguments: ad_run_hooks <hooks>
+# Arguments: ad_run_hooks <hooks> <params>
 #
 ad_run_hooks()
 {
-  ad_debug ">ad_run_hooks: $1"
+  ad_debug "Running hooks: $1"
+
+  ad_log ""
+  ad_log "Hooks executed:"
+  ad_log "--------------"
 
   for i in $1
   do
     if test '!' -f $i; then
       ad_fatal "Hook script $i does not exist"
     fi
-    sh $i $distribution $dist_version $package || exit 1
+    ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$2\""
+    sh $i "$distribution" "$dist_version" "$package" "$2" || exit 1
   done
+  ad_log ""
 
-  ad_debug "<ad_run_hooks: $1"
+  ad_debug "Ending running hooks: $1"
 }
 
 #
 # Run dist hooks
 #
-# Arguments: ad_run_dist_hooks <hooks>
+# Arguments: ad_run_dist_hooks <hooks> <params>
 #
 ad_run_dist_hooks()
 {
-  ad_debug ">ad_run_dist_hooks: $1"
+  ad_debug "Starting running distributions hooks: $1"
+
+  ad_log ""
+  ad_log "Distribution hooks executed:"
+  ad_log "----------------------------"
 
   for i in $1
   do
     if test '!' -f $i; then
       ad_fatal "Dist hook script $i does not exist"
     fi
-    sh $i $distribution $dist_version $package $am_distdir || exit 1
+
+    ad_log "  sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\" \"$2\""
+    sh $i "$distribution" "$dist_version" "$package" "$am_distdir" "$2" || exit 1
   done
+  ad_log ""
 
-  ad_debug "<ad_run_dist_hooks: $1"
+  ad_debug "Ending running distribution hooks"
 }
 
 ###############################################################################
 # Autodist code
 
-usage="Usage: autodist [options] [distribution] [version]"
+usage="Usage: autodist [options] [distribution] [version] [params]"
 help="\
 Autodist prepares source tree for configuration, compilation and
-distribution.  Prepares the source tree from the \`autodist.ad'
-configuration file.  Generates Automake.am files from Automake.ad
-files, configure.ac file from configure.ad file(s), generates the
-configure script by running Autoconf tool, and generates Makefile.in
-files by running Automake tool.
+distribution.  Generates Automake.am files from Automake.ad files,
+configure.ac file from configure.ad file(s), generates the configure
+script by running Autoconf tool, and generates Makefile.in files by
+running Automake tool.
 
 Operation modes:
   -h, --help                print this help, then exit
@@ -1432,6 +1862,10 @@ Operation modes:
   -s, --distdefs [<dist>]   print distribution defines of <dist>, then exit
   -i, --init                initialize Autodist environment, create default
                             distribution directory and distribution, then exit
+  -p, --process <type> <src> [<dst>]
+                            process file <src> into <dst> for distribution,
+                            <type> is 'makefile', 'configure', 'non-source'
+                            or 'source' and defines the type of <src>
   -m, --makedist            create and package distribution
       --gzip                create package compressed with gzip (default)
       --bzip2               create also package compressed with bzip2
@@ -1464,13 +1898,25 @@ while test $# -gt 0; do
     fi
     ad_process_distdefs
     echo "Distdefs:" 1>&2;
-    echo "${distdefs}";
+    for i in $distdefs
+    do
+      echo "$i";
+    done
     exit 0;;
 
   -i | --init)
     ad_initialize;
     exit 0;;
 
+  -p | --process)
+    shift;
+    if test $# -ge 2; then
+      ad_process $1 $2 $3
+    else
+      echo "${usage}" 1>&2;
+    fi
+    exit 0;;
+
   -m | --makedist)
     ad_makedist
     exit 0;;
@@ -1506,7 +1952,7 @@ while test $# -gt 0; do
     echo "@PACKAGE@ (@PACKAGE_NAME@) $ver" 1>&2;
     echo "Written by Pekka Riikonen" 1>&2;
     echo 1>&2;
-    echo "Copyright (C) 2004 - 2005 SILC Project" 1>&2;
+    echo "Copyright (C) 2004 - 2007 SILC Project" 1>&2;
     echo "\
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>&2;
@@ -1526,6 +1972,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>
   esac
 done
 
+# Open log file
+ad_log_open "autodist.log"
+
+ad_log "Processing source tree for compilation and configuration"
+ad_log "--------------------------------------------------------"
+ad_log ""
+
 #
 # Parse the requested distribution
 #
@@ -1534,13 +1987,18 @@ if test $# != 0; then
   distfile=$distribution
   shift
 fi
+
 ad_parse_distribution $distribution false
-ad_process_distdefs
 
 if test $# != 0; then
   dist_version="${1}";
 fi
 
+ad_log "  Distribution: $distribution $dist_version"
+ad_log ""
+
+ad_process_distdefs
+
 ad_debug "Preparing source tree for configuration and compilation..."
 ad_debug "Preparing $distribution distribution version $dist_version"
 
@@ -1553,10 +2011,15 @@ else
   ad_fatal "DISTDEFS not defined in $distdir/autodist.conf"
 fi
 
+# Get extra parameters from command line
+if test $# != 0; then
+  shift
+fi
+
 #
 # Run pre-hooks
 #
-ad_run_hooks "$pre_hooks"
+ad_run_hooks "$pre_hooks" "$@"
 
 #
 # Generate the Makefile.am files from Makefile.ad files
@@ -1568,6 +2031,11 @@ ad_make_makefile_ams
 #
 ad_make_configure_ac ./configure.ad
 
+#
+# Process all files with .ad suffix for distribution processing
+#
+ad_process_ads
+
 #
 # Generate configure script
 #
@@ -1578,23 +2046,21 @@ ad_make_configure
 #
 ad_make_makefile_ins
 
-#
-# Process all files with .ad suffix for distribution processing
-#
-ad_process_ads
-
 #
 # Create autodist.dist
 #
 ad_debug "Creating autodist.dist"
 echo "dist:$distfile" > autodist.dist
 echo "ver:$dist_version" >> autodist.dist
-echo "$package-$dist_version" >> autodist.dist
+echo "distdir:$package-$dist_version" >> autodist.dist
+echo "params:$@" >> autodist.dist
 
 #
 # Run post-hooks
 #
-ad_run_hooks "$post_hooks"
+ad_run_hooks "$post_hooks" "$@"
 
+ad_log "Source tree processed successfully."
 ad_debug "Done, now run ./configure and make."
+
 exit 0