## automake - create Makefile.in from Makefile.am
## Copyright (C) 2001-2013 Free Software Foundation, Inc.

## 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, 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, see <http://www.gnu.org/licenses/>.


## This dummy rule is called from subdirectories whenever one of the
## top-level Makefile's dependencies must be updated.  It does depend
## on %MAKEFILE% for the benefit of non-GNU make implementations (GNU
## make will always make sure %MAKEFILE% is updated before considering
## the am--refresh target anyway).
if %?TOPDIR_P%
.PHONY: am--refresh
am--refresh: %MAKEFILE%
	@:
endif %?TOPDIR_P%

## --------------------- ##
## Building Makefile.*.  ##
## --------------------- ##

## This rule remakes the Makefile.in.
%MAKEFILE-IN%: %MAINTAINER-MODE% %MAKEFILE-AM% %MAKEFILE-IN-DEPS% $(am__configure_deps)
## If configure.ac or one of configure's dependencies has changed, all
## Makefile.in are to be updated; it is then more efficient to run
## automake on all the Makefiles at once.  It also allow Automake to be
## run for newly added directories.
	@for dep in $?; do \
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
?TOPDIR_P?	      echo ' cd $(srcdir) && $(AUTOMAKE) %AUTOMAKE-OPTIONS%'; \
?TOPDIR_P?	      $(am__cd) $(srcdir) && $(AUTOMAKE) %AUTOMAKE-OPTIONS% \
?TOPDIR_P?		&& exit 0; \
?!TOPDIR_P?	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
## If on the other hand, subdir/Makefile.in has been removed, then toplevel
## am--refresh will not be aware of any need to run.  We still invoke it
## due to $? listing all prerequisites.  Fix up for it by running the rebuild
## rule for this file only, below.
?!TOPDIR_P?	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
## Otherwise, rebuild only this file.
	echo ' cd $(top_srcdir) && $(AUTOMAKE) %AUTOMAKE-OPTIONS% %MAKEFILE-AM-SOURCES%'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) %AUTOMAKE-OPTIONS% %MAKEFILE-AM-SOURCES%

## Ensure that GNU make doesn't remove Makefile if ./config.status (below)
## is interrupted.  Otherwise, the user would need to know to rerun
## ./config.status to recreate the lost Makefile.
.PRECIOUS: %MAKEFILE%
## This rule remakes the Makefile.
%MAKEFILE%: %MAKEFILE-DEPS% $(top_builddir)/config.status
## If Makefile is to be updated because of config.status, then run
## config.status without argument in order to (i) rerun all the
## AC_CONFIG_COMMANDS including those that are not visible to
## Automake, and (ii) to save time by running config.status all with
## all the files, instead of once per file (iii) generate Makefiles
## in newly added directories.
	@case '$?' in \
## Don't prefix $(top_builddir), because GNU make will strip it out
## when it's '.'.
	  *config.status*) \
?TOPDIR_P?	    echo ' $(SHELL) ./config.status'; \
?TOPDIR_P?	    $(SHELL) ./config.status;; \
?!TOPDIR_P?	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
## FIXME: $(am__depfiles_maybe) lets us re-run the rule to create the
## .P files.  Ideally we wouldn't have to do this by hand.
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status %CONFIG-MAKEFILE% $(am__depfiles_maybe)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status %CONFIG-MAKEFILE% $(am__depfiles_maybe);; \
	esac;

## Avoid the "deleted header file" problem for the dependencies.
?HAVE-MAKEFILE-IN-DEPS?%MAKEFILE-IN-DEPS%:

DIST_COMMON += %MAKEFILE-AM%


## --------------------------- ##
## config.status & configure.  ##
## --------------------------- ##

if %?TOPDIR_P%
## Always require configure.ac and configure at top level, even if they
## don't exist.  This is especially important for configure, since it
## won't be created until autoconf is run -- which might be after
## automake is run.
DIST_COMMON += $(top_srcdir)/configure $(am__configure_deps)
endif %?TOPDIR_P%

$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
?TOPDIR_P?	$(SHELL) ./config.status --recheck
?!TOPDIR_P?	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh

$(top_srcdir)/configure: %MAINTAINER-MODE% $(am__configure_deps)
?TOPDIR_P?	$(am__cd) $(srcdir) && $(AUTOCONF)
?!TOPDIR_P?	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh


## ------------ ##
## aclocal.m4.  ##
## ------------ ##

## Whenever a configure dependency changes we need to rebuild
## aclocal.m4 too.  Changing configure.ac, or any file included by
## aclocal.m4 might require adding more files to aclocal.m4.  Hence
## the $(am__configure_deps) dependency.
## We still need $(ACLOCAL_AMFLAGS) for sake of backward-compatibility;
## we should hopefully be able to get rid of it in a not-so-distant
## future.
if %?REGEN-ACLOCAL-M4%
$(ACLOCAL_M4): %MAINTAINER-MODE% $(am__aclocal_m4_deps)
?TOPDIR_P?	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
?!TOPDIR_P?	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh

## Avoid the "deleted header file" problem for the dependencies.
$(am__aclocal_m4_deps):
endif %?REGEN-ACLOCAL-M4%


## --------- ##
## cleanup.  ##
## --------- ##

## We special-case config.status here.  If we do it as part of the
## normal clean processing for this directory, then it might be
## removed before some subdir is cleaned.  However, that subdir's
## Makefile depends on config.status.

if %?TOPDIR_P%
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
 configure.lineno config.status.lineno
distclean:
	-rm -f $(am__CONFIG_DISTCLEAN_FILES)

## Note: you might think we should remove Makefile.in, configure, or
## aclocal.m4 here in a maintainer-clean rule.  However, the GNU
## Coding Standards explicitly prohibit this.

maintainer-clean:
	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
## autom4te.cache is created by Autoconf; the only valid target to
## remove it is maintainer-clean, not distclean.
## If you have an autom4te.cache that cause distcheck to fail, then
## it is good news: you finally discovered that autoconf and/or
## autoheader is needed to use your tarball, which is wrong.
	-rm -rf $(top_srcdir)/autom4te.cache


endif %?TOPDIR_P%
