diff options
-rw-r--r-- | CMakeLists.txt | 108 | ||||
-rw-r--r-- | cmake/Modules/FindPythonInterpWithDebug.cmake | 57 |
2 files changed, 76 insertions, 89 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 96fa61e75..5fd2d9e42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,50 +28,94 @@ else() endif() ## For debugging the PYTHON* variables -#message("PYTHONLIBS_FOUND: " ${PYTHONLIBS_FOUND}) -#message("PYTHON_LIBRARIES: " ${PYTHON_LIBRARIES}) -#message("PYTHON_INCLUDE_DIRS: " ${PYTHON_INCLUDE_DIRS}) -#message("PYTHON_DEBUG_LIBRARIES: " ${PYTHON_DEBUG_LIBRARIES}) -#message("PYTHONINTERP_FOUND: " ${PYTHONINTERP_FOUND}) -#message("PYTHON_EXECUTABLE: " ${PYTHON_EXECUTABLE}) -#message("PYTHON_VERSION_MAJOR: " ${PYTHON_VERSION_MAJOR}) -#message("PYTHON_VERSION_MINOR: " ${PYTHON_VERSION_MINOR}) -#message("PYTHON_VERSION_PATCH: " ${PYTHON_VERSION_PATCH}) +message("PYTHONLIBS_FOUND: " ${PYTHONLIBS_FOUND}) +message("PYTHON_LIBRARIES: " ${PYTHON_LIBRARIES}) +message("PYTHON_INCLUDE_DIRS: " ${PYTHON_INCLUDE_DIRS}) +message("PYTHON_DEBUG_LIBRARIES: " ${PYTHON_DEBUG_LIBRARIES}) +message("PYTHONINTERP_FOUND: " ${PYTHONINTERP_FOUND}) +message("PYTHON_EXECUTABLE: " ${PYTHON_EXECUTABLE}) +message("PYTHON_VERSION: " ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}) + +# Queries the python sysconfig for the abi flags which need to be inserted into extension suffixes. +# Only present starting with Python 3.2. +# Corresponding configure switches to single letter flags: +# --with-pymalloc -> m +# --with-pydebug -> d +# --with-unicode -> u (rare) +macro(get_python3_abi_flags) + if (NOT PYTHON_ABI_FLAGS) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "if True: + import sysconfig + print(sysconfig.get_config_var('abiflags')) + " + OUTPUT_VARIABLE PYTHON_ABI_FLAGS + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + message("PYTHON_ABI_FLAGS: " ${PYTHON_ABI_FLAGS}) +endmacro() -if (UNIX AND NOT APPLE) - # TODO: This part needs more testing first to be available on OSX and WIN - # Also note the quirk that UNIX includes Apple! +macro(get_python_multi_arch_suffix) + # TODO: This part needs testing to check if it is available on Windows. + # It is present on macOS, but is not used yet. + # Result is something like 'x86_64-linux-gnu'. if (NOT PYTHON_MULTIARCH_SUFFIX) execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "if True: - import sysconfig - print(sysconfig.get_config_var('MULTIARCH')) - " - OUTPUT_VARIABLE PYTHON_MULTIARCH_SUFFIX - OUTPUT_STRIP_TRAILING_WHITESPACE) + COMMAND ${PYTHON_EXECUTABLE} -c "if True: + import sysconfig + print(sysconfig.get_config_var('MULTIARCH')) + " + OUTPUT_VARIABLE PYTHON_MULTIARCH_SUFFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) endif() - + message("PYTHON_MULTIARCH_SUFFIX: " ${PYTHON_MULTIARCH_SUFFIX}) +endmacro() + +macro(get_python2_release_suffix) + # Result of imp.get_suffixes() is something like: + # [('_d.so', 'rb', 3), ('module_d.so', 'rb', 3), ('.x86_64-linux-gnu_d.so', 'rb', 3)] + # or alternatively the same but withut the '_d' part. + # The list comprehension is used to choose which suffix to include in library names. + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "if True: + import imp + print('_d' if any([tup[0].endswith('_d.so') for tup in imp.get_suffixes()]) else '') + " + OUTPUT_VARIABLE PYTHON_MODULE_RELEASE_SUFFIX + OUTPUT_STRIP_TRAILING_WHITESPACE) + message("PYTHON_MODULE_RELEASE_SUFFIX: " ${PYTHON_MODULE_RELEASE_SUFFIX}) +endmacro() + +# Note the quirk that UNIX includes Apple! +if (UNIX AND NOT APPLE) if (NOT PYTHON_EXTENSION_SUFFIX) + get_python_multi_arch_suffix() + # The suffix added to .so libraries should be differenet between Python 2 and 3. + # The position of the multiarch suffix is different, and the way the debug flag is set + # computed differently. + # In Python 2 there is no standard way to query if the python interpeter was built in debug or + # release build (sysconfig.get_config_var('Py_Debug') can have a different value than you would + # expect if you do a custom Python build). The solution is to query for the import + # suffixes and check if _d is present there. It is present on Linux distribution + # packages of Python, but not in custom built Python builds, because the distros apply their + # custom patches too append the '_d's. + # In Python 3 (starting with 3.2) there is a standard way to check if '_d' needs to be added, + # as well as any other letters, by querying the abiflags sysconfig variable. if (PYTHON_VERSION_MAJOR EQUAL 2) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(PYTHON_RELEASE_SUFFIX "-dbg") - else() - set(PYTHON_RELEASE_SUFFIX "") + get_python2_release_suffix() + if(PYTHON_MULTIARCH_SUFFIX) + set(PYTHON_EXTENSION_SUFFIX ".${PYTHON_MULTIARCH_SUFFIX}") endif() - set(PYTHON_EXTENSION_SUFFIX "-python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}${PYTHON_RELEASE_SUFFIX}") + set(PYTHON_EXTENSION_SUFFIX "${PYTHON_EXTENSION_SUFFIX}${PYTHON_MODULE_RELEASE_SUFFIX}") elseif (PYTHON_VERSION_MAJOR EQUAL 3) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(PYTHON_RELEASE_SUFFIX "dm") - else() - set(PYTHON_RELEASE_SUFFIX "m") + get_python3_abi_flags() + set(PYTHON_EXTENSION_SUFFIX ".cpython-${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}${PYTHON_ABI_FLAGS}") + if(PYTHON_MULTIARCH_SUFFIX) + set(PYTHON_EXTENSION_SUFFIX "${PYTHON_EXTENSION_SUFFIX}-${PYTHON_MULTIARCH_SUFFIX}") endif() - set(PYTHON_EXTENSION_SUFFIX ".cpython-${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}${PYTHON_RELEASE_SUFFIX}") else() message(FATAL_ERROR "Unsupported PYTHON_VERSION=${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}!") endif() - if(PYTHON_MULTIARCH_SUFFIX) - set(PYTHON_EXTENSION_SUFFIX "${PYTHON_EXTENSION_SUFFIX}-${PYTHON_MULTIARCH_SUFFIX}") - endif() endif() message(STATUS "PYTHON_EXTENSION_SUFFIX: ${PYTHON_EXTENSION_SUFFIX}") endif () diff --git a/cmake/Modules/FindPythonInterpWithDebug.cmake b/cmake/Modules/FindPythonInterpWithDebug.cmake deleted file mode 100644 index df01366dd..000000000 --- a/cmake/Modules/FindPythonInterpWithDebug.cmake +++ /dev/null @@ -1,57 +0,0 @@ -find_program(PYTHON_EXECUTABLE NAMES python3.6 python3.5 python3.4 python3.3 python3.2 python2.7 python2.6 python2.5) - -if (NOT PYTHON_EXECUTABLE) - find_package(PythonInterp REQUIRED) -else() - set(PYTHONINTERP_FOUND 1) -endif() - -if (PYTHONINTERP_FOUND AND UNIX AND CMAKE_BUILD_TYPE STREQUAL "Debug") - # This is for Debian - set(PYTHON_EXECUTABLE_TMP "${PYTHON_EXECUTABLE}-dbg") - - if (NOT EXISTS "${PYTHON_EXECUTABLE_TMP}") - # On Fedora we usually have the suffix as debug. As we didn't - # find python interpreter with the suffix dbg we'll fall back - # to the suffix as debug. - set(PYTHON_EXECUTABLE_TMP "${PYTHON_EXECUTABLE}-debug") - endif() - # Falling back to the standard interpreter. - if (NOT EXISTS "${PYTHON_EXECUTABLE_TMP}") - set(PYTHON_EXECUTABLE_TMP "${PYTHON_EXECUTABLE}") - endif() - - set(PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE_TMP}") -endif() - -# Detect if the python libs were compiled in debug mode -execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "if True: - from distutils import sysconfig - print(bool(sysconfig.get_config_var('Py_DEBUG'))) - " - OUTPUT_VARIABLE PYTHON_WITH_DEBUG - OUTPUT_STRIP_TRAILING_WHITESPACE) - -execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "if True: - import sys - from distutils import sysconfig - vr = sys.version_info - suffix = '-dbg' if bool(sysconfig.get_config_var('Py_DEBUG')) else '' - print('-python%d.%d%s' % (vr[0], vr[1], suffix)) - " - OUTPUT_VARIABLE PYTHON_SUFFIX - OUTPUT_STRIP_TRAILING_WHITESPACE) - -# Fix missing variable on UNIX env -if (NOT PYTHON_DEBUG_LIBRARIES AND UNIX) - string(REPLACE "-dbg" "" PYTHON_NAME_TMP ${PYTHON_SUFFIX}) - string(REPLACE "-python" "python" PYTHON_NAME ${PYTHON_NAME_TMP}) - find_library(LIBRARY_FOUND ${PYTHON_NAME}_d) - if (LIBRARY_FOUND) - set(PYTHON_DEBUG_LIBRARIES "${LIBRARY_FOUND}") - else() - set(PYTHON_DEBUG_LIBRARIES "${PYTHON_LIBRARIES}") - endif() -endif() |