# bootstrap.conf (GNU Libtool) version 2014-11-18
#
# Copyright (C) 2010-2019, 2021-2025 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.  If not, see <https://www.gnu.org/licenses/>.


## -------------------------------- ##
## User overridable 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        https://www.gnu.org/s/help2man
        make       3.81        https://www.gnu.org/s/make
        makeinfo   4.8         https://www.gnu.org/s/texinfo
        xz         4.999.8beta https://tukaani.org/xz
"

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

# Non-default gnulib directories.
local_gl_path=gl:gl-mod/bootstrap

# We don't need the whole copy of gnulib.
gnulib_clone_since=2019-02-19

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

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

gnulib_git_submodules='
        gl-mod/bootstrap
'

# 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
"


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

# func_autopoint
# --------------
# Libtool does not use autopoint.
func_autopoint ()
{
    $debug_cmd
}


# func_libtoolize
# ---------------
# Libtoolize is part of Libtool!
func_libtoolize ()
{
    $debug_cmd
}



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

# libtool_prep
# ------------
# Libtool bootstrap initialisation after successful option parse and
# validation.
libtool_prep ()
{
    $debug_cmd

    # 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_ltdl_dir
    $require_macro_dir
    $require_package
    $require_package_bugreport
    $require_package_name
    $require_package_url
    $require_package_version

    # 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"

      # The following allow us to tie bootstrap-deps output verbosity
      # into the bootstrap --verbose option:
      echo 'AM_V_GEN = $(am__v_GEN_$(V))'
      echo 'am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))'
      echo 'am__v_GEN_0 = @echo "  GEN     " $@;'
      echo 'AM_V_at = $(am__v_at_$(V))'
      echo 'am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))'
      echo 'am__v_at_0 = @'

      $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_show_eval "$MAKE bootstrap-deps \
        AM_DEFAULT_VERBOSITY=0 `$opt_verbose && echo V=1` \
        PACKAGE='$package' PACKAGE_BUGREPORT='$package_bugreport' \
        PACKAGE_NAME='$package_name' PACKAGE_URL='$package_url' \
        SED='$SED' srcdir=. VERSION='$package_version'"
    status=$?

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


# libtool_autoreconf_libltdl
# --------------------------
# Libtldl directory needs to be autoreconfed too.
libtool_autoreconf_libltdl ()
{
    $debug_cmd

    # Also bootstrap libltdl ready for installation.
    func_autoreconf libltdl
}
func_add_hook func_reconfigure libtool_autoreconf_libltdl


# 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... undesirable for users that do not
# have it!  Fudge the timestamp to prevent that.  But only fudge it as
# much as configure since configure depends on config-h.in and we don't
# want to require autoconf either.
libtool_fudge_timestamps ()
{
    $debug_cmd

    (
    cd libltdl
    touch -r configure 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
    $require_build_aux
    $build_aux/no-bogus-m4-defines || exit 1
}
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_ltdl_dir
# ----------------
# Extract libtool's ltdl directory from configure.ac.
require_ltdl_dir=func_require_ltdl_dir
func_require_ltdl_dir ()
{
    $debug_cmd

    $require_configure_ac

    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'"

    require_ltdl_dir=:
}


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

    $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:
