1

我有一个使用 glslangValidator 将 glsl 编译为 SPIR-V 的规则。

FileTagger {
    patterns: [
        "*.vert",
        "*.tesc",
        "*.tese",
        "*.geom",
        "*.frag",
        "*.comp"
    ]
    fileTags: ["glsl"]
}
Rule {
    inputs: ["glsl"]
    Artifact {
        filePath: input.fileName + ".spv"
        fileTags: ["spv"]
    }
    prepare: {
        var cmd = new Command("glslangValidator", ["-o", output.filePath, "-V", input.filePath]);
        cmd.description = "compiling " + input.fileName;
        cmd.highlight = "compiler";
        return [cmd];
    }
}

这在输入文件有效时效果很好,但是当出现错误时,glslangValidator 将错误打印到 STDOUT 而不是 STDERR 并返回非零值。由于返回值,构建失败(因为它应该),但是 Qt Creator 中的问题窗格没有检测到文件和行号等,因为它们打印到 STDOUT 而不是 STDERR。

我厌倦了使用 stderrFilterFunction 和 stdoutFilterFunction 但我似乎找不到在它们之间传递信息的方法。

有什么方法可以让 Qt Creator 检测到 glslangValidator 报告的问题?

4

1 回答 1

1

首先,您应该为该工具提交错误报告。作为一种解决方法,您可以切换到 JavaScriptCommand 并在那里使用 qbs.Process ( http://doc.qt.io/qbs/jsextension-process.html )。当然,这有点不方便,所以你必须决定 Qt Creator 中出现的问题是否值得。代码看起来像这样:

var cmd = new JavaScriptCommand();
cmd.sourceCode = function() {
    var p = new Process();
    var exitCode = p.exec("glslangValidator", ["-o", output.filePath, "-V", input.filePath]);
    var stdout = p.readStdOut();
    p.close();
    if (exitCode !== 0)
        throw stdout;
    console.info(stdout);
};
于 2018-04-18T07:26:00.757 回答