# Copyright (C) 2013 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # # Author: Adrien Bruneton # # Python libraries and interpreter detection for libBatch # The interpreter is found first, and if OK, the corresponding libraries are searched. # We ensure the version of the libraries matches the one of the interpreter. # # 1. Load environment or any previously detected Python IF(DEFINED ENV{PYTHON_ROOT_DIR}) FILE(TO_CMAKE_PATH "$ENV{PYTHON_ROOT_DIR}" _PYTHON_ROOT_DIR_ENV) SET(_dflt_value "${_PYTHON_ROOT_DIR_ENV}") ELSE() # will be blank if no Python was previously loaded SET(_dflt_value "${PYTHON_ROOT_DIR_EXP}") ENDIF() # Make cache entry SET(PYTHON_ROOT_DIR "${_dflt_value}" CACHE PATH "Path to Python directory (interpreter and libs)") # 2. Find package - config mode first (i.e. looking for XYZ-config.cmake) IF(EXISTS "${PYTHON_ROOT_DIR}") # Hope to find direclty a CMake config file there SET(_CONF_DIR "${PYTHON_ROOT_DIR}/share/cmake") # Try find_package in config mode with a hard-coded guess. This # has the priority. FIND_PACKAGE(Python CONFIG QUIET PATHS "${_CONF_DIR}") MARK_AS_ADVANCED(Python_DIR) IF (NOT PYTHON_FOUND) SET(CMAKE_PREFIX_PATH "${PYTHON_ROOT_DIR}") ELSE() MESSAGE(STATUS "Found Python in CONFIG mode!") ENDIF() ENDIF() # Otherwise try the standard way (module mode, with the standard CMake Find*** macro): SALOME_FIND_PACKAGE(LibbatchPython PythonInterp MODULE) SET(_found1 ${PYTHONINTERP_FOUND}) IF (PYTHONINTERP_FOUND) # Now ensure we find the Python libraries matching the interpreter: # This uses the variable PYTHON_EXECUTABLE GET_FILENAME_COMPONENT(_python_dir "${PYTHON_EXECUTABLE}" PATH) GET_FILENAME_COMPONENT(CMAKE_INCLUDE_PATH "${_python_dir}/../include/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}" ABSOLUTE) GET_FILENAME_COMPONENT(CMAKE_LIBRARY_PATH "${_python_dir}/../lib" ABSOLUTE) # For a Windows install, this might look more like this: IF(WIN32) LIST(APPEND CMAKE_LIBRARY_PATH "${_python_dir}/libs" ABSOLUTE) LIST(APPEND CMAKE_INCLUDE_PATH "${_python_dir}/include" ABSOLUTE) ENDIF() # Override the EXACT and VERSION settings of the LibbatchPython module # to force the next call to SALOME_FIND_PACKAGE() to find the exact matching # version: SET(_old_EXACT ${LibbatchPython_FIND_VERSION_EXACT}) SET(_old_VERSION "${LibbatchPython_FIND_VERSION}") SET(LibbatchPython_FIND_VERSION_EXACT TRUE) SET(LibbatchPython_FIND_VERSION "${PYTHON_VERSION_STRING}") # Prepare call to FIND_PACKAGE(PythonLibs) and ensure priority is given to # the location found for the interpreter: GET_FILENAME_COMPONENT(_tmp "${_python_dir}" PATH) SALOME_FIND_PACKAGE(LibbatchPython PythonLibs MODULE) # Restore variables: SET(LibbatchPython_FIND_VERSION_EXACT ${_old_EXACT}) SET(LibbatchPython_FIND_VERSION "${_old_VERSION}") ENDIF() # Set the FOUND flag for LibbatchPython: SET(LIBBATCHPYTHON_FOUND FALSE) IF (_found1 AND PYTHONLIBS_FOUND) SET(LIBBATCHPYTHON_FOUND TRUE) ENDIF() IF (LIBBATCHPYTHON_FOUND) MESSAGE(STATUS "Python interpreter and Python libraries found:") MESSAGE(STATUS "Python libraries: ${PYTHON_LIBRARY}") MESSAGE(STATUS "Python include dir: ${PYTHON_INCLUDE_DIR}") # 3. Set the root dir which was finally retained # For Python this is the grand-parent of the # include directory: GET_FILENAME_COMPONENT(_tmp_ROOT_DIR "${PYTHON_INCLUDE_DIR}" PATH) IF(NOT WIN32) GET_FILENAME_COMPONENT(_tmp_ROOT_DIR "${_tmp_ROOT_DIR}" PATH) ENDIF() # 4. Warn if CMake found something not located under ENV(XYZ_ROOT_DIR) IF(DEFINED ENV{PYTHON_ROOT_DIR}) SALOME_CHECK_EQUAL_PATHS(_res "${_tmp_ROOT_DIR}" "${_PYTHON_ROOT_DIR_ENV}") IF(NOT _res) MESSAGE(WARNING "Python was found, but not a the path given by the " "environment PYTHON_ROOT_DIR! Is the variable correctly set?") ELSE() MESSAGE(STATUS "Python found directory matches what was specified in the PYTHON_ROOT_DIR, all good!") ENDIF() ENDIF() # 5. Conflict detection # 5.1 From another prerequisite using Python IF(PYTHON_ROOT_DIR_EXP) SALOME_CHECK_EQUAL_PATHS(_res "${_tmp_ROOT_DIR}" "${PYTHON_ROOT_DIR_EXP}") IF(NOT _res) MESSAGE(WARNING "Warning: Python: detected version conflicts with a previously found Python!" "The two paths are " ${_tmp_ROOT_DIR} " vs " ${PYTHON_ROOT_DIR_EXP}) ELSE() MESSAGE(STATUS "Python directory matches what was previously exposed by another prereq, all good!") ENDIF() ENDIF() # 6. Finally retained variable: SET(PYTHON_ROOT_DIR "${_tmp_ROOT_DIR}") # 7. Specifics ## None here ELSE(LIBBATCHPYTHON_FOUND) MESSAGE(STATUS "Python was only partially (or not at all) found .") ENDIF(LIBBATCHPYTHON_FOUND)