我的任务是为基于C 的项目构建Python绑定(使用SWIG(。该项目使用cmake构建和ctest进行测试,并且绑定的构建和测试应该集成到此中。
手动运行时,我已经开始工作,测试工作正常,但是我必须设置一些环境变量才能使它们工作,并且我很难将其设置为自动化过程。
我需要设置ld_library_path和PythonPath。pythonpath我可以通过在测试脚本中操纵sys.path来解决,但这与ld_library_path更难。到目前为止
#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
无法正确设置,但我不知道我在做什么错。
有没有办法在测试中检查变量的状态是什么?谁能发现我做错了什么?
您可以使用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})
克雷格·斯科特(Craig Scott(已经通过环境测试属性提供了一个很好的解决方案。我只想添加Visual Studio Generator和Generator Expressions在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:我正在使用更灵活的$发电机表达式