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

时间:2016-01-27 05:05:56

标签: cmake environment-variables

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

我尝试了以下内容:

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)

不幸的是,%PATH%环境变量对somecommand不变。 (我已经设置了一个可以重现问题的要点here。)

我做错了什么?

3 个答案:

答案 0 :(得分:17)

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

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...
Run command in a modified environment.

E.g:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand)

另见Command Line Tool Mode

答案 1 :(得分:14)

您可以在配置步骤中设置环境变量,但在 build 步骤中执行为add_custom_target指定的命令。另请参阅CMake常见问题解答:How can I get or set environment variables?

  

[...]
  CMakeLists.txt 中的环境变量SET   生效cmake本身( configure-time ),   所以你不能使用这种方法来设置环境变量   自定义命令可能需要(构建时间)。   禁止各种CMake命令支持环境变量   (例如add_custom_command(),目前尚不支持),   可接受的解决方法可能是调用shell脚本   包装要执行的命令。

目前add_custom_target(以及定义构建步骤操作的其他命令,例如add_custom_command)不支持简单的设置环境变量。正如在this bugreport中所建议的那样,对于Linux上的设置变量的值无空格,您可以在" VAR = VAL"之前添加命令。条款。对于一般情况,您可以准备 wrapper 脚本,该脚本设置环境并运行实际命令:

在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...
)

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

<强>更新

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

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

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

答案 2 :(得分:1)

对此的较晚答案,但这也许会对某人有所帮助。我们使用&&运算符在Windows上的cmake文件中执行此操作。

set(MY_COMMAND set "PATH=C:\\some\\path\;%PATH%"&&
        somecommand)

add_custom_target(TARGET newtarget COMMAND ${MY_COMMAND})

请注意,在&&之前不能有空格(出于我无法完全理解的原因)。另外,在这里处理空格确实很麻烦,所以我不知道c:\ some \ path是否包含空格是否正确。如果您的原始路径中有空格,它将起作用。