# Check if pybind11 is being used directly or via add_subdirectory
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)### Warn if not an out-of-source buildsif(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)set(lines"You are building in-place. If that is not what you intended to ""do, you can clean the source directory with:\n""rm -r CMakeCache.txt CMakeFiles/ cmake_uninstall.cmake pybind11Config.cmake ""pybind11ConfigVersion.cmake tests/CMakeFiles/\n")message(AUTHOR_WARNING ${lines})endif()set(PYBIND11_MASTER_PROJECT ON)if(OSX AND CMAKE_VERSION VERSION_LESS 3.7)# Bug in macOS CMake < 3.7 is unable to download catchmessage(WARNING "CMAKE 3.7+ needed on macOS to download catch, and newer HIGHLY recommended")elseif(WINDOWS AND CMAKE_VERSION VERSION_LESS 3.8)# Only tested with 3.8+ in CI.message(WARNING "CMAKE 3.8+ tested on Windows, previous versions untested")endif()message(STATUS "CMake ${CMAKE_VERSION}")if(CMAKE_CXX_STANDARD)set(CMAKE_CXX_EXTENSIONS OFF)set(CMAKE_CXX_STANDARD_REQUIRED ON)endif()
else()set(PYBIND11_MASTER_PROJECT OFF)set(pybind11_system SYSTEM)
endif()
pybind11 查找 依賴項,比如 Python
# Options
option(PYBIND11_INSTALL "Install pybind11 header files?"${PYBIND11_MASTER_PROJECT})
option(PYBIND11_TEST "Build pybind11 test suite?"${PYBIND11_MASTER_PROJECT})
option(PYBIND11_NOPYTHON "Disable search for Python" OFF)cmake_dependent_option(USE_PYTHON_INCLUDE_DIR"Install pybind11 headers in Python include directory instead of default installation prefix"OFF "PYBIND11_INSTALL" OFF)cmake_dependent_option(PYBIND11_FINDPYTHON "Force new FindPython" OFF"NOT CMAKE_VERSION VERSION_LESS 3.12" OFF)
pybind11 設置 需要編譯的 include 文件
# NB: when adding a header don't forget to also add it to setup.py
set(PYBIND11_HEADERSinclude/pybind11/detail/class.hinclude/pybind11/detail/common.hinclude/pybind11/detail/descr.hinclude/pybind11/detail/init.hinclude/pybind11/detail/internals.hinclude/pybind11/detail/typeid.hinclude/pybind11/attr.hinclude/pybind11/buffer_info.hinclude/pybind11/cast.hinclude/pybind11/chrono.hinclude/pybind11/common.hinclude/pybind11/complex.hinclude/pybind11/options.hinclude/pybind11/eigen.hinclude/pybind11/embed.hinclude/pybind11/eval.hinclude/pybind11/iostream.hinclude/pybind11/functional.hinclude/pybind11/numpy.hinclude/pybind11/operators.hinclude/pybind11/pybind11.hinclude/pybind11/pytypes.hinclude/pybind11/stl.hinclude/pybind11/stl_bind.h)
pybind11 設置 需要編譯的 include 文件 - 定義 Cache variables 的變量
string(REPLACE "include/""${CMAKE_CURRENT_SOURCE_DIR}/include/" PYBIND11_HEADERS"${PYBIND11_HEADERS}")# Cache variables so pybind11_add_module can be used in parent projects
set(PYBIND11_INCLUDE_DIR"${CMAKE_CURRENT_LISCACHE INTERNAL "")
pybind11 設置 需要編譯的 include 文件
add_library(pybind11_headers INTERFACE)
add_library(pybind11::pybind11_headers ALIAS pybind11_headers)# to match exported target
add_library(pybind11::headers ALIAS pybind11_headers)# easier to use/rememberinclude("${CMAKE_CURRENT_SOURCE_DIR}/tools/pybind11Common.cmake")# Relative directory setting
if(USE_PYTHON_INCLUDE_DIR AND DEFINED Python_INCLUDE_DIRS)file(RELATIVE_PATH CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}${Python_INCLUDE_DIRS})
elseif(USE_PYTHON_INCLUDE_DIR AND DEFINED PYTHON_INCLUDE_DIR)file(RELATIVE_PATH CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}${PYTHON_INCLUDE_DIRS})
endif()
設置Install的一些參數,如install 的路經
target_include_directories(pybind11_headers ${pybind11_system} INTERFACE $<BUILD_INTERFACE:${PYBIND11_INCLUDE_DIR}>$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)target_compile_features(pybind11_headers INTERFACE cxx_inheriting_constructors cxx_user_literalscxx_right_angle_brackets)if(PYBIND11_INSTALL)install(DIRECTORY ${PYBIND11_INCLUDE_DIR}/pybind11 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})# GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share".set(PYBIND11_CMAKECONFIG_INSTALL_DIR"share/cmake/${PROJECT_NAME}"CACHE STRING "install path for pybind11Config.cmake")configure_package_config_file(tools/${PROJECT_NAME}Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"INSTALL_DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})if(CMAKE_VERSION VERSION_LESS 3.14)# Remove CMAKE_SIZEOF_VOID_P from ConfigVersion.cmake since the library does# not depend on architecture specific settings or libraries.set(_PYBIND11_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})unset(CMAKE_SIZEOF_VOID_P)write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmakeVERSION ${PROJECT_VERSION}COMPATIBILITY AnyNewerVersion)set(CMAKE_SIZEOF_VOID_P ${_PYBIND11_CMAKE_SIZEOF_VOID_P})else()# CMake 3.14+ natively supports header-only librarieswrite_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmakeVERSION ${PROJECT_VERSION}COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT)endif()install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmaketools/FindPythonLibsNew.cmaketools/pybind11Common.cmaketools/pybind11Tools.cmaketools/pybind11NewTools.cmakeDESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})if(NOT PYBIND11_EXPORT_NAME)set(PYBIND11_EXPORT_NAME "${PROJECT_NAME}Targets")endif()install(TARGETS pybind11_headers EXPORT "${PYBIND11_EXPORT_NAME}")install(EXPORT "${PYBIND11_EXPORT_NAME}"NAMESPACE "pybind11::"DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})# Uninstall targetif(PYBIND11_MASTER_PROJECT)configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake_uninstall.cmake.in""${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)endif()
endif()
包含 Test 目錄
# BUILD_TESTING takes priority, but only if this is the master project
if(PYBIND11_MASTER_PROJECT AND DEFINED BUILD_TESTING)if(BUILD_TESTING)if(_pybind11_nopython)message(FATAL_ERROR "Cannot activate tests in NOPYTHON mode")else()add_subdirectory(tests)endif()endif()
else()if(PYBIND11_TEST)if(_pybind11_nopython)message(FATAL_ERROR "Cannot activate tests in NOPYTHON mode")else()add_subdirectory(tests)endif()endif()
endif()