Skip to content

Commit

Permalink
Merge pull request #29100 from tchaikov/wip-cmake-python-osx
Browse files Browse the repository at this point in the history
cmake: use latest FindPython*.cmake

Reviewed-by: Casey Bodley <cbodley@redhat.com>
  • Loading branch information
tchaikov committed Jul 21, 2019
2 parents 4f57e06 + 79078f4 commit a1b9f60
Show file tree
Hide file tree
Showing 22 changed files with 2,004 additions and 575 deletions.
13 changes: 7 additions & 6 deletions CMakeLists.txt
@@ -1,4 +1,5 @@
cmake_minimum_required(VERSION 3.5.1)
# remove cmake/modules/FindPython* once 3.12 is required

project(ceph CXX C ASM)
set(VERSION 15.0.0)
Expand Down Expand Up @@ -499,12 +500,12 @@ if(WITH_MGR)
# FindPyhonInterp and FindPythonLibs think they belong to different families.
set(MGR_PYTHON_VERSION "2.7" CACHE
STRING "minimal required version of python runtime for running mgr plugins. ")
find_package(PythonInterp ${MGR_PYTHON_VERSION} REQUIRED)
find_package(PythonLibs ${MGR_PYTHON_VERSION} REQUIRED)
set(MGR_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
set(MGR_PYTHON_LIBRARIES ${PYTHON_LIBRARIES})
set(MGR_PYTHON_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
set(MGR_PYTHON_VERSION_MINOR ${PYTHON_VERSION_MINOR})
find_package(Python ${MGR_PYTHON_VERSION} REQUIRED
COMPONENTS Interpreter Development)
set(MGR_PYTHON_EXECUTABLE ${Python_EXECUTABLE})
set(MGR_PYTHON_LIBRARIES ${Python_LIBRARIES})
set(MGR_PYTHON_VERSION_MAJOR ${Python_VERSION_MAJOR})
set(MGR_PYTHON_VERSION_MINOR ${Python_VERSION_MINOR})
# Boost dependency check deferred to Boost section
endif(WITH_MGR)

Expand Down
4 changes: 2 additions & 2 deletions cmake/modules/AddCephTest.cmake
Expand Up @@ -15,7 +15,7 @@ function(add_ceph_test test_name test_path)
CEPH_BUILD_DIR=${CMAKE_BINARY_DIR}
LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib
PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}:${CMAKE_SOURCE_DIR}/src:$ENV{PATH}
PYTHONPATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/cython_modules/lib.${PYTHON${PYTHON_VERSION}_VERSION_MAJOR}:${CMAKE_SOURCE_DIR}/src/pybind
PYTHONPATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/cython_modules/lib.${Python${PYTHON_VERSION}_VERSION_MAJOR}:${CMAKE_SOURCE_DIR}/src/pybind
CEPH_BUILD_VIRTUALENV=${CEPH_BUILD_VIRTUALENV})
# none of the tests should take more than 1 hour to complete
set_property(TEST
Expand All @@ -35,7 +35,7 @@ if(WITH_GTEST_PARALLEL)
BUILD_COMMAND ""
INSTALL_COMMAND "")
add_dependencies(tests gtest-parallel_ext)
find_package(PythonInterp REQUIRED)
find_package(Python REQUIRED)
set(GTEST_PARALLEL_COMMAND
${PYTHON_EXECUTABLE} ${gtest_parallel_source_dir}/gtest-parallel)
endif()
Expand Down
11 changes: 6 additions & 5 deletions cmake/modules/BuildBoost.cmake
Expand Up @@ -109,14 +109,15 @@ function(do_build_boost version)
" : ${CMAKE_CXX_COMPILER}"
" ;\n")
if(with_python_version)
find_package(PythonLibs ${with_python_version} QUIET REQUIRED)
string(REPLACE ";" " " python_includes "${PYTHON_INCLUDE_DIRS}")
find_package(Python ${with_python_version} QUIET REQUIRED
COMPONENTS Development)
string(REPLACE ";" " " python_includes "${Python_INCLUDE_DIRS}")
file(APPEND ${user_config}
"using python"
" : ${with_python_version}"
" : ${PYTHON_EXECUTABLE}"
" : ${Python_EXECUTABLE}"
" : ${python_includes}"
" : ${PYTHON_LIBRARIES}"
" : ${Python_LIBRARIES}"
" ;\n")
endif()
list(APPEND b2 --user-config=${user_config})
Expand Down Expand Up @@ -212,7 +213,7 @@ macro(build_boost version)
endif()
add_dependencies(Boost::${c} Boost)
if(c MATCHES "^python")
set(c "python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}")
set(c "python${Python_VERSION_MAJOR}${Python_VERSION_MINOR}")
endif()
if(Boost_USE_STATIC_LIBS)
set(Boost_${upper_c}_LIBRARY
Expand Down
25 changes: 15 additions & 10 deletions cmake/modules/Distutils.cmake
Expand Up @@ -13,7 +13,12 @@ function(distutils_install_module name)
endforeach()
add_custom_target(${name}-clone ALL
DEPENDS ${py_clone})
cmake_parse_arguments(DU "" INSTALL_SCRIPT "" ${ARGN})
cmake_parse_arguments(DU "" "INSTALL_SCRIPT;PYTHON_VERSION" "" ${ARGN})
if(DU_PYTHON_VERSION)
set(python_version ${DU_PYTHON_VERSION})
else()
set(python_version 3)
endif()
install(CODE "
set(options --prefix=${CMAKE_INSTALL_PREFIX})
if(DEFINED ENV{DESTDIR})
Expand All @@ -28,12 +33,12 @@ function(distutils_install_module name)
endif()
endif()
execute_process(
COMMAND ${PYTHON${PYTHON_VERSION}_EXECUTABLE}
COMMAND ${Python${python_version}_EXECUTABLE}
setup.py install \${options}
WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")")
endfunction(distutils_install_module)

function(distutils_add_cython_module target name src)
function(distutils_add_cython_module target name src python_version)
get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
# When using ccache, CMAKE_C_COMPILER is ccache executable absolute path
Expand All @@ -57,12 +62,12 @@ function(distutils_add_cython_module target name src)
set(PY_CXX ${compiler_launcher} ${CMAKE_CXX_COMPILER} ${cxx_compiler_arg1})
set(PY_LDSHARED ${link_launcher} ${CMAKE_C_COMPILER} ${c_compiler_arg1} "-shared")

if(${PYTHON${PYTHON_VERSION}_VERSION_MAJOR} STREQUAL "2")
if(${Python${python_version}_VERSION_MAJOR} STREQUAL "2")
set(suffix_var "SO")
else()
set(suffix_var "EXT_SUFFIX")
endif()
execute_process(COMMAND "${PYTHON${PYTHON_VERSION}_EXECUTABLE}" -c
execute_process(COMMAND "${Python${python_version}_EXECUTABLE}" -c
"from distutils import sysconfig; print(sysconfig.get_config_var('${suffix_var}'))"
RESULT_VARIABLE result
OUTPUT_VARIABLE ext_suffix
Expand All @@ -71,7 +76,7 @@ function(distutils_add_cython_module target name src)
if(NOT result EQUAL 0)
message(FATAL_ERROR "Unable to tell python extension's suffix: ${error}")
endif()
set(output_dir "${CYTHON_MODULE_DIR}/lib.${PYTHON${PYTHON_VERSION}_VERSION_MAJOR}")
set(output_dir "${CYTHON_MODULE_DIR}/lib.${Python${python_version}_VERSION_MAJOR}")
set(setup_py ${CMAKE_CURRENT_SOURCE_DIR}/setup.py)
add_custom_command(
OUTPUT ${output_dir}/${name}${ext_suffix}
Expand All @@ -84,7 +89,7 @@ function(distutils_add_cython_module target name src)
LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
CYTHON_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}
CEPH_LIBDIR=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
${PYTHON${PYTHON_VERSION}_EXECUTABLE} ${setup_py}
${Python${python_version}_EXECUTABLE} ${setup_py}
build --verbose --build-base ${CYTHON_MODULE_DIR}
--build-platlib ${output_dir}
MAIN_DEPENDENCY ${src}
Expand All @@ -94,7 +99,7 @@ function(distutils_add_cython_module target name src)
DEPENDS ${output_dir}/${name}${ext_suffix})
endfunction(distutils_add_cython_module)

function(distutils_install_cython_module name)
function(distutils_install_cython_module name python_version)
get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
set(PY_CC "${compiler_launcher} ${CMAKE_C_COMPILER}")
Expand All @@ -120,9 +125,9 @@ function(distutils_install_cython_module name)
endif()
execute_process(
COMMAND
${PYTHON${PYTHON_VERSION}_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py
${Python${python_version}_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/setup.py
build --verbose --build-base ${CYTHON_MODULE_DIR}
--build-platlib ${CYTHON_MODULE_DIR}/lib.${PYTHON${PYTHON_VERSION}_VERSION_MAJOR}
--build-platlib ${CYTHON_MODULE_DIR}/lib.${Python${python_version}_VERSION_MAJOR}
build_ext --cython-c-in-temp --build-temp ${CMAKE_CURRENT_BINARY_DIR} --cython-include-dirs ${PROJECT_SOURCE_DIR}/src/pybind/rados
install \${options} --single-version-externally-managed --record /dev/null
egg_info --egg-base ${CMAKE_CURRENT_BINARY_DIR}
Expand Down
2 changes: 1 addition & 1 deletion cmake/modules/FindCython.cmake
Expand Up @@ -4,7 +4,7 @@

# Try to run Cython, to make sure it works:
execute_process(
COMMAND ${PYTHON${PYTHON_VERSION}_EXECUTABLE} -m cython --version
COMMAND ${Python${PYTHON_VERSION}_EXECUTABLE} -m cython --version
RESULT_VARIABLE cython_result
ERROR_VARIABLE cython_output)
if(cython_result EQUAL 0)
Expand Down
224 changes: 224 additions & 0 deletions cmake/modules/FindPython.cmake
@@ -0,0 +1,224 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindPython
----------

Find Python interpreter, compiler and development environment (include
directories and libraries).

Three components are supported:

* ``Interpreter``: search for Python interpreter.
* ``Compiler``: search for Python compiler. Only offered by IronPython.
* ``Development``: search for development artifacts (include directories and
libraries).
* ``NumPy``: search for NumPy include directories.

If no ``COMPONENTS`` is specified, ``Interpreter`` is assumed.

To ensure consistent versions between components ``Interpreter``, ``Compiler``,
``Development`` and ``NumPy``, specify all components at the same time::

find_package (Python COMPONENTS Interpreter Development)

This module looks preferably for version 3 of Python. If not found, version 2
is searched.
To manage concurrent versions 3 and 2 of Python, use :module:`FindPython3` and
:module:`FindPython2` modules rather than this one.

.. note::

If components ``Interpreter`` and ``Development`` are both specified, this
module search only for interpreter with same platform architecture as the one
defined by ``CMake`` configuration. This contraint does not apply if only
``Interpreter`` component is specified.

Imported Targets
^^^^^^^^^^^^^^^^

This module defines the following :ref:`Imported Targets <Imported Targets>`
(when :prop_gbl:`CMAKE_ROLE` is ``PROJECT``):

``Python::Interpreter``
Python interpreter. Target defined if component ``Interpreter`` is found.
``Python::Compiler``
Python compiler. Target defined if component ``Compiler`` is found.
``Python::Python``
Python library. Target defined if component ``Development`` is found.
``Python::NumPy``
NumPy Python library. Target defined if component ``NumPy`` is found.

Result Variables
^^^^^^^^^^^^^^^^

This module will set the following variables in your project
(see :ref:`Standard Variable Names <CMake Developer Standard Variable Names>`):

``Python_FOUND``
System has the Python requested components.
``Python_Interpreter_FOUND``
System has the Python interpreter.
``Python_EXECUTABLE``
Path to the Python interpreter.
``Python_INTERPRETER_ID``
A short string unique to the interpreter. Possible values include:
* Python
* ActivePython
* Anaconda
* Canopy
* IronPython
``Python_STDLIB``
Standard platform independent installation directory.

Information returned by
``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=True)``.
``Python_STDARCH``
Standard platform dependent installation directory.

Information returned by
``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True)``.
``Python_SITELIB``
Third-party platform independent installation directory.

Information returned by
``distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False)``.
``Python_SITEARCH``
Third-party platform dependent installation directory.

Information returned by
``distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False)``.
``Python_Compiler_FOUND``
System has the Python compiler.
``Python_COMPILER``
Path to the Python compiler. Only offered by IronPython.
``Python_COMPILER_ID``
A short string unique to the compiler. Possible values include:
* IronPython
``Python_Development_FOUND``
System has the Python development artifacts.
``Python_INCLUDE_DIRS``
The Python include directories.
``Python_LIBRARIES``
The Python libraries.
``Python_LIBRARY_DIRS``
The Python library directories.
``Python_RUNTIME_LIBRARY_DIRS``
The Python runtime library directories.
``Python_VERSION``
Python version.
``Python_VERSION_MAJOR``
Python major version.
``Python_VERSION_MINOR``
Python minor version.
``Python_VERSION_PATCH``
Python patch version.
``Python_NumPy_FOUND``
System has the NumPy.
``Python_NumPy_INCLUDE_DIRS``
The NumPy include directries.
``Python_NumPy_VERSION``
The NumPy version.

Hints
^^^^^

``Python_ROOT_DIR``
Define the root directory of a Python installation.

``Python_USE_STATIC_LIBS``
* If not defined, search for shared libraries and static libraries in that
order.
* If set to TRUE, search **only** for static libraries.
* If set to FALSE, search **only** for shared libraries.

``Python_FIND_REGISTRY``
On Windows the ``Python_FIND_REGISTRY`` variable determine the order
of preference between registry and environment variables.
the ``Python_FIND_REGISTRY`` variable can be set to empty or one of the
following:

* ``FIRST``: Try to use registry before environment variables.
This is the default.
* ``LAST``: Try to use registry after environment variables.
* ``NEVER``: Never try to use registry.

``CMAKE_FIND_FRAMEWORK``
On OS X the :variable:`CMAKE_FIND_FRAMEWORK` variable determine the order of
preference between Apple-style and unix-style package components.

.. note::

Value ``ONLY`` is not supported so ``FIRST`` will be used instead.

.. note::

If a Python virtual environment is configured, set variable
``Python_FIND_REGISTRY`` (Windows) or ``CMAKE_FIND_FRAMEWORK`` (macOS) with
value ``LAST`` or ``NEVER`` to select it preferably.

Commands
^^^^^^^^

This module defines the command ``Python_add_library`` (when
:prop_gbl:`CMAKE_ROLE` is ``PROJECT``), which has the same semantics as
:command:`add_library`, but takes care of Python module naming rules
(only applied if library is of type ``MODULE``), and adds a dependency to target
``Python::Python``::

Python_add_library (my_module MODULE src1.cpp)

If library type is not specified, ``MODULE`` is assumed.
#]=======================================================================]


set (_PYTHON_PREFIX Python)

if (DEFINED Python_FIND_VERSION)
set (_Python_REQUIRED_VERSION_MAJOR ${Python_FIND_VERSION_MAJOR})

include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake)
else()
# iterate over versions in quiet and NOT required modes to avoid multiple
# "Found" messages and prematurally failure.
set (_Python_QUIETLY ${Python_FIND_QUIETLY})
set (_Python_REQUIRED ${Python_FIND_REQUIRED})
set (Python_FIND_QUIETLY TRUE)
set (Python_FIND_REQUIRED FALSE)

set (_Python_REQUIRED_VERSIONS 3 2)
set (_Python_REQUIRED_VERSION_LAST 2)

foreach (_Python_REQUIRED_VERSION_MAJOR IN LISTS _Python_REQUIRED_VERSIONS)
set (Python_FIND_VERSION ${_Python_REQUIRED_VERSION_MAJOR})
include (${CMAKE_CURRENT_LIST_DIR}/FindPython/Support.cmake)
if (Python_FOUND OR
_Python_REQUIRED_VERSION_MAJOR EQUAL _Python_REQUIRED_VERSION_LAST)
break()
endif()
# clean-up some CACHE variables to ensure look-up restart from scratch
foreach (_Python_ITEM IN LISTS _Python_CACHED_VARS)
unset (${_Python_ITEM} CACHE)
endforeach()
endforeach()

unset (Python_FIND_VERSION)

set (Python_FIND_QUIETLY ${_Python_QUIETLY})
set (Python_FIND_REQUIRED ${_Python_REQUIRED})
if (Python_FIND_REQUIRED OR NOT Python_FIND_QUIETLY)
# call again validation command to get "Found" or error message
find_package_handle_standard_args (Python HANDLE_COMPONENTS
REQUIRED_VARS ${_Python_REQUIRED_VARS}
VERSION_VAR Python_VERSION)
endif()
endif()

if (COMMAND __Python_add_library)
macro (Python_add_library)
__Python_add_library (Python ${ARGV})
endmacro()
endif()

unset (_PYTHON_PREFIX)

0 comments on commit a1b9f60

Please sign in to comment.