Tengo la tarea de crear enlaces de python para un proyecto basado en c ++ (usando swig). El proyecto usa cmake para compilar y ctest para probar, y se supone que la compilación y la prueba de los enlaces están integradas en esto.
Logré que la compilación funcionara y las pruebas funcionan cuando se ejecutan manualmente, pero tengo que configurar un par de variables de entorno para que funcionen y tengo problemas para configurarlas para el proceso automatizado.
Necesito configurar LD_LIBRARY_PATH y PYTHONPATH. PYTHONPATH Puedo moverme manipulando sys.path dentro del script de prueba, pero eso es más difícil de hacer con LD_LIBRARY_PATH. Hasta ahora, he agregado lo siguiente a CMakelists.txt en el directorio de prueba:
#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)el error que me sale es
ImportError: libMyproj.so: cannot open shared object file: No such file or directory Cuál es la biblioteca a la que están vinculados mis enlaces y está en el directorio especificado por ${CMAKE_BINARY_DIR}/lib/ .
Considero que esto significa que $LD_LIBRARY_PATH no está configurado correctamente, pero no sé qué estoy haciendo mal.
¿Hay alguna manera de verificar dentro de la prueba cuál es el estado de la variable? ¿Alguien puede detectar lo que estoy haciendo mal?
Puede establecer variables de entorno como parte de la invocación de la prueba mediante el comando cmake -E env . Puede modificar la llamada add_test() a algo como lo siguiente:
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 )Lo anterior asume un entorno de host basado en Unix, pero podría generalizar esto para admitir todas las plataformas/tipos de generadores con un poco de trabajo si fuera necesario.
Otra alternativa es usar la propiedad de prueba ENVIRONMENT que debería lograr esencialmente lo mismo:
set_tests_properties(testPyMyproj PROPERTIES ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH})Craig Scott ya proporcionó una gran solución a través de las propiedades de prueba de MEDIO AMBIENTE. Solo quiero agregar cómo funciona esto en Windows con el generador de Visual Studio y las expresiones del generador:
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}" )Nota 1: en lugar de dos puntos, use un punto y coma con escape Nota 2: estoy usando la expresión generadora de $ más flexible