QBS 构建系统,无法使用 vcvars64.bat 初始化环境

QBS build system, can't initialize environment with vcvars64.bat

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

我选择使用 lld-link 而不是 Microsoft linker,所以我必须手动为它提供所有 MS 库包含路径。通过对这些路径进行硬编码,我成功地构建了我的应用程序。但我想让我的模块更灵活,并使用由 vcvars32.bat|vcvars64.bat

设置的 %LIB% 环境变量

据我所知,这可以(应该?)在模块的 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

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

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