| | |
| |
|
| | Adds the following targets:: |
| |
|
| | pybind11::pybind11 - link to headers and pybind11 |
| | pybind11::module - Adds module links |
| | pybind11::embed - Adds embed links |
| | pybind11::lto - Link time optimizations (manual selection) |
| | pybind11::thin_lto - Link time optimizations (manual selection) |
| | pybind11::python_link_helper - Adds link to Python libraries |
| | pybind11::windows_extras - MSVC bigobj and mp for building multithreaded |
| | pybind11::opt_size - avoid optimizations that increase code size |
| |
|
| | Adds the following functions:: |
| |
|
| | pybind11_strip(target) - strip target after building on linux/macOS |
| | pybind11_find_import(module) - See if a module is installed. |
| |
|
| | |
| |
|
| | |
| | |
| | if(TARGET pybind11::lto) |
| | return() |
| | endif() |
| |
|
| | |
| | |
| | |
| | |
| | get_property( |
| | is_config |
| | TARGET pybind11::headers |
| | PROPERTY IMPORTED) |
| | if(NOT is_config) |
| | set(optional_global GLOBAL) |
| | endif() |
| |
|
| | |
| | |
| | set(pybind11_INCLUDE_DIRS |
| | "${pybind11_INCLUDE_DIR}" |
| | CACHE INTERNAL "Include directory for pybind11 (Python not requested)") |
| |
|
| | |
| |
|
| | |
| | add_library(pybind11::pybind11 IMPORTED INTERFACE ${optional_global}) |
| | set_property( |
| | TARGET pybind11::pybind11 |
| | APPEND |
| | PROPERTY INTERFACE_LINK_LIBRARIES pybind11::headers) |
| |
|
| | |
| | add_library(pybind11::module IMPORTED INTERFACE ${optional_global}) |
| | set_property( |
| | TARGET pybind11::module |
| | APPEND |
| | PROPERTY INTERFACE_LINK_LIBRARIES pybind11::pybind11) |
| |
|
| | |
| | add_library(pybind11::embed IMPORTED INTERFACE ${optional_global}) |
| | set_property( |
| | TARGET pybind11::embed |
| | APPEND |
| | PROPERTY INTERFACE_LINK_LIBRARIES pybind11::pybind11) |
| |
|
| | |
| |
|
| | add_library(pybind11::python_link_helper IMPORTED INTERFACE ${optional_global}) |
| |
|
| | if(CMAKE_VERSION VERSION_LESS 3.13) |
| | |
| | |
| | set_property( |
| | TARGET pybind11::python_link_helper |
| | APPEND |
| | PROPERTY INTERFACE_LINK_LIBRARIES "$<$<PLATFORM_ID:Darwin>:-undefined dynamic_lookup>") |
| | else() |
| | |
| | |
| | |
| | set_property( |
| | TARGET pybind11::python_link_helper |
| | APPEND |
| | PROPERTY INTERFACE_LINK_OPTIONS "$<$<PLATFORM_ID:Darwin>:LINKER:-undefined,dynamic_lookup>") |
| | endif() |
| |
|
| | |
| |
|
| | add_library(pybind11::windows_extras IMPORTED INTERFACE ${optional_global}) |
| |
|
| | if(MSVC) |
| | |
| | |
| | set_property( |
| | TARGET pybind11::windows_extras |
| | APPEND |
| | PROPERTY INTERFACE_COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:CXX>:/bigobj>) |
| |
|
| | |
| | if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
| | if(CMAKE_VERSION VERSION_LESS 3.11) |
| | set_property( |
| | TARGET pybind11::windows_extras |
| | APPEND |
| | PROPERTY INTERFACE_COMPILE_OPTIONS $<$<NOT:$<CONFIG:Debug>>:/MP>) |
| | else() |
| | |
| | |
| | |
| | |
| | set_property( |
| | TARGET pybind11::windows_extras |
| | APPEND |
| | PROPERTY INTERFACE_COMPILE_OPTIONS |
| | $<$<NOT:$<CONFIG:Debug>>:$<$<COMPILE_LANGUAGE:CXX>:/MP>>) |
| | endif() |
| | endif() |
| | endif() |
| |
|
| | |
| |
|
| | add_library(pybind11::opt_size IMPORTED INTERFACE ${optional_global}) |
| |
|
| | if(MSVC) |
| | set(PYBIND11_OPT_SIZE /Os) |
| | else() |
| | set(PYBIND11_OPT_SIZE -Os) |
| | endif() |
| |
|
| | set_property( |
| | TARGET pybind11::opt_size |
| | APPEND |
| | PROPERTY INTERFACE_COMPILE_OPTIONS $<$<CONFIG:Release>:${PYBIND11_OPT_SIZE}> |
| | $<$<CONFIG:MinSizeRel>:${PYBIND11_OPT_SIZE}> |
| | $<$<CONFIG:RelWithDebInfo>:${PYBIND11_OPT_SIZE}>) |
| |
|
| | |
| |
|
| | |
| | if(PYBIND11_CPP_STANDARD) |
| | string(REGEX MATCH [[..$]] VAL "${PYBIND11_CPP_STANDARD}") |
| | if(CMAKE_CXX_STANDARD) |
| | if(NOT CMAKE_CXX_STANDARD STREQUAL VAL) |
| | message(WARNING "CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} does not match " |
| | "PYBIND11_CPP_STANDARD=${PYBIND11_CPP_STANDARD}, " |
| | "please remove PYBIND11_CPP_STANDARD from your cache") |
| | endif() |
| | else() |
| | set(supported_standards 11 14 17 20) |
| | if("${VAL}" IN_LIST supported_standards) |
| | message(WARNING "USE -DCMAKE_CXX_STANDARD=${VAL} instead of PYBIND11_CPP_STANDARD") |
| | set(CMAKE_CXX_STANDARD |
| | ${VAL} |
| | CACHE STRING "From PYBIND11_CPP_STANDARD") |
| | else() |
| | message(FATAL_ERROR "PYBIND11_CPP_STANDARD should be replaced with CMAKE_CXX_STANDARD " |
| | "(last two chars: ${VAL} not understood as a valid CXX std)") |
| | endif() |
| | endif() |
| | endif() |
| |
|
| | |
| |
|
| | |
| | if(PYBIND11_NOPYTHON) |
| | set(_pybind11_nopython ON) |
| | elseif( |
| | PYBIND11_FINDPYTHON |
| | OR Python_FOUND |
| | OR Python2_FOUND |
| | OR Python3_FOUND) |
| | |
| | include("${CMAKE_CURRENT_LIST_DIR}/pybind11NewTools.cmake") |
| |
|
| | else() |
| |
|
| | |
| | include("${CMAKE_CURRENT_LIST_DIR}/pybind11Tools.cmake") |
| |
|
| | endif() |
| |
|
| | |
| |
|
| | if(NOT _pybind11_nopython) |
| | |
| | |
| | |
| | |
| | |
| | function(pybind11_find_import PYPI_NAME) |
| | |
| | string(REPLACE "-" "_" NORM_PYPI_NAME "${PYPI_NAME}") |
| |
|
| | |
| | if(${NORM_PYPI_NAME}_FOUND) |
| | return() |
| | endif() |
| |
|
| | set(options "REQUIRED;QUIET") |
| | set(oneValueArgs "VERSION") |
| | cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "" ${ARGN}) |
| |
|
| | if(ARG_REQUIRED) |
| | set(status_level FATAL_ERROR) |
| | else() |
| | set(status_level WARNING) |
| | endif() |
| |
|
| | execute_process( |
| | COMMAND |
| | ${${_Python}_EXECUTABLE} -c |
| | "from pkg_resources import get_distribution; print(get_distribution('${PYPI_NAME}').version)" |
| | RESULT_VARIABLE RESULT_PRESENT |
| | OUTPUT_VARIABLE PKG_VERSION |
| | ERROR_QUIET) |
| |
|
| | string(STRIP "${PKG_VERSION}" PKG_VERSION) |
| |
|
| | |
| | if(RESULT_PRESENT) |
| | set(${NORM_PYPI_NAME}_FOUND |
| | ${NORM_PYPI_NAME}-NOTFOUND |
| | CACHE INTERNAL "") |
| | |
| | message( |
| | ${status_level} |
| | "Missing: ${PYPI_NAME} ${ARG_VERSION}\nTry: ${${_Python}_EXECUTABLE} -m pip install ${PYPI_NAME}" |
| | ) |
| | else() |
| | if(ARG_VERSION AND PKG_VERSION VERSION_LESS ARG_VERSION) |
| | message( |
| | ${status_level} |
| | "Version incorrect: ${PYPI_NAME} ${PKG_VERSION} found, ${ARG_VERSION} required - try upgrading" |
| | ) |
| | else() |
| | set(${NORM_PYPI_NAME}_FOUND |
| | YES |
| | CACHE INTERNAL "") |
| | set(${NORM_PYPI_NAME}_VERSION |
| | ${PKG_VERSION} |
| | CACHE INTERNAL "") |
| | endif() |
| | if(NOT ARG_QUIET) |
| | message(STATUS "Found ${PYPI_NAME} ${PKG_VERSION}") |
| | endif() |
| | endif() |
| | if(NOT ARG_VERSION OR (NOT PKG_VERSION VERSION_LESS ARG_VERSION)) |
| | |
| | endif() |
| | endfunction() |
| | endif() |
| |
|
| | |
| |
|
| | include(CheckCXXCompilerFlag) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | function(_pybind11_return_if_cxx_and_linker_flags_work result cxxflags linkerflags cxxflags_out |
| | linkerflags_out) |
| | set(CMAKE_REQUIRED_LIBRARIES ${linkerflags}) |
| | check_cxx_compiler_flag("${cxxflags}" ${result}) |
| | if(${result}) |
| | set(${cxxflags_out} |
| | "${cxxflags}" |
| | PARENT_SCOPE) |
| | set(${linkerflags_out} |
| | "${linkerflags}" |
| | PARENT_SCOPE) |
| | endif() |
| | endfunction() |
| |
|
| | function(_pybind11_generate_lto target prefer_thin_lto) |
| | if(MINGW) |
| | message(STATUS "${target} disabled (problems with undefined symbols for MinGW for now)") |
| | return() |
| | endif() |
| |
|
| | if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") |
| | set(cxx_append "") |
| | set(linker_append "") |
| | if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT APPLE) |
| | |
| | set(linker_append ";$<$<CONFIG:MinSizeRel>:-O3>") |
| | elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND NOT MINGW) |
| | set(cxx_append ";-fno-fat-lto-objects") |
| | endif() |
| |
|
| | if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le" OR CMAKE_SYSTEM_PROCESSOR MATCHES "mips64") |
| | set(NO_FLTO_ARCH TRUE) |
| | else() |
| | set(NO_FLTO_ARCH FALSE) |
| | endif() |
| |
|
| | if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" |
| | AND prefer_thin_lto |
| | AND NOT NO_FLTO_ARCH) |
| | _pybind11_return_if_cxx_and_linker_flags_work( |
| | HAS_FLTO_THIN "-flto=thin${cxx_append}" "-flto=thin${linker_append}" |
| | PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS) |
| | endif() |
| |
|
| | if(NOT HAS_FLTO_THIN AND NOT NO_FLTO_ARCH) |
| | _pybind11_return_if_cxx_and_linker_flags_work( |
| | HAS_FLTO "-flto${cxx_append}" "-flto${linker_append}" PYBIND11_LTO_CXX_FLAGS |
| | PYBIND11_LTO_LINKER_FLAGS) |
| | endif() |
| | elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") |
| | |
| | _pybind11_return_if_cxx_and_linker_flags_work(HAS_INTEL_IPO "-ipo" "-ipo" |
| | PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS) |
| | elseif(MSVC) |
| | |
| | |
| | |
| | _pybind11_return_if_cxx_and_linker_flags_work(HAS_MSVC_GL_LTCG "/GL" "-LTCG" |
| | PYBIND11_LTO_CXX_FLAGS PYBIND11_LTO_LINKER_FLAGS) |
| | endif() |
| |
|
| | |
| | if(PYBIND11_LTO_CXX_FLAGS) |
| | |
| | set(is_debug "$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>") |
| | set(not_debug "$<NOT:${is_debug}>") |
| | set(cxx_lang "$<COMPILE_LANGUAGE:CXX>") |
| | if(MSVC AND CMAKE_VERSION VERSION_LESS 3.11) |
| | set(genex "${not_debug}") |
| | else() |
| | set(genex "$<AND:${not_debug},${cxx_lang}>") |
| | endif() |
| | set_property( |
| | TARGET ${target} |
| | APPEND |
| | PROPERTY INTERFACE_COMPILE_OPTIONS "$<${genex}:${PYBIND11_LTO_CXX_FLAGS}>") |
| | if(CMAKE_PROJECT_NAME STREQUAL "pybind11") |
| | message(STATUS "${target} enabled") |
| | endif() |
| | else() |
| | if(CMAKE_PROJECT_NAME STREQUAL "pybind11") |
| | message(STATUS "${target} disabled (not supported by the compiler and/or linker)") |
| | endif() |
| | endif() |
| |
|
| | if(PYBIND11_LTO_LINKER_FLAGS) |
| | if(CMAKE_VERSION VERSION_LESS 3.11) |
| | set_property( |
| | TARGET ${target} |
| | APPEND |
| | PROPERTY INTERFACE_LINK_LIBRARIES "$<${not_debug}:${PYBIND11_LTO_LINKER_FLAGS}>") |
| | else() |
| | set_property( |
| | TARGET ${target} |
| | APPEND |
| | PROPERTY INTERFACE_LINK_OPTIONS "$<${not_debug}:${PYBIND11_LTO_LINKER_FLAGS}>") |
| | endif() |
| | endif() |
| | endfunction() |
| |
|
| | add_library(pybind11::lto IMPORTED INTERFACE ${optional_global}) |
| | _pybind11_generate_lto(pybind11::lto FALSE) |
| |
|
| | add_library(pybind11::thin_lto IMPORTED INTERFACE ${optional_global}) |
| | _pybind11_generate_lto(pybind11::thin_lto TRUE) |
| |
|
| | |
| |
|
| | function(pybind11_strip target_name) |
| | |
| | if(CMAKE_STRIP) |
| | if(APPLE) |
| | set(x_opt -x) |
| | endif() |
| |
|
| | add_custom_command( |
| | TARGET ${target_name} |
| | POST_BUILD |
| | COMMAND ${CMAKE_STRIP} ${x_opt} $<TARGET_FILE:${target_name}>) |
| | endif() |
| | endfunction() |
| |
|