## automake - create Makefile.in from Makefile.am
## Copyright (C) 1994-2015 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/>.

TEXI2DVI = texi2dvi
TEXI2PDF = $(TEXI2DVI) --pdf --batch
DVIPS = dvips
MAKEINFOHTML = $(MAKEINFO) --html
AM_MAKEINFOHTMLFLAGS ?= $(AM_MAKEINFOFLAGS)

define am.texi.build.dvi-or-pdf
	$1$(am.cmd.ensure-target-dir-exists) && \
	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
## Must set MAKEINFO like this so that version.texi will be found even
## if it is in srcdir.
	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
	                      -I $(@D) -I $(srcdir)/$(@D)' \
## texi2dvi and  texi2pdf don't silence everything with -q, redirect
## to /dev/null instead.  We still want -q ($(AM_V_TEXI_QUIETOPTS))
## because it turns on batch mode.
## Use '--build-dir' so that TeX and Texinfo auxiliary files and build
## by-products are left in there, instead of cluttering the current
## directory (see automake bug#11146).  Use a different build-dir for
## each file (as well as distinct build-dirs for PDF and DVI files) to
## avoid hitting a Texinfo bug that could cause a low-probability racy
## failure when doing parallel builds; see:
## http://lists.gnu.org/archive/html/automake-patches/2012-06/msg00073.html
	$2 $(AM_V_TEXI_QUIETOPTS) --build-dir=$3 \
	   -o $@ $< $(AM_V_TEXI_DEVNULL_REDIRECT)
endef

define am.texi.build.info
	$(if $1,,$(AM_V_at)$(am.cmd.ensure-target-dir-exists))
## If the texinfo file has some minor mistakes which cause makeinfo
## to fail, the info files are not removed.
	$(AM_V_MAKEINFO)$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
	                --no-split -I $(@D) -I $(srcdir)/$(@D) -o $@-t $<
	$(AM_V_at)mv -f $@-t $@
endef

define am.texi.build.html
	$(AM_V_MAKEINFO)$(am.cmd.ensure-target-dir-exists) \
## When --split (the default) is used, makeinfo will output a
## directory.  However it will not update the time stamp of a
## previously existing directory, and when the names of the nodes
## in the manual change, it may leave unused pages.  Our fix
## is to build under a temporary name, and replace the target on
## success.
	  && { test ! -d $(@:.html=.htp) || rm -rf $(@:.html=.htp); } \
	  || exit 1; \
	if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) \
	                    -I $(@D) -I $(srcdir)/$(@D) \
			    -o $(@:.html=.htp) $<; \
	then \
	  rm -rf $@ && mv $(@:.html=.htp) $@; \
	else \
## on failure, remove the temporary directory before exiting.
	  rm -rf $(@:.html=.htp) $@; exit 1; \
	fi
endef

%.info: %.texi
	$(call am.texi.build.info,$(am.texi.info-in-srcdir))
%.dvi: %.texi
	$(call am.texi.build.dvi-or-pdf,$(AM_V_TEXI2DVI),$(TEXI2DVI),$(@:.dvi=.t2d))
%.pdf: %.texi
	$(call am.texi.build.dvi-or-pdf,$(AM_V_TEXI2PDF),$(TEXI2PDF),$(@:.pdf=.t2p))
%.html: %.texi
	$(call am.texi.build.html)

## The way to make PostScript, for those who want it.
%.ps: %.dvi
	$(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
	$(DVIPS) $(AM_V_TEXI_QUIETOPTS) -o $@ $<
