pybind11Tools.cmake revision 11986
111986Sandreas.sandberg@arm.com# tools/pybind11Tools.cmake -- Build system for the pybind11 modules 211986Sandreas.sandberg@arm.com# 311986Sandreas.sandberg@arm.com# Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch> 411986Sandreas.sandberg@arm.com# 511986Sandreas.sandberg@arm.com# All rights reserved. Use of this source code is governed by a 611986Sandreas.sandberg@arm.com# BSD-style license that can be found in the LICENSE file. 711986Sandreas.sandberg@arm.com 811986Sandreas.sandberg@arm.comcmake_minimum_required(VERSION 2.8.12) 911986Sandreas.sandberg@arm.com 1011986Sandreas.sandberg@arm.com# Add a CMake parameter for choosing a desired Python version 1111986Sandreas.sandberg@arm.comset(PYBIND11_PYTHON_VERSION "" CACHE STRING "Python version to use for compiling modules") 1211986Sandreas.sandberg@arm.com 1311986Sandreas.sandberg@arm.comset(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4) 1411986Sandreas.sandberg@arm.comfind_package(PythonLibsNew ${PYBIND11_PYTHON_VERSION} REQUIRED) 1511986Sandreas.sandberg@arm.com 1611986Sandreas.sandberg@arm.cominclude(CheckCXXCompilerFlag) 1711986Sandreas.sandberg@arm.com 1811986Sandreas.sandberg@arm.comfunction(select_cxx_standard) 1911986Sandreas.sandberg@arm.com if(NOT MSVC AND NOT PYBIND11_CPP_STANDARD) 2011986Sandreas.sandberg@arm.com check_cxx_compiler_flag("-std=c++14" HAS_CPP14_FLAG) 2111986Sandreas.sandberg@arm.com check_cxx_compiler_flag("-std=c++11" HAS_CPP11_FLAG) 2211986Sandreas.sandberg@arm.com 2311986Sandreas.sandberg@arm.com if (HAS_CPP14_FLAG) 2411986Sandreas.sandberg@arm.com set(PYBIND11_CPP_STANDARD -std=c++14) 2511986Sandreas.sandberg@arm.com elseif (HAS_CPP11_FLAG) 2611986Sandreas.sandberg@arm.com set(PYBIND11_CPP_STANDARD -std=c++11) 2711986Sandreas.sandberg@arm.com else() 2811986Sandreas.sandberg@arm.com message(FATAL_ERROR "Unsupported compiler -- pybind11 requires C++11 support!") 2911986Sandreas.sandberg@arm.com endif() 3011986Sandreas.sandberg@arm.com 3111986Sandreas.sandberg@arm.com set(PYBIND11_CPP_STANDARD ${PYBIND11_CPP_STANDARD} CACHE STRING 3211986Sandreas.sandberg@arm.com "C++ standard flag, e.g. -std=c++11 or -std=c++14. Defaults to latest available." FORCE) 3311986Sandreas.sandberg@arm.com endif() 3411986Sandreas.sandberg@arm.comendfunction() 3511986Sandreas.sandberg@arm.com 3611986Sandreas.sandberg@arm.com# Build a Python extension module: 3711986Sandreas.sandberg@arm.com# pybind11_add_module(<name> [MODULE | SHARED] [EXCLUDE_FROM_ALL] source1 [source2 ...]) 3811986Sandreas.sandberg@arm.com# 3911986Sandreas.sandberg@arm.comfunction(pybind11_add_module target_name) 4011986Sandreas.sandberg@arm.com set(lib_type "MODULE") 4111986Sandreas.sandberg@arm.com set(do_lto True) 4211986Sandreas.sandberg@arm.com set(exclude_from_all "") 4311986Sandreas.sandberg@arm.com set(sources "") 4411986Sandreas.sandberg@arm.com 4511986Sandreas.sandberg@arm.com set(_args_to_try "${ARGN}") 4611986Sandreas.sandberg@arm.com foreach(_ex_arg IN LISTS _args_to_try) 4711986Sandreas.sandberg@arm.com if(${_ex_arg} STREQUAL "MODULE") 4811986Sandreas.sandberg@arm.com set(lib_type "MODULE") 4911986Sandreas.sandberg@arm.com elseif(${_ex_arg} STREQUAL "SHARED") 5011986Sandreas.sandberg@arm.com set(lib_type "SHARED") 5111986Sandreas.sandberg@arm.com elseif(${_ex_arg} STREQUAL "EXCLUDE_FROM_ALL") 5211986Sandreas.sandberg@arm.com set(exclude_from_all "EXCLUDE_FROM_ALL") 5311986Sandreas.sandberg@arm.com else() 5411986Sandreas.sandberg@arm.com list(APPEND sources "${_ex_arg}") 5511986Sandreas.sandberg@arm.com endif() 5611986Sandreas.sandberg@arm.com endforeach() 5711986Sandreas.sandberg@arm.com 5811986Sandreas.sandberg@arm.com add_library(${target_name} ${lib_type} ${exclude_from_all} ${sources}) 5911986Sandreas.sandberg@arm.com 6011986Sandreas.sandberg@arm.com target_include_directories(${target_name} 6111986Sandreas.sandberg@arm.com PRIVATE ${PYBIND11_INCLUDE_DIR} # from project CMakeLists.txt 6211986Sandreas.sandberg@arm.com PRIVATE ${pybind11_INCLUDE_DIR} # from pybind11Config 6311986Sandreas.sandberg@arm.com PRIVATE ${PYTHON_INCLUDE_DIRS}) 6411986Sandreas.sandberg@arm.com 6511986Sandreas.sandberg@arm.com # The prefix and extension are provided by FindPythonLibsNew.cmake 6611986Sandreas.sandberg@arm.com set_target_properties(${target_name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}") 6711986Sandreas.sandberg@arm.com set_target_properties(${target_name} PROPERTIES SUFFIX "${PYTHON_MODULE_EXTENSION}") 6811986Sandreas.sandberg@arm.com 6911986Sandreas.sandberg@arm.com if(WIN32 OR CYGWIN) 7011986Sandreas.sandberg@arm.com # Link against the Python shared library on Windows 7111986Sandreas.sandberg@arm.com target_link_libraries(${target_name} PRIVATE ${PYTHON_LIBRARIES}) 7211986Sandreas.sandberg@arm.com elseif(APPLE) 7311986Sandreas.sandberg@arm.com # It's quite common to have multiple copies of the same Python version 7411986Sandreas.sandberg@arm.com # installed on one's system. E.g.: one copy from the OS and another copy 7511986Sandreas.sandberg@arm.com # that's statically linked into an application like Blender or Maya. 7611986Sandreas.sandberg@arm.com # If we link our plugin library against the OS Python here and import it 7711986Sandreas.sandberg@arm.com # into Blender or Maya later on, this will cause segfaults when multiple 7811986Sandreas.sandberg@arm.com # conflicting Python instances are active at the same time (even when they 7911986Sandreas.sandberg@arm.com # are of the same version). 8011986Sandreas.sandberg@arm.com 8111986Sandreas.sandberg@arm.com # Windows is not affected by this issue since it handles DLL imports 8211986Sandreas.sandberg@arm.com # differently. The solution for Linux and Mac OS is simple: we just don't 8311986Sandreas.sandberg@arm.com # link against the Python library. The resulting shared library will have 8411986Sandreas.sandberg@arm.com # missing symbols, but that's perfectly fine -- they will be resolved at 8511986Sandreas.sandberg@arm.com # import time. 8611986Sandreas.sandberg@arm.com 8711986Sandreas.sandberg@arm.com target_link_libraries(${target_name} PRIVATE "-undefined dynamic_lookup") 8811986Sandreas.sandberg@arm.com endif() 8911986Sandreas.sandberg@arm.com 9011986Sandreas.sandberg@arm.com select_cxx_standard() 9111986Sandreas.sandberg@arm.com if(NOT MSVC) 9211986Sandreas.sandberg@arm.com # Make sure C++11/14 are enabled 9311986Sandreas.sandberg@arm.com target_compile_options(${target_name} PUBLIC ${PYBIND11_CPP_STANDARD}) 9411986Sandreas.sandberg@arm.com 9511986Sandreas.sandberg@arm.com # Enable link time optimization and set the default symbol 9611986Sandreas.sandberg@arm.com # visibility to hidden (very important to obtain small binaries) 9711986Sandreas.sandberg@arm.com string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE) 9811986Sandreas.sandberg@arm.com if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG) 9911986Sandreas.sandberg@arm.com # Check for Link Time Optimization support (GCC/Clang) 10011986Sandreas.sandberg@arm.com check_cxx_compiler_flag("-flto" HAS_LTO_FLAG) 10111986Sandreas.sandberg@arm.com if(HAS_LTO_FLAG AND NOT CYGWIN) 10211986Sandreas.sandberg@arm.com target_compile_options(${target_name} PRIVATE -flto) 10311986Sandreas.sandberg@arm.com endif() 10411986Sandreas.sandberg@arm.com 10511986Sandreas.sandberg@arm.com # Intel equivalent to LTO is called IPO 10611986Sandreas.sandberg@arm.com if(CMAKE_CXX_COMPILER_ID MATCHES "Intel") 10711986Sandreas.sandberg@arm.com check_cxx_compiler_flag("-ipo" HAS_IPO_FLAG) 10811986Sandreas.sandberg@arm.com if(HAS_IPO_FLAG) 10911986Sandreas.sandberg@arm.com target_compile_options(${target_name} PRIVATE -ipo) 11011986Sandreas.sandberg@arm.com endif() 11111986Sandreas.sandberg@arm.com endif() 11211986Sandreas.sandberg@arm.com 11311986Sandreas.sandberg@arm.com # Default symbol visibility 11411986Sandreas.sandberg@arm.com target_compile_options(${target_name} PRIVATE "-fvisibility=hidden") 11511986Sandreas.sandberg@arm.com 11611986Sandreas.sandberg@arm.com # Strip unnecessary sections of the binary on Linux/Mac OS 11711986Sandreas.sandberg@arm.com if(CMAKE_STRIP) 11811986Sandreas.sandberg@arm.com if(APPLE) 11911986Sandreas.sandberg@arm.com add_custom_command(TARGET ${target_name} POST_BUILD 12011986Sandreas.sandberg@arm.com COMMAND ${CMAKE_STRIP} -u -r $<TARGET_FILE:${target_name}>) 12111986Sandreas.sandberg@arm.com else() 12211986Sandreas.sandberg@arm.com add_custom_command(TARGET ${target_name} POST_BUILD 12311986Sandreas.sandberg@arm.com COMMAND ${CMAKE_STRIP} $<TARGET_FILE:${target_name}>) 12411986Sandreas.sandberg@arm.com endif() 12511986Sandreas.sandberg@arm.com endif() 12611986Sandreas.sandberg@arm.com endif() 12711986Sandreas.sandberg@arm.com elseif(MSVC) 12811986Sandreas.sandberg@arm.com # /MP enables multithreaded builds (relevant when there are many files), /bigobj is 12911986Sandreas.sandberg@arm.com # needed for bigger binding projects due to the limit to 64k addressable sections 13011986Sandreas.sandberg@arm.com target_compile_options(${target_name} PRIVATE /MP /bigobj) 13111986Sandreas.sandberg@arm.com 13211986Sandreas.sandberg@arm.com # Enforce link time code generation on MSVC, except in debug mode 13311986Sandreas.sandberg@arm.com target_compile_options(${target_name} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/GL>) 13411986Sandreas.sandberg@arm.com 13511986Sandreas.sandberg@arm.com # Fancy generator expressions don't work with linker flags, for reasons unknown 13611986Sandreas.sandberg@arm.com set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE /LTCG) 13711986Sandreas.sandberg@arm.com set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS_MINSIZEREL /LTCG) 13811986Sandreas.sandberg@arm.com set_property(TARGET ${target_name} APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO /LTCG) 13911986Sandreas.sandberg@arm.com endif() 14011986Sandreas.sandberg@arm.comendfunction() 141