无法为CTest测试设置环境变量

时间:2018-02-23 19:27:24

标签: python cmake swig ctest

我的任务是为基于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设置不正确,但我不知道自己做错了什么。

有没有办法在测试中检查变量的状态是什么?谁能发现我做错了什么?

2 个答案:

答案 0 :(得分:4)

您可以使用cmake -E env命令将环境变量设置为调用测试的一部分。您可以将add_test()调用修改为以下内容:

ADD_TEST(NAME testPyMyproj
    COMMAND ${CMAKE_COMMAND} -E env
        LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_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:$ENV{LD_LIBRARY_PATH})

答案 1 :(得分:2)

克雷格·斯科特(Craig Scott)已经通过环境测试属性提供了一个出色的解决方案。我只想使用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>\;$ENV{PATH}"
)

注1:请使用转义的分号代替冒号 注意2:我使用的是更灵活的$生成器表达式