tools
tools copied to clipboard
rdmd incorrectly assumes that the D compiler outputs dependency info to stdout
Transferred from: https://issues.dlang.org/show_bug.cgi?id=18423
User @WebDrake reported (2018-02-11 16:22:46 CET):
When
rdmd
invokes the D compiler to generate dependencies information, it makes a hardcoded assumption that this information gets written by the compiler tostdout
. However, this assumption is not valid for all D compilers. In particular, compiler frontend messages are written out to a configurablestdmsg
: https://github.com/dlang/dmd/commit/dc8421f... and this configurability is used by GDC to output such messages to
stderr
(reflecting GCC policy thatstdout
is reserved for-pipe
output; see: https://github.com/dlang/tools/pull/297#issuecomment-363342259).This means not only that
rdmd
will not work with more recent GDC releases, but thatrdmd
's assumptions aboutstdout
are not valid in general (given the configurablestdmsg
in the DMD frontend).The gory details
The
getDependencies
function insiderdmd.d
invokes the D compiler via therun
command, passing in options (thedepsGetter
variable) and the name of a file to which to write the compiler output (depsFilename
):immutable depsExitCode = run(depsGetter, depsFilename);
Internally,
run
takes this and usesspawnProcess
to invoke the D compiler:private int run(string[] args, string output = null, bool replace = false) { ... File outputFile; if (output.ptr) outputFile = File(output, "wb"); else outputFile = stdout; auto process = spawnProcess(args, stdin, outputFile); return process.wait(); }
In other words,
run
opens a file whose name is given bydepsFilename
, and uses it to replacestdout
for the spawned process. The contents of this file are then read using the nestedreadDepsFile()
function defined internally insidegetDependencies
.In consequence, if the information parsed by
readDepsFile
is not written tostdout
by the D compiler, it will not get written intooutputFile
, and therefore not be available to parse.
User @WebDrake responded (2018-02-11 16:30:16 CET):
For context, this issue was observed while trying to update rdmd's integration tests to use gdmd: https://github.com/dlang/tools/pull/307#issuecomment-363564781
Marking as enhancement since things work at the moment and this is to support a new feature.