## Makefile.am -- Process this file with automake to produce Makefile.in
##
##   Copyright (C) 2003-2019, 2021-2025 Free Software Foundation, Inc.
##   Written by Gary V. Vaughan, 2003
##
##   This file is part of GNU Libtool.
##
## 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/>.
#####

ACLOCAL_AMFLAGS		= -I m4

AM_CPPFLAGS		=
AM_LDFLAGS		=

SUBDIRS			= . gnulib-tests
DIST_SUBDIRS		= $(SUBDIRS)
EXTRA_DIST		=

BUILT_SOURCES		= libtool libtoolize libtool-next-version

CLEANFILES		=
MOSTLYCLEANFILES	=
DISTCLEANFILES		=
MAINTAINERCLEANFILES	=

include_HEADERS		=
noinst_LTLIBRARIES	=
lib_LTLIBRARIES		=
EXTRA_LTLIBRARIES	=

# Using 'cd' in backquotes may print the directory name, use this instead:
lt__cd		= CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd

git_version_gen = '$(SHELL)' '$(aux_dir)/git-version-gen' '--fallback' '$(VERSION)' '.tarball-version'
rebuild = rebuild=:; revision=`$(lt__cd) $(srcdir) && $(git_version_gen) | $(SED) 's|-.*$$||'`


# ---------- #
# Bootstrap. #
# ---------- #

SCRIPT_ENV	= GREP='$(GREP)' SED='$(SED)'

build_scripts	= $(srcdir)/$(aux_dir)/announce-gen \
		  $(srcdir)/$(aux_dir)/do-release-commit-and-tag \
		  $(srcdir)/$(aux_dir)/gendocs.sh \
		  $(srcdir)/$(aux_dir)/git-version-gen \
		  $(srcdir)/$(aux_dir)/gnu-web-doc-update \
		  $(srcdir)/$(aux_dir)/gnupload \
		  $(srcdir)/$(aux_dir)/useless-if-before-free \
		  $(srcdir)/$(aux_dir)/vc-list-files

EXTRA_DIST     += bootstrap bootstrap.conf $(build_scripts) cfg.mk maint.mk \
		  GNUmakefile
CLEANFILES     += libtool libtoolize libtool-next-version

## If a file is named several times below, and especially if it
## is a distributed file created during Libtool bootstrap, we
## put it in a variable in accordance with the DRY principle.
## Use '$(srcdir)' for the benefit of non-GNU makes: referring
## to them by their variable makes sure they appear as targets
## and dependencies with '$(srcdir)' consistently.
configure_ac	= $(srcdir)/configure.ac
config_status	= $(top_builddir)/config.status
extract_trace	= $(srcdir)/$(aux_dir)/extract-trace
funclib_sh	= $(srcdir)/$(aux_dir)/funclib.sh
inline_source	= $(srcdir)/$(aux_dir)/inline-source
libtoolize_in	= $(srcdir)/libtoolize.in
libtoolnextv_in	= $(srcdir)/libtool-next-version.in
ltmain_sh	= $(srcdir)/$(aux_dir)/ltmain.sh
ltmain_in	= $(srcdir)/$(aux_dir)/ltmain.in
libtool_m4	= $(srcdir)/$(macro_dir)/libtool.m4
ltversion_in	= $(srcdir)/$(macro_dir)/ltversion.in
ltversion_m4	= $(srcdir)/$(macro_dir)/ltversion.m4
no_bogus_macros	= $(srcdir)/$(aux_dir)/no-bogus-m4-defines
options_parser	= $(srcdir)/$(aux_dir)/options-parser
u2d_copyright	= $(srcdir)/$(aux_dir)/update-copyright

EXTRA_DIST     += $(extract_trace) $(funclib_sh) $(inline_source) \
		  $(libtoolize_in) $(libtoolnextv_in) \
		  $(ltmain_in) $(ltmain_sh) \
		  $(ltversion_in) $(ltversion_m4) $(no_bogus_macros) \
		  $(options_parser) $(u2d_copyright)

## These are the replacements that need to be made at bootstrap time,
## because they must be static in distributed files, and not accidentally
## changed by configure running on the build machine.
bootstrap_edit  = $(SED) \
		  -e 's|@MACRO_VERSION\@|$(VERSION)|g' \
		  -e "s|@MACRO_REVISION\@|$$revision|g" \
		  -e "s|@MACRO_SERIAL\@|$$serial|g" \
		  -e 's|@PACKAGE\@|$(PACKAGE)|g' \
		  -e 's|@PACKAGE_BUGREPORT\@|$(PACKAGE_BUGREPORT)|g' \
		  -e 's|@PACKAGE_URL\@|$(PACKAGE_URL)|g' \
		  -e 's|@PACKAGE_NAME\@|$(PACKAGE_NAME)|g' \
		  -e "s|@package_revision\@|$$revision|g" \
		  -e 's|@PACKAGE_STRING\@|$(PACKAGE_NAME) $(VERSION)|g' \
		  -e 's|@PACKAGE_TARNAME\@|$(PACKAGE)|g' \
		  -e 's|@PACKAGE_VERSION\@|$(VERSION)|g' \
		  -e 's|@VERSION\@|$(VERSION)|g'

## We build ltversion.m4 here, instead of from config.status,
## because config.status is rerun each time one of configure's
## dependencies change and ltversion.m4 happens to be a configure
## dependency.  configure and ltversion.m4 would be rebuilt in
## a loop otherwise.
## We used to do this with a 'stamp-vcl' file, but non-gmake builds
## would rerun configure on every invocation, so now we manually
## check the version numbers from the build rule when necessary.
$(ltversion_m4): $(ltversion_in) $(dotversion)
	@$(rebuild); \
	if test -f '$@'; then \
	  eval `'$(SED)' -n '/^macro_revision=/p' '$@'`; \
	  test "x$$macro_revision" = "x$$revision" && rebuild=false; \
	fi; \
	for prereq in $?; do \
	  case $$prereq in *.version);; *) rebuild=:;; esac; \
	done; \
	if $$rebuild; then \
	  rm -f '$@'; \
	  if test -d '$(srcdir)/.git' && git --version >/dev/null 2>&1; then \
	    $(git_commit_count) > '$(srcdir)/.serial'; \
	  fi; \
	  serial=`cat '$(srcdir)/.serial'`; \
	  if test 0 = '$(AM_DEFAULT_VERBOSITY)' && test 1 != '$(V)'; \
	    then echo "  GEN     " $@; \
	  else echo $(bootstrap_edit) "'$(ltversion_in)' > '$@'"; fi; \
	  $(bootstrap_edit) '$(ltversion_in)' > '$@'; \
	  chmod a-w '$@'; \
	fi

## And for similar reasons, ltmain.sh can't be built from config.status.
## We used to do this with a 'stamp-vcl' file, but non-gmake builds
## would rerun configure on every invocation, so now we manually
## check the version numbers from the build rule when necessary.
## !WARNING! If you edit this rule to change the contents of ltmain.sh,
##           you must 'touch $(aux_dir)/ltmain.in' from the
##           shell if you need ltmain.sh to be regenerated.  Ideally, we
##           should make this rule depend on Makefile but that will break
##           distcheck (at least) by rebuilding ltmain.sh in the source
##           tree whenever config.status regenerates the Makefile.
$(ltmain_sh): $(ltmain_in) $(dotversion)
	@$(rebuild); \
	if test -f '$@'; then \
	  eval `'$(SED)' -n '/^package_revision=/p' '$@'`; \
	  test "x$$package_revision" = "x$$revision" && rebuild=false; \
	fi; \
	for prereq in $?; do \
	  case $$prereq in *.version);; *) rebuild=:;; esac; \
	done; \
	if $$rebuild; then \
	  rm -f '$@'; \
	  if test 0 = '$(AM_DEFAULT_VERBOSITY)' && test 1 != '$(V)'; \
	    then echo "  GEN     " $@; \
	  else echo "$(inline_source) '$(ltmain_in)' |" $(bootstrap_edit) "> '$@'"; fi; \
	  $(SCRIPT_ENV) '$(inline_source)' '$(ltmain_in)' | $(bootstrap_edit) > '$@'; \
	  chmod a-w '$@'; \
	fi

lt_Makefile_am	= $(srcdir)/$(ltdl_dir)/Makefile.am
lt_Makefile_in	= $(srcdir)/$(ltdl_dir)/Makefile.in
ltdl_mk		= $(srcdir)/$(ltdl_dir)/ltdl.mk

$(lt_Makefile_am): $(ltdl_mk)
	$(AM_V_at)rm -f '$@'
	$(AM_V_GEN)( '$(SED)' -n '1,/^.. DO NOT REMOVE THIS LINE -- /p' \
	      '$(ltdl_mk)'; \
	  { echo 'ACLOCAL_AMFLAGS = -I ../m4'; \
	    echo 'AUTOMAKE_OPTIONS = foreign'; \
	    echo 'AM_CPPFLAGS ='; \
	    echo 'AM_LDFLAGS ='; \
	    echo 'BUILT_SOURCES ='; \
	    echo 'include_HEADERS ='; \
	    echo 'noinst_LTLIBRARIES ='; \
	    echo 'lib_LTLIBRARIES ='; \
	    echo 'EXTRA_LTLIBRARIES ='; \
	    echo 'EXTRA_DIST ='; \
	    echo 'CLEANFILES ='; \
	    echo 'MOSTLYCLEANFILES ='; \
	  }; \
	  '$(SED)' -n '/^.. DO NOT REMOVE THIS LINE -- /,$$p' \
	      '$(ltdl_mk)' \
	    |'$(SED)' -e 's|libltdl_||; s|libltdl/||; s|: libltdl/|: |' \
	      -e '/^[	 ]*-I\$$(srcdir)\/libltdl -Ilibltdl \\/d' \
	      -e 's|\$$(libltdl_|$$(|' \
	) |'$(SED)' -e '/^.. DO NOT REMOVE THIS LINE -- /d' \
	      -e '1s,^\(.. Makefile.\)inc.*,\1am -- Process this file with automake to produce Makefile.in,' > '$@'
	$(AM_V_at)chmod a-w '$@'

## Document the make macros that are needed to build bootstrap-deps
## dependencies when called from 'bootstrap' (developer's machine),
## where the Makefile.am is fed to make in its raw format before
## 'configure' has found the correct values (on the build machine).
bootstrap_files = \
    $(lt_Makefile_am) \
    $(ltmain_sh) \
    $(ltversion_m4)

.PHONY: bootstrap-deps bootstrap-deps-prep
bootstrap-deps: bootstrap-deps-prep
	$(MAKE) $(bootstrap_files)

bootstrap-deps-prep:
## The following variables are substituted by 'bootstrap-dep-preps'
	@exit_cmd=:; \
	test -z '$(srcdir)' \
	    && echo "ERROR: don't call $(MAKE) with srcdir unset." \
	    && exit_cmd=exit; \
	test -z '$(PACKAGE)' \
	    && echo "ERROR: don't call $(MAKE) with PACKAGE unset." \
	    && exit_cmd=exit; \
	test -z '$(PACKAGE_BUGREPORT)' \
	    && echo "ERROR: don't call $(MAKE) with PACKAGE_BUGREPORT unset." \
	    && exit_cmd=exit; \
	test -z '$(PACKAGE_NAME)' \
	    && echo "ERROR: don't call $(MAKE) with PACKAGE_NAME unset." \
	    && exit_cmd=exit; \
	test -z '$(PACKAGE_URL)' \
	    && echo "ERROR: don't call $(MAKE) with PACKAGE_URL unset." \
	    && exit_cmd=exit; \
	test -z '$(SED)' \
	    && echo "ERROR: don't call $(MAKE) with SED unset." \
	    && exit_cmd=exit; \
	test -z '$(VERSION)' \
	    && echo "ERROR: don't call $(MAKE) with VERSION unset." \
	    && exit_cmd=exit; \
	$$exit_cmd 1
	$(AM_V_at)rm -f $(bootstrap_files)

## Unfortunately, all this bogeyness means that we have to manually
## keep the generated files in libltdl up to date.
LTDL_BOOTSTRAP_DEPS = \
	$(stamp_mk) \
	$(lt_aclocal_m4) \
	$(lt_config_h_in) \
	$(lt_configure)

all-local: $(LTDL_BOOTSTRAP_DEPS)


## ---------------- ##
## Libtool scripts. ##
## ---------------- ##

abs_aux_dir = `$(lt__cd) '$(srcdir)/$(aux_dir)' && pwd`
ltdl_ac_aux_dir = `$(SCRIPT_ENV) $(extract_trace) AC_CONFIG_AUX_DIR $(srcdir)/libltdl/configure.ac`

configure_edit = $(bootstrap_edit) \
	-e '/^\. /s|@auxscriptsdir\@|'$(abs_aux_dir)'|g' \
	-e 's|@aclocaldir\@|$(aclocaldir)|g' \
	-e 's|@aux_dir\@|$(aux_dir)|g' \
	-e 's|@datadir\@|$(datadir)|g' \
	-e 's|@EGREP\@|$(EGREP)|g' \
	-e 's|@FGREP\@|$(FGREP)|g' \
	-e 's|@GREP\@|$(GREP)|g' \
	-e 's|@host_triplet\@|$(host_triplet)|g' \
	-e 's|@LN_S\@|$(LN_S)|g' \
	-e "s|@ltdl_ac_aux_dir\@|$(ltdl_ac_aux_dir)|g" \
	-e 's|@macro_dir\@|$(macro_dir)|g' \
	-e 's|@pkgauxdir\@|$(pkgauxdir)|g' \
	-e 's|@pkgaux_files\@|$(pkgaux_scripts) $(pkgaux_data_files)|g' \
	-e 's|@pkgaux_install_files\@|$(pkgaux_install_files)|g' \
	-e 's|@pkgaux_parent_files\@|$(pkgaux_parent_files)|g' \
	-e 's|@pkgdatadir\@|$(pkgdatadir)|g' \
	-e 's|@pkgltdl_files\@|$(pkgltdl_files)|g' \
	-e 's|@pkgmacro_files\@|$(pkgmacro_files)|g' \
	-e 's|@prefix\@|$(prefix)|g' \
	-e 's|@SED\@|$(SED)|g' \
	-e 's|@srcdir\@|$(srcdir)|g'

# The libtool distributor and the standalone libtool script.
bin_SCRIPTS = libtool
# The "Update version info" wizard.
bin_SCRIPTS += libtool-next-version

libtoolize: $(libtoolize_in) $(config_status)
	$(AM_V_at)rm -f '$@'
	$(AM_V_GEN)$(configure_edit) '$(libtoolize_in)' > '$@'
	$(AM_V_at)chmod a+x '$@'
	$(AM_V_at)chmod a-w '$@'

libtool-next-version: $(libtoolnextv_in) $(config_status)
	$(AM_V_at)rm -f '$@'
	$(AM_V_GEN)$(bootstrap_edit) '$(libtoolnextv_in)' > '$@'
	$(AM_V_at)chmod a+x '$@'
	$(AM_V_at)chmod a-w '$@'

# We used to do this with a 'stamp-vcl' file, but non-gmake builds
# would rerun configure on every invocation, so now we manually
# check the version numbers from the build rule when necessary.
libtool: $(ltmain_sh) $(config_status) $(dotversion)
	@$(rebuild); \
	if test -f '$@'; then \
	  eval `'$(SED)' -n '/^package_revision=/p' '$@'`; \
	  test "$$package_revision" = "$$revision" && rebuild=false; \
	fi; \
	for prereq in $?; do \
	  case $$prereq in *.version);; *) rebuild=:;; esac; \
	done; \
	if $$rebuild; then \
	  if test 0 = '$(AM_DEFAULT_VERBOSITY)' && test 1 != '$(V)'; \
	    then echo "  GEN     " $@; \
	  else echo '$(SHELL) $(top_builddir)/config.status "$@"'; fi; \
	  cd '$(top_builddir)' && '$(SHELL)' ./config.status '$@'; \
	fi


## -------- ##
## Libltdl. ##
## -------- ##

include libltdl/ltdl.mk

lt_aclocal_m4	= $(srcdir)/$(ltdl_dir)/aclocal.m4
lt_config_h_in	= $(srcdir)/$(ltdl_dir)/config-h.in
lt_configure	= $(srcdir)/$(ltdl_dir)/configure
lt_configure_ac	= $(srcdir)/$(ltdl_dir)/configure.ac
stamp_mk	= $(srcdir)/$(ltdl_dir)/stamp-mk

lt_obsolete_m4	= $(srcdir)/$(macro_dir)/lt~obsolete.m4

EXTRA_DIST     += $(lt_aclocal_m4) \
		  $(lt_configure) \
		  $(lt_configure_ac) \
		  $(lt_config_h_in) \
		  $(lt_Makefile_am) \
		  $(lt_Makefile_in) \
		  $(lt_obsolete_m4) \
		  $(stamp_mk)

$(lt_Makefile_in): $(lt_Makefile_am) $(lt_aclocal_m4) $(lt_config_h_in)
	$(AM_V_GEN)cd '$(srcdir)/$(ltdl_dir)' && $(AUTOMAKE) Makefile

# Don't let unused scripts leak into the libltdl Makefile
$(stamp_mk): $(lt_Makefile_in)
	$(AM_V_at)T='$(srcdir)/$(aux_dir)/Makefile.tmp'; \
	for p in $(srcdir)/$(aux_dir)/*; do \
	  test -f "$$p" || continue; \
	  f=`echo "$$p" | $(SED) 's|^$(srcdir)/$(aux_dir)/||'`; \
	  case " $(pkgaux_scripts) ltmain.sh " in \
	    *" $$f "*) ;; \
	    *) '$(SED)' \
		  -e 's|\(\$$([^)]*)/\)*'"$(ltdl_ac_aux_dir)/$$f"'\$$||' \
		  -e 's|\(\$$([^)]*)/\)*'"$(ltdl_ac_aux_dir)/$$f"' ||' \
		  -e '/^[	 ]*\\$$/d' \
		'$(lt_Makefile_in)' > "$$T" \
		  && mv -f "$$T" '$(lt_Makefile_in)';; \
	  esac; \
	done
	$(AM_V_GEN)echo stamp > '$@'

lt_aclocal_m4_deps = \
	$(lt_obsolete_m4) \
	$(ltversion_m4) \
	$(libtool_m4) \
	$(srcdir)/$(macro_dir)/ltargz.m4 \
	$(srcdir)/$(macro_dir)/ltdl.m4 \
	$(srcdir)/$(macro_dir)/ltoptions.m4 \
	$(srcdir)/$(macro_dir)/ltsugar.m4 \
	$(srcdir)/$(macro_dir)/m4.m4 \
	$(srcdir)/$(ltdl_dir)/configure.ac

lt_configure_deps = $(lt_aclocal_m4) $(lt_aclocal_m4_deps)

$(lt_aclocal_m4): $(lt_aclocal_m4_deps)
	$(AM_V_GEN)cd '$(srcdir)/$(ltdl_dir)' && $(ACLOCAL) -I ../m4

$(lt_configure): $(lt_configure_deps) $(lt_config_h_in)
	$(AM_V_GEN)cd '$(srcdir)/$(ltdl_dir)' && $(AUTOCONF)

$(lt_config_h_in): $(lt_configure_deps)
	$(AM_V_GEN)cd '$(srcdir)/$(ltdl_dir)' && $(AUTOHEADER)
	$(AM_V_at)touch '$@'


## -------------- ##
## Documentation. ##
## -------------- ##

doc_dir		= $(srcdir)/doc

libtool_1	= $(doc_dir)/libtool.1
libtoolize_1	= $(doc_dir)/libtoolize.1
libtoolnextv_1	= $(doc_dir)/libtool-next-version.1
notes_texi	= $(doc_dir)/notes.texi
notes_txt	= $(doc_dir)/notes.txt

EXTRA_DIST	+= $(doc_dir)/gendocs_template

# A bug in automake 1.11.1 (at least) prevents us from using:
#
#   info_TEXINFOS	= $(doc_dir)/libtool.texi
#
# Producing the following error, even though srcdir is implicitly set:
# "cannot open < ./$(srcdir)/doc/libtool.texi: No such file or directory"
info_TEXINFOS		= doc/libtool.texi
doc_libtool_TEXINFOS	= $(doc_dir)/PLATFORMS $(doc_dir)/fdl.texi \
			  $(notes_texi)
EXTRA_DIST	       += $(notes_txt)
## Workaround for a texinfo bug described here:
## http://thread.gmane.org/gmane.comp.tex.texinfo.bugs/3930
DISTCLEANFILES	       += libtool.dvi

all-local: $(notes_txt)

$(notes_txt): $(notes_texi)
	$(AM_V_GEN)$(MAKEINFO) -P '$(srcdir)/doc' --no-headers \
	    $(MAKEINFOFLAGS) -o '$@' '$(notes_texi)'

dist_man1_MANS		= $(libtool_1) $(libtoolize_1) $(libtoolnextv_1)
MAINTAINERCLEANFILES	+= $(dist_man1_MANS)
update_mans = \
  PATH=".$(PATH_SEPARATOR)$$PATH"; export PATH; \
  $(HELP2MAN) --output='$@'

# It's wrong to make distributed files (e.g. $(libtool_1)) rely on
# files created in the build tree, so instead we regenerate the
# manual pages if the sources for the build-tree files we want to
# run have changed.
$(libtool_1): $(ltmain_sh)
	$(AM_V_GEN)$(update_mans) -n 'Provide generalized library-building support services' --help-option=--help-all libtool
$(libtoolize_1): $(libtoolize_in)
	$(AM_V_GEN)$(update_mans) -n 'Prepare a package to use libtool' libtoolize
$(libtoolnextv_1): $(libtoolnextv_in)
	$(AM_V_GEN)$(update_mans) -n 'Determines next version to use for a libtool library' libtool-next-version



## ------------- ##
## Installation. ##
## ------------- ##

ltdldir		= $(srcdir)/libltdl
pkgauxdir	= $(pkgdatadir)/build-aux

# The timestamps on these files must be preserved carefully so we install,
# uninstall and set executable with custom rules here.
pkgaux_parent_files	= ltmain.sh
pkgaux_install_files	= config.guess config.sub install-sh
pkgaux_data_files	= $(pkgaux_parent_files)

# Everything that gets picked up by aclocal is automatically distributed,
# this is the list of macro files we install on the user's system.
pkgmacro_files	= libtool.m4 ltargz.m4 ltdl.m4 ltoptions.m4 ltsugar.m4 \
		  ltversion.m4 lt~obsolete.m4

## These are installed as a subdirectory of pkgdatadir so that
## libtoolize --ltdl can find them later. Note that this list requires
## specific order to avoid unnecessary re-autotooling after libtoolize run.
pkgltdl_files	= COPYING.LIB \
		  Makefile.am \
		  README \
		  configure.ac \
		  aclocal.m4 \
		  Makefile.in \
		  config-h.in \
		  configure \
		  libltdl/lt__alloc.h \
		  libltdl/lt__argz_.h \
		  libltdl/lt__dirent.h \
		  libltdl/lt__glibc.h \
		  libltdl/lt__private.h \
		  libltdl/lt__strl.h \
		  libltdl/lt_dlloader.h \
		  libltdl/lt_error.h \
		  libltdl/lt_system.h \
		  libltdl/slist.h \
		  loaders/dld_link.c \
		  loaders/dlopen.c \
		  loaders/dyld.c \
		  loaders/load_add_on.c \
		  loaders/loadlibrary.c \
		  loaders/preopen.c \
		  loaders/shl_load.c \
		  lt__alloc.c \
		  lt__argz.c \
		  lt__dirent.c \
		  lt__strl.c \
		  lt_dlloader.c \
		  lt_error.c \
		  ltdl.c \
		  ltdl.h \
		  ltdl.mk \
		  slist.c

install-data-local: $(lt_Makefile_in) install-scripts-local
	@$(NORMAL_INSTALL)
## Don't install over the top of an old pkgdatadir
	-rm -rf '$(DESTDIR)$(pkgdatadir)'/*
## First, put a copy of the libtool m4 macros in the aclocal dir
	@list='$(pkgmacro_files)'; for p in $$list; do \
	  d=`echo "$(DESTDIR)$(aclocaldir)/$$p" |$(SED) 's|[^/]*$$||'`; \
	  test -d "$$d" || $(mkinstalldirs) "$$d"; \
	  echo " $(INSTALL_DATA) '$(srcdir)/$(macro_dir)/$$p' '$(DESTDIR)$(aclocaldir)/$$p'"; \
	  $(INSTALL_DATA) "$(srcdir)/$(macro_dir)/$$p" "$(DESTDIR)$(aclocaldir)/$$p"; \
	done
## install the helper scripts
	@list='$(pkgaux_scripts)' && \
	for p in $$list; do \
	  d=`echo "$(DESTDIR)$(pkgauxdir)/$$p" |$(SED) 's|[^/]*$$||'`; \
	  test -d "$$d" || $(mkinstalldirs) "$$d"; \
	  echo " $(INSTALL_SCRIPT) '$(srcdir)/$(aux_dir)/$$p' '$(DESTDIR)$(pkgauxdir)/$$p'"; \
	  $(INSTALL_SCRIPT) "$(srcdir)/$(aux_dir)/$$p" "$(DESTDIR)$(pkgauxdir)/$$p"; \
	done
	@list='$(pkgaux_data_files)' && for p in $$list; do \
	  d=`echo "$(DESTDIR)$(pkgauxdir)/$$p" |$(SED) 's|[^/]*$$||'`; \
	  test -d "$$d" || $(mkinstalldirs) "$$d"; \
	  echo " $(INSTALL_DATA) '$(srcdir)/$(aux_dir)/$$p' '$(DESTDIR)$(pkgauxdir)/$$p'"; \
	  $(INSTALL_DATA) "$(srcdir)/$(aux_dir)/$$p" "$(DESTDIR)$(pkgauxdir)/$$p"; \
	done
## install the libltdl files
	@list='$(pkgltdl_files)' && for p in $$list; do \
	  d=`echo "$(DESTDIR)$(pkgdatadir)/$$p" |$(SED) 's|[^/]*$$||'`; \
	  test -d "$$d" || $(mkinstalldirs) "$$d"; \
	  echo " $(INSTALL_DATA) '$(ltdldir)/$$p' '$(DESTDIR)$(pkgdatadir)/$$p'"; \
	  $(INSTALL_DATA) "$(ltdldir)/$$p" "$(DESTDIR)$(pkgdatadir)/$$p"; \
	done
	chmod a+x '$(DESTDIR)$(pkgdatadir)/configure'

.PHONY: install-scripts-local
install-scripts-local: $(lt_Makefile_in)
## Inline helper-scripts for installed libtoolize script
	@p=`echo libtoolize |sed -e '$(transform)'`; \
	echo " $(SCRIPT_ENV) '$(inline_source)' libtoolize > '$(DESTDIR)$(bindir)/$$p'"; \
	d=`echo "$(DESTDIR)$(bindir)/$$p" |$(SED) 's|[^/]*$$||'`; \
	test -d "$$d" || $(mkinstalldirs) "$$d"; \
	$(SCRIPT_ENV) '$(inline_source)' libtoolize > "$(DESTDIR)$(bindir)/$$p"; \
	chmod a+x "$(DESTDIR)$(bindir)/$$p"


## ------------- ##
## Distribution. ##
## ------------- ##

edit_readme_alpha	= $(srcdir)/$(aux_dir)/edit-readme-alpha
gitlog_to_changelog	= $(srcdir)/$(aux_dir)/gitlog-to-changelog
git_log_fix		= $(srcdir)/$(aux_dir)/git-log-fix
thanks_gen		= $(srcdir)/$(aux_dir)/thanks-gen

dotserial		= $(distdir)/.serial
dotversion		= $(top_srcdir)/.version
tarball_version		= $(distdir)/.tarball-version
readme			= $(distdir)/README
changelog		= $(distdir)/ChangeLog
changelog_old		= $(srcdir)/ChangeLog.old
thanks			= $(distdir)/THANKS
no_thanks		= $(srcdir)/NO-THANKS

# Generate ChangeLog using git log entries for as far back as
# they are in good shape, appending manual records from earlier.
changelog_start_date = 2011-01-01
$(changelog): FORCE
	$(AM_V_GEN)if test -d '$(srcdir)/.git'; then \
	  TZ=UTC $(gitlog_to_changelog) --amend=$(git_log_fix) \
	      --ignore-matching=Omit-from-ChangeLog. \
	      --format='%s%n%n%b%n' \
	      --since=$(changelog_start_date) > '$@T'; \
	  rm -f '$@'; mv '$@T' '$@'; \
	  cat '$(changelog_old)' >> '$@'; \
	fi

# Sort in traditional ASCII order, regardless of the current locale;
# otherwise we may get into trouble with distinct strings that the
# current locale considers to be equal.
ASSORT = LC_ALL=C sort

# Extract all lines up to the first one starting with "##".
prologue = perl -ne '/^\#\#/ and exit; print' $(no_thanks)

# Generate THANKS using git log entries as far as possible, fixing
# up omissions and errors from NO-THANKS configuration.
$(thanks): FORCE
	$(AM_V_GEN)if test -d '$(srcdir)/.git'; then \
	  { \
	    $(prologue); echo; \
	    { perl -ne '/^$$/.../^$$/ and print' $(no_thanks) \
	      | grep -v '^$$' | perl -pe 's/  +/\0/'; \
	      {  sed -e '1,/\#\# /d' -e '/^\#\# /d' \
		    -e 's|[	][	 ]*|	|' < $(no_thanks) \
		  | tr '\t' '\0'; \
		git log --pretty=format:'%aN%x00%aE'; \
	      } | $(ASSORT) -u; \
	    } | $(thanks_gen) \
	      | LC_ALL=en_US.UTF-8 sort -f; \
	    echo; \
	    printf ';; %s\n' 'Local Variables:' 'coding: utf-8' End:; \
	  } > '$@'; \
	fi

## Arrange so that .version appears only in the distribution
## tarball, and never in a checked-out repository.
EXTRA_DIST += $(dotversion)
BUILT_SOURCES += $(dotversion)
$(dotversion):
	$(AM_V_GEN)echo '$(VERSION)' > '$@T' && mv '$@T' '$@'

## Edit the README file for alpha releases.
EXTRA_DIST += $(edit_readme_alpha)
re_alpha_version = '\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*[-\.][-\.0-9a-z]*\)'
$(readme): FORCE
	@if test -n "`expr $(VERSION) : $(re_alpha_version)`"; then \
	  if test 0 = '$(AM_DEFAULT_VERBOSITY)' && test 1 != '$(V)'; \
	    then echo "  GEN     " $@; \
	  else echo "$(SHELL) $(edit_readme_alpha) $@"; fi; \
	  $(SHELL) $(edit_readme_alpha) '$@'; \
	fi

git_commit_count = git log --pretty=oneline |wc -l |$(SED) 's|[	 ]||g'

dist-hook: $(changelog) $(thanks) $(dotversion) $(readme)
## Arrange so that .tarball-version appears only in the distribution
## tarball, and never in a checked-out repository.
	echo '$(VERSION)' > $(tarball_version)
## ...and similarly for .serial.
	$(git_commit_count) > $(dotserial)
## Ensure aclocal has not wrongly picked up old macro definitions.
	$(no_bogus_macros)

distcheck-hook: syntax-check

uninstall-hook:
	@$(NORMAL_UNINSTALL)
	@list='$(pkgltdl_files)'; \
	for f in $$list; do \
	  echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
	  rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
	done
	@list='$(pkgaux_scripts) $(pkgaux_data_files)'; \
	for f in $$list; do \
	  echo " rm -f '$(DESTDIR)$(pkgauxdir)/$$f'"; \
	  rm -f "$(DESTDIR)$(pkgauxdir)/$$f"; \
	done
	@for p in $(pkgmacro_files); do \
	  f=`echo "$$p" |$(SED) 's|^.*/||'`; \
	  echo " rm -f '$(DESTDIR)$(aclocaldir)/$$f'"; \
	  rm -f "$(DESTDIR)$(aclocaldir)/$$f"; \
	done
	@p=`echo libtoolize |sed -e '$(transform)'`; \
	echo " rm -f '$(DESTDIR)$(bindir)/$$p'"; \
	rm -f "$(DESTDIR)$(bindir)/$$p"


## ----------- ##
## Test suite. ##
## ----------- ##

tests_dir	= $(top_srcdir)/tests
package_m4	= $(tests_dir)/package.m4
testsuite	= $(tests_dir)/testsuite

# The testsuite files are evaluated in the order given here. When
# adding new tests, make sure cmdline_wrap.at stays at the end so
# that it can check for previous failures and skip if necessary.
TESTSUITE	= tests/testsuite
TESTSUITE_AT	= tests/testsuite.at \
		  tests/configure-funcs.at \
		  tests/libtoolize.at \
		  tests/libtool.at \
		  tests/demo.at \
		  tests/pic_flag.at \
		  tests/with-pic.at \
		  tests/cdemo.at \
		  tests/convenience.at \
		  tests/depdemo.at \
		  tests/help.at \
		  tests/duplicate_members.at \
		  tests/duplicate_conv.at \
		  tests/duplicate_deps.at \
		  tests/flags.at \
		  tests/inherited_flags.at \
		  tests/link-order.at \
		  tests/link-order2.at \
		  tests/fail.at \
		  tests/shlibpath.at \
		  tests/runpath-in-lalib.at \
		  tests/static.at \
		  tests/export.at \
		  tests/export-def.at \
		  tests/search-path.at \
		  tests/indirect_deps.at \
		  tests/archive-in-archive.at \
		  tests/exeext.at \
		  tests/execute-mode.at \
		  tests/bindir.at \
		  tests/cwrapper.at \
		  tests/deplib-in-subdir.at \
		  tests/infer-tag.at \
		  tests/localization.at \
		  tests/nocase.at \
		  tests/install.at \
		  tests/versioning.at \
		  tests/destdir.at \
		  tests/old-m4-iface.at \
		  tests/am-subdir.at \
		  tests/lt_dlexit.at \
		  tests/lt_dladvise.at \
		  tests/lt_dlopen.at \
		  tests/lt_dlopen_a.at \
		  tests/lt_dlopenext.at \
		  tests/ltdl-libdir.at \
		  tests/ltdl-api.at \
		  tests/dlloader-api.at \
		  tests/loadlibrary.at \
		  tests/lalib-syntax.at \
		  tests/resident.at \
		  tests/slist.at \
		  tests/need_lib_prefix.at \
		  tests/mdemo.at \
		  tests/standalone.at \
		  tests/subproject.at \
		  tests/nonrecursive.at \
		  tests/recursive.at \
		  tests/tagdemo.at \
		  tests/template.at \
		  tests/ctor.at \
		  tests/exceptions.at \
		  tests/early-libtool.at \
		  tests/no-executables.at \
		  tests/deplibs-ident.at \
		  tests/configure-iface.at \
		  tests/f77demo.at \
		  tests/fcdemo.at \
		  tests/darwin.at \
		  tests/dumpbin-symbols.at \
		  tests/deplibs-mingw.at \
		  tests/sysroot.at \
		  tests/stresstest.at \
		  tests/cmdline_wrap.at \
		  tests/bug_62343.at	\
		  tests/bug_71489.at \
		  tests/bug_42313.at \
		  $(NOTHING_ELSE)

EXTRA_DIST     += $(testsuite) $(TESTSUITE_AT) $(package_m4)

# Be sure to reexport important environment variables:
TESTS_ENVIRONMENT = MAKE="$(MAKE)" CC="$(CC)" CFLAGS="$(CFLAGS)" \
	CPP="$(CPP)" CPPFLAGS="$(CPPFLAGS)" LD="$(LD)" LDFLAGS="$(LDFLAGS)" \
	LIBS="$(LIBS)" LN_S="$(LN_S)" NM="$(NM)" RANLIB="$(RANLIB)" \
	AR="$(AR)" \
	EGREP="$(EGREP)" FGREP="$(FGREP)" GREP="$(GREP)" SED="$(SED)" \
	STRIP="$(STRIP)" lt_INSTALL="$(INSTALL)" \
	MANIFEST_TOOL="$(MANIFEST_TOOL)" \
	OBJEXT="$(OBJEXT)" EXEEXT="$(EXEEXT)" \
	SHELL="$(SHELL)" CONFIG_SHELL="$(SHELL)" \
	CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" CXXCPP="$(CXXCPP)" \
	OBJC="$(OBJC)" OBJCFLAGS="$(OBJCFLAGS)" \
	OBJCXX="$(OBJCXX)" OBJCXXFLAGS="$(OBJCXXFLAGS)" \
	F77="$(F77)" FFLAGS="$(FFLAGS)" \
	FC="$(FC)" FCFLAGS="$(FCFLAGS)" \
	GCJ="$(GCJ)" GCJFLAGS="$(GCJFLAGS)" \
	lt_cv_with_aix_soname="$(with_aix_soname)" \
	lt_cv_to_host_file_cmd="$(to_host_file_cmd)" \
	lt_cv_to_tool_file_cmd="$(to_tool_file_cmd)"

BUILDCHECK_ENVIRONMENT = _lt_pkgdatadir="$(abs_top_srcdir)" \
	LIBTOOLIZE="$(abs_top_builddir)/libtoolize" \
	LIBTOOL="$(abs_top_builddir)/libtool" \
	tst_aclocaldir="$(abs_top_srcdir)/m4"

INSTALLCHECK_ENVIRONMENT = \
	LIBTOOLIZE="$(bindir)/`echo libtoolize |$(SED) '$(program_transform_name)'`" \
	LIBTOOL="$(bindir)/`echo libtool |$(SED) '$(program_transform_name)'`" \
	LTDLINCL="-I$(includedir)" \
	LIBLTDL="$(libdir)/libltdl.la" \
	tst_aclocaldir="$(aclocaldir)"

$(testsuite): $(package_m4) $(TESTSUITE_AT) Makefile.am
	$(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -I '$(srcdir)/tests' $(TESTSUITE_AT) -o '$@'

$(package_m4): $(dotversion) Makefile.am
	$(AM_V_GEN){ \
	  echo '# Signature of the current package.'; \
	  echo 'm4_define([AT_PACKAGE_NAME],      [$(PACKAGE_NAME)])'; \
	  echo 'm4_define([AT_PACKAGE_TARNAME],   [$(PACKAGE_TARNAME)])'; \
	  echo 'm4_define([AT_PACKAGE_VERSION],   [$(PACKAGE_VERSION)])'; \
	  echo 'm4_define([AT_PACKAGE_STRING],    [$(PACKAGE_STRING)])'; \
	  echo 'm4_define([AT_PACKAGE_BUGREPORT], [$(PACKAGE_BUGREPORT)])'; \
	  echo 'm4_define([AT_PACKAGE_URL],       [$(PACKAGE_URL)])'; \
	} > '$@'

tests/atconfig: $(config_status)
	$(AM_V_GEN)$(SHELL) '$(config_status)' '$@'

DISTCLEANFILES += tests/atconfig

CD_TESTDIR	= abs_srcdir=`$(lt__cd) $(srcdir) && pwd`; cd tests

testsuite_deps = tests/atconfig $(srcdir)/$(TESTSUITE)
testsuite_deps_uninstalled = $(testsuite_deps) libltdl/libltdlc.la \
			     $(bin_SCRIPTS) $(LTDL_BOOTSTRAP_DEPS)

# Hook the test suite into the check rule
check-local: $(testsuite_deps_uninstalled)
	$(AM_V_at)$(CD_TESTDIR); \
	CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \
	  $(TESTS_ENVIRONMENT) $(BUILDCHECK_ENVIRONMENT) $(TESTSUITEFLAGS)

# Run the test suite on the *installed* tree.
installcheck-local: $(testsuite_deps)
	$(AM_V_at)$(CD_TESTDIR); \
	CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \
	  $(TESTS_ENVIRONMENT) $(INSTALLCHECK_ENVIRONMENT) $(TESTSUITEFLAGS) \
	  AUTOTEST_PATH='$(exec_prefix)/bin'

.PHONY: check-noninteractive-old
check-noninteractive-old:
	$(AM_V_at)'$(MAKE)' $(AM_MAKEFLAGS) check-TESTS TESTS='$(TESTS)'

# Run only noninteractive parts of the new testsuite.
.PHONY: check-noninteractive-new
check-noninteractive-new: $(testsuite_deps_uninstalled)
	$(AM_V_at)$(CD_TESTDIR); \
	CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \
	  $(TESTS_ENVIRONMENT) $(BUILDCHECK_ENVIRONMENT) \
	  -k '!interactive' INNER_TESTSUITEFLAGS=',!interactive' \
	  $(TESTSUITEFLAGS)

# Run only interactive parts of the new testsuite.
.PHONY: check-interactive
check-interactive: $(testsuite_deps_uninstalled)
	$(AM_V_at)$(CD_TESTDIR); \
	CONFIG_SHELL='$(SHELL)' '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" \
	  $(TESTS_ENVIRONMENT) $(BUILDCHECK_ENVIRONMENT) \
	  -k interactive -k recursive INNER_TESTSUITEFLAGS=',interactive' \
	  $(TESTSUITEFLAGS)

.PHONY: check-noninteractive
check-noninteractive: check-noninteractive-old check-noninteractive-new

# We need to remove any file droppings left behind by testsuite
clean-local:
	-$(CD_TESTDIR); \
	test -f "$$abs_srcdir/$(TESTSUITE)" && \
	    '$(SHELL)' "$$abs_srcdir/$(TESTSUITE)" --clean

## An empty target to depend on when a rule needs to always run
## whenever it is visited.
FORCE:
