FindPython.cmake
183 lines
| 7.8 KiB
| text/x-cmake
|
CMakeLexer
/ cmake / FindPython.cmake
Orochimarufan
|
r205 | # - 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() | ||||
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 | ||||
) | ||||
IF(WIN32) | ||||
EXECUTE_PROCESS( | ||||
COMMAND "${PYTHON_EXECUTABLE}" -c "import ${_PYTHON_SYSCONFIG}; import sys; sys.stdout.write(${_PYTHON_SYSCONFIG}.get_config_var('LIBRARY'))" | ||||
OUTPUT_VARIABLE _PYTHON_LIBRARY_NAME | ||||
) | ||||
ELSE(WIN32) | ||||
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) | ||||