Trouble setting environment variables for CTest te

2020-04-07 05:46发布

问题:

I'm tasked with building python bindings for a c++-based project (using swig). The project uses cmake to build and ctest to test and the build and test of the bindings are supposed to be integrated into this.

I've gotten the build to work and the tests work when run manually, but I have to set a couple of environment variables in order for them to work and I'm having trouble setting those for the automated process.

I need to set LD_LIBRARY_PATH and PYTHONPATH. PYTHONPATH I can get around by manipulating sys.path within the testing script, but that's harder to do with LD_LIBRARY_PATH. So far I have the following added to the CMakelists.txt in the testing directory:

#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)

The error I am getting is

ImportError: libMyproj.so: cannot open shared object file: No such file or directory

Which is the library my bindings are linked to and is in the directory specified by ${CMAKE_BINARY_DIR}/lib/.

I take this to mean that $LD_LIBRARY_PATH is not set correctly, but I don't know what I'm doing wrong.

Is there a way to check within the test what the state of the variable is? Can anyone spot what I am doing wrong?

回答1:

You can set environment variables as part of invoking the test by using the cmake -E env command. You can modify the add_test() call to something like the following:

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
)

The above assumes a Unix-based host environment, but you could generalise this to support all platforms/generator types with a bit of work if you needed to.

Another alternative is to use the ENVIRONMENT test property which should achieve essentially the same thing:

set_tests_properties(testPyMyproj PROPERTIES
    ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH})