为 CTest 测试设置环境变量时遇到问题
Posted
技术标签:
【中文标题】为 CTest 测试设置环境变量时遇到问题【英文标题】:Trouble setting environment variables for CTest tests 【发布时间】:2018-08-03 22:15:00 【问题描述】:我的任务是为基于 c++ 的项目构建 python 绑定(使用 swig)。该项目使用 cmake 构建和 ctest 进行测试,并且应该将绑定的构建和测试集成到其中。
我已经让构建工作并且测试在手动运行时工作,但我必须设置几个环境变量才能让它们工作,而我在为自动化过程设置这些变量时遇到了麻烦。
我需要设置 LD_LIBRARY_PATH 和 PYTHONPATH。 PYTHONPATH 我可以通过在测试脚本中操作 sys.path 来解决问题,但使用 LD_LIBRARY_PATH 就更难了。到目前为止,我已将以下内容添加到测试目录中的 CMakelists.txt 中:
#Python wrapper testing
find_package(PythonInterp 3.5 REQUIRED)
if (NOT PYTHONINTERP_FOUND)
message(STATUS "Python interpreter NOT found")
else(NOT PYTHONINTERP_FOUND)
message(STATUS "Python interpreter found")
ADD_TEST(NAME testPyMyproj
COMMAND $PYTHON_EXECUTABLE $CMAKE_CURRENT_SOURCE_DIR/test_scripts/test_pyMyproj.py
)
set_property(TEST testPyMyproj PROPERTY ENVIRONMENT LD_LIBRARY_PATH=$CMAKE_BINARY_DIR/lib/)
endif (NOT PYTHONINTERP_FOUND)
我得到的错误是
ImportError: libMyproj.so: cannot open shared object file: No such file or directory
我的绑定链接到哪个库,位于$CMAKE_BINARY_DIR/lib/
指定的目录中。
我认为这意味着$LD_LIBRARY_PATH
设置不正确,但我不知道我做错了什么。
有没有办法在测试中检查变量的状态是什么?谁能发现我做错了什么?
【问题讨论】:
谢谢。因为我怀疑变量是空的。 好吧,它并没有解决我做错的主要问题。 我不知道你想做什么。I need to set LD_LIBRARY_PATH and PYTHONPATH. PYTHONPATH I can get around that by...
你不能只设置环境变量吗?
我可以手动设置它们,然后它就可以工作了,但这需要在 docker 容器中自动运行。我正在尝试以不依赖于系统预先存在的状态的方式设置它们。
为什么不使用os.environ["LD_LIBRARY_PATH"] = "foo"
?
【参考方案1】:
您可以使用cmake -E env
命令将环境变量设置为调用测试的一部分。您可以将add_test()
调用修改为如下内容:
ADD_TEST(NAME testPyMyproj
COMMAND $CMAKE_COMMAND -E env
LD_LIBRARY_PATH=$CMAKE_BINARY_DIR/lib:$ENVLD_LIBRARY_PATH
$PYTHON_EXECUTABLE $CMAKE_CURRENT_SOURCE_DIR/test_scripts/test_pyMyproj.py
)
以上假设是基于 Unix 的主机环境,但如果需要,您可以通过一些工作将其概括为支持所有平台/生成器类型。
另一种选择是使用ENVIRONMENT
测试属性,它应该实现基本相同的事情:
set_tests_properties(testPyMyproj PROPERTIES
ENVIRONMENT LD_LIBRARY_PATH=$CMAKE_BINARY_DIR/lib:$ENVLD_LIBRARY_PATH)
【讨论】:
请注意,要将ENVIRONMENT
属性与多个变量一起使用,您必须将它们作为单个分号分隔的字符串提供。
另见:cmake.org/cmake/help/latest/command/set_property.htmlset_property(TEST [<test1> ...] APPEND PROPERTY ENVIRONMENT [value1 ...])
如果您需要在变量值中使用分号(例如 Windows 上的 PATH
),请使用类似 \\$<SEMICOLON>
的内容
具有多个值的示例:set_property(TEST unit_test PROPERTY ENVIRONMENT LD_LIBRARY_PATH="$ENVLD_LIBRARY_PATH"\\$Craig Scott 已经通过 ENVIRONMENT 测试属性提供了一个很好的解决方案。我只想通过 Visual Studio 生成器和生成器表达式添加它在 Windows 上的工作原理:
set_tests_properties(
name_of_test_one
name_of_test_two
PROPERTIES
# Make sure DLL is found by adding its directory to PATH
ENVIRONMENT "PATH=$<TARGET_FILE_DIR:library_target_name>\;$ENVPATH"
)
注意 1:不要使用冒号,而是使用转义的分号 注 2:我使用的是更灵活的 $ 生成器表达式
【讨论】:
以上是关于为 CTest 测试设置环境变量时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章