我的任务是为基于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
设置不正确,但我不知道自己做错了什么。
有没有办法在测试中检查变量的状态是什么?谁能发现我做错了什么?
答案 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:我使用的是更灵活的$生成器表达式