我有一个 CMake 脚本,可以通过以下方式运行一些测试add_test()
,在 Windows(Server 2008,不要问)下运行于 CMake 3.15。当调用这些测试时,它们运行的环境中的 PYTHONPATH 环境变量似乎会重置为环境默认值,并且不包含它需要的一些路径。
因此,当 CMake 运行时,我需要在运行测试时将 PYTHONPATH 设置为 $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 没有改变。我认为这是因为它是一个环境变量,但是通过使用常规 CMake 变量set()
没有什么区别,所以我做错了。请帮助!
以下应该有效:
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
I get:
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的解析方式引用的论点 https://cmake.org/cmake/help/v3.12/manual/cmake-language.7.html#quoted-argument。参数要么被完全引用,要么根本不被引用 - 部分引号被解释为文字"
。所以假设:
set(var a;b;c)
下列:
var="$var"
不是引用的论点并且"
是按字面意思理解的!它扩展了$var
列表到空格分隔的列表中,并且"
留下来,有一个"
之间=
and 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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)