From ffb113d1d8c6c7d820b9f521c70c85a06a7b8211 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 15 Dec 2020 21:55:14 -0500 Subject: [PATCH] fix: regression with installed pybind11 overriding local one (#2716) * fix: regression with installed pybind11 overriding discovered one Closes #2709 * docs: wording incorrect --- tools/pybind11NewTools.cmake | 12 +++++++++++- tools/pybind11Tools.cmake | 12 ++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmake index dd1b972c0..686450bc3 100644 --- a/tools/pybind11NewTools.cmake +++ b/tools/pybind11NewTools.cmake @@ -127,10 +127,20 @@ endif() # Check on every access - since Python2 and Python3 could have been used - do nothing in that case. if(DEFINED ${_Python}_INCLUDE_DIRS) + # Only add Python for build - must be added during the import for config + # since it has to be re-discovered. + # + # This needs to be a target to be included after the local pybind11 + # directory, just in case there there is an installed pybind11 sitting + # next to Python's includes. It also ensures Python is a SYSTEM library. + add_library(pybind11::python_headers INTERFACE IMPORTED) + set_property( + TARGET pybind11::python_headers PROPERTY INTERFACE_INCLUDE_DIRECTORIES + "$") set_property( TARGET pybind11::pybind11 APPEND - PROPERTY INTERFACE_INCLUDE_DIRECTORIES $) + PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python_headers) set(pybind11_INCLUDE_DIRS "${pybind11_INCLUDE_DIR}" "${${_Python}_INCLUDE_DIRS}" CACHE INTERNAL "Directories where pybind11 and possibly Python headers are located") diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake index 23cff98e8..cdd197959 100644 --- a/tools/pybind11Tools.cmake +++ b/tools/pybind11Tools.cmake @@ -81,11 +81,19 @@ if(PYBIND11_MASTER_PROJECT) endif() endif() -# Only add Python for build - must be added during the import for config since it has to be re-discovered. +# Only add Python for build - must be added during the import for config since +# it has to be re-discovered. +# +# This needs to be an target to it is included after the local pybind11 +# directory, just in case there are multiple versions of pybind11, we want the +# one we expect. +add_library(pybind11::python_headers INTERFACE IMPORTED) +set_property(TARGET pybind11::python_headers PROPERTY INTERFACE_INCLUDE_DIRECTORIES + "$") set_property( TARGET pybind11::pybind11 APPEND - PROPERTY INTERFACE_INCLUDE_DIRECTORIES $) + PROPERTY INTERFACE_LINK_LIBRARIES pybind11::python_headers) set(pybind11_INCLUDE_DIRS "${pybind11_INCLUDE_DIR}" "${PYTHON_INCLUDE_DIRS}"