##// END OF EJS Templates
More PythonQt*Config.cmake fixes
More PythonQt*Config.cmake fixes

File last commit:

r213:89db53e7cd3e
r213:89db53e7cd3e
Show More
FindPython.cmake
189 lines | 8.1 KiB | text/x-cmake | CMakeLexer
# - Find python
# This module searches for both the python interpreter and the python libraries
# and determines where they are located
#
#
# PYTHON_FOUND - The requested Python components were found
# PYTHON_EXECUTABLE - path to the Python interpreter
# PYTHON_INCLUDE_DIRS - path to the Python header files
# PYTHON_LIBRARIES - the libraries to link against for python
# PYTHON_VERSION - the python version
#
#=============================================================================
# Copyright 2010 Branan Purvine-Riley
# 2013 Orochimarufan
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the names of Kitware, Inc., the Insight Software Consortium,
# nor the names of their contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#=============================================================================
IF("3" STREQUAL "${Python_FIND_VERSION_MAJOR}")
SET(PYTHON_3_OK "TRUE")
SET(PYTHON_2_OK "FALSE") # redundant in version selection code, but skips a FOREACH
ELSE("3" STREQUAL "${Python_FIND_VERSION_MAJOR}")
SET(PYTHON_2_OK "TRUE")
# don't set PYTHON_3_OK to false here - if the user specified it we want to search for Python 2 & 3
ENDIF("3" STREQUAL "${Python_FIND_VERSION_MAJOR}")
# This is heavily inspired by FindBoost.cmake, with the addition of a second version list to keep
# python 2 and python 3 separate
IF(Python_FIND_VERSION_EXACT)
SET(_PYTHON_TEST_VERSIONS "${Python_FIND_VERSION_MAJOR}.${Python_FIND_VERSION_MINOR}")
ELSE(Python_FIND_VERSION_EXACT)
# Version lists
SET(_PYTHON_3_KNOWN_VERSIONS ${PYTHON_3_ADDITIONAL_VERSIONS}
"3.3" "3.2" "3.1" "3.0")
SET(_PYTHON_2_KNOWN_VERSIONS ${PYTHON_2_ADDITIONAL_VERSIONS}
"2.7" "2.6" "2.5" "2.4" "2.3" "2.2" "2.1" "2.0" "1.6" "1.5")
SET(_PYTHON_2_TEST_VERSIONS)
SET(_PYTHON_3_TEST_VERSIONS)
SET(_PYTHON_TEST_VERSIONS)
IF(Python_FIND_VERSION)
# python 3 versions
IF(PYTHON_3_OK)
FOREACH(version ${_PYTHON_3_KNOWN_VERSIONS})
IF(NOT ${version} VERSION_LESS ${Python_FIND_VERSION})
LIST(APPEND _PYTHON_3_TEST_VERSIONS ${version})
ENDIF(NOT ${version} VERSION_LESS ${Python_FIND_VERSION})
ENDFOREACH(version)
ENDIF(PYTHON_3_OK)
# python 2 versions
IF(PYTHON_2_OK)
FOREACH(version ${_PYTHON_2_KNOWN_VERSIONS})
IF(NOT ${version} VERSION_LESS ${Python_FIND_VERSION})
LIST(APPEND _PYTHON_2_TEST_VERSIONS ${version})
ENDIF(NOT ${version} VERSION_LESS ${Python_FIND_VERSION})
ENDFOREACH(version)
ENDIF(PYTHON_2_OK)
# all versions
ELSE(Python_FIND_VERSION)
IF(PYTHON_3_OK)
LIST(APPEND _PYTHON_3_TEST_VERSIONS ${_PYTHON_3_KNOWN_VERSIONS})
ENDIF(PYTHON_3_OK)
IF(PYTHON_2_OK)
LIST(APPEND _PYTHON_2_TEST_VERSIONS ${_PYTHON_2_KNOWN_VERSIONS})
ENDIF(PYTHON_2_OK)
ENDIF(Python_FIND_VERSION)
# fix python3 version flags
IF(PYTHON_3_OK)
FOREACH(version ${_PYTHON_3_TEST_VERSIONS})
IF(${version} VERSION_GREATER 3.1)
LIST(APPEND _PYTHON_TEST_VERSIONS "${version}mu" "${version}m" "${version}u" "${version}")
ELSE(${version} VERSION_GREATER 3.1)
LIST(APPEND _PYTHON_TEST_VERSIONS ${version})
ENDIF(${version} VERSION_GREATER 3.1)
ENDFOREACH(version)
ENDIF(PYTHON_3_OK)
IF(PYTHON_2_OK)
LIST(APPEND _PYTHON_TEST_VERSIONS ${_PYTHON_2_TEST_VERSIONS})
ENDIF(PYTHON_2_OK)
ENDIF(Python_FIND_VERSION_EXACT)
SET(_PYTHON_EXE_VERSIONS)
FOREACH(version ${_PYTHON_TEST_VERSIONS})
LIST(APPEND _PYTHON_EXE_VERSIONS python${version})
ENDFOREACH(version ${_PYTHON_TEST_VERSIONS})
IF(WIN32)
SET(_PYTHON_REGISTRY_KEYS)
FOREACH(version ${_PYTHON_TEST_VERSIONS})
LIST(APPEND _PYTHON_REGISTRY_KEYS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath])
ENDFOREACH(version ${_PYTHON_TEST_VERSIONS})
# this will find any standard windows Python install before it finds anything from Cygwin
FIND_PROGRAM(PYTHON_EXECUTABLE NAMES python ${_PYTHON_EXE_VERSIONS} PATHS ${_PYTHON_REGISTRY_KEYS})
ELSE(WIN32)
FIND_PROGRAM(PYTHON_EXECUTABLE NAMES ${_PYTHON_EXE_VERSIONS} PATHS)
ENDIF(WIN32)
EXECUTE_PROCESS(COMMAND "${PYTHON_EXECUTABLE}" "-c" "from sys import *; stdout.write('%i.%i.%i' % version_info[:3])" OUTPUT_VARIABLE PYTHON_VERSION)
# Get our library path and include directory from python
IF(${PYTHON_VERSION} VERSION_GREATER 3.1)
SET(_PYTHON_SYSCONFIG "sysconfig")
SET(_PYTHON_SC_INCLUDE "sysconfig.get_path('include')")
ELSE()
SET(_PYTHON_SYSCONFIG "distutils.sysconfig")
SET(_PYTHON_SC_INCLUDE "distutils.sysconfig.get_python_inc()")
ENDIF()
IF(WIN32)
EXECUTE_PROCESS(
COMMAND "${PYTHON_EXECUTABLE}" -c "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SYSCONFIG}.get_config_var('prefix'))"
OUTPUT_VARIABLE _PYTHON_PREFIX
)
EXECUTE_PROCESS(
COMMAND "${PYTHON_EXECUTABLE}" -c "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SYSCONFIG}.get_config_var('py_version_nodot'))"
OUTPUT_VARIABLE _PYTHON_VERSION_MAJOR
)
SET(_PYTHON_LIBRARY_PATH ${_PYTHON_PREFIX}/libs)
SET(_PYTHON_LIBRARY_NAME libpython${_PYTHON_VERSION_MAJOR}.a)
ELSE(WIN32)
EXECUTE_PROCESS(
COMMAND "${PYTHON_EXECUTABLE}" -c "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SYSCONFIG}.get_config_var('LIBDIR'))"
OUTPUT_VARIABLE _PYTHON_LIBRARY_PATH
)
EXECUTE_PROCESS(
COMMAND "${PYTHON_EXECUTABLE}" -c "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SYSCONFIG}.get_config_var('LDLIBRARY'))"
OUTPUT_VARIABLE _PYTHON_LIBRARY_NAME
)
# Multiarch
EXECUTE_PROCESS(
COMMAND "${PYTHON_EXECUTABLE}" -c "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SYSCONFIG}.get_config_vars().get('MULTIARCH', 'PYTHON_LIBRARY_MULTIARCH-NOTFOUND'))"
OUTPUT_VARIABLE _PYTHON_LIBRARY_MULTIARCH
)
IF(NOT "${_PYTHON_LIBRARY_MULTIARCH}" STREQUAL "PYTHON_LIBRARY_MULTIARCH-NOTFOUND")
SET(_PYTHON_LIBRARY_PATH_X ${_PYTHON_LIBRARY_PATH})
SET(_PYTHON_LIBRARY_PATH)
FOREACH(path ${_PYTHON_LIBRARY_PATH_X})
LIST(APPEND _PYTHON_LIBRARY_PATH "${path}/${_PYTHON_LIBRARY_MULTIARCH}" "${path}")
ENDFOREACH(path)
ENDIF(NOT "${_PYTHON_LIBRARY_MULTIARCH}" STREQUAL "PYTHON_LIBRARY_MULTIARCH-NOTFOUND")
ENDIF(WIN32)
EXECUTE_PROCESS(COMMAND "${PYTHON_EXECUTABLE}"
"-c" "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SC_INCLUDE})"
OUTPUT_VARIABLE PYTHON_INCLUDE_DIR
)
FIND_FILE(PYTHON_LIBRARY ${_PYTHON_LIBRARY_NAME} PATHS ${_PYTHON_LIBRARY_PATH} NO_DEFAULT_PATH)
FIND_FILE(PYTHON_HEADER "Python.h" PATHS ${PYTHON_INCLUDE_DIR} NO_DEFAULT_PATH)
set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR})
set(PYTHON_LIBRARIES ${PYTHON_LIBRARY})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Python
REQUIRED_VARS PYTHON_EXECUTABLE PYTHON_HEADER PYTHON_LIBRARY
VERSION_VAR PYTHON_VERSION
)
MARK_AS_ADVANCED(PYTHON_EXECUTABLE)
MARK_AS_ADVANCED(PYTHON_INCLUDE_DIRS)
MARK_AS_ADVANCED(PYTHON_LIBRARIES)
MARK_AS_ADVANCED(PYTHON_VERSION)