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

whlutmcx  于 2023-02-12  发布在  其他
关注(0)|答案(4)|浏览(240)

也许我忽略了一些明显的东西,但是我似乎不知道如何显式地设置环境变量,这些变量可以被通过add_custom_target()启动的进程看到。
我尝试了以下方法:

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

不幸的是,%PATH%环境变量看起来未更改为somecommand(我设置了一个Gist,它重现了here问题)。
我哪里做错了?

ssgvzors

ssgvzors1#

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

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...

在修改的环境中运行命令。
例如:

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

另请参见命令行工具模式。

xggvc2p6

xggvc2p62#

您在 * configuration * 步骤中设置了环境变量,但在 * build * 步骤中执行了为add_custom_target指定的命令。另请参见CMake常见问题解答:如何获取或设置环境变量?
[...]
CMakeLists.txt中的环境变量SET * 仅 * 对cmake本身有效(* configure-time ),因此不能使用此方法设置自定义命令可能需要的环境变量( build-time *).禁止各种CMake命令支持的环境变量(例如,add_custom_command(),目前尚不支持),可接受的解决方案可能是调用 shell 脚本,而 shell 脚本 Package 要执行的命令。
目前add_custom_target(和其他命令,定义构建步骤的操作,例如add_custom_command)不支持简单设置环境变量。如this bugreport中所建议,在Linux上,对于设置变量的值 * 不带空格 *,您可以在命令前面添加"VAR = VAL"子句。对于一般情况,您可以准备 * wrapper * 脚本,用于设置环境并运行实际命令:
在Windows上:

    • Package 器. bat**:
@ECHO OFF
set PATH=C:\\Some\\Path;%PATH%
%*
    • CMakeLists.文本文件**:
add_custom_target(...
    COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args...
)

在Linux上:

    • Package 器. sh**:
export "PATH=/Some/Path:$PATH"
eval "$*"
    • CMakeLists.文本文件**:
add_custom_target(...
    COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args...
)

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

    • 更新**:

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

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

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

ccrfmcuu

ccrfmcuu3#

这是一个迟来的答案,但也许它会帮助一些人。我们在Windows上的cmake文件中使用&&操作符来做这件事。

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

add_custom_target(TARGET newtarget COMMAND ${MY_COMMAND})

注意,你不能在&&之前有空格(原因我不完全理解).而且,空格在这里处理起来真实的痛苦,所以我不知道我是否正确的c:\some\path是否有空格.如果你的原始路径有空格,它确实有效.

vom3gejh

vom3gejh4#

命令对我有效

add_custom_target(
    run
    DEPENDS ${PROJECT_NAME}
    COMMAND ASAN_OPTIONS=alloc_dealloc_mismatch=0 ./${PROJECT_NAME}
)

相关问题