CMakeLists.txt revision 12037:d28054ac6ec9
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 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}) 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 37set(PYBIND11_HEADERS 38 include/pybind11/attr.h 39 include/pybind11/cast.h 40 include/pybind11/chrono.h 41 include/pybind11/class_support.h 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}") 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 83if(NOT (CMAKE_VERSION VERSION_LESS 3.0)) # CMake >= 3.0 84 # Build an interface library target: 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") 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)) 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}) 123 endif() 124endif() 125