shave: making the autotools output sane
updated: Automake 1.11 has been release with “silent rules” support, a feature that supersedes the hack that shave is. If you can depend on automake 1.11 please consider using its silent rules rather than shave.
updated: add some gtk-doc info
updated: CXX support thanks to Tommi Komulainen
Fed up with endless screens of libtool/automake output? Fed up with having to resort to -Werror to see warnings in your code? Then shave might be for you. shave transforms the messy output of autotools into a pretty Kbuild-like one (Kbuild is the Linux build system). It’s composed of a m4 macro and 2 small shell scripts and it’s available in a git repository.
git clone git://git.lespiau.name/shave
Hopefully, in a few minutes, you should be able to see your project compile like this:
$ make Making all in foo Making all in internal CC internal-file0.o LINK libinternal.la CC lib-file0.o CC lib-file1.o LINK libfoo.la Making all in tools CC tool0-tool0.o LINK tool0
Just like Kbuild, shave supports outputting the underlying commands using:
$ make V=1
- Put the two shell scripts shave.in and shave-libtool.in in the directory of your choice (it can be at the root of your autotooled project).
- add shave and shave-libtool to AC_CONFIG_FILES
- add shave.m4 either in acinclude.m4 or your macro directory
- add a call to SHAVE_INIT just before AC_CONFIG_FILES/AC_OUTPUT. SHAVE_INIT takes one argument, the directory where shave and shave-libtool are.
Sometimes you have custom Makefile rules, e.g. to generate a small header, run glib-mkenums or glib-genmarshal. It would be nice to output a pretty ‘GEN’ line. That’s quite easy actually, just add few (portable!) lines at the top of your Makefile.am:
V = @ Q = $(V:1=) QUIET_GEN = $(Q:@=@echo ' GEN '$@;)
and then it’s just a matter of prepending $(QUIET_GEN) to the rule creating the file:
lib-file2.h: Makefile $(QUIET_GEN)echo "#define FOO_DEFINE 0xbabe" > lib-file2.h
gtk-doc + shave
gtk-doc + shave + libtool 1.x (2.x is fine) is known to have a small issue, a patch is available. Meanwhile I suggest adding a few lines to your autogen.sh script.
sed -e 's#) --mode=compile#) --tag=CC --mode=compile#' gtk-doc.make > gtk-doc.temp \ && mv gtk-doc.temp gtk-doc.make sed -e 's#) --mode=link#) --tag=CC --mode=link#' gtk-doc.make > gtk-doc.temp \ && mv gtk-doc.temp gtk-doc.make
dolt + shave
Real world example: Clutter
$ make GEN stamp-clutter-marshal.h GEN clutter-marshal.c GEN stamp-clutter-enum-types.h Making all in cogl Making all in common CC cogl-util.o CC cogl-bitmap.o CC cogl-bitmap-fallback.o CC cogl-primitives.o CC cogl-bitmap-pixbuf.o CC cogl-clip-stack.o CC cogl-fixed.o CC cogl-color.o cogl-color.c: In function ‘cogl_set_source_color4ub’: cogl-color.c:141: warning: implicit declaration of function ‘cogl_set_source_color’ CC cogl-vertex-buffer.o CC cogl-matrix.o CC cogl-material.o LINK libclutter-cogl-common.la [...]
Eh! now we can see a warning there!
This is a first release, shave has not been widely tested aka it may not work for you!
- test it with a wider range of automake/libtool versions
- shave won’t work without AC_CONFIG_HEADERS due to shell quoting problems
- see what can be done for make install/dist (they are prettier thanks to make -s, but we probably miss a few actions)
- there is a ‘-s’ hardcoded in MAKEFLAGS, I have to find a way to make it more flexible