Skip to content

Commit

Permalink
Drop old Python detection logic
Browse files Browse the repository at this point in the history
We now require CMake 3.14 or later, so the new
Python support in CMake should always be
available.
  • Loading branch information
benmwebb committed Nov 13, 2024
1 parent 12c24d5 commit b8b97ba
Showing 1 changed file with 17 additions and 84 deletions.
101 changes: 17 additions & 84 deletions cmake_modules/IMPFindPython.cmake
Original file line number Diff line number Diff line change
@@ -1,89 +1,22 @@
# Like cmake's FindPython but allows the user to override; should also
# work (to some degree) with older cmake
# Like cmake's FindPython but allows the user to override
function(imp_find_python)
if (${CMAKE_VERSION} VERSION_LESS "3.14.0")
message(WARNING "Using old Python detection logic. Recommended to upgrade to cmake 3.14.0 or later")
if(NOT DEFINED PYTHON_INCLUDE_DIRS)
set(_SEARCH_PYTHON_BINARIES python3 python)

foreach(pybinary ${_SEARCH_PYTHON_BINARIES})
execute_process(COMMAND ${pybinary} -c "import sys; print(sys.executable)"
RESULT_VARIABLE retval
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
OUTPUT_VARIABLE python_full_path
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${retval} EQUAL 0)
break()
endif()
endforeach()

if(NOT ${retval} EQUAL 0)
message(FATAL_ERROR "Could not find a suitable Python binary - looked for ${_SEARCH_PYTHON_BINARIES}")
endif()
set(PYTHON_EXECUTABLE ${python_full_path} CACHE INTERNAL "" FORCE)
set(PYTHON_TEST_EXECUTABLE ${python_full_path} CACHE STRING "")
endif()
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sys; print('%d.%d.%d' % sys.version_info[:3])"
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
OUTPUT_VARIABLE python_full_version
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^([0-9])+\\.[0-9]+.*" "\\1" major
"${python_full_version}")
string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*" "\\1" minor
"${python_full_version}")
string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" patch
"${python_full_version}")
set(PYTHON_VERSION ${python_full_version} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_MAJOR ${major} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_MINOR ${minor} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_PATCH ${patch} CACHE INTERNAL "" FORCE)
message(STATUS "Python binary is " ${PYTHON_EXECUTABLE} " (version " ${python_full_version} ")")
if(${major} EQUAL 2)
message(FATAL_ERROR "Only Python 2 was found; Python 3 is required to build")
endif()
if(NOT DEFINED PYTHON_INCLUDE_DIRS)
find_package(PythonLibs ${python_full_version} EXACT REQUIRED)
# Make sure PYTHON_INCLUDE_DIRS is in the cache so it can be
# used elsewhere
set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS} CACHE INTERNAL "")
endif()
if(NOT DEFINED PYTHON_NUMPY_INCLUDE_DIR)
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
"try: import numpy; print(numpy.get_include());\nexcept: pass"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
OUTPUT_VARIABLE __numpy_path
OUTPUT_STRIP_TRAILING_WHITESPACE)
find_path(PYTHON_NUMPY_INCLUDE_DIR numpy/arrayobject.h
HINTS "${__numpy_path}" "${PYTHON_INCLUDE_PATH}"
NO_DEFAULT_PATH)
if(PYTHON_NUMPY_INCLUDE_DIR)
set(PYTHON_NUMPY_FOUND 1 CACHE INTERNAL "Python numpy found")
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(NumPy
REQUIRED_VARS PYTHON_NUMPY_INCLUDE_DIR
VERSION_VAR __numpy_version)
endif()
find_package(Python3 COMPONENTS Interpreter Development NumPy)

if(Python3_Interpreter_FOUND AND Python3_Development_FOUND)
# Use Python 3 tools
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE} CACHE INTERNAL "" FORCE)
set(PYTHON_TEST_EXECUTABLE ${Python3_EXECUTABLE} CACHE STRING "")
set(PYTHON_LIBRARIES ${Python3_LIBRARIES} CACHE INTERNAL "" FORCE)
set(PYTHON_INCLUDE_DIRS ${Python3_INCLUDE_DIRS} CACHE INTERNAL "" FORCE)
set(PYTHON_LIBRARY_DIRS ${Python3_LIBRARY_DIRS} CACHE INTERNAL "" FORCE)
set(PYTHON_NUMPY_FOUND ${Python3_NumPy_FOUND} CACHE INTERNAL "" FORCE)
set(PYTHON_NUMPY_INCLUDE_DIR ${Python3_NumPy_INCLUDE_DIRS}
CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION ${Python3_VERSION} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_MINOR ${Python3_VERSION_MINOR} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_PATCH ${Python3_VERSION_PATCH} CACHE INTERNAL "" FORCE)
else()
find_package(Python3 COMPONENTS Interpreter Development NumPy)

if(Python3_Interpreter_FOUND AND Python3_Development_FOUND)
# Use Python 3 tools
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE} CACHE INTERNAL "" FORCE)
set(PYTHON_TEST_EXECUTABLE ${Python3_EXECUTABLE} CACHE STRING "")
set(PYTHON_LIBRARIES ${Python3_LIBRARIES} CACHE INTERNAL "" FORCE)
set(PYTHON_INCLUDE_DIRS ${Python3_INCLUDE_DIRS} CACHE INTERNAL "" FORCE)
set(PYTHON_LIBRARY_DIRS ${Python3_LIBRARY_DIRS} CACHE INTERNAL "" FORCE)
set(PYTHON_NUMPY_FOUND ${Python3_NumPy_FOUND} CACHE INTERNAL "" FORCE)
set(PYTHON_NUMPY_INCLUDE_DIR ${Python3_NumPy_INCLUDE_DIRS}
CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION ${Python3_VERSION} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_MINOR ${Python3_VERSION_MINOR} CACHE INTERNAL "" FORCE)
set(PYTHON_VERSION_PATCH ${Python3_VERSION_PATCH} CACHE INTERNAL "" FORCE)
else()
message(FATAL_ERROR "Could not find a Python interpreter and matching headers/libraries. Python is required to build.")
endif()
message(FATAL_ERROR "Could not find a Python interpreter and matching headers/libraries. Python is required to build.")
endif()
endfunction(imp_find_python)

0 comments on commit b8b97ba

Please sign in to comment.