feat: expose the precompiled-mode sources to non-CMake builds
Adds pybind11.get_source_dir() / python -m pybind11 --srcdir and a srcdir variable in pybind11.pc, so build systems such as Meson can compile src/pybind11_combined.cpp with PYBIND11_PRECOMPILED defined. Assisted-by: ClaudeCode:claude-fable-5
This commit is contained in:
committed by
Henry Schreiner
parent
b8d7622e45
commit
1d3436ada0
+5
-4
@@ -343,8 +343,8 @@ if(PYBIND11_INSTALL)
|
||||
install(DIRECTORY ${pybind11_INCLUDE_DIR}/pybind11 DESTINATION "${SKBUILD_HEADERS_DIR}")
|
||||
endif()
|
||||
install(DIRECTORY ${pybind11_INCLUDE_DIR}/pybind11 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/
|
||||
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/pybind11/src")
|
||||
set(pybind11_install_srcdir "${CMAKE_INSTALL_DATAROOTDIR}/pybind11/src")
|
||||
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/ DESTINATION "${pybind11_install_srcdir}")
|
||||
set(PYBIND11_CMAKECONFIG_INSTALL_DIR
|
||||
"${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}"
|
||||
CACHE STRING "install path for pybind11Config.cmake")
|
||||
@@ -355,9 +355,9 @@ if(PYBIND11_INSTALL)
|
||||
set(pybind11_INCLUDEDIR "\$\{PACKAGE_PREFIX_DIR\}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
endif()
|
||||
if(IS_ABSOLUTE "${CMAKE_INSTALL_DATAROOTDIR}")
|
||||
set(pybind11_SRCDIR "${CMAKE_INSTALL_DATAROOTDIR}/pybind11/src")
|
||||
set(pybind11_SRCDIR "${pybind11_install_srcdir}")
|
||||
else()
|
||||
set(pybind11_SRCDIR "\$\{PACKAGE_PREFIX_DIR\}/${CMAKE_INSTALL_DATAROOTDIR}/pybind11/src")
|
||||
set(pybind11_SRCDIR "\$\{PACKAGE_PREFIX_DIR\}/${pybind11_install_srcdir}")
|
||||
endif()
|
||||
|
||||
configure_package_config_file(
|
||||
@@ -410,6 +410,7 @@ if(PYBIND11_INSTALL)
|
||||
endif()
|
||||
endif()
|
||||
join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
join_paths(srcdir_for_pc_file "\${prefix}" "${pybind11_install_srcdir}")
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tools/pybind11.pc.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/pybind11.pc" @ONLY)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pybind11.pc"
|
||||
|
||||
@@ -8,12 +8,13 @@ if sys.version_info < (3, 9): # noqa: UP036
|
||||
|
||||
|
||||
from ._version import __version__, version_info
|
||||
from .commands import get_cmake_dir, get_include, get_pkgconfig_dir
|
||||
from .commands import get_cmake_dir, get_include, get_pkgconfig_dir, get_source_dir
|
||||
|
||||
__all__ = (
|
||||
"__version__",
|
||||
"get_cmake_dir",
|
||||
"get_include",
|
||||
"get_pkgconfig_dir",
|
||||
"get_source_dir",
|
||||
"version_info",
|
||||
)
|
||||
|
||||
@@ -17,6 +17,7 @@ from .commands import (
|
||||
get_include_dirs,
|
||||
get_ldflags,
|
||||
get_pkgconfig_dir,
|
||||
get_source_dir,
|
||||
)
|
||||
|
||||
|
||||
@@ -50,6 +51,12 @@ def main() -> None:
|
||||
action="store_true",
|
||||
help="Print the pkgconfig directory, ideal for setting $PKG_CONFIG_PATH.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--srcdir",
|
||||
action="store_true",
|
||||
help="Print the directory containing the library sources for the optional"
|
||||
" precompiled mode.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--extension-suffix",
|
||||
action="store_true",
|
||||
@@ -101,6 +108,8 @@ def main() -> None:
|
||||
print(quote(get_cmake_dir()))
|
||||
if args.pkgconfigdir:
|
||||
print(quote(get_pkgconfig_dir()))
|
||||
if args.srcdir:
|
||||
print(quote(get_source_dir()))
|
||||
if args.extension_suffix:
|
||||
print(ext_suffix)
|
||||
|
||||
|
||||
@@ -52,6 +52,24 @@ def get_include(user: bool = False) -> str: # noqa: ARG001
|
||||
return installed_path if os.path.exists(installed_path) else source_path
|
||||
|
||||
|
||||
def get_source_dir() -> str:
|
||||
"""
|
||||
Return the path to the pybind11 library sources, for the optional
|
||||
precompiled mode. Compile ``pybind11_combined.cpp`` (or the individual
|
||||
``.cpp`` files) with ``PYBIND11_PRECOMPILED`` defined, and define that
|
||||
macro for every translation unit that includes pybind11.
|
||||
"""
|
||||
installed_path = os.path.join(DIR, "share", "pybind11", "src")
|
||||
source_path = os.path.join(os.path.dirname(DIR), "src")
|
||||
if os.path.exists(installed_path):
|
||||
return installed_path
|
||||
if os.path.exists(source_path):
|
||||
return source_path
|
||||
|
||||
msg = "pybind11 library sources not found (pybind11 not installed?)"
|
||||
raise ImportError(msg)
|
||||
|
||||
|
||||
def get_cmake_dir() -> str:
|
||||
"""
|
||||
Return the path to the pybind11 CMake module directory.
|
||||
|
||||
@@ -33,6 +33,7 @@ UV_ARGS = ["--installer=uv"] if HAS_UV else []
|
||||
PKGCONFIG = """\
|
||||
prefix=${{pcfiledir}}/../../
|
||||
includedir=${{prefix}}/include
|
||||
srcdir=${{prefix}}/share/pybind11/src
|
||||
|
||||
Name: pybind11
|
||||
Description: Seamless operability between C++11 and Python
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
prefix=@prefix_for_pc_file@
|
||||
includedir=@includedir_for_pc_file@
|
||||
srcdir=@srcdir_for_pc_file@
|
||||
|
||||
Name: @PROJECT_NAME@
|
||||
Description: Seamless operability between C++11 and Python
|
||||
|
||||
Reference in New Issue
Block a user