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
636 ad_log " $src into $am_distdir/$d"
637 cp -pR $src $am_distdir/$d || exit 1
639 # Add to different location
640 check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
641 if test "$check" != "$dst"; then
642 ad_fatal "Invalid destination in 'include $src $dst'"
645 d=`echo $dst | sed 's,/[^/]*$,,'`
646 ds=`echo $dst | sed 's/\/$//'`
647 if test "$ds" = "$d"; then
648 d=`echo $d | sed 's,/[^/]*$,,'`
650 if test '!' -d $am_distdir/$d && test "$dst" != "$d"; then
651 mkdir -p $am_distdir/$d || exit 1
654 ad_log " $src into $am_distdir/$dst"
655 cp -pR $src $am_distdir/$dst || exit 1
658 elif test x$2 != xtrue; then
659 # We assume regular expression in filename
660 check=`echo "$src" | sed 's/?//; s/*//; s/\[//; s/\]//'`
661 if test "$check" == "$src"; then
662 if test '!' -a $src; then
663 ad_fatal "Including $src: No such file or directory"
670 # Recursively call this function with expanded pathnames. The
671 # reason why we don't let sh by default expand pathnames is that
672 # the include's destination is optional. If sh expands by default
673 # we don't know the destination. For this reason, we handle the
674 # expansion here ourselves.
676 # If src and dst are same, then expand the pathname as we'll copy
677 # matches to their own locations.
678 if test "$src" = "$dst"; then
679 # Expand pathnames, and format to our include format
681 srcs=`echo $src | sed -e 's/ / : /g' -e 's/^/ : /'` || exit 1
684 # Destination is new, and it has to be a directory.
685 check=`echo "$dst" | sed 's/?//; s/*//; s/\[//; s/\]//'`
686 if test "$check" != "$dst"; then
687 ad_fatal "Invalid destination in 'include $src $dst'"
690 # Make sure dst has / at the end, as this must be a directory
691 dst=`echo $dst | sed 's/\/$//; s/$/\//'`
694 dste=`echo $dst | sed 's/\\//\\\\\//g'` || exit 1
696 # Expand pathnames, and format to our include format
698 srcs=`echo $src | sed -e "s/ / $dste : /g" \
699 -e 's/^/ : /' -e "s/$/ $dste/"` || exit 1
703 # Include recursively
704 ad_dist_includes "$srcs" true
706 elif test '!' -a $src; then
707 ad_fatal "Including $src: No such file or directory"
717 ad_debug "Ending running includes: $1 $2"
721 # Excludes files specified in the distribution for exclusion. Used when
722 # creating the distribution for packaging.
724 # exclude has the following format in distfile:
728 # The path may be file, directory or regular expression.
730 # Arguments: ad_dist_includes <excludelist>
734 ad_debug "Starting running excludes: $1"
737 ad_log "Following files and directories were excluded from distribution:"
738 ad_log "----------------------------------------------------------------"
742 ad_debug "Excluding $i"
744 rm -rf $am_distdir/$i
748 ad_debug "Ending running excludes: $1"
752 # Processes the entire tree for distribution. This inspects files other
753 # than source and header files, with exception of any file with .ad
754 # suffix, and performs distribution processing for the file. The original
755 # file is replaced with the processed file. This function is used when
756 # creating the distribution for packaging.
758 # Arguments: ad_process_tree <directory>
762 ad_debug "Starting processing non-source files: $1"
764 # Take files, except source and .ad files.
765 files=`find $am_distdir \! -name \*\.ad \( \
766 \! -name \*\.[cC] -a \
767 \! -name \*\.[cC][cCpP] -a \
768 \! -name \*\.[cC][xX][xX] -a \
769 \! -name \*\.[cC][pP][pP] -a \
770 \! -name \*\.[cC]++ -a \
772 \! -name \*\.[hH] -a \
774 \! -name \*\.[cC]\.in -a \
775 \! -name \*\.[cC][cCpP]\.in -a \
776 \! -name \*\.[cC][xX][xX]\.in -a \
777 \! -name \*\.[cC][pP][pP]\.in -a \
778 \! -name \*\.[cC]++\.in -a \
779 \! -name \*\.m\.in -a \
780 \! -name \*\.[hH]\.in -a \
781 \! -name \*\.hh\.in \)`
782 files=`echo $files | sed 's/$am_distdir//'`
784 # Take away noprocess list
785 if test -f autodist.noprocess; then
786 files=`echo $files" " | sh autodist.noprocess` || exit 1
791 ad_process_file $ff $ff.tmp true
792 if test -f $ff.tmp; then
794 mv -f $ff.tmp $ff || exit 1
798 ad_debug "Ending processing non-source files: $1"
802 # Processes the entire source tree for distribution. This inspects files
803 # in the source tree, with exception of any file with .ad suffix, and
804 # performs distribution processing for the file. The original file is
805 # replaced with the processed file. This function is used when creating
806 # the distribution for packaging.
808 # Call this before ad_process_tree().
810 # Arguments: ad_process_source_tree <directory>
812 ad_process_source_tree()
814 ad_debug "Starting processing source files: $1"
816 # We take only C/C++ files since they use the C compiler friendly
817 # version of distdefs. Other files are not assumed to use them.
818 files=`find $am_distdir \! -name \*\.ad \( \
820 -name \*\.[cC][cCpP] -o \
821 -name \*\.[cC][xX][xX] -o \
822 -name \*\.[cC][pP][pP] -o \
823 -name \*\.[cC]++ -o \
827 -name \*\.[cC]\.in -o \
828 -name \*\.[cC][cCpP]\.in -o \
829 -name \*\.[cC][xX][xX]\.in -o \
830 -name \*\.[cC][pP][pP]\.in -o \
831 -name \*\.[cC]++\.in -o \
833 -name \*\.[hH]\.in -o \
836 # Take away noprocess list
837 if test -f autodist.noprocess; then
838 files=`echo $files" " | sh autodist.noprocess` || exit 1
843 ad_process_source_file $ff $ff.tmp true
844 if test -f $ff.tmp; then
846 mv -f $ff.tmp $ff || exit 1
850 ad_debug "Ending processing source files: $1"
854 # Makes distribution sane, ala modtimes. Since we modify the distribution
855 # we need to make it sane after that.
857 # Arguments: ad_makedist_makesane
859 ad_makedist_makesane()
861 ad_debug "Making distribution file modtimes sane"
863 # DO NOT change these order unless you know what you are doing.
864 if test -f $am_distdir/configure.ac; then
865 touch $am_distdir/configure.ac
868 if test -f $am_distdir/aclocal.m4; then
869 touch $am_distdir/aclocal.m4
872 if test '!' -f Makefile; then
873 ad_fatal "Makefile: No such file or directory"
876 configh=`grep "^CONFIG_HEADER" Makefile | cut -d= -f2 | sed 's/^[ ]*//'`
877 touch $am_distdir/$configh.in 1>/dev/null 2>/dev/null
879 files=`find $am_distdir -name Makefile\.in`
885 if test -f $am_distdir/configure; then
886 touch $am_distdir/configure
889 if test -f $am_distdir/config.status; then
890 touch $am_distdir/config.status
893 ad_debug "Distribution made sane"
897 # Creates distribution of the source tree. All files in the distribution
898 # will be processed and the distribution will be packaged.
900 # Arguments: ad_makedist
904 ad_log_open "makedist.log"
905 ad_debug "Starting distribution creation"
907 ad_log "Starting distribution creation"
908 ad_log "------------------------------"
911 if test '!' -f autodist.dist; then
912 ad_fatal "Autodist has not been run yet to prepare source tree"
915 if test -z $MAKE; then
916 ad_fatal "The MAKE variable is not set in autodist.conf"
919 # Get distdir from Makefile
920 if test '!' -f Makefile; then
921 ad_fatal "The source tree is not configured, run ./configure first"
924 # Parse the requested distribution
925 distribution=`grep "dist:" < autodist.dist | cut -d: -f2` || exit 1
926 dist_version=`grep "ver:" < autodist.dist | cut -d: -f2` || exit 1
927 am_distdir=`grep "distdir:" < autodist.dist | cut -d: -f2` || exit 1
928 ad_parse_distribution $distribution false
929 ad_log " Distribution: $distribution $dist_version"
930 ad_log " Destination directory: $am_distdir"
933 if test x$opt_no_dist = xtrue; then
934 ad_fatal "The '$distribution' distribution cannot be packaged"
938 ad_run_dist_hooks "$pre_dist_hooks"
940 # Create distribution directory
941 ad_debug "Creating distribution directory $am_distdir"
942 $MAKE distdir || exit 1
943 chmod -R a+r $am_distdir
945 if test '!' -d $am_distdir; then
946 ad_fatal "Distribution directory $am_distdir not created"
949 # Run pre-process-dist-hooks
950 ad_run_dist_hooks "$pre_p_dist_hooks"
953 ad_dist_excludes "$excludes"
956 ad_dist_includes "$includes"
958 # Include specific license file if specified
959 if test "$license" != ""; then
961 ad_log "License file in distribution:"
962 ad_log "-----------------------------"
963 ad_log " $license into $am_distdir/COPYING"
964 cp -p $license $am_distdir/COPYING || exit 1
967 # Process noprocesses
971 ad_log "Following files were not re-licensed:"
972 ad_log "-------------------------------------"
974 # Process source files
975 ad_debug "Process distribution source tree"
976 ad_process_source_tree $am_distdir
978 # Process non-source files
979 ad_debug "Process distribution tree"
980 ad_process_tree $am_distdir
982 # Run post-process_dist-hooks
983 ad_run_dist_hooks "$post_p_dist_hooks"
985 # Make distribution sane
989 ad_debug "Packaging distribution"
990 tar chof $am_distdir.tar $am_distdir || exit 1
993 ad_debug "Compressing distribution package"
994 if test x$ad_gzip = xtrue; then
995 ad_debug "Compressing distribution package $am_distdir.tar.gz"
996 gzip -9 -c $am_distdir.tar > $am_distdir.tar.gz || exit 1
998 if test x$ad_bzip2 = xtrue; then
999 ad_debug "Compressing distribution package $am_distdir.tar.bz2"
1000 bzip2 -9 -c $am_distdir.tar > $am_distdir.tar.bz2 || exit 1
1002 if test x$ad_compress = xtrue; then
1003 ad_debug "Compressing distribution package $am_distdir.tar.Z"
1004 compress -c $am_distdir.tar > $am_distdir.tar.Z || exit 1
1006 if test x$ad_zip = xtrue; then
1007 rm -f $am_distdir.zip
1008 ad_debug "Compressing distribution package $am_distdir.zip"
1009 zip -rq $am_distdir.zip $am_distdir || exit 1
1011 rm -f $am_distdir.tar
1013 # Run post-dist-hooks
1014 ad_run_dist_hooks "$post_dist_hooks"
1018 rm -f autodist.noprocess
1020 ad_log "Distribution created successfully."
1022 ad_debug "Ending distribution creation"
1026 # Handles distribution options.
1028 # option has the following format in distfile:
1032 # Following options are supported:
1038 # Arguments: ad_handle_options <options>
1042 ad_debug "Handling options: $1"
1046 if test "$i" = "template"; then
1049 elif test "$i" = "no-dist"; then
1052 elif test "$i" = "no-inherit"; then
1060 # Clears set options
1062 # Arguments: ad_clear_options
1068 opt_no_inherit=false
1072 # Parses the distribution. Gets all distribution defines from the
1073 # distribution. This also expands all inherited distributions recursively
1074 # to get all inherited distribution defines. From inherited distributions
1075 # their name and package name is not inherited.
1077 # Arguments: ad_parse_distribution <distribution name> <inherit>
1079 ad_parse_distribution()
1098 ad_debug "Starting parsing distribution: $1 $2"
1100 if test '!' -f $distdir/$1; then
1101 ad_fatal "Distribution '$1' is not declared"
1105 inhs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1106 | grep "inherit " | cut -d' ' -f2 | sort | uniq`
1109 defs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1110 | grep "define " | cut -d' ' -f2 | sort | uniq`
1112 if test "$inhs" = "" && test "$defs" = ""; then
1113 ad_fatal "Distribution '$1' does not define anything"
1116 # Get undefined distdefs
1117 undefs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1118 | grep "undef " | cut -d' ' -f2 | sort | uniq`
1121 incs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1122 | grep "include " | sed 's/include / : /'`
1125 excs=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1126 | grep "exclude " | cut -d' ' -f2- | sort | uniq`
1129 nops=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1130 | grep "noprocess " | cut -d' ' -f2- | sort | uniq`
1133 opts=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1134 | grep "option " | cut -d' ' -f2- | sort | uniq`
1137 ad_handle_options "$opts"
1138 if test x$2 = xtrue && test x$opt_no_inherit = xtrue; then
1139 ad_fatal "Distribution '$1' cannot be inherited"
1141 if test x$2 = xfalse && test x$opt_template = xtrue; then
1142 ad_fatal "Template distribution '$1' cannot be prepared or packaged"
1145 ad_debug "inherits: $inhs"
1146 ad_debug "distdefs: $defs"
1147 ad_debug "includes: $incs"
1148 ad_debug "excludes: $excs"
1149 ad_debug "noprocess: $nops"
1150 ad_debug "undistdefs: $undefs"
1151 ad_debug "options: $opts"
1153 # Expand distdefs from inherited distributions
1156 if test x$1 = x$i; then
1157 ad_fatal "Infinite recursion detected. Fix the '$distdir/$1' \
1158 distribution to not have 'inherit $i' declared."
1161 if test '!' -f $distdir/$i; then
1162 ad_fatal "Distribution '$i' is not declared (inherited from '$1')"
1165 ad_parse_distribution $i true
1170 license=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1171 | grep "license " | cut -d' ' -f2`
1172 licenseh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1173 | grep "license-header " | sed 's/license-header / : /'`
1175 ad_debug "license: $license"
1176 ad_debug "licenseh: $licenseh"
1178 if test x$2 = xfalse; then
1179 # Take rest of the stuff from top distribution
1181 # We take precedence on defined and undefined distdefs. Remove
1182 # undefined distdefs if we have defined them.
1185 ad_debug "defining undefined $d distdef"
1186 undistdefs=`echo $undistdefs | sed s/$d//g`
1189 # Get distribution name
1190 dname=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1191 | grep "name " | cut -d' ' -f2-`
1193 if test "$dname"; then
1197 # Get distribution package name (optional)
1198 dpname=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1199 | grep "package " | cut -d' ' -f2`
1201 if test "$dpname"; then
1204 package=$distribution
1207 # Get Bug-report email address (optional)
1208 bugr=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1209 | grep "bug-report " | cut -d' ' -f2-`
1211 if test "$bugr"; then
1215 ad_debug "distribution: $distribution"
1216 ad_debug "package: $package"
1217 ad_debug "bug-report: $bug_report"
1219 # Get hooks (optional)
1220 prh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1221 | grep "pre-hook " | cut -d' ' -f2-`
1222 poh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1223 | grep "post-hook " | cut -d' ' -f2-`
1224 prdh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1225 | grep "pre-dist-hook " | cut -d' ' -f2-`
1226 podh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1227 | grep "post-dist-hook " | cut -d' ' -f2-`
1228 prpdh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1229 | grep "pre-process-dist-hook " | cut -d' ' -f2-`
1230 popdh=`sed 's/^[ ]*//' < $distdir/$1 | grep -v "^#" \
1231 | grep "post-process-dist-hook " | cut -d' ' -f2-`
1233 pre_hooks="$pre_hooks $prh"
1234 post_hooks="$post_hooks $poh"
1235 pre_dist_hooks="$pre_dist_hooks $prdh"
1236 post_dist_hooks="$post_dist_hooks $podh"
1237 pre_p_dist_hooks="$pre_p_dist_hooks $prpdh"
1238 post_p_dist_hooks="$post_p_dist_hooks $popdh"
1239 doptions="$doptions $opts"
1241 ad_handle_options "$doptions"
1242 ad_debug "options: $doptions"
1246 inherits="$inherits $inhs"
1247 distdefs="$distdefs $defs"
1248 includes="$includes $incs"
1249 excludes="$excludes $excs"
1250 noprocess="$noprocess $nops"
1251 undistdefs="$undistdefs $undefs"
1253 ad_debug "Ending parsing distribution: $1 $2"
1257 # Processes parsed distdefs. Removes duplicates, and undefined distdefs
1258 # from the distdefs.
1260 # Arguments: ad_process_distdefs
1262 ad_process_distdefs()
1264 ad_debug "Starting processing distdefs"
1267 ad_log "Following distdefs were processed:"
1268 ad_log "----------------------------------"
1270 # Remove all undefined distribution defines
1271 for i in $undistdefs
1273 ad_debug "undefining $i distdef"
1274 distdefs=`echo $distdefs | sed s/$i//g`
1277 rm -f autodist.tmp.defs
1279 # Remove duplicate distdefs
1282 echo $i >>autodist.tmp.defs
1284 distdefs=`sort < autodist.tmp.defs | uniq`
1285 distdefs=`echo $distdefs`
1286 rm -f autodist.tmp.defs
1295 ad_debug "distdefs=$distdefs"
1297 ad_debug "Ending processing distdefs"
1301 # Processes for a license header change.
1303 # Arguments: ad_process_license_header <scriptfile> <sourcefile>
1305 ad_process_license_header()
1307 ad_debug "Starting license header processing"
1309 # Add : separator at the end
1310 lics=`echo "$licenseh" | sed 's/$/ : /'`
1316 if test "$i" = ":" && test -z "$src"; then
1319 if test -z "$src"; then
1323 if test -z "$dst" && test "$i" != ":"; then
1326 ad_fatal "Missing argument in 'license-header $src'"
1329 ad_debug "Replacing $src license with $dst license"
1331 if test '!' -f $src; then
1332 ad_fatal "License header $src: No such file or directory"
1335 if test '!' -f $dst; then
1336 ad_fatal "License header $dst: No such file or directory"
1339 # Awk script to replace the license header
1340 fl=`sed q $src | sed 's/\\//\\\\\//g' > autodist.lsrc` || exit 1
1341 ll=`sed -n '$p' $src | sed 's/\\//\\\\\//g' > autodist.ldst` || exit 1
1342 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
1343 rm -f autodist.lsrc autodist.ldst
1349 ad_debug "Ending license header processing"
1353 # Process specified noprocesses. This is called during makedist.
1355 # Arguments: ad_process_noprocess
1357 ad_process_noprocess()
1362 ad_debug "Starting running noprocesses"
1365 ad_log "Autodist did not process the following files:"
1366 ad_log "---------------------------------------------"
1369 cd $am_distdir || exit 1
1375 ie=`echo $i | sed 's/\\//\\\\\//g'` || exit 1
1377 n="$n -e 's/$am_distdir\\/$ie //'"
1382 rm -f autodist.noprocess
1383 if test x$np = xtrue; then
1384 echo $n > autodist.noprocess || exit 1
1388 ad_debug "Ending running noprocesses"
1392 # Process a file given as argument for the distribution.
1394 # Arguments: ad_process_file <filepath> <dest_filepath> <re-license>
1403 # Process only regular files
1404 if test '!' -f $1; then
1408 ad_debug "Starting processing file: $1 $2"
1410 f="autodist.tmp.script"
1413 # If license header is provided, replace the license header in the file.
1414 if test x$3 = xtrue; then
1415 ad_process_license_header $f $1
1418 ad_debug "Getting #ifdef's and #ifndef's"
1420 # Get defined distribution defines
1421 defs=`awk "/^#ifdef "$DP"_DIST_|^#else "$DP"_DIST_/ { print; }" \
1422 $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1424 # Get explicitly not-defined distribution defines
1425 ndefs=`awk "/^#ifndef "$DP"_DIST_|^#else !"$DP"_DIST_/ { print; }" \
1426 $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1428 ad_debug "defs in $1: $defs"
1429 ad_debug "ndefs in $1: $ndefs"
1431 # Create the script to include and exclude stuff in the file according
1432 # to the distribution defines
1435 ad_debug "processing ifdefs"
1441 if test x$d = x$i; then
1447 # If distribution define was not found exclude those lines from the file.
1448 # This also handles the #ifdef's #else (ie. #ifndef) branch.
1449 if test x$found = xfalse; then
1450 ad_debug "ifdef $d will be excluded (it is NOT defined)"
1451 echo "/^#ifdef $d/,/^#else !$d|^#endif $d/ { next; }" >> $f
1453 echo "/^#else !$d/,/^#endif $d/ { next; }" >> $f
1458 ad_debug "processing ifndefs"
1464 if test x$d = x$i; then
1470 # If distribution define was found exclude those lines from the file.
1471 # This also handles the #ifndef's #else (ie. #ifdef) branch.
1472 if test x$found = xtrue; then
1473 ad_debug "ifndef $d will be excluded (it IS defined)"
1474 echo "/^#ifndef $d/,/^#else $d|^#endif $d/ { next; }" >> $f
1476 echo "/^#else $d/,/^#endif $d/ { next; }" >> $f
1480 # Now process the file with the script
1483 # Those distdef lines that remain in the file are removed to make
1484 # the appearance prettier
1485 echo "/^#ifdef "$DP"_DIST_|^#endif "$DP"_DIST_|^#else "$DP"_DIST_|^#else !"$DP"_DIST_|^#ifndef "$DP"_DIST_/ { next; }" >> $f
1486 echo "{ print; }" >> $f
1488 # Execute the script
1489 cp -p $1 $2 || exit 1
1490 awk -f $f $1 > $2 || exit 1
1495 # Log if file was not relicensed
1496 if test -f "$1.norelicense"; then
1498 rm -f $1.norelicense
1501 ad_debug "Ending processing file: $1 $2"
1505 # Process a source file given as argument for the distribution.
1507 # Arguments: ad_process_source_file <filepath> <dest_filepath> <re-license>
1509 ad_process_source_file()
1516 # Process only regular files
1517 if test '!' -f $1; then
1521 ad_debug "Starting processing source file: $1 $2"
1523 f="autodist.tmp.script"
1526 # If license header is provided, replace the license header in the file.
1527 if test x$3 = xtrue; then
1528 ad_process_license_header $f $1
1531 ad_debug "Getting #ifdef's and #ifndef's"
1533 # Get defined distribution defines
1534 defs=`awk '/^#ifdef SILC_DIST_|^#else \/\* SILC_DIST_/ { print; }' \
1535 $1 |cut -d'*' -f2 |cut -d' ' -f2 | sort | uniq`
1537 # Get explicitly not-defined distribution defines
1538 ndefs=`awk '/^#ifndef SILC_DIST_|^#else \/\* \!SILC_DIST_/ { print; }' \
1539 $1 |cut -d'*' -f2 |cut -d' ' -f2 | cut -d'!' -f2 | sort | uniq`
1541 ad_debug "defs in $1: $defs"
1542 ad_debug "ndefs in $1: $ndefs"
1544 # Create the script to include and exclude stuff in the file according
1545 # to the distribution defines
1548 ad_debug "processing ifdefs"
1554 if test x$d = x$i; then
1560 # If distribution define was not found exclude those lines from the file.
1561 # This also handles the #ifdef's #else (ie. #ifndef) branch.
1562 if test x$found = xfalse; then
1563 ad_debug "ifdef $d will be excluded (it is NOT defined)"
1564 echo "/^#ifdef $d/,/^#else \/\* \!$d|^#endif \/\* $d/ { next; }" >> $f
1566 echo "/^#else \/\* \!$d/,/^#endif \/\* $d/ { next; }" >> $f
1571 ad_debug "processing ifndefs"
1577 if test x$d = x$i; then
1583 # If distribution define was found exclude those lines from the file.
1584 # This also handles the #ifndef's #else (ie. #ifdef) branch.
1585 if test x$found = xtrue; then
1586 ad_debug "ifndef $d will be excluded (it IS defined)"
1587 echo "/^#ifndef $d/,/^#else \/\* $d|^#endif \/\* $d/ { next; }" >> $f
1589 echo "/^#else \/\* $d/,/^#endif \/\* $d/ { next; }" >> $f
1593 # Now process the file with the script
1596 # Those distdef lines that remain in the file are removed to make
1597 # the appearance prettier
1598 echo "/^#ifdef SILC_DIST_|^#endif \/\* SILC_DIST_|^#else \/\* SILC_DIST_|^#else \/\* \!SILC_DIST_|^#ifndef SILC_DIST_/ { next; }" >> $f
1599 echo "{ print; }" >> $f
1601 # Execute the script
1602 cp -p $1 $2 || exit 1
1603 awk -f $f $1 > $2 || exit 1
1608 # Log if file was not relicensed
1609 if test -f "$1.norelicense"; then
1611 rm -f $1.norelicense
1614 ad_debug "Ending processing source file: $1 $2"
1620 # Arguments: ad_run_hooks <hooks>
1624 ad_debug "Running hooks: $1"
1627 ad_log "Running hooks:"
1628 ad_log "--------------"
1632 if test '!' -f $i; then
1633 ad_fatal "Hook script $i does not exist"
1635 ad_log " sh $i \"$distribution\" \"$dist_version\" \"$package\""
1636 sh $i "$distribution" "$dist_version" "$package" || exit 1
1640 ad_debug "Ending running hooks: $1"
1646 # Arguments: ad_run_dist_hooks <hooks>
1650 ad_debug "Starting running distributions hooks: $1"
1653 ad_log "Running distribution hooks:"
1654 ad_log "---------------------------"
1658 if test '!' -f $i; then
1659 ad_fatal "Dist hook script $i does not exist"
1662 ad_log " sh $i \"$distribution\" \"$dist_version\" \"$package\" \"$am_distdir\""
1663 sh $i "$distribution" "$dist_version" "$package" "$am_distdir" || exit 1
1667 ad_debug "Ending running distribution hooks"
1670 ###############################################################################
1673 usage="Usage: autodist [options] [distribution] [version]"
1675 Autodist prepares source tree for configuration, compilation and
1676 distribution. Prepares the source tree from the \`autodist.ad'
1677 configuration file. Generates Automake.am files from Automake.ad
1678 files, configure.ac file from configure.ad file(s), generates the
1679 configure script by running Autoconf tool, and generates Makefile.in
1680 files by running Automake tool.
1683 -h, --help print this help, then exit
1684 -V, --version print version number, then exit
1685 -v, --verbose verbosely report processing
1686 -d, --distdir <dir> search distributions from <dir>
1687 -s, --distdefs [<dist>] print distribution defines of <dist>, then exit
1688 -i, --init initialize Autodist environment, create default
1689 distribution directory and distribution, then exit
1690 -m, --makedist create and package distribution
1691 --gzip create package compressed with gzip (default)
1692 --bzip2 create also package compressed with bzip2
1693 --compress create also package compressed with compress
1694 --zip create also package compressed with zip"
1697 # Process command line arguments
1699 while test $# -gt 0; do
1704 test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
1713 if test $# -eq 0; then
1714 ad_parse_distribution $distribution false
1715 echo "Distribution: ${distribution}" 1>&2;
1717 ad_parse_distribution $1 false
1718 echo "Distribution: ${1}" 1>&2;
1721 echo "Distdefs:" 1>&2;
1757 echo "${usage}" 1>&2;
1759 echo "${help}" 1>&2;
1764 echo "@PACKAGE@ (@PACKAGE_NAME@) $ver" 1>&2;
1765 echo "Written by Pekka Riikonen" 1>&2;
1767 echo "Copyright (C) 2004 - 2005 SILC Project" 1>&2;
1769 This is free software; see the source for copying conditions. There is NO
1770 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " 1>&2;
1778 echo "${usage}" 1>&2;
1788 ad_log_open "autodist.log"
1790 ad_log "Processing source tree for compilation and configuration"
1791 ad_log "--------------------------------------------------------"
1795 # Parse the requested distribution
1797 if test $# != 0; then
1798 distribution="${1}";
1799 distfile=$distribution
1802 ad_parse_distribution $distribution false
1803 ad_log " Distribution: $distribution $dist_version"
1806 if test $# != 0; then
1807 dist_version="${1}";
1810 ad_debug "Preparing source tree for configuration and compilation..."
1811 ad_debug "Preparing $distribution distribution version $dist_version"
1814 # Create the distribution defines header file
1816 if test "$DISTDEFS"; then
1817 ad_create_distdefs_h
1819 ad_fatal "DISTDEFS not defined in $distdir/autodist.conf"
1825 ad_run_hooks "$pre_hooks"
1828 # Generate the Makefile.am files from Makefile.ad files
1830 ad_make_makefile_ams
1833 # Generate the configure.ac from configure.ad file(s)
1835 ad_make_configure_ac ./configure.ad
1838 # Process all files with .ad suffix for distribution processing
1843 # Generate configure script
1848 # Generate Makefile.in files
1850 ad_make_makefile_ins
1853 # Create autodist.dist
1855 ad_debug "Creating autodist.dist"
1856 echo "dist:$distfile" > autodist.dist
1857 echo "ver:$dist_version" >> autodist.dist
1858 echo "distdir:$package-$dist_version" >> autodist.dist
1863 ad_run_hooks "$post_hooks"
1865 ad_log "Source tree processed successfully."
1866 ad_debug "Done, now run ./configure and make."