Skip to content

rdmd incorrectly assumes that the D compiler outputs dependency info to stdout  #392

@Geod24

Description

@Geod24

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 to stdout. However, this assumption is not valid for all D compilers. In particular, compiler frontend messages are written out to a configurable stdmsg: dlang/dmd@dc8421f

... and this configurability is used by GDC to output such messages to stderr (reflecting GCC policy that stdout is reserved for -pipe output; see: #297 (comment)).

This means not only that rdmd will not work with more recent GDC releases, but that rdmd's assumptions about stdout are not valid in general (given the configurable stdmsg in the DMD frontend).

The gory details

The getDependencies function inside rdmd.d invokes the D compiler via the run command, passing in options (the depsGetter 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 uses spawnProcess 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 by depsFilename, and uses it to replace stdout for the spawned process. The contents of this file are then read using the nested readDepsFile() function defined internally inside getDependencies.

In consequence, if the information parsed by readDepsFile is not written to stdout by the D compiler, it will not get written into outputFile, 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: #307 (comment)

Marking as enhancement since things work at the moment and this is to support a new feature.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Prio.3.NormalA bug that is neither a blocker nor a regressionT.RDMDIssues that apply only to rdmdType.EnhancementAn improvement to an existing functionality

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions