1

As a follow-up to my question from a few years ago, I'm currently converting a very similar project from using recursive automake to a single non-recursive Makefile. This works fine for C++ source code and checks. However, when building the documentation (i.e. running PDFLaTeX to convert .tex files to .pdf files) I run into trouble: make works fine, but make distcheck fails with the following error:

make[1]: *** No rule to make target `doc//UserGuide.tex', needed by `doc//UserGuide.aux'. Stop.

The directory structure is as follows:

project/
  |-- Makefile.am
  |-- configure.ac
  |-- src/            # containing all .cpp and .h files
  |-- doc/
       \-- UserGuide.tex

configure.ac has some code to detect the presence of pdflatex and allow the user to disable compiling the documentation (e.g. in case a certain LaTeX package isn't installed):

# The user can disable building of the PDF of the manual, for example
# if the required LaTeX packages are not installed
AC_ARG_ENABLE([latex-doc],
    [AS_HELP_STRING([--disable-latex-doc], [disable building the PDF
    documentation from LaTeX source])],
    [latexdoc=no],
    [latexdoc=yes])

if test "x$latexdoc" = "xyes"; then
   AC_MSG_NOTICE([building of the PDF of the user manual from LaTeX source is enabled])
   # Check for presence of pdfLaTeX
   AC_CHECK_PROGS(PDFLATEX, pdflatex)
   if test -z "$PDFLATEX"; then
      AC_MSG_NOTICE([pdflatex not found - Unable to create PDF version of the user manual])
   fi
fi
AM_CONDITIONAL([HAVE_PDFLATEX], test -n "$PDFLATEX")
AM_CONDITIONAL([BUILD_latexdoc], test "x$latexdoc" = "xyes")

And in Makefile.am I defined the following relevant parts:

## Stuff needed for documentation in the doc/ directory
dist_doc_DATA = doc/howtocompile.txt doc/UserGuide.tex  \
 COPYING INSTALL ChangeLog AUTHORS

## Build the PDF documentation if building of the LaTeX docs is
## enabled via ./configure.
if BUILD_latexdoc
if HAVE_PDFLATEX
DOCDIR = doc/
MANNAME = $(DOCDIR)/UserGuide
MANPDF = $(MANNAME).pdf
MANTEXSRC = $(MANNAME).tex
MANAUX = $(MANNAME).aux
doc_DATA = $(MANPDF)
PDFLATEXOPTS = --output-directory=$(DOCDIR)

CLEANFILES += $(MANPDF) $(MANNAME).log $(MANNAME).idx $(MANNAME).out \
 $(MANNAME).toc $(MANNAME).idx $(MANNAME).ilg $(MANNAME).ind $(MANAUX) .btmp
endif
endif

The problem is most likely with the custom suffix rules I set up (which work fine in the case of recursive make):

# Several make rules to generate the PDF from the LaTeX source
.aux.pdf:
    @echo === Making PDF: $@ from $^ ===
    $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC)
    @while ( grep "Rerun to "           \
        $(MANNAME).log  ); do           \
        echo '** Re-running LaTeX **';      \
        $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC); \
    done
    if [ -f $(MANNAME).idx ]; then \
        echo === Making index ===; \
        makeindex $(MANNAME); \
    fi
    @echo === Making final PDF ===
    $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC)

.tex.aux:
    @echo === Making $@ file from $^ ===
    $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC)
## Look for citations. Make sure grep never returns an error code.
    @grep "^\\\\citation" $(MANAUX) > .btmp.new || true
## If the citations are not changed, don't do anything. Otherwise replace
## the .btmp file to make sure BibTeX will be run.
    @if ( diff .btmp.new .btmp  > /dev/null ); then \
        rm .btmp.new; \
    else \
        mv .btmp.new .btmp; \
    fi

# A target needed to keep track of the nr. of LaTeX runs
.btmp:

I tried changing the .tex.aux rule to a GNU Make pattern rule (%.aux: $(srcdir)/%.tex), which seemed to work (although Automake gave a warning about this being a GNU Make functionality), but when I tried to do the same for the .aux.pdf rule this didn't work, giving the following error message:

make: *** No rule to make target `UserGuide.pdf', needed by `all-am'. Stop.

My guess is that it has something to do with the VPATH build that make distcheck performs as the doc/ directory doesn't show up in the _build directory.

Any suggestions on how to make this work or improve it?

Community
  • 1
  • 1
ph0t0nix
  • 535
  • 14
  • 25

1 Answers1

2

Well, it turns out there were two things I needed to change:

  1. Explicitly mention the extensions .tex, .aux and .pdf in a SUFFIX rule
  2. Tell Automake to create the target directory where the PDF documentation will end up (the $(DOCDIR) variable in my case.

The last section of code from the question now reads:

SUFFIXES = .tex .aux .pdf
# Several make rules to generate the PDF from the LaTeX source
.aux.pdf:
    @echo === Making PDF: $@ from $^ ===
    $(MKDIR_P) $(DOCDIR)
    $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC)
    @while ( grep "Rerun to "           \
        $(MANNAME).log  ); do           \
        echo '** Re-running LaTeX **';      \
        $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC); \
    done
    if [ -f $(MANNAME).idx ]; then \
        echo === Making index ===; \
        makeindex $(MANNAME); \
    fi
    @echo === Making final PDF ===
    $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC)

.tex.aux:
    @echo === Making $@ file from $^ ===
    $(MKDIR_P) $(DOCDIR)
    $(PDFLATEX) $(PDFLATEXOPTS) $(srcdir)/$(MANTEXSRC)
## Look for citations. Make sure grep never returns an error code.
    @grep "^\\\\citation" $(MANAUX) > .btmp.new || true
## If the citations are not changed, don't do anything. Otherwise replace
## the .btmp file to make sure BibTeX will be run.
    @if ( diff .btmp.new .btmp  > /dev/null ); then \
        rm .btmp.new; \
    else \
        mv .btmp.new .btmp; \
    fi

# A target needed to keep track of the nr. of LaTeX runs
.btmp:

I've added the $(MKDIR_P) lines to both suffix rules, just to be sure. Probably it'll be enough to only have it in the .tex.aux rule.

ph0t0nix
  • 535
  • 14
  • 25