为 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"\\$opt/poky/1.4.2/sysroots/core2-poky-linux /lib)【参考方案2】:

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 测试设置环境变量时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

postman如何设置环境变量和全局变量

postman使用--环境变量

在Postman中如何设置环境变量?

Postman小技巧之变量的使用及优先级

Postman中的环境变量

用.reg在注册表中修改环境变量时遇到的问题