如何修改传递给自定义CMake目标的环境变量?

Nat*_*man 26 cmake environment-variables

也许我错过了一些明显的东西,但我似乎无法弄清楚如何显式设置可以通过启动的进程看到的环境变量add_custom_target().

我尝试了以下方法:

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)
Run Code Online (Sandbox Code Playgroud)

不幸的是,%PATH%环境变量似乎没有变化somecommand.(我已经设置了一个Gist,可以在这里重现问题.)

我究竟做错了什么?

sak*_*kra 22

为自定义目标设置环境变量的便携方法是使用CMake的命令行工具模式命令env:

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...
Run Code Online (Sandbox Code Playgroud)

例如:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand)
Run Code Online (Sandbox Code Playgroud)

另请参阅命令行工具模式.


Tsy*_*rev 18

您可以在配置步骤中设置环境变量,但add_custom_target构建步骤中执行指定的命令.另请参阅CMake FAQ:如何获取或设置环境变量?

[...] CMakeLists.txt中的
环境变量仅对 cmake本身(configure-time)生效,因此您无法使用此方法设置自定义命令可能需要的环境变量(构建时).除了各种CMake命令(例如,目前尚不支持)的环境变量支持之外,可接受的解决方法可能是调用shell脚本而不是包装要执行的命令.SETadd_custom_command()

当前add_custom_target(以及其他命令,例如,定义构建步骤的动作add_custom_command)不支持简单的设置环境变量.正如在这个 bug报告中所建议的那样,对于Linux上没有空格的 set变量值,你可以在命令前添加"VAR = VAL"子句.对于一般情况,您可以准备包装脚本,它设置环境并运行实际命令:

在Windows上:

wrapper.bat:

@ECHO OFF
set PATH=C:\\Some\\Path;%PATH%
%*
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt:

add_custom_target(...
    COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args...
)
Run Code Online (Sandbox Code Playgroud)

在Linux上:

wrapper.sh:

export "PATH=/Some/Path:$PATH"
eval "$*"
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt:

add_custom_target(...
    COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args...
)
Run Code Online (Sandbox Code Playgroud)

如果变量的值取决于配置,则可以使用配置包装器脚本configure_file.

更新:

正如@sakra所指出的,可执行文件的env工具模式cmake可以用作包装脚本:

add_custom_target(...
    COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args...
)
Run Code Online (Sandbox Code Playgroud)

从CMake 3.2开始,这种方式可用.

  • 3个点应该写什么?什么是“real_command”?什么是“参数”?回答不好 (2认同)
  • 没有完整的示例,我完全不明白这个命令是如何工作的,抱歉 (2认同)