views:

221

answers:

3

I recently learned how to use automake, and I'm somewhat annoyed that my compile commands went from a bunch of:

g++ -O2 -Wall -c fileName.cpp

To a bunch of:

depbase=`echo src/Unit.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
    g++ -DHAVE_CONFIG_H -I. -I./src     -g -O2 -MT src/Unit.o -MD -MP -MF $depbase.Tpo -c -o src/Unit.o src/Unit.cpp &&\
    mv -f $depbase.Tpo $depbase.Po

Is there any way to clean this up? I can usually easily pick out warning messages, but now the wall of text to read though is 3x bigger and much weirder.

I know what my flags are, so making it just says "Compiling xxx.cpp" for each file would be perfect.

+2  A: 

Wish I knew too.

In the meantime, take a look at cmake. Your configuration will be much simpler, your compile commands will go back to something simpler, and your builds will be twice as fast.

Paul Beckingham
Thanks, I'll check it out.
Brendan Long
...and your links will mysteriously break because link flags from `PKG_CHECK_MODULES` are stored as a semicolon-separated list, then substituted straight into the command line, causing much anguish.
Jack Kelly
+1  A: 

I did a bit of googling around as I am in the same boat, the autoconf tools do a nice job but it kind of wrecks your eyes when the text whizzes by and no way of knowing what was that about... here is a link to a blog that mentions a tool to do this and make it look like neater just like how you see a kernel build does the magic i.e.

Compiling foo.so
Linking foo.so

Here is another link to a tool that is called prettify automake.

tommieb75
+5  A: 

As of automake 1.11, you can greatly clean up the output using the silent-rules option. For example:

$ # First, make without silent rules
$ make
make  all-am
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT foo.o -MD -MP -MF .deps/foo.Tpo -c -o foo.o foo.c
mv -f .deps/foo.Tpo .deps/foo.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc  -g -O2   -o foo foo.o
libtool: link: gcc -g -O2 -o foo foo.o
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT bar.o -MD -MP -MF .deps/bar.Tpo -c -o bar.o bar.c
mv -f .deps/bar.Tpo .deps/bar.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc  -g -O2   -o bar bar.o
libtool: link: gcc -g -O2 -o bar bar.o
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT baz.o -MD -MP -MF .deps/baz.Tpo -c -o baz.o baz.c
mv -f .deps/baz.Tpo .deps/baz.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc  -g -O2   -o baz baz.o
libtool: link: gcc -g -O2 -o baz baz.o
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT qux.o -MD -MP -MF .deps/qux.Tpo -c -o qux.o qux.c
mv -f .deps/qux.Tpo .deps/qux.Po
/bin/sh ./libtool  --tag=CC   --mode=link gcc  -g -O2   -o qux qux.o
libtool: link: gcc -g -O2 -o qux qux.o
$ # Now, use the silent rules
$ ./configure --enable-silent-rules > /dev/null
$ make clean all
 rm -f foo bar baz qux
rm -rf .libs _libs
rm -f *.o
rm -f *.lo
make  all-am
  CC       foo.o
  CCLD     foo
  CC       bar.o
  CCLD     bar
  CC       baz.o
  CCLD     baz
  CC       qux.o
  CCLD     qux

All that is needed is to add "silent-rules" to the invocation of AM_INIT_AUTOMAKE in configure.ac, and add the option --enable-silent-rules when you invoke configure. (There was much debate about requiring the option to be added at configure time when this feature was added, and there is an easy workaround to make it unnecessary.) Note that with silent-rules enabled, you can still get verbose output by running 'make V=1'

William Pursell
Looks like all it takes to make it the default is to add AM_SILENT_RULES([yes]). This is exactly what I was looking for.
Brendan Long

related questions