QBS构建系统,无法使用vcvars64.bat

时间:2019-01-20 20:29:32

标签: c++ windows build qbs clang-cl

我正在尝试实现自己的模块,以便使用clang-cl工具链在Windows上构建C ++,因为QBS目前没有内置支持。

我选择使用lld-link而不是Microsoft链接程序,因此我必须手动为其提供所有MS库包含路径。通过这些路径的硬编码,我可以很好地构建我的应用程序。但是我想使我的模块更加灵活,并使用%LIB% | vcvars32.bat

设置的vcvars64.bat环境变量

据我了解,这可以(应该?)在模块的setupBuildEnvironment脚本中完成。这是我尝试阅读%LIB%并失败的内容:

import qbs.Environment
import qbs.Process

Module
{
    setupBuildEnvironment:
    {
        var p = new Process();
        p.exec("vcvars64.bat", [], true);
        // makes no difference
        // p.exec("cmd", ["/c", "vcvars64.bat"], true);
        var lib = p.getEnv("LIB");
        // this fails too
        // var lib = Environment.getEnv("LIB");
        console.info("LIB = " + lib);
        p.close();
    }
    ...
}

这给了我LIB =,所以我一无所获。我的猜测是,在查询变量(p.getEnv("LIB"))时,该过程已经终止,因此结果为空。 Process.getEnv()的QBS文档在这方面没有说明。

vcvars64.bat初始化环境的正确QBS方法是什么,更广泛地说,在setupBuildEnvironment内获取进程环境的正确方法是什么?


[更新] 好吧,令人尴尬的是,通过创建简单的批处理并完全摆脱setupBuildEnvironment脚本,可以轻松解决此问题:

 @echo off
 call vcvars64 && qbs

但是我想尽可能避免批处理脚本,因此问题仍然存在。

1 个答案:

答案 0 :(得分:1)

vars批处理文件只是将一些信息转储到控制台上。这不会以任何方式在调用进程上设置环境。您将需要解析流程输出。我建议您看一看qbs源中的MsvcProbe项,以了解如何为MSVC实施。您也许可以修改clang-cl的代码。