1# CMakeLists.txt -- Build system for the pybind11 modules 2# 3# Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch> 4# 5# All rights reserved. Use of this source code is governed by a 6# BSD-style license that can be found in the LICENSE file. 7 8cmake_minimum_required(VERSION 2.8.12) 9
| 1# CMakeLists.txt -- Build system for the pybind11 modules 2# 3# Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch> 4# 5# All rights reserved. Use of this source code is governed by a 6# BSD-style license that can be found in the LICENSE file. 7 8cmake_minimum_required(VERSION 2.8.12) 9
|
| 10if (POLICY CMP0048) 11 # cmake warns if loaded from a min-3.0-required parent dir, so silence the warning: 12 cmake_policy(SET CMP0048 NEW) 13endif() 14
|
10project(pybind11) 11 12# Check if pybind11 is being used directly or via add_subdirectory 13set(PYBIND11_MASTER_PROJECT OFF) 14if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) 15 set(PYBIND11_MASTER_PROJECT ON) 16endif() 17 18option(PYBIND11_INSTALL "Install pybind11 header files?" ${PYBIND11_MASTER_PROJECT}) 19option(PYBIND11_TEST "Build pybind11 test suite?" ${PYBIND11_MASTER_PROJECT})
| 15project(pybind11) 16 17# Check if pybind11 is being used directly or via add_subdirectory 18set(PYBIND11_MASTER_PROJECT OFF) 19if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) 20 set(PYBIND11_MASTER_PROJECT ON) 21endif() 22 23option(PYBIND11_INSTALL "Install pybind11 header files?" ${PYBIND11_MASTER_PROJECT}) 24option(PYBIND11_TEST "Build pybind11 test suite?" ${PYBIND11_MASTER_PROJECT})
|
20option(PYBIND11_WERROR "Report all warnings as errors" OFF)
| |
21 22list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/tools") 23 24include(pybind11Tools) 25 26# Cache variables so pybind11_add_module can be used in parent projects 27set(PYBIND11_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/include" CACHE INTERNAL "") 28set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS} CACHE INTERNAL "") 29set(PYTHON_LIBRARIES ${PYTHON_LIBRARIES} CACHE INTERNAL "") 30set(PYTHON_MODULE_PREFIX ${PYTHON_MODULE_PREFIX} CACHE INTERNAL "") 31set(PYTHON_MODULE_EXTENSION ${PYTHON_MODULE_EXTENSION} CACHE INTERNAL "") 32
| 25 26list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/tools") 27 28include(pybind11Tools) 29 30# Cache variables so pybind11_add_module can be used in parent projects 31set(PYBIND11_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/include" CACHE INTERNAL "") 32set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS} CACHE INTERNAL "") 33set(PYTHON_LIBRARIES ${PYTHON_LIBRARIES} CACHE INTERNAL "") 34set(PYTHON_MODULE_PREFIX ${PYTHON_MODULE_PREFIX} CACHE INTERNAL "") 35set(PYTHON_MODULE_EXTENSION ${PYTHON_MODULE_EXTENSION} CACHE INTERNAL "") 36
|
33# Compile with compiler warnings turned on 34function(pybind11_enable_warnings target_name) 35 if(MSVC) 36 target_compile_options(${target_name} PRIVATE /W4) 37 else() 38 target_compile_options(${target_name} PRIVATE -Wall -Wextra -Wconversion) 39 endif() 40 41 if(PYBIND11_WERROR) 42 if(MSVC) 43 target_compile_options(${target_name} PRIVATE /WX) 44 else() 45 target_compile_options(${target_name} PRIVATE -Werror) 46 endif() 47 endif() 48endfunction() 49
| |
50set(PYBIND11_HEADERS 51 include/pybind11/attr.h 52 include/pybind11/cast.h 53 include/pybind11/chrono.h
| 37set(PYBIND11_HEADERS 38 include/pybind11/attr.h 39 include/pybind11/cast.h 40 include/pybind11/chrono.h
|
| 41 include/pybind11/class_support.h
|
54 include/pybind11/common.h 55 include/pybind11/complex.h 56 include/pybind11/descr.h 57 include/pybind11/options.h 58 include/pybind11/eigen.h 59 include/pybind11/eval.h 60 include/pybind11/functional.h 61 include/pybind11/numpy.h 62 include/pybind11/operators.h 63 include/pybind11/pybind11.h 64 include/pybind11/pytypes.h 65 include/pybind11/stl.h 66 include/pybind11/stl_bind.h 67 include/pybind11/typeid.h 68) 69string(REPLACE "include/" "${CMAKE_CURRENT_SOURCE_DIR}/include/" 70 PYBIND11_HEADERS "${PYBIND11_HEADERS}") 71 72if (PYBIND11_TEST) 73 add_subdirectory(tests) 74endif() 75 76include(GNUInstallDirs) 77include(CMakePackageConfigHelpers) 78 79# extract project version from source 80file(STRINGS "${PYBIND11_INCLUDE_DIR}/pybind11/common.h" pybind11_version_defines 81 REGEX "#define PYBIND11_VERSION_(MAJOR|MINOR|PATCH) ") 82foreach(ver ${pybind11_version_defines}) 83 if (ver MATCHES "#define PYBIND11_VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$") 84 set(PYBIND11_VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "") 85 endif() 86endforeach() 87set(${PROJECT_NAME}_VERSION ${PYBIND11_VERSION_MAJOR}.${PYBIND11_VERSION_MINOR}.${PYBIND11_VERSION_PATCH})
| 42 include/pybind11/common.h 43 include/pybind11/complex.h 44 include/pybind11/descr.h 45 include/pybind11/options.h 46 include/pybind11/eigen.h 47 include/pybind11/eval.h 48 include/pybind11/functional.h 49 include/pybind11/numpy.h 50 include/pybind11/operators.h 51 include/pybind11/pybind11.h 52 include/pybind11/pytypes.h 53 include/pybind11/stl.h 54 include/pybind11/stl_bind.h 55 include/pybind11/typeid.h 56) 57string(REPLACE "include/" "${CMAKE_CURRENT_SOURCE_DIR}/include/" 58 PYBIND11_HEADERS "${PYBIND11_HEADERS}") 59 60if (PYBIND11_TEST) 61 add_subdirectory(tests) 62endif() 63 64include(GNUInstallDirs) 65include(CMakePackageConfigHelpers) 66 67# extract project version from source 68file(STRINGS "${PYBIND11_INCLUDE_DIR}/pybind11/common.h" pybind11_version_defines 69 REGEX "#define PYBIND11_VERSION_(MAJOR|MINOR|PATCH) ") 70foreach(ver ${pybind11_version_defines}) 71 if (ver MATCHES "#define PYBIND11_VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$") 72 set(PYBIND11_VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "") 73 endif() 74endforeach() 75set(${PROJECT_NAME}_VERSION ${PYBIND11_VERSION_MAJOR}.${PYBIND11_VERSION_MINOR}.${PYBIND11_VERSION_PATCH})
|
| 76message(STATUS "pybind11 v${${PROJECT_NAME}_VERSION}")
|
88
| 77
|
| 78option (USE_PYTHON_INCLUDE_DIR "Install pybind11 headers in Python include directory instead of default installation prefix" OFF) 79if (USE_PYTHON_INCLUDE_DIR) 80 file(RELATIVE_PATH CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX} ${PYTHON_INCLUDE_DIRS}) 81endif() 82
|
89if(NOT (CMAKE_VERSION VERSION_LESS 3.0)) # CMake >= 3.0 90 # Build an interface library target:
| 83if(NOT (CMAKE_VERSION VERSION_LESS 3.0)) # CMake >= 3.0 84 # Build an interface library target:
|
91 add_library(pybind11 INTERFACE) 92 target_include_directories(pybind11 INTERFACE $<BUILD_INTERFACE:${PYBIND11_INCLUDE_DIR}> 93 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) 94 if(APPLE) 95 target_link_libraries(pybind11 INTERFACE "-undefined dynamic_lookup")
| 85 add_library(module INTERFACE) 86 target_include_directories(module INTERFACE $<BUILD_INTERFACE:${PYBIND11_INCLUDE_DIR}> 87 $<BUILD_INTERFACE:${PYTHON_INCLUDE_DIRS}> 88 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) 89 if(WIN32 OR CYGWIN) 90 target_link_libraries(module INTERFACE $<BUILD_INTERFACE:${PYTHON_LIBRARIES}>) 91 elseif(APPLE) 92 target_link_libraries(module INTERFACE "-undefined dynamic_lookup")
|
96 endif()
| 93 endif()
|
| 94 target_compile_options(module INTERFACE $<BUILD_INTERFACE:${PYBIND11_CPP_STANDARD}>) 95 96 add_library(pybind11::module ALIAS module) # to match exported target
|
97endif() 98 99if (PYBIND11_INSTALL) 100 install(FILES ${PYBIND11_HEADERS} 101 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pybind11) 102 # GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share". 103 set(PYBIND11_CMAKECONFIG_INSTALL_DIR "share/cmake/${PROJECT_NAME}" CACHE STRING "install path for pybind11Config.cmake") 104 105 configure_package_config_file(tools/${PROJECT_NAME}Config.cmake.in 106 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" 107 INSTALL_DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR}) 108 write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 109 VERSION ${${PROJECT_NAME}_VERSION} 110 COMPATIBILITY AnyNewerVersion) 111 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake 112 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 113 tools/FindPythonLibsNew.cmake 114 tools/pybind11Tools.cmake 115 DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR}) 116 117 if(NOT (CMAKE_VERSION VERSION_LESS 3.0))
| 97endif() 98 99if (PYBIND11_INSTALL) 100 install(FILES ${PYBIND11_HEADERS} 101 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pybind11) 102 # GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share". 103 set(PYBIND11_CMAKECONFIG_INSTALL_DIR "share/cmake/${PROJECT_NAME}" CACHE STRING "install path for pybind11Config.cmake") 104 105 configure_package_config_file(tools/${PROJECT_NAME}Config.cmake.in 106 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" 107 INSTALL_DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR}) 108 write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 109 VERSION ${${PROJECT_NAME}_VERSION} 110 COMPATIBILITY AnyNewerVersion) 111 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake 112 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 113 tools/FindPythonLibsNew.cmake 114 tools/pybind11Tools.cmake 115 DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR}) 116 117 if(NOT (CMAKE_VERSION VERSION_LESS 3.0))
|
118 install(TARGETS pybind11
| 118 install(TARGETS module
|
119 EXPORT "${PROJECT_NAME}Targets") 120 install(EXPORT "${PROJECT_NAME}Targets" 121 NAMESPACE "${PROJECT_NAME}::" 122 DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})
| 119 EXPORT "${PROJECT_NAME}Targets") 120 install(EXPORT "${PROJECT_NAME}Targets" 121 NAMESPACE "${PROJECT_NAME}::" 122 DESTINATION ${PYBIND11_CMAKECONFIG_INSTALL_DIR})
|
123 message(STATUS "Exporting ${PROJECT_NAME}::pybind11 interface library target version ${${PROJECT_NAME}_VERSION}")
| |
124 endif() 125endif()
| 123 endif() 124endif()
|