How to log make output without buffering from stdout and stderr

Jeroen Dirks picture Jeroen Dirks · Feb 17, 2009 · Viewed 23.5k times · Source

I am having a problem with logging to output from an automated build.

The build is done with a Makefile and the makefile utility.

The problem is that normal output like compiler command lines go to stdout and compile errors go to stderr.

I want to get the output from the build as it would show on the screen. So something like:

(stdout) CC -c file.cpp
(stderr) Compile error at file.cpp line 232, blah blah blah
(stdout) CC -c file2.cpp

What I tried (from a ksh script) is:

make -k > build.log 2> build.log

This results in a single log file but the problem is that the streams are buffered and so the result in the log file is all mixed up.

I could capture the output into 2 separate log files but then I would have no info on how to glue them back together into a single log file.

Is there a way to turn off buffering for stdout and stderr in this case?

Answer

Ryan Graham picture Ryan Graham · Feb 17, 2009
make -k > build.log 2>&1

This should work better for you because it is not redirecting stderr and stdout separately, but redirecting stderr to stdout, which should make the buffering sync up.

If you want to log it to a file as well as print it to the console:

make -k 2>&1 | tee build.log