fix(cmake): keep CMP0190 auto-default in add_subdirectory builds

The previous commit's `NOT DEFINED PYBIND11_USE_CROSSCOMPILING` guard
broke the intended auto-default for top-level / add_subdirectory builds:
CMakeLists.txt runs `option(PYBIND11_USE_CROSSCOMPILING ... OFF)` before
including pybind11Common.cmake, so the variable is already defined (OFF)
and the CMP0190 default never applied.

Capture, before the option() call, whether the project set the value
itself, and let pybind11Common.cmake apply its default unless the value
was set explicitly. This keeps both the emulator override fix and the
CMP0190 auto-default for subdirectory consumers.

Assisted-by: ClaudeCode:claude-opus-4.8
This commit is contained in:
Henry Schreiner
2026-06-24 00:55:38 -04:00
parent 40493f0a29
commit 692b031ac5
2 changed files with 10 additions and 2 deletions

View File

@@ -102,6 +102,11 @@ option(PYBIND11_SIMPLE_GIL_MANAGEMENT
set(PYBIND11_INTERNALS_VERSION
""
CACHE STRING "Override the ABI version, may be used to enable the unstable ABI.")
# Record whether the project set this before option() supplies its OFF default, so
# pybind11Common.cmake can apply its CMP0190-aware default without clobbering an explicit value.
if(NOT DEFINED PYBIND11_USE_CROSSCOMPILING)
set(_PYBIND11_USE_CROSSCOMPILING_DEFAULTED ON)
endif()
option(PYBIND11_USE_CROSSCOMPILING "Respect CMAKE_CROSSCOMPILING" OFF)
if(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION)

View File

@@ -45,9 +45,12 @@ set(pybind11_INCLUDE_DIRS
# when cross-compiling, unless the CMAKE_CROSSCOMPILING_EMULATOR variable is defined.
# Default PYBIND11_USE_CROSSCOMPILING to ON in that case, but never override a value the
# project set explicitly (e.g. Emscripten/Pyodide defines an emulator yet still wants it ON).
# PYBIND11_USE_CROSSCOMPILING is undefined for find_package() consumers, but our own
# CMakeLists.txt always defines it via option(); _PYBIND11_USE_CROSSCOMPILING_DEFAULTED tells
# us whether that came from the project or from the option() default.
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.1"
AND NOT DEFINED PYBIND11_USE_CROSSCOMPILING
AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR
AND (NOT DEFINED PYBIND11_USE_CROSSCOMPILING OR _PYBIND11_USE_CROSSCOMPILING_DEFAULTED))
cmake_policy(GET CMP0190 _pybind11_cmp0190)
if(_pybind11_cmp0190 STREQUAL "NEW")
set(PYBIND11_USE_CROSSCOMPILING "ON")