Each line of abuild's output can come from one of two sources: either abuild can generate the output itself, or the output can come from one of the backends invoked on behalf of the individual job. The backend output would include output from programs like make or ant or from anything they may invoke, such as compilers. Abuild can either capture and process output from its backends, or it can just let the backends use the same standard input, output, and error as abuild itself. We refer to what abuild does with its output as its output mode.
Abuild has three output modes: raw mode,
interleaved mode, and buffered
mode. In interleaved and buffered modes, each job is
run with standard input connected to the null device
(/dev/null
in UNIX environments and
NUL
in Windows environments) and with
standard output and standard error redirected to two separate
pipes. Abuild reads from each job's output and error pipes and
process the results with its own logging facility.
In raw mode, abuild invokes backend processes without capturing
their output. The backend processes just write to the same
standard output and standard error as abuild itself uses.
Additionally, each backend has access to abuild's standard
input, which makes it possible for builds to prompt the user for
input. For single-threaded builds, abuild's default behavior
is to run in the raw mode. This was the only output mode
available in versions of abuild prior to 1.1.3. To explicitly
tell abuild to use raw output mode, specify the
--raw-output
flag when invoking abuild.
In interleaved mode, every job is assigned a specific job prefix, which is a fixed-length (possibly zero-filled) number enclosed in square brackets. Every line of output generated by abuild itself, as well as every complete line generated by the backend, is prefixed with the job prefix and then written to abuild's standard output or standard error as appropriate. Messages generated by abuild are written immediately, and lines generated by the jobs' backends are written as soon as they are received through the pipes. By using the job prefix, it is possible to unambiguously associate each line of abuild's output with the job (build item/platform) that generated it while still having each line of output written as soon as it is generated.
For multithreaded builds, abuild runs in interleaved mode by
default. Interleaved mode may be specifically requested by
passing the --interleaved-output
flag to
abuild. If --interleaved-output
is specified
for a single-threaded build, abuild still runs the backend
through pipes and disconnected from standard input, but it does
not prepend each line with a job prefix.
In buffered mode, rather than prefixing lines with a job prefix
and outputting them as soon as they are available, abuild saves
up (buffers) all the output from a particular job and outputs it
all at once when the job completes. This ensures that, even for
a multithreaded build, there is no interleaving of output from
the builds of different build items. To enable buffered output,
invoke abuild with the --buffered-output
flag.