Система сборки 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.