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
shave
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/shaveHopefully, in a few minutes, you should be able to see your project compile like this:
$ makeJust like Kbuild, shave supports outputting the underlying commands using:
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
$ make V=1
Setup
- 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.
Custom rules
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 = @and then it’s just a matter of prepending $(QUIET_GEN) to the rule creating the file:
Q = $(V:1=)
QUIET_GEN = $(Q:@=@echo ' GEN '$@;)
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 <br />&& mv gtk-doc.temp gtk-doc.make
sed -e 's#) –mode=link#) –tag=CC –mode=link#' gtk-doc.make > gtk-doc.temp <br />&& mv gtk-doc.temp gtk-doc.make
dolt + shave
It’s possible to use dolt in conjunction with shave with a surprisingly small patch to dolt.
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!
TODO
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