#! /bin/sh
# libtoolize (GNU libtool 1.1467 2004/04/01 04:43:56) 1.5a
# Written by Gary V. Vaughan <gary@gnu.org>

# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, a copy can be downloaded from
# http://www.gnu.org/copyleft/gpl.html, or by writing to the Free
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.

# Usage: $progname [OPTION]...
#
# Prepare a package to use libtool.
#
# -c, --copy            copy files rather than symlinking them
#     --debug           enable verbose shell tracing
# -n, --dry-run         print commands rather than running them
# -f, --force           replace existing files
#     --help            display this message and exit
# -i, --install         copy missing auxiliary files
#     --ltdl            install libltdl in a subdirectory
# -q, --quiet           work silently
# -v, --verbose         verbosely report processing
#     --version         print version information and exit
#
# You must `cd' to the top directory of your package before you run
# `$progname'.
#
# Report bugs to <bug-libtool@gnu.org>.

: ${CP="cp -f"}
: ${LN_S="ln -s"}
: ${MKDIR="mkdir"}
: ${RM="rm -f"}
: ${SED="/bin/sed"}

dirname="s,/[^/]*$,,"
basename="s,^.*/,,g"

# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath="$0"

# The name of this program:
progname=`echo "$progpath" | $SED "$basename"`
PROGRAM=libtoolize

# Global variables:
EXIT_SUCCESS=0
EXIT_FAILURE=1

opt_dry_run=false
opt_force=false
opt_install=false
opt_link=:
opt_ltdl=false
opt_quiet=false
opt_verbose=false

seen_libtool=false
seen_ltdl=false

exit_status=$EXIT_SUCCESS

# Locations for important files:
prefix=/usr
datadir=${prefix}/share
pkgdatadir=${datadir}/libtool
pkgmacrodir="$pkgdatadir/m4"
auxdir=
m4dir=
configure_ac=configure.in


# func_echo arg...
# Echo program name prefixed message.
func_echo ()
{
    echo $progname: ${1+"$@"}
}

# func_verbose arg...
# Echo program name prefixed message in verbose mode only.
func_verbose ()
{
    $opt_verbose && func_echo ${1+"$@"}
}

# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
    echo $progname: ${1+"$@"} 1>&2
}

# func_fatal_error arg...
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
    func_error ${1+"$@"}
    exit $EXIT_FAILURE
}

# func_fatal_help arg...
# Echo program name prefixed message to standard error, followed by
# a help hint, and exit.
func_fatal_help ()
{
    func_error ${1+"$@"}
    func_fatal_error "Try \`$progname --help' for more information."
}

# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
    func_error "missing argument for $1"
    exit_cmd=exit
}

# func_usage
# Echo short help message to standard output and exit.
func_usage ()
{
    $SED '/^# Usage:/,/# -h/ {
        s/^# //; s/^# *$//;
	s/\$progname/'$progname'/;
	p;
    }; d' < "$progpath"
    echo
    echo "run \`$progname --help | more' for full usage"
    exit $EXIT_SUCCESS
}

# func_help
# Echo long help message to standard output and exit.
func_help ()
{
    $SED '/^# Usage:/,/# Report bugs to/ {
        s/^# //; s/^# *$//;
	s/\$progname/'$progname'/;
	p;
     }; d' < "$progpath"
    exit $EXIT_SUCCESS
}

# func_version
# Echo version message to standard output and exit.
func_version ()
{
    $SED '/^# '$PROGRAM' (GNU /,/# warranty; / {
        s/^# //; s/^# *$//;
        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/;
        p;
     }; d' < "$progpath"
     exit $EXIT_SUCCESS
}


# Parse options once, thoroughly.  This comes as soon as possible in
# the script to make things like `libtoolize --version' happen quickly.
{
  # sed scripts:
  my_sed_single_opt='1s/^\(..\).*$/\1/;q'
  my_sed_single_rest='1s/^..\(.*\)$/\1/;q'
  my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
  my_sed_long_arg='1s/^--[^=]*=//'

  while test "$#" -gt 0; do
    opt="$1"
    shift
    case $opt in
      --copy|-c)	opt_link=false		;;

      --debug)		func_echo "enabling shell trace mode"
			set -x
			;;

      --dry-run|-n)	if $opt_dry_run; then :; else
			  opt_dry_run=:
			  RM="echo $RM"
			  test -n "$LN_S" && LN_S="echo $LN_S"
			  CP="echo $CP"
			  MKDIR="echo $MKDIR"
			fi
			;;

      --force|-f)	opt_force=:		;;
      --install|-i)	opt_install=:		;;
      --ltdl)		opt_ltdl=:		;;
      --quiet|--automake|-q) # --automake is for 1.5 compatibility
			opt_quiet=:		;;
      --verbose|-v)	opt_verbose=:		;;

      -c*|-i*|-f*|-n*|-q*|-v*)
			rest=`echo "$opt" |$SED "$my_sed_single_rest"`
			opt=`echo "$opt" |$SED "$my_sed_single_opt"`
			set -- "$opt" "-$rest" ${1+"$@"}
			;;

      -\?|-h)		func_usage					;;
      --help)		func_help					;;
      --version)	func_version					;;
      --)		break						;;
      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
      *)		func_fatal_help "too many arguments"		;;
    esac
  done
}

# func_mkdir_p dir
# Make sure the entire path to DIR is available.
func_mkdir_p ()
{
    my_dir=$1
    my_dirs=

    while test ! -d "$my_dir"; do
      my_dirs="$my_dir $my_dirs"
      case $my_dir in */*) ;; *) break ;; esac
      my_dir=`echo "$my_dir" | $SED "$dirname"`
    done
   test ! -n "$my_dirs" || $MKDIR $my_dirs
}

# func_copy srcfile destfile
# If option `--copy' was specified, or soft-linking SRCFILE to DESTFILE fails,
# then try to copy SRCFILE to DESTFILE.
func_copy ()
{
    my_srcfile="$1"
    my_destfile="$2"
    my_return_status=1

    func_mkdir_p `echo "$my_destfile" | $SED "$dirname"`

    $RM "$my_destfile"
    if $opt_link && $LN_S "$my_srcfile" "$my_destfile"; then
      $opt_quiet || func_echo "copying file \`$my_destfile'"
      my_return_status=0
    elif $CP "$my_srcfile" "$my_destfile"; then
      $opt_quiet || func_echo "copying file \`$my_destfile'"
      my_return_status=0
    else
      func_error "can not copy \`$my_srcfile' to \`$my_destfile'"
      exit_status=$EXIT_FAILURE
    fi

    return $my_return_status
}

# func_copy_all_files srcdir destdir [glob_exclude] [copy_cb=func_copy]
# For each file in SRCDIR, then try to copy the file to DESTDIR by calling
# COPY_CB with the src and dest files.  If GLOB_EXCLUDE is given, exclude
# any matching filenames from the copy.  If COPY_CB is passed, then the
# check for overwriting without opt_force is the callbacks responsibility:
# This allows using callbacks like func_serial_update, which perform their
# own checks to decide whether to overwrite the dest file.
func_copy_all_files ()
{
    my_srcdir="$1"
    my_destdir="$2"
    my_glob_exclude="$3"
    my_copy_cb=${4-func_copy}

    for my_filename in `cd "$my_srcdir" && ls`; do

      # ignore excluded filenames
      if test -n "$my_glob_exclude"; then
        eval 'case $my_filename in '$my_glob_exclude') continue ;; esac'
      fi

      if test -f "$my_srcdir/$my_filename"; then
        if test "X$my_copy_cb" = Xfunc_copy; then
	  $opt_force || if test -f "$my_destdir/$my_filename"; then
  	    $opt_quiet \
	      || func_error "\`$my_destdir/$my_filename' exists: use \`--force' to overwrite"
	    continue
	  fi
        fi
      else
        # Not a regular file
        continue
      fi

      $my_copy_cb "$my_srcdir/$my_filename" "$my_destdir/$my_filename"
    done
}

# func_grep expression filename
# Check whether EXPRESSION matches any line of FILENAME, without output.
func_grep ()
{
    grep "$1" "$2" >/dev/null 2>&1
}

# func_scan_files
# Scan configure.(ac|in) and aclocal.m4 (if present) for use of libltdl
# and libtool.  Possibly running some of these tools if necessary.
# Libtoolize affects the contents of aclocal.m4, and should be run before
# aclocal, so we can't use configure --trace which relies on a consistent
# configure.(ac|in) and aclocal.m4.
func_scan_files ()
{
    # Prefer configure.ac to configure.in
    test -f configure.ac && configure_ac=configure.ac
    test -f "$configure_ac" \
        || func_fatal_help "\`$configure_ac' does not exist"

    test -n "`cd $pkgdatadir && ls`" \
        || func_fatal_error "can not list files in \`$pkgdatadir'"


    # Set local variables to reflect contents of configure.ac
    my_uses_autoconf=false
    my_sed_scan_configure_ac='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
	/AC_INIT/ { s,^.*$,my_uses_autoconf=:,; p; };
	d'
    eval `$SED "$my_sed_scan_configure_ac" "$configure_ac"`

    $my_uses_autoconf || {
        func_verbose "$configure_ac: not using Autoconf"
	return
    }

    # ---------------------------------------------------- #
    # Probe macro usage in configure.ac and/or aclocal.m4. #
    # ---------------------------------------------------- #

    my_sed_traces='s,#.*$,,; s,^dnl .*$,,; s, dnl .*$,,;
    	/AC_CONFIG_AUX_DIR[^_]/  {
	    s,^.*AC_CONFIG_AUX_DIR([[ 	]*\([^])]*\).*$,auxdir=\1,; p;
        };
    	/AC_CONFIG_MACRO_DIR/   {
	    s,^.*AC_CONFIG_MACRO_DIR([[ 	]*\([^])]*\).*$,m4dir=\1,; p;
        };
	/A[CM]_PROG_LIBTOOL/ { s,^.*$,seen_libtool=:,; p; };
	/LT_INIT/	     { s,^.*$,seen_libtool=:,; p; };
	/AC_LIB_LTDL/        { s,^.*$,seen_ltdl=:,; p; };
	d;'
    eval `cat aclocal.m4 "$configure_ac" 2>/dev/null | $SED "$my_sed_traces"`


    # ---------------- #
    # Validate auxdir. #
    # ---------------- #

    if test -n "$auxdir"; then
      # If $configure_ac contains AC_CONFIG_AUX_DIR, check that it was
      # not given in terms of a shell variable!
      case "$auxdir" in
      *\$*)
        func_fatal_error "can not handle variables in AC_CONFIG_AUX_DIR"
        ;;
      *);;
      esac
    else
      # Try to discover auxdir the same way it is discovered by configure.
      # Note that we default to the current directory.
      for dir in . .. ../..; do
        if test -f "$dir/install-sh"; then
          auxdir=$dir
          break
        elif test -f "$dir/install.sh"; then
          auxdir="$dir"
          break
        fi
      done
    fi

    # Just use the current directory if all else fails.
    test -n "$auxdir" || auxdir=.


    # ------------------------------ #
    # Find local m4 macro directory. #
    # ------------------------------ #

    # If AC_CONFIG_MACRO_DIR turned nothing up, we hunt for ACLOCAL_AMFLAGS
    # in `Makefile.am' for a `-I' argument.

    my_sed_aclocal_flags='/^[ 	]*ACLOCAL_[A-Z_]*FLAGS[ 	]*=/ {
	s,^[^=]*=[ 	]*\(.*\), \1,; q; }; d'
    if test ! -n "$m4dir" && test -f Makefile.am; then
      my_m4dir_is_next=false
      for arg in `$SED "$my_sed_aclocal_flags" Makefile.am`; do
        if $my_m4dir_is_next; then
          m4dir="$arg"
          break
        else
          if test "X$arg" = "X-I"; then
            my_m4dir_is_next=:
          else
            my_m4dir_is_next=false
          fi
        fi
      done
    fi

    # Just use the current directory if all else fails.
    test -n "$m4dir" || m4dir=.
}

# func_included_files searchfile
# Output INCLUDEFILE if SEARCHFILE m4_includes it, else output SEARCHFILE.
func_included_files ()
{
    my_searchfile="$1"

    my_include_regex=
    my_sed_include='
        /^m4_include(\[.*\])$/ { s,^m4_include(\[\(.*\)\])$,\1,; p; };
        d'

    test -f "$my_searchfile" && echo "$my_searchfile"

    # Only recurse when we don't care if all the variables we use get
    # trashed, since they are in global scope.
    for my_filename in `$SED "$my_sed_include" "$my_searchfile"`; do
      func_included_files $my_filename
    done
}

# func_serial filename [macro_regex]
# Output the value of the serial number comment in FILENAME, where the
# comment line must also match MACRO_REGEX, if given.
func_serial ()
{
    my_filename="$1"
    my_macro_regex="$2"
    my_sed_serial='/^# serial [1-9][0-9]*[ 	]*'"$my_macro_regex"'[ 	]*$/ {
	  s,^# serial \([1-9][0-9]*\).*$,\1,; q;
	}; d'

    # Search FILENAME and all the files it m4_includes for a serial number
    # in the file that AC_DEFUNs MACRO_REGEX.
    my_serial=
    for my_file in `func_included_files "$my_filename"`; do
      if test -z "$my_macro_regex" ||
         func_grep '^AC_DEFUN(\['"$my_macro_regex" "$my_file"
      then
        my_serial=`$SED -e "$my_sed_serial" "$my_file"`
	break
      fi
    done

    # If the file has no serial number, we assume it's ancient.
    test -n "$my_serial" || my_serial=0

    echo $my_serial
}

# func_serial_update srcfile destfile [macro_regex] [old_macro_regex]
# Copy SRCFILE to DESTFILE provided SRCFILE has a newer serial number, or
# DESTFILE does not yet exist, or the user specified `--force'.  If given,
# MACRO_REGEX or OLD_MACRO_REGEX must match any text after "# serial N" in
# both files.
func_serial_update ()
{
    my_srcfile="$1"
    my_destfile="$2"
    my_macro_regex="$3"
    my_old_macro_regex="$4"

    my_return_status=1
    my_update_p=:

    if test -f "$my_destfile"; then
      my_src_serial=`func_serial "$my_srcfile" "$my_macro_regex"`
      # Strictly, this libtoolize ought not to have to deal with ancient
      # serial formats, but we accept them here to be complete:
      test "$my_src_serial" -eq 0 &&
        my_src_serial=`func_serial "$my_srcfile" "$my_old_macro_regex"`

      my_dest_serial=`func_serial "$my_destfile" "$my_macro_regex"`
      test "$my_dest_serial" -eq 0 &&
        my_dest_serial=`func_serial "$my_destfile" "$my_old_macro_regex"`

      test "$my_src_serial" -eq 0 && {
        func_error "warning: no serial number on \`$my_srcfile', not copying."
	return
      }

      # Only perform the file update if the destination has an older serial.
      test "$my_src_serial" -gt "$my_dest_serial" || my_update_p=false

      test "$my_src_serial" -gt "$my_dest_serial" \
        && func_verbose "\`$my_srcfile' is serial $my_srcserial, greater than $my_destserial in \`$my_destfile'"

      if test "$my_src_serial" -lt "$my_dest_serial"; then
        func_error "\`$my_srcfile' is serial $my_srcserial, less than $my_destserial in \`$my_destfile'"
	$opt_force \
          || func_fatal_error "Use \`--force' to replace newer libtool files with this version."
      fi
    fi

    if $my_update_p || $opt_force; then
      func_copy "$my_srcfile" "$my_destfile"
      my_return_status=$?
    else
      $opt_quiet \
        || func_echo "\`$my_destfile' is already up to date."
    fi

    # Do this after the copy for hand maintained `aclocal.m4', incase
    # it has `m4_include([DESTFILE])', so the copy effectively already
    # updated `aclocal.m4'.
    $use_aclocal || if test -f aclocal.m4; then
      test "$my_src_serial" -gt `func_serial aclocal.m4 "$my_macro_regex"` \
	  && func_echo "You should add the contents of \'$my_destfile' to \`aclocal.m4'."
    fi

    return $my_return_status
}

# func_check_macros
# Sanity check macros from aclocal.m4 against installed versions.
func_check_macros ()
{
    # Don't trace for this, we're just checking the user didn't invoke it
    # directly from configure.ac.
    $SED 's,dnl .*$,,; s,# .*$,,' "$configure_ac" | grep AC_PROG_RANLIB \
      && func_echo "\`AC_PROG_RANLIB' is rendered obsolete by \`LT_INIT'"

    $seen_libtool \
      || func_echo "Remember to add \`LT_INIT' to \`$configure_ac'."

    # FIXME: Ensure ltmain.sh, libtool.m4 and ltdl.m4 are from the same release
}

# func_ltmain_update srcfile destfile
# Copy SRCFILE to DESTFILE provided SRCFILE has a newer VERSION/TIMESTAMP,
# or DESTFILE does not yet exist, or the user specified `--force'.
func_ltmain_update ()
{
    my_srcfile="$1"
    my_destfile="$2"
    my_sed_ltmain='
	s,^VERSION=[^0-9]*\(.*\)[ 	]*$,\1,; t
	s,^TIMESTAMP=[^0-9]*\([.0-9]*\) .*$,\1,; t
	d'

    if test -f "$my_srcfile"; then :
    else
      func_error "\`$my_srcfile' does not exist."
      return
    fi

    # FIXME:  check versions, and only downgrade with --force
    cmp -s  "$my_srcfile" "$my_destfile"
    if test "$?" -ne 0 || $opt_force; then
      func_copy "$my_srcfile" "$my_destfile"
    else
      $opt_quiet \
        || func_echo "\`$my_destfile' is already up to date."
    fi
}

# func_config_update srcfile destfile
# Copy SRCFILE to DESTFILE provided SRCFILE has a newer TIMESTAMP,
# or DESTFILE does not yet exist, or the user specified `--force'.
func_config_update ()
{
    my_srcfile="$1"
    my_destfile="$2"
    my_sed_config='s,^timestamp=[^0-9]*\([.0-9-]*\)[^0-9].*$,\1,; t; d'

    if test -f "$my_srcfile"; then :
    else
      func_error "\`$my_srcfile' does not exist."
      return
    fi

    # FIXME:  check versions, and only downgrade with --force
    cmp -s  "$my_srcfile" "$my_destfile"
    if test "$?" -ne 0 || $opt_force; then
      func_copy "$my_srcfile" "$my_destfile"
    else
      $opt_quiet \
        || func_echo "\`$my_destfile' is already up to date."
    fi
}



## ----------- ##
##    Main.    ##
## ----------- ##

{
  rerun_aclocal=false

  re_pkgaux_files='config\.guess|config\.sub|ltmain\.sh'
  re_pkgmacro_files='libtool\.m4|ltdl\.m4'

  func_scan_files
  $opt_quiet || func_check_macros

  # Copy all the files from installed libltdl to this project, if the
  # user specified `--with-ltdl'.
  $opt_ltdl && eval func_copy_all_files "$pkgdatadir/libltdl" libltdl

  # Copy all the installed utility files to the auxiliary directory if
  # `--install' was passed, or else copy just ltmain.sh.
  $opt_quiet || if test "$auxdir" != .; then
    func_echo "putting files in AC_CONFIG_AUX_DIR, \`$auxdir'."
  fi
  if $opt_install || $opt_force; then
    func_copy_all_files "$pkgdatadir" "$auxdir" "$re_pkgaux_files"
    func_config_update "$pkgdatadir/config.guess" "$auxdir/config.guess"
    test -f "$pkgdatadir/config.sub" \
      && func_config_update "$pkgdatadir/config.sub" "$auxdir/config.sub"
  fi
  func_ltmain_update "$pkgdatadir/ltmain.sh" "$auxdir/ltmain.sh"

  # Copy libtool's m4 macros to the macro directory, if they are newer.
  $opt_quiet || if test "$m4dir" != .; then
    func_echo "putting macros in AC_CONFIG_MACRO_DIR, \`$m4dir'."
  fi

  libtool_m4="$pkgmacrodir/libtool.m4"
  ltdl_m4="$pkgmacrodir/ltdl.m4"

  func_copy_all_files "$pkgmacrodir" "$m4dir" \
      "$re_pkgmacro_files" func_serial_update
  func_serial_update  "$libtool_m4" "$m4dir/libtool.m4" LT_INIT 'A[CM]_PROG_LIBTOOL'

  if $seen_ltdl; then
    func_serial_update "$ltdl_m4" "$m4dir/ltdl.m4" 'AC_LIB_LTDL'
  else
    func_verbose "Not copying \`$ltdl_m4', AC_LIB_LTDL not used."
  fi
}

exit $exit_status

# Local Variables:
# mode:shell-script
# sh-indentation:2
# End:
