gpt4 book ai didi

cmake - 不要扩展 CMake 列表变量

转载 作者:行者123 更新时间:2023-12-05 03:57:19 25 4
gpt4 key购买 nike

我有一个 CMake 脚本,它通过 add_test() 运行一些测试,在 CMake 3.15 的 Windows(Server 2008,不要问)下运行。当调用这些测试时,它们运行的​​环境中的 PYTHONPATH 环境变量似乎被重置为环境默认值,并且不包含它需要的一些路径。

因此,我需要在测试运行时将 PYTHONPATH 设置为 CMake 运行时 $ENV{PYTHONPATH} 变量的值。这有许多以分号分隔的路径,因此 CMake 认为它是一个列表并试图将其扩展为许多以空格分隔的字符串,这显然以糟糕的方式结束。

我不知道如何阻止 CMake 这样做。从我所看到的一切来看,你应该能够用引号括起来:

add_test(
NAME mytest
COMMAND cmake -E env PYTHONPATH="$ENV{PYTHONPATH}"
run_test_here)

...但它总是进行扩展。我还尝试使用 set_tests_properties 进行设置:

set_tests_properties(mytest PROPERTIES
ENVIRONMENT PYTHONPATH="$ENV{PYTHONPATH}")

...但这似乎根本没有做任何事情 - 测试时的 PYTHONPATH 没有改变。我认为这是因为它是一个环境变量,但是通过 set() 使用常规 CMake 变量没有任何区别,所以我做错了什么。请帮忙!

最佳答案

以下应该有效:

COMMAND cmake -E env "PYTHONPATH=$ENV{PYTHONPATH}"

您需要引用命令行的完整部分,以正确扩展消息。

测试:

set(tmp "C:\\Python27\\Scripts;E:\\JenkinsMIDEBLD\\workspace\\...;...")
add_test(NAME MYtest1 COMMAND cmake -S . -E env "tmp=${tmp}")
add_test(NAME MYtest2 COMMAND cmake -S . -E env tmp="${tmp}")

运行 ctest 后我得到:

1: Test command: /bin/cmake "-S" "." "-E" "env" "tmp=C:\Python27\Scripts;E:\JenkinsMIDEBLD\workspace\...;..."
2: Test command: /bin/cmake "-S" "." "-E" "env" "tmp="C:\Python27\Scripts" "E:\JenkinsMIDEBLD\workspace\..." "...""

第一个测试有正确的 ; 传递给 var,而第二个测试传递空格分隔的列表。

这就是 cmake 解析 quoted arguments 的方式.一个参数要么被完全引用,要么根本没有被引用 - 部分引用被解释为文字 "。所以假设:

set(var a;b;c)

以下内容:

var="$var"

不是引用参数," 是按字面意思理解的!它将 $var 列表扩展为空格分隔的列表,而 " 保留, =a之间有一个",最后还有一个"var="$var" 等于:

var=\"a b c\"
^^ ^^ - the quotes stay!
^^^^^^^ ^ ^^^ - these are 3 arguments, the last one is `c"`

没有引号是:

var=$var

等于(注意遗漏的引号):

var=a c c

要引用参数,您必须将其全部引用,元素的第一个和最后一个字符为 ":

"var=$var"

将扩展为:

"var=a;b;c"

关于cmake - 不要扩展 CMake 列表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com