# bootstrap.conf (GNU Libtool) version 2011-11-21
#
# Copyright (C) 2010-2012 Free Software Foundation, Inc.
# Written by Gary V. Vaughan, 2010

# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# GNU Libtool 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.
#
# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.


## -------------------------------- ##
## User overrideable command paths. ##
## -------------------------------- ##

: "${MAKE=make}"

export MAKE



## -------------- ##
## Configuration. ##
## -------------- ##

# File that should exist in the top directory of a checked out hierarchy,
# but not in a distribution tarball.
checkout_only_file=HACKING

# List of programs (and minimum versions) required to bootstrap, maintain
# and release Libtool.
buildreq="
        help2man   1.29        http://www.gnu.org/software/help2man
        makeinfo   4.8         http://www.gnu.org/software/texinfo
        xz         4.999.8beta http://tukaani.org/xz
"

# Instructions on how to install packages in $buildreq.
buildreq_readme=HACKING

# Non-default gnulib directory options.
local_gl_dir=gl

# Additional gnulib-tool options to use.
gnulib_tool_options=$gnulib_tool_options"
        --avoid=dummy
        --libtool
        --macro-prefix=GL
"

# gnulib modules used by this package.
gnulib_modules='
        announce-gen
        do-release-commit-and-tag
        gendocs
        git-version-gen
        gitlog-to-changelog
        gnu-web-doc-update
        gnupload
        maintainer-makefile
        readme-release
        update-copyright
'

# Extra gnulib files that are not in modules, which override files of
# the same name installed by other bootstrap tools.
gnulib_non_module_files=$gnulib_non_module_files'
        doc/COPYINGv2
        doc/fdl.texi
'

# What ignore files to maintain.
vc_ignore=.gitignore

# Running the installed `libtoolize' will trash the local (newer) libtool.m4
# among others.  Don't use `:', since autoreconf can't exec it!
LIBTOOLIZE=true

# List of file droppings from old releases of Libtool.
libtool_obsolete_files="
        acinclude.m4
        argz.c
        libltdl/config.h
        lt__dirent.c
        lt__strl.c
"

# The not-synced with gnulib warning is bogus until upstream adopts
# the saner bootstrap script.
require_bootstrap_uptodate=:


## ------------------- ##
## Override functions. ##
## ------------------- ##

# func_reconfigure
# ------------------
# In addition to needing to autoreconf several directories, Libtool
# provides `libtoolize' and doesn't use `autopoint', so we can use a
# somewhat simpler `func_reconfigure' implementation.
func_reconfigure ()
{
    $debug_cmd

    $require_autoheader
    $require_build_aux
    $require_macro_dir

    # Only need this from the top level directory
    func_gnulib_tool

    export LIBTOOLIZE
    func_verbose "export LIBTOOLIZE='$LIBTOOLIZE'"

    # Also bootstrap any additional directories that were specified with
    # `reconfdirs' in the environment.
    save_IFS=$IFS
    IFS=,
    for sub in $opt_reconf_dirs; do
      IFS=$save_IFS
      my_autoreconf_options=
      $opt_copy || func_append my_autoreconf_options " --symlink"
      $opt_force && func_append my_autoreconf_options " --force"
      $opt_verbose && func_append my_autoreconf_options " --verbose"
      func_show_eval "$AUTORECONF$my_autoreconf_options --install $sub" \
        'exit $?'
    done
    IFS=$save_IFS
}



## --------------- ##
## Hook functions. ##
## --------------- ##

# `bootstrap' itself takes care of the arguments it recognises, so we only
# have to handle additional options here.  Setting exit_cmd to anything
# other than `:', will tell `bootstrap' to exit after printing it's own
# option loop parser errors.  Best not to use any time-consuming $require_
# functions here, otherwise they will be run even if we only need to
# process `--version'.

# libtool_options_prep [ARG...]
# -----------------------------
# Preparation for supporting additional options in Libtool bootstrap,
# before the option parsing loop.
libtool_options_prep ()
{
    $debug_cmd

    # Extend the existing usage message
    usage_message=$usage_message'
Libtool Specific Options:
  -r, --reconf-dirs=DIR1,DIR2,...
                          limit the directories to be bootstrapped to
                          the comma-delimited list of DIR1,DIR2,...
'

    # autoreconf all directories by default
    test -n "$reconfdirs" \
      || reconfdirs=". libltdl `ls -1d tests/*demo tests/*demo[0-9]`"

    # pass back the list of options we consumed
    func_quote_for_eval ${1+"$@"}
    libtool_options_prep_result=$func_quote_for_eval_result
}
func_add_hook func_options_prep libtool_options_prep


# libtool_parse_options [ARG...]
# ------------------------------
# Provide handling for additional Libtool options inside the main option
# parsing loop.
libtool_parse_options ()
{
    $debug_cmd

    # this inner loop lets us handle `-r.' in a single iteration
    while test $# -gt 0; do
      opt=$1
      shift

      case $opt in
        --reconf-dirs|--reconfdirs|-r)
              test $# = 0 && func_missing_arg $opt && break
              # squash spaces so that delimiter is just `,' and nothing else
              opt_reconf_dirs=`echo "$1" |$SED 's|,  *|,|g'`
              shift
              ;;

        # Separate arguments to short options:
        -r*)  func_split_short_opt "$opt"
              set dummy "$func_split_short_opt_name" "$func_split_short_opt_arg" ${1+"$@"}
              shift
              ;;

        *)    set dummy "$opt" ${1+"$@"}; shift; break ;;
      esac
    done

    # pass back the list of options we consumed
    func_quote_for_eval ${1+"$@"}
    libtool_parse_options_result=$func_quote_for_eval_result
}
func_add_hook func_parse_options libtool_parse_options


# libtool_validate_options [ARG...]
# ---------------------------------
# Validation of additional Libtool bootstrap options, after the main option
# parsing loop.
libtool_validate_options ()
{
    # support the old interface too: `reconfdirs='. libltdl' ./bootstrap'
    test -n "$opt_reconf_dirs" \
      || opt_reconf_dirs=`echo $reconfdirs |$SED 's|  *|,|g'`

    # validate $opt_reconf_dirs
    save_IFS=$IFS
    IFS=,
    for reconfdir in $opt_reconf_dirs; do
      IFS=$save_IFS
      test -d "$reconfdir" || {
        func_error "bad reconf directory \`$reconfdir': directory does not exist"
        exit_cmd=exit
      }
    done
    IFS=$save_IFS

    # pass back the list of options we consumed
    func_quote_for_eval ${1+"$@"}
    libtool_validate_options_result=$func_quote_for_eval_result
}
func_add_hook func_validate_options libtool_validate_options


## ---------------------------- ##
## Libtool bootstrap functions. ##
## ---------------------------- ##

# libtool_prep
# ------------
# Libtool bootstrap initialisation after successful option parse and
# validation.
libtool_prep ()
{
    # initial clean-up of checked out tree
    find . -depth \( -name autom4te.cache -o -name libtool \) -print \
      | grep -v '{arch}' \
      | xargs rm -rf

    # remove obsolete file droppings from old Libtool versions
    for file in $libtool_obsolete_files; do
      rm -f $file
    done
}
func_add_hook func_prep libtool_prep


# libtool_add_libltdl_copying
# ---------------------------
# Use the canonical COPYING.LESSERv2 from gnulib.
libtool_add_libltdl_copying ()
{
    $debug_cmd

    func_gnulib_tool_copy_file doc/COPYING.LESSERv2 libltdl/COPYING.LIB
}
func_add_hook func_gnulib_tool libtool_add_libltdl_copying


# libtool_build_prerequisites
# ---------------------------
# Libtool generates some files that are required before any autotools
# can be run successfully.
libtool_build_prerequisites ()
{
    $debug_cmd

    $require_build_aux
    $require_macro_dir
    $require_package
    $require_package_bugreport
    $require_package_name
    $require_package_url
    $require_package_version

    func_extract_trace LT_CONFIG_LTDL_DIR

    save_ifs=$IFS
    IFS=:
    set dummy $func_extract_trace_result
    IFS=$save_ifs
    shift

    ltdl_dir=$1
    func_check_configuration ltdl_dir \
        "LT_CONFIG_LTDL_DIR([name of your libltdl directory])"
    func_verbose "ltdl_dir='$ltdl_dir'"

    # Whip up a dirty Makefile:
    makes='Makefile.am libltdl/ltdl.mk'
    rm -f Makefile
    {
      echo "aux_dir = $build_aux"
      echo "ltdl_dir = $ltdl_dir"
      echo "macro_dir = $macro_dir"
      $SED '/^if /,/^endif$/d;/^else$/,/^endif$/d;/^include /d' $makes
    } > Makefile

    # Building distributed files from configure is bad for automake, so we
    # generate them here, and have Makefile rules to keep them up to date.
    func_echo "running: $MAKE bootstrap-deps ..."
    $opt_dry_run || {
    output=`$MAKE bootstrap-deps  \
        M4SH="$AUTOM4TE --language=m4sh" PACKAGE="$package" \
        PACKAGE_BUGREPORT="$package_bugreport" PACKAGE_NAME="$package_name" \
        PACKAGE_URL="$package_url" SED="$SED" srcdir=. \
        VERSION="$package_version" 2>&1`
    }
    status=$?

    test 0 -eq "$status" || echo "$output"
    rm -f Makefile
    test 0 -eq "$status" ||exit $EXIT_FAILURE
}
func_add_hook func_gnulib_tool libtool_build_prerequisites


# libtool_force_changelog
# -----------------------
# Automake requires that ChangeLog exist.
libtool_force_changelog ()
{
    $debug_cmd

    echo "Autogenerated by \`make dist'" > ChangeLog || exit 1
}
func_add_hook func_gnulib_tool libtool_force_changelog


# libtool_readme_release_package_substitutions
# --------------------------------------------
# Show our own package details instead of generic strings.
libtool_readme_release_package_substitutions ()
{
    $debug_cmd

    $require_build_aux
    $require_package

    my_readme=README-release

    test -f "$my_readme" \
        || func_fatal_error "error: \`$my_readme' does not exist"

    # Perform substitutions to a temporary file
    $SED -e "\
        s|\@PACKAGE\@|$package|g
    " "$my_readme" > "${my_readme}T" \
        && mv "${my_readme}T" "$my_readme"
}
func_add_hook func_fini libtool_readme_release_package_substitutions


# libtool_fudge_timestamps
# ------------------------
# Autoheader valiantly tries to prevent needless reconfigurations by
# not changing the timestamp of config-h.in unless the file contents
# are updated.  Unfortunately config-h.in depends on aclocal.m4 which
# *is* updated, so running 'libtoolize --ltdl=. && configure && make'
# causes autoheader to be called... undesireable for users that do not
# have it!  Fudge the timestamp to prevent that:
libtool_fudge_timestamps ()
{
    $debug_cmd

    sleep 2 && touch libltdl/config-h.in
}
func_add_hook func_fini libtool_fudge_timestamps


# libtool_cleanup
# ---------------
libtool_cleanup ()
{
    $debug_cmd

    # These files can cause an infinite configure loop if left behind.
    rm -f Makefile libltdl/Makefile libtool vcl.tmp
}
func_add_hook func_fini libtool_cleanup


# libtool_check_for_bogus_macros
# ------------------------------
# Try to catch the case where `aclocal' pulls installed libtool macro
# file contents from another version of libtool into the current package
# `aclocal.m4'.
libtool_check_for_bogus_macros ()
{
    $debug_cmd

    $opt_dry_run ||
        for macro in LT_INIT AC_PROG_LIBTOOL AM_PROG_LIBTOOL; do
          if grep $macro aclocal.m4 libltdl/aclocal.m4; then
            func_fatal_error "Bogus $macro macro contents in an aclocal.m4 file"
          else :; fi
        done
}
func_add_hook func_fini libtool_check_for_bogus_macros


# libtool_cleanup_empty_dirs
# --------------------------
# Gnulib leaves behind a few files we don't need.
libtool_cleanup_empty_dirs ()
{
    $debug_cmd

    my_gnulib_source=${source_base-'lib'}
    if test -d "$my_gnulib_source"; then
      rm -f "$my_gnulib_source/.gitignore" "$my_gnulib_source/Makefile.am" || exit 1
      rmdir "$my_gnulib_source" || exit 1
    fi
}
func_add_hook func_fini libtool_cleanup_empty_dirs



## -------------------- ##
## Resource management. ##
## -------------------- ##

# require_package_url
# -------------------
# Ensure that package_url has a sensible default.
require_package_url=libtool_require_package_url
libtool_require_package_url ()
{
    $require_configure_ac

    func_extract_trace AC_INIT

    save_IFS=$IFS
    IFS=:
    set dummy $func_extract_trace_result
    IFS=$save_IFS
    shift

    test -n "$package_url " || package_url=$5
    test -n "$package_url" || {
      # How to extract the parameters for `make bootstrap-deps' from
      # configure.ac.  This is very specific to the way Libtool's
      # configure.ac layout.
      sed_extract_package_url='s|#.*$||; s|^dnl .*$||; s| dnl .*$||;
        /AC_SUBST([[]*PACKAGE_URL/{
            s|.*AC_SUBST([[	 ]*PACKAGE_URL[]	 ]*,[[	 ]*|package_url="|
            s|[])	 ]*$|"|
            p
        }'

      # Extract package_url setting from configure.ac.
      eval `$SED -n "$sed_extract_package_url" < configure.ac`
    }

    test -n "$package_url" \
      || func_fatal_error "unable to determine \`package_url' from \`$configure_ac'."

    func_verbose "package_url='$package_url'"

    require_package_url=:
}


# Local variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "# bootstrap.conf (GNU Libtool) version "
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "$"
# End:
