也许我错过了一些明显的东西,但我似乎无法弄清楚如何明确设置通过add_custom_target()
启动的流程可以看到的环境变量。
我尝试了以下内容:
set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)
不幸的是,%PATH%
环境变量对somecommand
不变。 (我已经设置了一个可以重现问题的要点here。)
我做错了什么?
答案 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)
答案 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是否包含空格是否正确。如果您的原始路径中有空格,它将起作用。