194 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			CMake
		
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			CMake
		
	
	
	
| ##############################################################################
 | |
| # @file  FindPythonInterp.cmake
 | |
| # @brief Find Python interpreter.
 | |
| #
 | |
| # @par Input variables:
 | |
| # <table border="0">
 | |
| #   <tr>
 | |
| #     @tp @b Python_ADDITIONAL_VERSIONS @endtp
 | |
| #     <td>List of version numbers that should be taken into account when
 | |
| #         searching for Python.</td>
 | |
| #   </tr>
 | |
| # </table>
 | |
| #
 | |
| # @par Output variables:
 | |
| # <table border="0">
 | |
| #   <tr>
 | |
| #     @tp @b PYTHONINTERP_FOUND @endtp
 | |
| #     <td>Was the Python executable found.</td>
 | |
| #   </tr>
 | |
| #   <tr>
 | |
| #     @tp @b PYTHON_EXECUTABLE @endtp
 | |
| #     <td>Path to the Python interpreter.</td>
 | |
| #   </tr>
 | |
| #   <tr>
 | |
| #     @tp @b PYTHON_VERSION_STRING @endtp
 | |
| #     <td>Python version found e.g. 2.5.2.</td>
 | |
| #   </tr>
 | |
| #   <tr>
 | |
| #     @tp @b PYTHON_VERSION_MAJOR @endtp
 | |
| #     <td>Python major version found e.g. 2.</td>
 | |
| #   </tr>
 | |
| #   <tr>
 | |
| #     @tp @b PYTHON_VERSION_MINOR @endtp
 | |
| #     <td>Python minor version found e.g. 5.</td>
 | |
| #   </tr>
 | |
| #   <tr>
 | |
| #     @tp @b PYTHON_VERSION_PATCH @endtp
 | |
| #     <td>Python patch version found e.g. 2.</td>
 | |
| #   </tr>
 | |
| # </table>
 | |
| #
 | |
| # @note This module has been copied from the Git repository of CMake on
 | |
| #       4/12/2012, i.e., before the release of CMake 2.8.8. Once CMake 2.8.8
 | |
| #       or any version is available for all major platforms, consider to
 | |
| #       remove this module from the BASIS package.
 | |
| #
 | |
| # @ingroup CMakeFindModules
 | |
| ##############################################################################
 | |
| 
 | |
| #=============================================================================
 | |
| # Copyright 2005-2010 Kitware, Inc.
 | |
| # Copyright 2011 Bjoern Ricks <bjoern.ricks@gmail.com>
 | |
| # Copyright 2012 Rolf Eike Beer <eike@sf-mail.de>
 | |
| #
 | |
| # 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.
 | |
| #=============================================================================
 | |
| 
 | |
| unset(_Python_NAMES)
 | |
| 
 | |
| set(_PYTHON1_VERSIONS 1.6 1.5)
 | |
| set(_PYTHON2_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0)
 | |
| set(_PYTHON3_VERSIONS 3.3 3.2 3.1 3.0)
 | |
| 
 | |
| if(PythonInterp_FIND_VERSION)
 | |
|     if(PythonInterp_FIND_VERSION MATCHES "^[0-9]+\\.[0-9]+(\\.[0-9]+.*)?$")
 | |
|         string(REGEX REPLACE "^([0-9]+\\.[0-9]+).*" "\\1" _PYTHON_FIND_MAJ_MIN "${PythonInterp_FIND_VERSION}")
 | |
|         string(REGEX REPLACE "^([0-9]+).*" "\\1" _PYTHON_FIND_MAJ "${_PYTHON_FIND_MAJ_MIN}")
 | |
|         list(APPEND _Python_NAMES python${_PYTHON_FIND_MAJ_MIN} python${_PYTHON_FIND_MAJ})
 | |
|         unset(_PYTHON_FIND_OTHER_VERSIONS)
 | |
|         if(NOT PythonInterp_FIND_VERSION_EXACT)
 | |
|             foreach(_PYTHON_V ${_PYTHON${_PYTHON_FIND_MAJ}_VERSIONS})
 | |
|                 if(NOT _PYTHON_V VERSION_LESS _PYTHON_FIND_MAJ_MIN)
 | |
|                     list(APPEND _PYTHON_FIND_OTHER_VERSIONS ${_PYTHON_V})
 | |
|                 endif()
 | |
|              endforeach()
 | |
|         endif(NOT PythonInterp_FIND_VERSION_EXACT)
 | |
|         unset(_PYTHON_FIND_MAJ_MIN)
 | |
|         unset(_PYTHON_FIND_MAJ)
 | |
|     else(PythonInterp_FIND_VERSION MATCHES "^[0-9]+\\.[0-9]+(\\.[0-9]+.*)?$")
 | |
|         list(APPEND _Python_NAMES python${PythonInterp_FIND_VERSION})
 | |
|         set(_PYTHON_FIND_OTHER_VERSIONS ${_PYTHON${PythonInterp_FIND_VERSION}_VERSIONS})
 | |
|     endif(PythonInterp_FIND_VERSION MATCHES "^[0-9]+\\.[0-9]+(\\.[0-9]+.*)?$")
 | |
| else(PythonInterp_FIND_VERSION)
 | |
|     set(_PYTHON_FIND_OTHER_VERSIONS ${_PYTHON3_VERSIONS} ${_PYTHON2_VERSIONS} ${_PYTHON1_VERSIONS})
 | |
| endif(PythonInterp_FIND_VERSION)
 | |
| 
 | |
| list(APPEND _Python_NAMES python)
 | |
| 
 | |
| # Search for the current active python version first
 | |
| find_program(PYTHON_EXECUTABLE NAMES ${_Python_NAMES})
 | |
| 
 | |
| # Set up the versions we know about, in the order we will search. Always add
 | |
| # the user supplied additional versions to the front.
 | |
| set(_Python_VERSIONS
 | |
|   ${Python_ADDITIONAL_VERSIONS}
 | |
|   ${_PYTHON_FIND_OTHER_VERSIONS}
 | |
|   )
 | |
| 
 | |
| unset(_PYTHON_FIND_OTHER_VERSIONS)
 | |
| unset(_PYTHON1_VERSIONS)
 | |
| unset(_PYTHON2_VERSIONS)
 | |
| unset(_PYTHON3_VERSIONS)
 | |
| 
 | |
| # Search for newest python version if python executable isn't found
 | |
| if(NOT PYTHON_EXECUTABLE)
 | |
|     foreach(_CURRENT_VERSION ${_Python_VERSIONS})
 | |
|       set(_Python_NAMES python${_CURRENT_VERSION})
 | |
|       if(WIN32)
 | |
|         list(APPEND _Python_NAMES python)
 | |
|       endif()
 | |
|       find_program(PYTHON_EXECUTABLE
 | |
|         NAMES ${_Python_NAMES}
 | |
|         PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]
 | |
|         )
 | |
|     endforeach()
 | |
| endif()
 | |
| 
 | |
| # determine python version string
 | |
| if(PYTHON_EXECUTABLE)
 | |
|     execute_process(COMMAND "${PYTHON_EXECUTABLE}" -E -c
 | |
|                             "import sys; sys.stdout.write(';'.join([str(x) for x in sys.version_info[:3]]))"
 | |
|                     OUTPUT_VARIABLE _VERSION
 | |
|                     RESULT_VARIABLE _PYTHON_VERSION_RESULT
 | |
|                     ERROR_QUIET)
 | |
|     if(NOT _PYTHON_VERSION_RESULT)
 | |
|         string(REPLACE ";" "." PYTHON_VERSION_STRING "${_VERSION}")
 | |
|         list(GET _VERSION 0 PYTHON_VERSION_MAJOR)
 | |
|         list(GET _VERSION 1 PYTHON_VERSION_MINOR)
 | |
|         list(GET _VERSION 2 PYTHON_VERSION_PATCH)
 | |
|         if(PYTHON_VERSION_PATCH EQUAL 0)
 | |
|             # it's called "Python 2.7", not "2.7.0"
 | |
|             string(REGEX REPLACE "\\.0$" "" PYTHON_VERSION_STRING "${PYTHON_VERSION_STRING}")
 | |
|         endif()
 | |
|     else()
 | |
|         # sys.version predates sys.version_info, so use that
 | |
|         execute_process(COMMAND "${PYTHON_EXECUTABLE}" -E -c "import sys; sys.stdout.write(sys.version)"
 | |
|                         OUTPUT_VARIABLE _VERSION
 | |
|                         RESULT_VARIABLE _PYTHON_VERSION_RESULT
 | |
|                         ERROR_QUIET)
 | |
|         if(NOT _PYTHON_VERSION_RESULT)
 | |
|             string(REGEX REPLACE " .*" "" PYTHON_VERSION_STRING "${_VERSION}")
 | |
|             string(REGEX REPLACE "^([0-9]+)\\.[0-9]+.*" "\\1" PYTHON_VERSION_MAJOR "${PYTHON_VERSION_STRING}")
 | |
|             string(REGEX REPLACE "^[0-9]+\\.([0-9])+.*" "\\1" PYTHON_VERSION_MINOR "${PYTHON_VERSION_STRING}")
 | |
|             if(PYTHON_VERSION_STRING MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+.*")
 | |
|                 string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" PYTHON_VERSION_PATCH "${PYTHON_VERSION_STRING}")
 | |
|             else()
 | |
|                 set(PYTHON_VERSION_PATCH "0")
 | |
|             endif()
 | |
|         else()
 | |
|             # sys.version was first documented for Python 1.5, so assume
 | |
|             # this is older.
 | |
|             set(PYTHON_VERSION_STRING "1.4")
 | |
|             set(PYTHON_VERSION_MAJOR "1")
 | |
|             set(PYTHON_VERSION_MINOR "4")
 | |
|             set(PYTHON_VERSION_PATCH "0")
 | |
|         endif()
 | |
|     endif()
 | |
|     unset(_PYTHON_VERSION_RESULT)
 | |
|     unset(_VERSION)
 | |
| endif(PYTHON_EXECUTABLE)
 | |
| 
 | |
| # handle the QUIETLY and REQUIRED arguments and set PYTHONINTERP_FOUND to TRUE if
 | |
| # all listed variables are TRUE
 | |
| include(FindPackageHandleStandardArgs)
 | |
| FIND_PACKAGE_HANDLE_STANDARD_ARGS(PythonInterp REQUIRED_VARS PYTHON_EXECUTABLE VERSION_VAR PYTHON_VERSION_STRING)
 | |
| 
 | |
| mark_as_advanced(PYTHON_EXECUTABLE)
 |