From 3f42f88a8a5ab5140d01b70690ad479cb374795f Mon Sep 17 00:00:00 2001 From: Max Smolens Date: Thu, 3 Sep 2015 09:42:57 -0400 Subject: [PATCH] Fix OS X build when CMAKE_BUILD_WITH_INSTALL_RPATH is enabled When building Python 2.7.4+, python is run from the build tree as part of the build process. When BUILD_SHARED and CMAKE_BUILD_WITH_INSTALL_RPATH are enabled the python executable is unable to find the shared library. The build fails with an error like: [100%] Relocate _sysconfigdata.py and update pybuilddir.txt dyld: Library not loaded: /path/to/python-install/lib/libpython2.7.dylib Referenced from: /path/to/python-build/bin/python Reason: image not found /bin/sh: line 1: 12570 Trace/BPT trap /path/to/python-build/bin/python -E -S -m sysconfig --generate-posix-vars make[2]: *** [bin/pybuilddir.txt] Error 133 make[1]: *** [CMakeBuild/python/CMakeFiles/update_sysconfig.dir/all] Error 2 make: *** [all] Error 2 The same error shows when running the tests. This commit sets the DYLD_LIBRARY_PATH so that the executable finds the shared library when building and when running the tests. [cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DBUILD_SHARED=ON] --- CMakeLists.txt | 6 +++++- cmake/python/CMakeLists.txt | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af372be63..6487ac420 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -319,11 +319,15 @@ if(BUILD_TESTING) set(TESTOPTS -l ${EXTRATESTOPTS}) set(TESTPROG ${CMAKE_BINARY_DIR}/${PYTHONHOME}/test/regrtest.py) set(TESTPYTHONOPTS ) + set(TESTPYTHONWRAPPER ) + if(APPLE AND BUILD_SHARED) + set(TESTPYTHONWRAPPER env DYLD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/${LIBPYTHON_LIBDIR}) + endif() set(TESTPYTHON $ -Wd -3 -E -tt ${TESTPYTHONOPTS}) include(cmake/UnitTests.cmake) foreach(unittest ${unittests}) - add_test(NAME ${unittest} COMMAND ${TESTPYTHON} ${TESTPROG} ${TESTOPTS} ${unittest}) + add_test(NAME ${unittest} COMMAND ${TESTPYTHONWRAPPER} ${TESTPYTHON} ${TESTPROG} ${TESTOPTS} ${unittest}) endforeach(unittest) endif(BUILD_TESTING) diff --git a/cmake/python/CMakeLists.txt b/cmake/python/CMakeLists.txt index acd36d2e5..0638704e1 100644 --- a/cmake/python/CMakeLists.txt +++ b/cmake/python/CMakeLists.txt @@ -24,9 +24,13 @@ install(TARGETS python EXPORT PythonTargets RUNTIME DESTINATION ${BIN_INSTALL_DI if(UNIX AND PY_VERSION VERSION_GREATER "2.7.4") # Setup landmark allowing to run the interpreter from a build tree. See 'getpath.c' for details. + set(PYTHON_WRAPPER_COMMAND ) + if(APPLE AND BUILD_SHARED) + set(PYTHON_WRAPPER_COMMAND env DYLD_LIBRARY_PATH="${CMAKE_BINARY_DIR}/${LIBPYTHON_LIBDIR}") + endif() add_custom_command( OUTPUT ${BIN_BUILD_DIR}/pybuilddir.txt ${EXTENSION_BUILD_DIR}/_sysconfigdata.py - COMMAND $ -E -S -m sysconfig --generate-posix-vars + COMMAND ${PYTHON_WRAPPER_COMMAND} $ -E -S -m sysconfig --generate-posix-vars COMMAND ${CMAKE_COMMAND} -DBIN_BUILD_DIR:PATH=${BIN_BUILD_DIR} -DPYTHON_BINARY_DIR:PATH=${CMAKE_BINARY_DIR}