The rules and dependency trees generated by automake
can get
rather complex, and leave the developer head-scratching when things
don’t work as expected. Besides the debug options provided by the
make
command (see Options Summary in The GNU Make
Manual), here’s a couple of further hints for debugging makefiles
generated by automake
effectively:
make -n
can help show what would be done without actually doing
it. However, this still executes commands prefixed with
‘+’, and, when using GNU make
, commands that contain
the strings ‘$(MAKE)’ or ‘${MAKE}’ (see Instead of
Execution in The GNU Make Manual). Typically, this is helpful
to show what recursive rules would do, but it means that, in your own
rules, you should not mix such recursion with actions that change any
files.6 Furthermore,
GNU make
will update prerequisites for the Makefile
file itself even with -n (see Remaking Makefiles in The GNU Make Manual).
make SHELL="/bin/bash -vx"
can help debug complex rules.
See The Make Macro SHELL in The Autoconf Manual, for some
portability quirks associated with this construct.
echo 'print: ; @echo "$(VAR)"' | make -f Makefile -f - print
can be handy to examine the expanded value of variables. You may need
to use a target other than ‘print’ if that is already used or a
file with that name exists.
make
command called remake
that copes with
complex GNU make
-specific Makefiles and allows tracing
execution, examining variables, and calling rules interactively, much like
a debugger.
Automake’s ‘dist’ and ‘distcheck’ rules had a bug in this regard in that they created directories even with -n, but this has been fixed in Automake 1.11.