Проблемы с настройкой переменных среды для тестов CTest
Мне поручено создавать привязки Python для проекта на основе C++ (используя 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
установлен неправильно, но я не знаю, что я делаю неправильно.
Есть ли способ проверить в тесте, каково состояние переменной? Кто-нибудь может определить, что я делаю не так?
1 ответ
Вы можете установить переменные среды как часть вызова теста, используя 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
свойство test, которое должно достигать по существу того же самого:
set_tests_properties(testPyMyproj PROPERTIES
ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH})
Крейг Скотт уже предоставил отличное решение с помощью тестовых свойств ENVIRONMENT. Я просто хочу добавить, как это работает в Windows с генератором и выражениями генератора Visual Studio:
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. Я использую более гибкое выражение $ generator.