3 # Author: Pekka Riikonen <priikone@silcnet.org>
5 # Copyright (C) 2005 Pekka Riikonen
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions are
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
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.
33 ###############################################################################
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.
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+"$@"}'='"$@"'
45 DUALCASE=1; export DUALCASE # for MKS sh
47 # Support unset when possible.
48 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
54 # Work around bugs in pre-3.0 UWIN ksh.
55 $as_unset ENV MAIL MAILPATH
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 \
66 if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
67 eval $as_var=C; export $as_var
74 ###############################################################################
77 # Packaging and compressing
83 # Distribution subdirectory
87 # This current distribution
89 distfile=$distribution
94 # All inherited distributions in this distribution
97 # All distribution defines for this distribution
100 # All distribution undefines for this distribution
103 # All distribution options
126 # Distribution license and license header
130 # Whether to output ad_debug information
136 ###############################################################################
138 if test -f "$distdir/autodist.conf"; then
139 . $distdir/autodist.conf
145 ###############################################################################
149 # Print out debug information if debugging is enabled. To enable debugging
150 # set the global variable "debug" to true value.
152 # Arguments: ad_debug <ad_debug string>
156 if test x$debug = xtrue; then
164 # Prints out error message and exits the script.
166 # Arguments: ad_fatal <error message>
172 echo autodist: error: $1
178 # Prints out warning message
180 # Arguments: ad_warning <warning message>
186 echo autodist: warning: $1
193 # Arguments: ad_log_open <logfile>
201 This file contains messages produced by the Autodist $ver.
207 # Prints to an open log file
217 # Initializes the Autodist environment, creates default distribution
218 # directory, and default distribution.
220 # Arguments: ad_initialize
224 ad_debug "Initializing Autodist environment"
226 # Create default distdir
227 if test '!' -f $distdir; then
231 # Create Autodist configuration file
232 if test -f @AUTODISTDIR@/autodist.conf; then
233 cp -p @AUTODISTDIR@/autodist.conf $distdir
236 # Create default distribution
237 if test -f @AUTODISTDIR@/default; then
238 cp -p @AUTODISTDIR@/default $distdir
241 ad_debug "Autodist environment initialized"
245 # Creates the distdefs header file including defined distdefs
247 # Arguments: ad_create_distdefs_h
249 ad_create_distdefs_h()
251 ad_debug "Creating distdef header file"
257 Automatically generated by Autodist $ver. Do not edit.
259 Generated: `date` by `whoami`
260 Distribution: $distribution
264 #ifndef _`echo $DP`_DISTDEFS_H
265 #define _`echo $DP`_DISTDEFS_H
271 echo "#define $i 1" >>$fname
276 #endif /* _`echo $DP`_DISTDEFS_H */
279 ad_debug "Distdef header file created"
283 # Creates the main configure script for the distribution. This runs
284 # the aclocal, autoheader and autoconf tools.
286 # Arguments: ad_make_configure
290 local run_autoconf=false
292 ad_debug "Starting configure creation"
296 if test "$ACLOCAL"; then
297 ad_debug "Running aclocal"
298 if test x$debug = xtrue; then
301 $ACLOCAL 1>/dev/null 2>/dev/null
303 if test $? != 0; then
304 ad_fatal "aclocal failed"
308 if test "$AUTOCONF"; then
309 ad_debug "Running autoconf"
311 if test $? != 0; then
312 ad_fatal "autoconf failed"
317 if test "$AUTOHEADER"; then
318 ad_debug "Running autoheader"
320 if test $? != 0; then
321 ad_fatal "autoheader failed"
325 if test "$LIBTOOLIZE"; then
326 ad_debug "Running libtoolize"
328 if test $? != 0; then
329 ad_fatal "libtoolize failed"
333 if test x$run_autoconf = xtrue; then
334 if test '!' -f configure; then
335 ad_fatal "creating configure script failed"
339 ad_debug "Ending configure creation"
343 # Creates the configure.ac script from the configure.ad fragments in
344 # the source tree. Takes the source configure file as argument which
345 # is used to create the actual configure.ac.
347 # Arguments: ad_make_configure_ac <configure_ac_source>
349 ad_make_configure_ac()
353 ad_debug "Starting creating configure.ac: $1"
356 ad_log "Following configure.ad files were processed into configure.ac:"
357 ad_log "--------------------------------------------------------------"
359 if test '!' -f $1; then
360 ad_fatal "The configure file '$1' does not exist"
363 check="`sed 's/^[ ]*//' < $1 | grep -v "^#" | grep -e "AD_INIT"`"
364 if test -z $check; then
365 rm -f configure.ad.cfs
366 rm -f $fname $fname.tmp
367 ad_fatal "The 'AD_INIT' macro has not been set in configure.ac"
370 rm -f configure.ac configure.ad.cfs
372 cfs=`find . -name configure\*\.ad`
375 if test "x$i" = "x$1"; then
379 ad_debug "including $i"
382 cat $i >> configure.ad.cfs
385 if test -f configure.ad.cfs; then
386 check="`sed 's/^[ ]*//' < $1 | grep -v "^#" | grep -e "AD_INCLUDE_CONFIGURE"`"
387 if test -z $check; then
388 rm -f configure.ad.cfs
389 ad_warning "configure.ad fragments found but 'AD_INCLUDE_CONFIGURE' is not set"
393 # Header for configure.ac
394 fname="configure.tmp.ac"
396 # Automatically generated by Autodist $ver. Do not edit.
397 # To make changes edit the configure.ad file in the source tree.
399 # Source: configure.ad
400 # Generated: `date` by `whoami`
401 # Distribution: $distribution
406 ad_debug "creating configure.ac"
407 if test -f configure.ad.cfs; then
408 sed '/AD_INCLUDE_CONFIGURE/ r configure.ad.cfs' $1 > $fname.tmp
409 sed -e "/AD_INCLUDE_CONFIGURE/s///" $fname.tmp >> $fname
410 rm -f configure.ad.cfs $fname.tmp
416 sed -e "/AD_INIT/s//AC_INIT([$distribution], [$dist_version], [$bug_report], [$package])/" $fname > $fname.tmp
418 # Process for distribution
420 ad_process_file $fname.tmp $fname false
422 # Remove any trailing backslashes
423 if test -f "$fname"; then
424 sed -e :a -e '/\\$/N; s/[ ]*\\\n//; ta' < $fname > configure.ac
426 cp -p $fname.tmp configure.ac
428 rm -f $fname $fname.tmp
430 ad_log " ./configure.ad"
433 ad_debug "Ending creating configure.ac: $1"
437 # Creates the Makefile.in files by running the automake tool.
439 # Arguments: ad_make_makefile_ins
441 ad_make_makefile_ins()
443 ad_debug "Starting creating Makefile.in files"
445 if test "$AUTOMAKE"; then
446 ad_debug "Running automake"
448 if test $? != 0; then
449 ad_fatal "automake failed"
453 ad_debug "Ending creating Makefile.in files"
457 # Creates the Makefile.am files from the Makefile.ad files in the
458 # source tree. This runs the distribution specific processing for the
461 # Arguments: ad_make_makefile_ams
463 ad_make_makefile_ams()
465 ad_debug "Starting creating Makefile.am files"
468 ad_log "Following Makefile.ad files were processed into Makefile.am files:"
469 ad_log "------------------------------------------------------------------"
471 files=`find . -name Makefile\.ad`
475 fname=`echo $ff | sed s/\.ad//`
477 # Header for the Makefile.am
478 cat > $fname.am <<EOF
479 # Automatically generated by Autodist $ver from Makefile.ad. Do not edit.
480 # To make changes edit the $ff file in the source tree.
483 # Generated: `date` by `whoami`
484 # Distribution: $distribution
489 # Run the distribution processing for this Makefile.ad
490 ad_debug "Processing $ff to be $fname.am"
491 ad_process_file $ff $fname.tmp false
493 # Remove any trailing backslashes
494 if test -f "$fname.tmp"; then
495 sed -e :a -e '/\\$/N; s/[ ]*\\\n//; ta' < $fname.tmp >> $fname.am
504 ad_debug "Ending creating Makefile.am files"
508 # Processes all files with .ad suffix, with exception of configure*.ad
509 # and Makefile.ad files, for distribution from the source tree.
511 # Arguments: ad_process_ads false
515 ad_debug "Starting processing .ad files"
518 ad_log "Following .ad files were processed:"
519 ad_log "-----------------------------------"
521 files=`find . -name \*\.ad \! -name configure\*\.ad \! -name Makefile\.ad`
524 fname=`echo $i | sed s/\.ad//`
526 ad_debug "Processing $i to be $fname"
527 ad_log " $i into $fname"
529 # Run the distribution processing for this file
530 ad_process_file $i $fname false
531 if test -f $fname; then
532 cp -p $i $fname || exit 1
538 ad_debug "Ending processing .ad files"
542 # Includes files specified in the distribution for inclusion. Used when
543 # creating the distribution for packaging.
545 # include has the following format in distfile:
547 # include <path> [<dest path>]
549 # If only source path, which may be file, directory or regular expression,
550 # is specified the path will be same in distribution. If the destination
551 # path is specified that will be the new name and/or new location of the
552 # source path. This, in effect, is a cp utility with ability to create
553 # directories if they do not exist.
555 # Arguments: ad_dist_includes <includeslist> <recursive>
561 ad_debug "Starting running includes: $1 $2"
564 ad_log "Following files and directories were included in distribution:"
565 ad_log "--------------------------------------------------------------"
567 # By default do not expand pathnames
570 # Add : separator at the end
571 incs="`echo "$1" | sed 's/$/ : /'`"
577 if test "$i" = ":" && test -z "$src"; then
580 if test -z "$src"; then
584 if test -z "$dst" && test "$i" != ":"; then
590 ad_debug "Including $src into $dst"
592 if test -f "$src"; then
595 if test "$src" = "$dst"; then
596 # Add to same location
597 d=`echo $src | sed 's,/[^/]*$,,'`
598 if test "$d" != "$src" && test "$d" != "." && \
599 test '!' -d $am_distdir/$d; then
600 mkdir -p $am_distdir/$d || exit 1
603 # Add to different location
604 check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
605 if test "$check" != "$dst"; then
606 ad_fatal "Invalid destination in 'include $src $dst'"
609 d=`echo $dst | sed 's,/[^/]*$,,'`
610 if test "$d" != "$dst" && test "$d" != "." && \
611 test '!' -d $am_distdir/$d; then
612 mkdir -p $am_distdir/$d || exit 1
616 ad_log " $src into $am_distdir/$d"
617 cp -p $src $am_distdir/$d || exit 1
619 elif test -d "$src"; then
622 if test "$src" = "$dst"; then
623 # Add to same location
624 d=`echo $src | sed 's,/[^/]*$,,'`
625 ds=`echo $src | sed 's/\/$//'`
626 if test "$ds" = "$d"; then
627 d=`echo $d | sed 's,/[^/]*$,,'`
629 if test "$ds" = "$d"; then
632 if test '!' -d $am_distdir/$d && test "$ds" != "$d"; then
633 mkdir -p $am_distdir/$d || exit 1
638 ad_log " $src into $am_distdir/$d"
639 cp -pR $src $am_distdir/$d || exit 1
641 # Add to different location
642 check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
643 if test "$check" != "$dst"; then
644 ad_fatal "Invalid destination in 'include $src $dst'"
647 d=`echo $dst | sed 's,/[^/]*$,,'`
648 ds=`echo $dst | sed 's/\/$//'`
649 if test "$ds" = "$d"; then
650 d=`echo $d | sed 's,/[^/]*$,,'`
652 if test '!' -d $am_distdir/$d && test "$dst" != "$d"; then
653 mkdir -p $am_distdir/$d || exit 1
656 ad_log " $src into $am_distdir/$dst"
657 cp -pR $src $am_distdir/$dst || exit 1
660 elif test x$2 != xtrue; then
661 # We assume regular expression in filename
662 check=`echo "$src" | sed 's/?//; s/*//; s/\[//; s/\]//'`
663 if test "$check" == "$src"; then
664 if test '!' -a $src; then
665 ad_fatal "Including $src: No such file or directory"
672 # Recursively call this function with expanded pathnames. The
673 # reason why we don't let sh by default expand pathnames is that
674 # the include's destination is optional. If sh expands by default
675 # we don't know the destination. For this reason, we handle the
676 # expansion here ourselves.
678 # If src and dst are same, then expand the pathname as we'll copy
679 # matches to their own locations.
680 if test "$src" = "$dst"; then
681 # Expand pathnames, and format to our include format
683 srcs=`echo $src | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
686 # Destination is new, and it has to be a directory.
687 check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
688 if test "$check" != "$dst"; then
689 ad_fatal "Invalid destination in 'include $src $dst'"
692 # Make sure dst has / at the end, as this must be a directory
693 dst=`echo $dst | sed 's/\/$//; s/$/\//'`
696 dste=`echo $dst | sed 's/\\//\\\\\//g'` || exit 1
698 # Expand pathnames, and format to our include format
700 srcs=`echo $src | sed -e "s/ / $dste : /g" \
701 -e 's/^/ : /' -e "s/$/ $dste/"` || exit 1
705 # Include recursively
706 ad_dist_includes "$srcs" true
708 elif test '!' -a $src; then
709 ad_fatal "Including $src: No such file or directory"
719 ad_debug "Ending running includes: $1 $2"
723 # Excludes files specified in the distribution for exclusion. Used when
724 # creating the distribution for packaging.
726 # exclude has the following format in distfile:
730 # The path may be file, directory or regular expression.
732 # Arguments: ad_dist_includes <excludelist>
736 ad_debug "Starting running excludes: $1"
739 ad_log "Following files and directories were excluded from distribution:"
740 ad_log "----------------------------------------------------------------"
744 ad_debug "Excluding $i"
746 rm -rf $am_distdir/$i
750 ad_debug "Ending running excludes: $1"
754 # Processes the entire tree for distribution. This inspects files other
755 # than source and header files, with exception of any file with .ad
756 # suffix, and performs distribution processing for the file. The original
757 # file is replaced with the processed file. This function is used when
758 # creating the distribution for packaging.
760 # Arguments: ad_process_tree <directory>
764 ad_debug "Starting processing non-source files: $1"
766 # Take files, except source and .ad files.
767 files=`find $am_distdir \! -name \*\.ad \( \
768 \! -name \*\.[cC] -a \
769 \! -name \*\.[cC][cCpP] -a \
770 \! -name \*\.[cC][xX][xX] -a \
771 \! -name \*\.[cC][pP][pP] -a \
772 \! -name \*\.[cC]++ -a \
774 \! -name \*\.[hH] -a \
776 \! -name \*\.[cC]\.in -a \
777 \! -name \*\.[cC][cCpP]\.in -a \
778 \! -name \*\.[cC][xX][xX]\.in -a \
779 \! -name \*\.[cC][pP][pP]\.in -a \
780 \! -name \*\.[cC]++\.in -a \
781 \! -name \*\.m\.in -a \
782 \! -name \*\.[hH]\.in -a \
783 \! -name \*\.hh\.in \)`
784 files=`echo $files | sed 's/$am_distdir//'`
786 # Take away noprocess list
787 if test -f autodist.noprocess; then
788 files=`echo $files" " | sh autodist.noprocess` || exit 1
793 ad_process_file $ff $ff.tmp true
794 if test -f $ff.tmp; then
796 mv -f $ff.tmp $ff || exit 1
800 ad_debug "Ending processing non-source files: $1"
804 # Processes the entire source tree for distribution. This inspects files
805 # in the source tree, with exception of any file with .ad suffix, and
806 # performs distribution processing for the file. The original file is
807 # replaced with the processed file. This function is used when creating
808 # the distribution for packaging.
810 # Call this before ad_process_tree().
812 # Arguments: ad_process_source_tree <directory>
814 ad_process_source_tree()
816 ad_debug "Starting processing source files: $1"
818 # We take only C/C++ files since they use the C compiler friendly
819 # version of distdefs. Other files are not assumed to use them.
820 files=`find $am_distdir \! -name \*\.ad \( \
822 -name \*\.[cC][cCpP] -o \
823 -name \*\.[cC][xX][xX] -o \
824 -name \*\.[cC][pP][pP] -o \
825 -name \*\.[cC]++ -o \
829 -name \*\.[cC]\.in -o \
830 -name \*\.[cC][cCpP]\.in -o \
831 -name \*\.[cC][xX][xX]\.in -o \
832 -name \*\.[cC][pP][pP]\.in -o \
833 -name \*\.[cC]++\.in -o \
835 -name \*\.[hH]\.in -o \
838 # Take away noprocess list
839 if test -f autodist.noprocess; then
840 files=`echo $files" " | sh autodist.noprocess` || exit 1
845 ad_process_source_file $ff $ff.tmp true
846 if test -f $ff.tmp; then
848 mv -f $ff.tmp $ff || exit 1
852 ad_debug "Ending processing source files: $1"
856 # Makes distribution sane, ala modtimes. Since we modify the distribution
857 # we need to make it sane after that.
859 # Arguments: ad_makedist_makesane
861 ad_makedist_makesane()
863 ad_debug "Making distribution file modtimes sane"
865 # DO NOT change these order unless you know what you are doing.
866 if test -f $am_distdir/configure.ac; then
867 touch $am_distdir/configure.ac
870 if test -f $am_distdir/aclocal.m4; then
871 touch $am_distdir/aclocal.m4
874 if test '!' -f Makefile; then
875 ad_fatal "Makefile: No such file or directory"
878 configh=`grep "^CONFIG_HEADER" Makefile | cut -d= -f2 | sed 's/^[ ]*//'`
879 touch $am_distdir/$configh.in 1>/dev/null 2>/dev/null
881 files=`find $am_distdir -name Makefile\.in`
887 if test -f $am_distdir/configure; then
888 touch $am_distdir/configure
891 if test -f $am_distdir/config.status; then
892 touch $am_distdir/config.status
895 ad_debug "Distribution made sane"
899 # Creates distribution of the source tree. All files in the distribution
900 # will be processed and the distribution will be packaged.
902 # Arguments: ad_makedist
906 ad_log_open "makedist.log"
907 ad_debug "Starting distribution creation"
909 ad_log "Starting distribution creation"
910 ad_log "------------------------------"
913 if test '!' -f autodist.dist; then
914 ad_fatal "Autodist has not been run yet to prepare source tree"
917 if test -z $MAKE; then
918 ad_fatal "The MAKE variable is not set in autodist.conf"
921 # Get distdir from Makefile
922 if test '!' -f Makefile; then
923 ad_fatal "The source tree is not configured, run ./configure first"
926 # Parse the requested distribution
927 distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
928 dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
929 am_distdir=`grep "distdir:" < autodist.dist | cut -d: -f2` || exit 1
930 ad_parse_distribution $distribution false
931 ad_log " Distribution: $distribution $dist_version"
932 ad_log " Destination directory: $am_distdir"
935 if test x$opt_no_dist = xtrue; then
936 ad_fatal "The '$distribution' distribution cannot be packaged"
940 ad_run_dist_hooks "$pre_dist_hooks"
942 # Create distribution directory
943 ad_debug "Creating distribution directory $am_distdir"
944 $MAKE distdir || exit 1
945 chmod -R a+r $am_distdir
947 if test '!' -d $am_distdir; then
948 ad_fatal "Distribution directory $am_distdir not created"
951 # Run pre-process-dist-hooks
952 ad_run_dist_hooks "$pre_p_dist_hooks"
955 ad_dist_excludes "$excludes"
958 ad_dist_includes "$includes"
960 # Include specific license file if specified
961 if test "$license" != ""; then
963 ad_log "License file in distribution:"
964 ad_log "-----------------------------"
965 ad_log " $license into $am_distdir/COPYING"
966 cp -p $license $am_distdir/COPYING || exit 1
969 # Process noprocesses
973 ad_log "Following files were not re-licensed:"
974 ad_log "-------------------------------------"
976 # Process source files
977 ad_debug "Process distribution source tree"
978 ad_process_source_tree $am_distdir
980 # Process non-source files
981 ad_debug "Process distribution tree"
982 ad_process_tree $am_distdir
984 # Run post-process_dist-hooks
985 ad_run_dist_hooks "$post_p_dist_hooks"
987 # Make distribution sane
991 ad_debug "Packaging distribution"
992 tar chof $am_distdir.tar $am_distdir || exit 1
995 ad_debug "Compressing distribution package"
996 if test x$ad_gzip = xtrue; then
997 ad_debug "Compressing distribution package $am_distdir.tar.gz"
998 gzip -9 -c $am_distdir.tar > $am_distdir.tar.gz || exit 1
1000 if test x$ad_bzip2 = xtrue; then
1001 ad_debug "Compressing distribution package $am_distdir.tar.bz2"
1002 bzip2 -9 -c $am_distdir.tar > $am_distdir.tar.bz2 || exit 1
1004 if test x$ad_compress = xtrue; then
1005 ad_debug "Compressing distribution package $am_distdir.tar.Z"
1006 compress -c $am_distdir.tar > $am_distdir.tar.Z || exit 1
1008 if test x$ad_zip = xtrue; then
1009 rm -f $am_distdir.zip
1010 ad_debug "Compressing distribution package $am_distdir.zip"
1011 zip -rq $am_distdir.zip $am_distdir || exit 1
1013 rm -f $am_distdir.tar
1015 # Run post-dist-hooks
1016 ad_run_dist_hooks "$post_dist_hooks"
1020 rm -f autodist.noprocess
1022 ad_log "Distribution created successfully."
1024 ad_debug "Ending distribution creation"
1028 # Handles distribution options.
1030 # option has the following format in distfile:
1034 # Following options are supported:
1040 # Arguments: ad_handle_options <options>
1044 ad_debug "Handling options: $1"
1048 if test "$i" = "template"; then
1051 elif test "$i" = "no-dist"; then
1054 elif test "$i" = "no-inherit"; then
1062 # Clears set options
1064 # Arguments: ad_clear_options
1070 opt_no_inherit=false
1074 # Parses the distribution. Gets all distribution defines from the
1075 # distribution. This also expands all inherited distributions recursively
1076 # to get all inherited distribution defines. From inherited distributions
1077 # their name and package name is not inherited.
1079 # Arguments: ad_parse_distribution <distribution name> <inherit>
1081 ad_parse_distribution()
1100 ad_debug "Starting parsing distribution: $1 $2"
1102 if test '!' -f $distdir/$1; then
1103 ad_fatal "Distribution '$1' is not declared"
1107 inhs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1108 | grep "inherit " | cut -d' ' -f2 | sort | uniq`
1111 defs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1112 | grep "define " | cut -d' ' -f2 | sort | uniq`
1114 if test "$inhs" = "" && test "$defs" = ""; then
1115 ad_fatal "Distribution '$1' does not define anything"
1118 # Get undefined distdefs
1119 undefs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1120 | grep "undef " | cut -d' ' -f2 | sort | uniq`
1123 incs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1124 | grep "include " | sed 's/include / : /'`
1127 excs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1128 | grep "exclude " | cut -d' ' -f2- | sort | uniq`
1131 nops=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1132 | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
1135 opts=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1136 | grep "option " | cut -d' ' -f2- | sort | uniq`
1139 ad_handle_options "$opts"
1140 if test x$2 = xtrue && test x$opt_no_inherit = xtrue; then
1141 ad_fatal "Distribution '$1' cannot be inherited"
1143 if test x$2 = xfalse && test x$opt_template = xtrue; then
1144 ad_fatal "Template distribution '$1' cannot be prepared or packaged"
1147 ad_debug "inherits: $inhs"
1148 ad_debug "distdefs: $defs"
1149 ad_debug "includes: $incs"
1150 ad_debug "excludes: $excs"
1151 ad_debug "noprocess: $nops"
1152 ad_debug "undistdefs: $undefs"
1153 ad_debug "options: $opts"
1155 # Expand distdefs from inherited distributions
1158 if test x$1 = x$i; then
1159 ad_fatal "Infinite recursion detected. Fix the '$distdir/$1' \
1160 distribution to not have 'inherit $i' declared."
1163 if test '!' -f $distdir/$i; then
1164 ad_fatal "Distribution '$i' is not declared (inherited from '$1')"
1167 ad_parse_distribution $i true
1172 license=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1173 | grep "license " | cut -d' ' -f2`
1174 licenseh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1175 | grep "license-header " | sed 's/license-header / : /'`
1177 ad_debug "license: $license"
1178 ad_debug "licenseh: $licenseh"
1180 if test x$2 = xfalse; then
1181 # Take rest of the stuff from top distribution
1183 # We take precedence on defined and undefined distdefs. Remove
1184 # undefined distdefs if we have defined them.
1187 ad_debug "defining undefined $d distdef"
1188 undistdefs=`echo $undistdefs | sed s/$d//g`
1191 # Get distribution name
1192 dname=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1193 | grep "name " | cut -d' ' -f2-`
1195 if test "$dname"; then
1199 # Get distribution package name (optional)
1200 dpname=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1201 | grep "package " | cut -d' ' -f2`
1203 if test "$dpname"; then
1206 package=$distribution
1209 # Get Bug-report email address (optional)
1210 bugr=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1211 | grep "bug-report " | cut -d' ' -f2-`
1213 if test "$bugr"; then
1217 ad_debug "distribution: $distribution"
1218 ad_debug "package: $package"
1219 ad_debug "bug-report: $bug_report"
1221 # Get hooks (optional)
1222 prh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1223 | grep "pre-hook " | cut -d' ' -f2-`
1224 poh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1225 | grep "post-hook " | cut -d' ' -f2-`
1226 prdh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1227 | grep "pre-dist-hook " | cut -d' ' -f2-`
1228 podh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1229 | grep "post-dist-hook " | cut -d' ' -f2-`
1230 prpdh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1231 | grep "pre-process-dist-hook " | cut -d' ' -f2-`
1232 popdh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1233 | grep "post-process-dist-hook " | cut -d' ' -f2-`
1235 pre_hooks="$pre_hooks $prh"
1236 post_hooks="$post_hooks $poh"
1237 pre_dist_hooks="$pre_dist_hooks $prdh"
1238 post_dist_hooks="$post_dist_hooks $podh"
1239 pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
1240 post_p_dist_hooks="$post_p_dist_hooks $popdh"
1241 doptions="$doptions $opts"
1243 ad_handle_options "$doptions"
1244 ad_debug "options: $doptions"
1248 inherits="$inherits $inhs"
1249 distdefs="$distdefs $defs"
1250 includes="$includes $incs"
1251 excludes="$excludes $excs"
1252 noprocess="$noprocess $nops"
1253 undistdefs="$undistdefs $undefs"
1255 ad_debug "Ending parsing distribution: $1 $2"
1259 # Processes parsed distdefs. Removes duplicates, and undefined distdefs
1260 # from the distdefs.
1262 # Arguments: ad_process_distdefs
1264 ad_process_distdefs()
1266 ad_debug "Starting processing distdefs"
1269 ad_log "Following distdefs were processed:"
1270 ad_log "----------------------------------"
1272 # Remove all undefined distribution defines
1273 for i in $undistdefs
1275 ad_debug "undefining $i distdef"
1276 distdefs=`echo $distdefs | sed s/$i//g`
1279 rm -f autodist.tmp.defs
1281 # Remove duplicate distdefs
1284 echo $i >>autodist.tmp.defs
1286 distdefs=`sort < autodist.tmp.defs | uniq`
1287 distdefs=`echo $distdefs`
1288 rm -f autodist.tmp.defs
1297 ad_debug "distdefs=$distdefs"
1299 ad_debug "Ending processing distdefs"
1303 # Processes for a license header change.
1305 # Arguments: ad_process_license_header <scriptfile> <sourcefile>
1307 ad_process_license_header()
1309 ad_debug "Starting license header processing"
1311 # Add : separator at the end
1312 lics=`echo "$licenseh" | sed 's/$/ : /'`
1318 if test "$i" = ":" && test -z "$src"; then
1321 if test -z "$src"; then
1325 if test -z "$dst" && test "$i" != ":"; then
1328 ad_fatal "Missing argument in 'license-header $src'"
1331 ad_debug "Replacing $src license with $dst license"
1333 if test '!' -f $src; then
1334 ad_fatal "License header $src: No such file or directory"
1337 if test '!' -f $dst; then
1338 ad_fatal "License header $dst: No such file or directory"
1341 # Awk script to replace the license header
1342 fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
1343 ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
1344 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
1345 rm -f autodist.lsrc autodist.ldst
1351 ad_debug "Ending license header processing"
1355 # Process specified noprocesses. This is called during makedist.
1357 # Arguments: ad_process_noprocess
1359 ad_process_noprocess()
1364 ad_debug "Starting running noprocesses"
1367 ad_log "Autodist did not process the following files:"
1368 ad_log "---------------------------------------------"
1371 cd $am_distdir || exit 1
1377 ie=`echo $i | sed 's/\\//\\\\\//g'` || exit 1
1379 n="$n -e 's/$am_distdir\\/$ie //'"
1384 rm -f autodist.noprocess
1385 if test x$np = xtrue; then
1386 echo $n > autodist.noprocess || exit 1
1390 ad_debug "Ending running noprocesses"
1394 # Process a file given as argument for the distribution.
1396 # Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
1405 # Process only regular files
1406 if test '!' -f $1; then
1410 ad_debug "Starting processing file: $1 $2"
1412 f="autodist.tmp.script"
1415 # If license header is provided, replace the license header in the file.
1416 if test x$3 = xtrue; then
1417 ad_process_license_header $f $1
1420 ad_debug "Getting #ifdef's and #ifndef's"
1422 # Get defined distribution defines
1423 defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
1424 $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1426 # Get explicitly not-defined distribution defines
1427 ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
1428 $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1430 ad_debug "defs in $1: $defs"
1431 ad_debug "ndefs in $1: $ndefs"
1433 # Create the script to include and exclude stuff in the file according
1434 # to the distribution defines
1437 ad_debug "processing ifdefs"
1443 if test x$d = x$i; then
1449 # If distribution define was not found exclude those lines from the file.
1450 # This also handles the #ifdef's #else (ie. #ifndef) branch.
1451 if test x$found = xfalse; then
1452 ad_debug "ifdef $d will be excluded (it is NOT defined)"
1453 echo "/^#ifdef $d/,/^#else !$d|^#endif $d/ { next; }" >> $f
1455 echo "/^#else !$d/,/^#endif $d/ { next; }" >> $f
1460 ad_debug "processing ifndefs"
1466 if test x$d = x$i; then
1472 # If distribution define was found exclude those lines from the file.
1473 # This also handles the #ifndef's #else (ie. #ifdef) branch.
1474 if test x$found = xtrue; then
1475 ad_debug "ifndef $d will be excluded (it IS defined)"
1476 echo "/^#ifndef $d/,/^#else $d|^#endif $d/ { next; }" >> $f
1478 echo "/^#else $d/,/^#endif $d/ { next; }" >> $f
1482 # Now process the file with the script
1485 # Those distdef lines that remain in the file are removed to make
1486 # the appearance prettier
1487 echo "/^#ifdef "$DP"_DIST_|^#endif "$DP"_DIST_|^#else "$DP"_DIST_|^#else !"$DP"_DIST_|^#ifndef "$DP"_DIST_/ { next; }" >> $f
1488 echo "{ print; }" >> $f
1490 # Execute the script
1491 cp -p $1 $2 || exit 1
1492 awk -f $f $1 > $2 || exit 1
1497 # Log if file was not relicensed
1498 if test -f "$1.norelicense"; then
1500 rm -f $1.norelicense
1503 ad_debug "Ending processing file: $1 $2"
1507 # Process a source file given as argument for the distribution.
1509 # Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
1511 ad_process_source_file()
1518 # Process only regular files
1519 if test '!' -f $1; then
1523 ad_debug "Starting processing source file: $1 $2"
1525 f="autodist.tmp.script"
1528 # If license header is provided, replace the license header in the file.
1529 if test x$3 = xtrue; then
1530 ad_process_license_header $f $1
1533 ad_debug "Getting #ifdef's and #ifndef's"
1535 # Get defined distribution defines
1536 defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
1537 $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1539 # Get explicitly not-defined distribution defines
1540 ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
1541 $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1543 ad_debug "defs in $1: $defs"
1544 ad_debug "ndefs in $1: $ndefs"
1546 # Create the script to include and exclude stuff in the file according
1547 # to the distribution defines
1550 ad_debug "processing ifdefs"
1556 if test x$d = x$i; then
1562 # If distribution define was not found exclude those lines from the file.
1563 # This also handles the #ifdef's #else (ie. #ifndef) branch.
1564 if test x$found = xfalse; then
1565 ad_debug "ifdef $d will be excluded (it is NOT defined)"
1566 echo "/^#ifdef $d/,/^#else \/\* \!$d|^#endif \/\* $d/ { next; }" >> $f
1568 echo "/^#else \/\* \!$d/,/^#endif \/\* $d/ { next; }" >> $f
1573 ad_debug "processing ifndefs"
1579 if test x$d = x$i; then
1585 # If distribution define was found exclude those lines from the file.
1586 # This also handles the #ifndef's #else (ie. #ifdef) branch.
1587 if test x$found = xtrue; then
1588 ad_debug "ifndef $d will be excluded (it IS defined)"
1589 echo "/^#ifndef $d/,/^#else \/\* $d|^#endif \/\* $d/ { next; }" >> $f
1591 echo "/^#else \/\* $d/,/^#endif \/\* $d/ { next; }" >> $f
1595 # Now process the file with the script
1598 # Those distdef lines that remain in the file are removed to make
1599 # the appearance prettier
1600 echo "/^#ifdef SILC_DIST_|^#endif \/\* SILC_DIST_|^#else \/\* SILC_DIST_|^#else \/\* \!SILC_DIST_|^#ifndef SILC_DIST_/ { next; }" >> $f
1601 echo "{ print; }" >> $f
1603 # Execute the script
1604 cp -p $1 $2 || exit 1
1605 awk -f $f $1 > $2 || exit 1
1610 # Log if file was not relicensed
1611 if test -f "$1.norelicense"; then
1613 rm -f $1.norelicense
1616 ad_debug "Ending processing source file: $1 $2"
1622 # Arguments: ad_run_hooks <hooks>
1626 ad_debug "Running hooks: $1"
1629 ad_log "Running hooks:"
1630 ad_log "--------------"
1634 if test '!' -f $i; then
1635 ad_fatal "Hook script $i does not exist"
1637 ad_log " sh $i \"$distribution\" \"$dist_version\" \"$package\""
1638 sh $i "$distribution" "$dist_version" "$package" || exit 1
1642 ad_debug "Ending running hooks: $1"
1648 # Arguments: ad_run_dist_hooks <hooks>
1652 ad_debug "Starting running distributions hooks: $1"
1655 ad_log "Running distribution hooks:"
1656 ad_log "---------------------------"
1660 if test '!' -f $i; then
1661 ad_fatal "Dist hook script $i does not exist"
1664 ad_log " sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\""
1665 sh $i "$distribution" "$dist_version" "$package" "$am_distdir" || exit 1
1669 ad_debug "Ending running distribution hooks"
1672 ###############################################################################
1675 usage="Usage: autodist [options] [distribution] [version]"
1677 Autodist prepares source tree for configuration, compilation and
1678 distribution. Prepares the source tree from the \`autodist.ad'
1679 configuration file. Generates Automake.am files from Automake.ad
1680 files, configure.ac file from configure.ad file(s), generates the
1681 configure script by running Autoconf tool, and generates Makefile.in
1682 files by running Automake tool.
1685 -h, --help print this help, then exit
1686 -V, --version print version number, then exit
1687 -v, --verbose verbosely report processing
1688 -d, --distdir <dir> search distributions from <dir>
1689 -s, --distdefs [<dist>] print distribution defines of <dist>, then exit
1690 -i, --init initialize Autodist environment, create default
1691 distribution directory and distribution, then exit
1692 -m, --makedist create and package distribution
1693 --gzip create package compressed with gzip (default)
1694 --bzip2 create also package compressed with bzip2
1695 --compress create also package compressed with compress
1696 --zip create also package compressed with zip"
1699 # Process command line arguments
1701 while test $# -gt 0; do
1706 test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
1715 if test $# -eq 0; then
1716 ad_parse_distribution $distribution false
1717 echo "Distribution: ${distribution}" 1>&2;
1719 ad_parse_distribution $1 false
1720 echo "Distribution: ${1}" 1>&2;
1723 echo "Distdefs:" 1>&2;
1759 echo "${usage}" 1>&2;
1761 echo "${help}" 1>&2;
1766 echo "@PACKAGE@ (@PACKAGE_NAME@) $ver" 1>&2;
1767 echo "Written by Pekka Riikonen" 1>&2;
1769 echo "Copyright (C) 2004 - 2005 SILC Project" 1>&2;
1771 This is free software; see the source for copying conditions. There is NO
1772 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>&2;
1780 echo "${usage}" 1>&2;
1790 ad_log_open "autodist.log"
1792 ad_log "Processing source tree for compilation and configuration"
1793 ad_log "--------------------------------------------------------"
1797 # Parse the requested distribution
1799 if test $# != 0; then
1800 distribution="${1}";
1801 distfile=$distribution
1804 ad_parse_distribution $distribution false
1805 ad_log " Distribution: $distribution $dist_version"
1808 if test $# != 0; then
1809 dist_version="${1}";
1812 ad_debug "Preparing source tree for configuration and compilation..."
1813 ad_debug "Preparing $distribution distribution version $dist_version"
1816 # Create the distribution defines header file
1818 if test "$DISTDEFS"; then
1819 ad_create_distdefs_h
1821 ad_fatal "DISTDEFS not defined in $distdir/autodist.conf"
1827 ad_run_hooks "$pre_hooks"
1830 # Generate the Makefile.am files from Makefile.ad files
1832 ad_make_makefile_ams
1835 # Generate the configure.ac from configure.ad file(s)
1837 ad_make_configure_ac ./configure.ad
1840 # Process all files with .ad suffix for distribution processing
1845 # Generate configure script
1850 # Generate Makefile.in files
1852 ad_make_makefile_ins
1855 # Create autodist.dist
1857 ad_debug "Creating autodist.dist"
1858 echo "dist:$distfile" > autodist.dist
1859 echo "ver:$dist_version" >> autodist.dist
1860 echo "distdir:$package-$dist_version" >> autodist.dist
1865 ad_run_hooks "$post_hooks"
1867 ad_log "Source tree processed successfully."
1868 ad_debug "Done, now run ./configure and make."