M.I*_*olt 4 python swig cmake ctest
我的任务是为基于c ++的项目(使用swig)构建python绑定。该项目使用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)
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
ImportError: libMyproj.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我的绑定链接到哪个库,并位于所指定的目录中${CMAKE_BINARY_DIR}/lib/
。
我认为这表示$LD_LIBRARY_PATH
设置不正确,但是我不知道我在做什么错。
有没有办法在测试中检查变量的状态是什么?谁能发现我在做什么错?
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}"
)
Run Code Online (Sandbox Code Playgroud)
注 1:使用转义分号代替冒号 注 2:我使用更灵活的 $ 生成器表达式
您可以使用以下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
)
Run Code Online (Sandbox Code Playgroud)
上面假设基于Unix的主机环境,但是如果需要的话,您可以花点工夫将其推广到支持所有平台/发电机类型。
另一种选择是使用ENVIRONMENT
测试属性,该属性应该实现基本相同的功能:
set_tests_properties(testPyMyproj PROPERTIES
ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2304 次 |
最近记录: |