Проблемы с настройкой переменных среды для тестов 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.

Другие вопросы по тегам