Prettify Automake

This is the homepage for the prettification of GNU Automake.

Rationale

There is no question that Automake could generate Makefiles which output progress in a much nicer way. There are already projects employing a more informational approach to compiling. The Linux kernel is probably the best known example. Samba did it long before.

The normal user is not interrested in knowing the compilation flags used to build the killer app. She merely wants to know if any progress is made. How long will the compilation take and what should she do during that time.

Also, during development (although this has been under heavy discussion) it is easier to find warnings and errors if the compilation command line does not extend five lines. Because different people have different views of the process, it was neccessary to be able to turn pretty commands on and off.

By far, the easiest way to control this sort of thing is to include the switch in configure and using the substitution engine Autoconf already has.

Accomplishments

As of today, the prettification takes a Linux approach and outputs things like

Figure 1: The Linux style output.
  [C++       ]  control.cc
  [YACC      ]  parser.y
This hides all the gory details and makes it a lot easier to spot warnings and errors.

Downloads

Distributed under the GNU General Public License, Version 2.

Release Released Automake Version File Comments
1.3 Dec 9, 2006 Untested 1.10 Patch (71 kB) Fixed broken test == in M4-file (Found by Jeremy R.).
Fixed erronous copyright.
1.2 Nov 8, 2006 Untested 1.10 Patch (71 kB) First release for 1.10.
1.1 Nov 8, 2006 1.9.6 Patch (69 kB) Added prettycmds.m4 to Makefile, it was missing in installation (Found by Philipp G.).
The patch name should be in plural.
A circular dependency on aclocal exists. See below.
1.0 July 11, 2006 1.9.6 Patch (69 kB) First release.

Installation

  1. Download the latest patch.
  2. Download Automake as close to the stated Automake version as possible. A patch for 1.9.6 probably works for most of the 1.9 series, though.
  3. Unpack Automake.
  4. Patch it (patch -P0 or so).
  5. Touch m4/init.m4 with m4/auxdir.m4 (touch -r m4/auxdir.m4 m4/init.m4).
    This is because the patch modifies m4/init.m4. Seeing this, automake tries to rebuild its own aclocal.m4 before aclocal is build.
  6. Install Automake as you would have done otherwise.

Implementation

The implementation uses a number of new Autoconf AC_SUBST macros. They are expanded to at-signs (@) and colons (:) and are placed in front of certain action lines in Automake's templates (stored in /usr/share/automake-1.9/am). When pretty commands are active, the at-signs (expanded from AMSHOWCMDSAT) hide the command line and AMPRETTYECHO is expanded to echo to tell the user what gives...

When pretty commands are disabled, AMSHOWCMDSAT is expanded to the empty string and AMPRETTYECHO is expanded to a colon (which is the no-op of [most] shell scripts).

For instance, the distclean target of compile.am now looks like the code in Figure 2.

Figure 2: The new looks of a cleaning rule.
distclean-compile:
	@@AMPRETTYECHO@ '  [RM        ]  *.tab.c'
	@AMSHOWCMDSAT@-rm -f *.tab.c
The benefit of not simply expanding AMPRETTYECHO to a hash (comment it out, is that it allows the echoing to be included in a multiline action command. The only side effect to this the author has seen, is that the templates may be harder to maintain due to the extra text.

To implement the switch between pretty commands and verbose commands, a new Autoconf macro was added, called AM_PRETTY_CMDS. It is called from AM_INIT_AUTOMAKE. It adds the command line switches --disable-pretty-cmds and --enable-pretty-cmds. All needed substitutions are declared and the libtool macro is modified to be silent if enabled.

Documentation

User's View

If you are just compiling a package which has been prettified, you simply add the --enable-pretty-commands to the configure command line and hope for the best. The default is still the old behaviour; to show the entire command lines.

Maintainer's View

Since Automake is open-source, the prettification can be completly integrated into Automake and requires no changes to your code, in the normal case.

However, if you write your own actions, you will need to patch them to use the magic substitutions. First read about the implementation, though. There are four substitution macros you need to be aware of:

Macro Substitutes to Use at Description
Enabled Disabled
AMSHOWCMDSAT @ empty Beginning of action command line Silences the command when pretty commands are enabled.
AMDEPSHOWCMDSAT @ empty Beginning of action command line Silences the command, but only when dependency tracking is off.
AMPRETTYECHO echo : Instead of echo for the pretty command Allows us to not print the pretty string when pretty commands is disabled.
AMCMDECHO : echo Instead of echo in normal commands Some normal commands (especially dependency tracking) use echo to furnish their output. To disable this, a simple "@" is not enough.

Of these, you will probably only use AMSHOWCMDSAT and AMPRETTYECHO.

Now, if you write a rule to generate source code from an RPC file, you probably write something along the lines of the code in Figure 3. This must be prettified to read like Figure 4. You should note the double @ on the first action line. Otherwise, the echo command itself would be output. Not very pretty…

Figure 3: A simple rpcgen-rule.
%.ss.c: %.rg
	$(RPCGEN) $(RPCGENFLAGS) -m -o $@ $<
Figure 4: The new looks of the rule.
%.ss.c: %.rg
	@@AMPRETTYECHO@ '  [RPC SS    ]  $<'
	@AMSHOWCMDSAT@$(RPCGEN) $(RPCGENFLAGS) -m -o $@ $<

That's all. As stated earlier, if you don't write your own rules, you won't need to change your code.

Roadmap

  1. Write test-cases for all modified files in lib/am.
  2. Include support for turning it on/off in make.
    Essentially replacing echo with $(am_prettyecho) and setting some make variables. It would still require --enable-pretty-commands, though.
  3. Some way of informing the user how many objects remain to be compiled.
  4. Estimation of time

Tommie Gannert <tommie of gannert.se>