CMakeLists.txt revision 11986:c12e4625ab56
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 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}) 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 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 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}) 88 89if(NOT (CMAKE_VERSION VERSION_LESS 3.0)) # CMake >= 3.0 90 # 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") 96 endif() 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 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() 126