1 # Copyright (C) 2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 # Author: Adrien Bruneton
22 # Python libraries and interpreter detection for SALOME
24 # !! Please read the generic detection procedure in SalomeMacros.cmake !!
26 # The interpreter is found first, and if OK, the corresponding libraries are searched.
27 # We ensure the version of the libraries matches the one of the interpreter.
29 # We also look for an installation of NumPy, and if found the following variables are set
30 # NUMPY_INCLUDE_DIR - NumPy header location
31 # NUMPY_DEFINITIONS - compiler flag
32 # and are automatically appended to PYTHON_INCLUDE_DIRS (and PYTHON_DEFINITIONS resp.)
35 # 1. Load environment or any previously detected Python
36 IF(DEFINED ENV{PYTHON_ROOT_DIR})
37 FILE(TO_CMAKE_PATH "$ENV{PYTHON_ROOT_DIR}" _PYTHON_ROOT_DIR_ENV)
38 SET(_dflt_value "${_PYTHON_ROOT_DIR_ENV}")
40 # will be blank if no Python was previously loaded
41 SET(_dflt_value "${PYTHON_ROOT_DIR_EXP}")
45 SET(PYTHON_ROOT_DIR "${_dflt_value}" CACHE PATH "Path to Python directory (interpreter and libs)")
47 # 2. Find package - config mode first (i.e. looking for XYZ-config.cmake)
48 IF(EXISTS "${PYTHON_ROOT_DIR}")
49 # Hope to find direclty a CMake config file there
50 SET(_CONF_DIR "${PYTHON_ROOT_DIR}/share/cmake")
52 # Try find_package in config mode with a hard-coded guess. This
54 FIND_PACKAGE(Python CONFIG QUIET PATHS "${_CONF_DIR}")
55 MARK_AS_ADVANCED(Python_DIR)
58 LIST(APPEND CMAKE_PREFIX_PATH "${PYTHON_ROOT_DIR}")
60 MESSAGE(STATUS "Found Python in CONFIG mode!")
64 # Otherwise try the standard way (module mode, with the standard CMake Find*** macro):
65 SALOME_FIND_PACKAGE(SalomePython PythonInterp MODULE)
66 SET(_found1 ${PYTHONINTERP_FOUND})
68 IF (PYTHONINTERP_FOUND)
69 # Now ensure we find the Python libraries matching the interpreter:
70 # This uses the variable PYTHON_EXECUTABLE
71 GET_FILENAME_COMPONENT(_python_dir "${PYTHON_EXECUTABLE}" PATH)
72 GET_FILENAME_COMPONENT(CMAKE_INCLUDE_PATH "${_python_dir}/../include/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}" ABSOLUTE)
73 GET_FILENAME_COMPONENT(CMAKE_LIBRARY_PATH "${_python_dir}/../lib" ABSOLUTE)
74 # For a Windows install, this might look more like this:
76 LIST(APPEND CMAKE_LIBRARY_PATH "${_python_dir}/libs" ABSOLUTE)
77 LIST(APPEND CMAKE_INCLUDE_PATH "${_python_dir}/include" ABSOLUTE)
79 # Override the EXACT and VERSION settings of the SalomePython module
80 # to force the next call to SALOME_FIND_PACKAGE() to find the exact matching
82 SET(_old_EXACT ${SalomePython_FIND_VERSION_EXACT})
83 SET(_old_VERSION "${SalomePython_FIND_VERSION}")
84 SET(SalomePython_FIND_VERSION_EXACT TRUE)
85 SET(SalomePython_FIND_VERSION "${PYTHON_VERSION_STRING}")
86 # Prepare call to FIND_PACKAGE(PythonLibs) and ensure priority is given to
87 # the location found for the interpreter:
88 GET_FILENAME_COMPONENT(_tmp "${_python_dir}" PATH)
89 # SET(PYTHON_LIBRARY ${_tmp}/lib)
90 # SET(PYTHON_INCLUDE_DIR ${_tmp}/include)
91 SALOME_FIND_PACKAGE(SalomePython PythonLibs MODULE)
93 SET(SalomePython_FIND_VERSION_EXACT ${_old_EXACT})
94 SET(SalomePython_FIND_VERSION "${_old_VERSION}")
97 # Set the FOUND flag for SalomePython and Python:
98 SET(SALOMEPYTHON_FOUND FALSE)
99 IF (_found1 AND PYTHONLIBS_FOUND)
100 SET(SALOMEPYTHON_FOUND TRUE)
101 SET(Python_FOUND TRUE)
103 SET(SALOMEPYTHON_FOUND FALSE)
104 SET(Python_FOUND FALSE)
107 IF (SALOMEPYTHON_FOUND)
108 MESSAGE(STATUS "Python interpreter and Python libraries found:")
109 MESSAGE(STATUS "Python libraries: ${PYTHON_LIBRARY}")
110 MESSAGE(STATUS "Python include dir: ${PYTHON_INCLUDE_DIR}")
112 # 3. Set the root dir which was finally retained
113 # For Python this is the grand-parent of the
115 GET_FILENAME_COMPONENT(_tmp_ROOT_DIR "${PYTHON_INCLUDE_DIR}" PATH)
117 GET_FILENAME_COMPONENT(_tmp_ROOT_DIR "${_tmp_ROOT_DIR}" PATH)
120 # 4. Warn if CMake found something not located under ENV(XYZ_ROOT_DIR)
121 IF(DEFINED ENV{PYTHON_ROOT_DIR})
122 SALOME_CHECK_EQUAL_PATHS(_res "${_tmp_ROOT_DIR}" "${_PYTHON_ROOT_DIR_ENV}")
124 MESSAGE(WARNING "Python was found, but not a the path given by the "
125 "environment PYTHON_ROOT_DIR! Is the variable correctly set?")
127 MESSAGE(STATUS "Python found directory matches what was specified in the PYTHON_ROOT_DIR, all good!")
131 # 5. Conflict detection
132 # 5.1 From another prerequisite using Python
133 IF(PYTHON_ROOT_DIR_EXP)
134 SALOME_CHECK_EQUAL_PATHS(_res "${_tmp_ROOT_DIR}" "${PYTHON_ROOT_DIR_EXP}")
136 MESSAGE(WARNING "Warning: Python: detected version conflicts with a previously found Python!"
137 "The two paths are " ${_tmp_ROOT_DIR} " vs " ${PYTHON_ROOT_DIR_EXP})
139 MESSAGE(STATUS "Python directory matches what was previously exposed by another prereq, all good!")
147 EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy ; import sys ; sys.stdout.write(numpy.get_include())" OUTPUT_VARIABLE NUMPY_INCLUDE_DIR ERROR_QUIET )
148 IF(NUMPY_INCLUDE_DIR)
149 SET(NUMPY_FOUND TRUE)
150 ENDIF(NUMPY_INCLUDE_DIR)
152 SET(PYTHON_INCLUDE_DIRS ${NUMPY_INCLUDE_DIR} ${PYTHON_INCLUDE_DIRS})
153 SET(PYTHON_DEFINITIONS "${PYTHON_DEFINITIONS} -DWITH_NUMPY")
154 MESSAGE(STATUS "NumPy found : ${NUMPY_INCLUDE_DIR}")
156 MESSAGE(STATUS "NumPy not found.")
161 MESSAGE(STATUS "Python was only partially (or not at all) found .")