Как изменить переменные среды, переданные в пользовательскую цель CMake?
Возможно, мне не хватает чего-то очевидного, но я не могу понять, как явно устанавливать переменные среды, которые можно увидеть в процессах, запущенных через add_custom_target()
..
Я попробовал следующее:
set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)
К сожалению, переменная среды %PATH%
не изменяется до somecommand
. (Я создал Gist, который воспроизводит проблему здесь.)
Что я делаю неправильно?
Ответы
Ответ 1
Портативный способ настройки переменных среды для настраиваемой цели заключается в использовании команды режима командной строки CMake env
:
env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...
Run command in a modified environment.
например:.
add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand)
Также см. Режим инструмента командной строки.
Ответ 2
Вы устанавливаете переменную среды на этапе конфигурации, но команда, указанная для add_custom_target
, выполняется на этапе сборки. См. Также FAQ CMake: Как я могу получить или установить переменные среды?
[...]
переменные окружения SET
только в CMakeLists.txt вступают в силу для самого cmake (время настройки), поэтому вы не можете использовать этот метод для установки переменной окружения что может потребоваться пользовательская команда (время сборки). Запрет поддержки переменных окружения различными командами CMake (например, add_custom_command()
, в настоящее время еще не поддерживается), допустимым обходным путем может быть вызов сценариев оболочки вместо которые завершают выполняемые команды.
В настоящее время add_custom_target
(и другие команды, которые определяют действия для этапа сборки, например add_custom_command
), не поддерживают простые переменные среды установки. Как указано в this bugreport, для заданного значения переменной без пробелов в Linux вы можете добавить команду с предложениями "VAR = VAL". Для общих случаев вы можете подготовить оболочку script, которая настраивает среду и запускает действительную команду:
В Windows:
wrapper.bat
@ECHO OFF
set PATH="C:\\Some\\Path;%PATH%"
%*
CMakeLists.txt
add_custom_target(...
COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args...
)
В Linux:
wrapper.sh
export "PATH=/Some/Path:$PATH"
eval "$*"
CMakeLists.txt
add_custom_target(...
COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args...
)
Если значение переменной зависит от конфигурации, вы можете настроить оболочку script на configure_file
.
UPDATE
Как отмечено @sakra, env
режим инструмента исполняемого файла cmake
может использоваться как обертка script:
add_custom_target(...
COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args...
)
Этот способ доступен с CMake 3.2.