|
|
# - 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)
|
|
|
|
|
|
|