Система сборки QBS, не может инициализировать среду с vcvars64.bat

Я пытаюсь реализовать свой собственный модуль для сборки C++ в Windows с помощью цепочки инструментов clang-cl, поскольку в 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")), следовательно, пустой результат. Документы QBS для Process.getEnv() ничего не говорите в этом отношении.

Как правильно QBS способ инициализации среды с vcvars64.batи, в более широком смысле, как правильно получить среду процесса внутри setupBuildEnvironment?


[обновление] Ну, смущающе, это было легко обойти, создав простую партию и избавившись от setupBuildEnvironment сценарий в целом:

 @echo off
 call vcvars64 && qbs

Но я бы хотел как можно больше избегать пакетного скриптинга, поэтому вопрос остается открытым.

1 ответ

Решение

Пакетные файлы vars просто выводят некоторую информацию на консоль. Это никак не влияет на вызывающий процесс. Вам нужно будет проанализировать вывод процесса. Я предлагаю вам взглянуть на элемент MsvcProbe в источниках qbs, чтобы увидеть, как это реализовано для MSVC. Возможно, вы сможете адаптировать код для clang-cl.

Другие вопросы по тегам