Skip to content
Snippets Groups Projects
Commit 55e621f4 authored by Pospelov, Gennady's avatar Pospelov, Gennady
Browse files

Switch to modern CMake way of finding Python on the system (code is in uncompilable state).

parent 7598a7ce
No related branches found
No related tags found
No related merge requests found
...@@ -61,25 +61,31 @@ endif() ...@@ -61,25 +61,31 @@ endif()
message(STATUS "Requested Python versions ${Python_ADDITIONAL_VERSIONS}") message(STATUS "Requested Python versions ${Python_ADDITIONAL_VERSIONS}")
if(BORNAGAIN_PYTHON OR BORNAGAIN_GUI) if(BORNAGAIN_PYTHON OR BORNAGAIN_GUI)
find_package(PythonInterp REQUIRED) find_package (Python COMPONENTS Interpreter Development NumPy)
message(STATUS "Found Python interpreter version ${PYTHON_VERSION_STRING} at ${PYTHON_EXECUTABLE}")
find_package(PythonLibs REQUIRED)
if(NOT PYTHONLIBS_FOUND)
message(FATAL_ERROR "No Python library has been found")
endif()
message(STATUS "Found Python libraries version ${PYTHONLIBS_VERSION_STRING} at ${PYTHON_LIBRARIES}; includes at ${PYTHON_INCLUDE_DIRS}")
if(PYTHONLIBS_VERSION_STRING MATCHES "^3.*$") message(STATUS " Python_VERSION : ${Python_VERSION}")
set(BORNAGAIN_USE_PYTHON3 ON) message(STATUS " Python_INTERPRETER_ID : ${Python_INTERPRETER_ID}")
endif() message(STATUS " Python_EXECUTABLE : ${Python_EXECUTABLE}")
message(STATUS "BORNAGAIN_USE_PYTHON3: ${BORNAGAIN_USE_PYTHON3}.") message(STATUS " Python_STDLIB : ${Python_STDLIB} Python_STDARCH: ${Python_STDARCH}")
message(STATUS " Python_SITELIB : ${Python_SITELIB} Python_SITEARCH: ${Python_SITEARCH}")
message(STATUS " Python_INCLUDE_DIRS : ${Python_INCLUDE_DIRS}")
message(STATUS " Python_LIBRARIES : ${Python_LIBRARIES}")
message(STATUS " Python_LIBRARY_DIRS : ${Python_LIBRARY_DIRS}")
message(STATUS " Python_NumPy_VERSION : ${Python_NumPy_VERSION}")
message(STATUS " Python_NumPy_INCLUDE_DIRS : ${Python_NumPy_INCLUDE_DIRS}")
if(NOT WIN32) if (NOT Python_FOUND)
include(ValidatePythonInstallation) message(FATAL_ERROR "No Python requested components.")
ValidatePythonInstallation() endif ()
endif()
if (NOT Python_Development_FOUND)
message(FATAL_ERROR "No Python.h has been found.")
endif ()
if (NOT Python_NumPy_FOUND)
message(FATAL_ERROR "Numpy was not found.")
endif ()
find_package(Numpy REQUIRED)
endif() endif()
# --- Swig --- # --- Swig ---
......
function(ValidatePythonInstallation)
message(STATUS "--> Validating Python installation corresponding to the interpreter ${PYTHON_EXECUTABLE}")
execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
"from distutils import sysconfig as s;import sys;import struct;
print('.'.join(str(v) for v in sys.version_info));
print(sys.prefix);
print(s.get_python_inc(plat_specific=True));
print(s.get_python_lib(plat_specific=True));
print(s.get_config_var('SO'));
print(hasattr(sys, 'gettotalrefcount')+0);
print(struct.calcsize('@P'));
print(s.get_config_var('LDVERSION') or s.get_config_var('VERSION'));
"
RESULT_VARIABLE _PYTHON_SUCCESS
OUTPUT_VARIABLE _PYTHON_VALUES
ERROR_VARIABLE _PYTHON_ERROR_VALUE
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT _PYTHON_SUCCESS MATCHES 0)
set(ALT_PYTHONLIBS_FOUND FALSE)
return()
endif()
# Convert the process output into a list
string(REGEX REPLACE ";" "\\\\;" _PYTHON_VALUES ${_PYTHON_VALUES})
string(REGEX REPLACE "\n" ";" _PYTHON_VALUES ${_PYTHON_VALUES})
list(GET _PYTHON_VALUES 0 _PYTHON_VERSION_LIST)
list(GET _PYTHON_VALUES 1 ALT_PYTHON_PREFIX)
list(GET _PYTHON_VALUES 2 ALT_PYTHON_INCLUDE_DIRS)
list(GET _PYTHON_VALUES 3 ALT_PYTHON_SITE_PACKAGES)
list(GET _PYTHON_VALUES 4 ALT_PYTHON_MODULE_EXTENSION)
list(GET _PYTHON_VALUES 5 ALT_PYTHON_IS_DEBUG)
list(GET _PYTHON_VALUES 6 ALT_PYTHON_SIZEOF_VOID_P)
list(GET _PYTHON_VALUES 7 ALT_PYTHON_LIBRARY_SUFFIX)
string(REGEX REPLACE "\\." ";" _PYTHON_VERSION_LIST ${_PYTHON_VERSION_LIST})
list(GET _PYTHON_VERSION_LIST 0 ALT_PYTHON_VERSION_MAJOR)
list(GET _PYTHON_VERSION_LIST 1 ALT_PYTHON_VERSION_MINOR)
list(GET _PYTHON_VERSION_LIST 2 ALT_PYTHON_VERSION_PATCH)
set(ALT_PYTHON_VERSION_STRING ${ALT_PYTHON_VERSION_MAJOR}.${ALT_PYTHON_VERSION_MINOR}.${ALT_PYTHON_VERSION_PATCH})
message(STATUS "----> ALT_PYTHON_PREFIX:${ALT_PYTHON_PREFIX}")
message(STATUS "----> ALT_PYTHON_INCLUDE_DIRS:${ALT_PYTHON_INCLUDE_DIRS}")
message(STATUS "----> ALT_PYTHON_SITE_PACKAGES:${ALT_PYTHON_SITE_PACKAGES}")
message(STATUS "----> ALT_PYTHON_MODULE_EXTENSION:${ALT_PYTHON_MODULE_EXTENSION}")
message(STATUS "----> ALT_PYTHON_IS_DEBUG:${ALT_PYTHON_IS_DEBUG}")
message(STATUS "----> ALT_PYTHON_SIZEOF_VOID_P:${ALT_PYTHON_SIZEOF_VOID_P} ")
message(STATUS "----> ALT_PYTHON_LIBRARY_SUFFIX:${ALT_PYTHON_LIBRARY_SUFFIX}")
if(NOT PYTHON_INCLUDE_DIRS STREQUAL ALT_PYTHON_INCLUDE_DIRS)
message(STATUS "----> Python interpreter reports include directory (see ALT_PYTHON_INCLUDE_DIRS) which differs from what we have learned before (see PYTHON_INCLUDE_DIRS).")
message(STATUS "----> Setting PYTHON_INCLUDE_DIRS=${ALT_PYTHON_INCLUDE_DIRS}")
set(PYTHON_INCLUDE_DIRS ${ALT_PYTHON_INCLUDE_DIRS} PARENT_SCOPE)
endif()
if(PYTHONLIBS_FOUND)
if(NOT PYTHON_VERSION_STRING STREQUAL PYTHONLIBS_VERSION_STRING)
message(STATUS "---> PYTHON_VERSION_STRING ${PYTHON_VERSION_STRING} differs from PYTHONLIBS_VERSION_STRING ${PYTHONLIBS_VERSION_STRING}")
if(APPLE)
set(ALT_PYTHON_LIBRARIES "${ALT_PYTHON_PREFIX}/lib/libpython${ALT_PYTHON_LIBRARY_SUFFIX}.dylib")
message(STATUS "----> Will use library from ${ALT_PYTHON_LIBRARIES} instead")
set(PYTHON_LIBRARIES ${ALT_PYTHON_LIBRARIES} PARENT_SCOPE)
else()
message(STATUS "---> There is inconcistency between versions of interpreter and library.")
endif()
endif()
endif()
if(NOT PYTHONLIBS_FOUND)
if(APPLE)
message(STATUS "----> There was a complain that no suitable Python library has been found. This is APPLE of course... well, let's see... ")
set(ALT_PYTHON_LIBRARIES "${ALT_PYTHON_PREFIX}/lib/libpython${ALT_PYTHON_LIBRARY_SUFFIX}.dylib")
if(${PYTHON_LIBRARIES} STREQUAL ${ALT_PYTHON_LIBRARIES})
message(STATUS "----> ... we found that the library is OK. Ignoring complain.")
set(PYTHONLIBS_FOUND TRUE)
else()
if(EXISTS ${ALT_PYTHON_LIBRARIES})
message(STATUS "----> ... there is another one which seems to be OK ${ALT_PYTHON_LIBRARIES}.")
set(PYTHONLIBS_FOUND TRUE)
set(PYTHON_LIBRARIES ${ALT_PYTHON_LIBRARIES} PARENT_SCOPE)
endif()
endif()
endif()
endif()
if(PYTHONLIBS_FOUND)
if(NOT WIN32)
GET_FILENAME_COMPONENT(PyLibExtension ${PYTHON_LIBRARIES} EXT)
if(${PyLibExtension} STREQUAL ".a")
find_package( Threads )
set(syslibs "-lm -ldl -lutil ${CMAKE_THREAD_LIBS_INIT} -rdynamic")
message(STATUS "----> Static python library detected, adding ${syslibs}")
set(PYTHON_LIBRARIES "${syslibs} ${PYTHON_LIBRARIES}" PARENT_SCOPE)
endif()
endif()
if(BUILD_DEBIAN)
set(PYTHON_SITE_PACKAGES ${ALT_PYTHON_SITE_PACKAGES} PARENT_SCOPE)
endif()
endif()
if(PYTHONLIBS_FOUND)
set(PYTHONLIBS_FOUND TRUE PARENT_SCOPE)
message(STATUS "--> Python seems to be OK.")
else()
message(FATAL_ERROR "No appropriate Python library has been found. Sorry.")
endif()
# set(ALT_PYTHONLIBS_FOUND ${ALT_PYTHONLIBS_FOUND} PARENT_SCOPE)
# set(ALT_PYTHON_VERSION_STRING ${ALT_PYTHON_VERSION_STRING} PARENT_SCOPE)
# set(ALT_PYTHON_INCLUDE_DIRS ${ALT_PYTHON_INCLUDE_DIRS} PARENT_SCOPE)
endfunction()
# Find the native numpy includes
# This module defines
# NUMPY_INCLUDE_DIR, where to find numpy/arrayobject.h, etc.
# NUMPY_FOUND, If false, do not try to use numpy headers.
if (NUMPY_INCLUDE_DIR)
# in cache already
set (Numpy_FIND_QUIETLY TRUE)
endif (NUMPY_INCLUDE_DIR)
if(NOT Numpy_FIND_QUIETLY)
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.get_include())"
OUTPUT_VARIABLE NUMPY_INCLUDE_DIR
RESULT_VARIABLE NUMPY_NOT_FOUND
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if (NUMPY_INCLUDE_DIR MATCHES "Traceback")
# Did not successfully include numpy
message(ERROR "Unexpected NUMPY_INCLUDE_DIR='${NUMPY_INCLUDE_DIR}'.")
set(NUMPY_FOUND FALSE)
else()
# successful
message(STATUS "Found NUMPY_INCLUDE_DIR='${NUMPY_INCLUDE_DIR}'.")
if(NOT EXISTS ${NUMPY_INCLUDE_DIR}/numpy/arrayobject.h)
message(STATUS "Can't find numpy/arrayobject.h, please install python-numpy-devel package")
else()
set (NUMPY_FOUND TRUE)
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.__version__)"
OUTPUT_VARIABLE numpy_version_number
RESULT_VARIABLE numpy_return_value
OUTPUT_STRIP_TRAILING_WHITESPACE)
set (NUMPY_VERSION_STRING ${numpy_version_number})
endif()
endif()
if (NUMPY_FOUND)
if (NOT Numpy_FIND_QUIETLY)
message (STATUS "Numpy headers found at ${NUMPY_INCLUDE_DIR}, version ${numpy_version_number}.")
endif()
else()
if (Numpy_FIND_REQUIRED)
message (FATAL_ERROR "Numpy headers missing, please install python-numpy-devel package")
endif()
endif()
if(WIN32)
STRING(REGEX REPLACE "\\\\" "/" NUMPY_INCLUDE_DIR ${NUMPY_INCLUDE_DIR})
endif()
MARK_AS_ADVANCED (NUMPY_INCLUDE_DIR)
MARK_AS_ADVANCED (NUMPY_VERSION_STRING)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment