fix(cmake): respect explicit PYBIND11_USE_CROSSCOMPILING under CMP0190#6094
fix(cmake): respect explicit PYBIND11_USE_CROSSCOMPILING under CMP0190#6094henryiii wants to merge 2 commits into
Conversation
PR #5829 added `AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR` to the condition setting `_PYBIND11_CROSSCOMPILING`. That gate was meant to only control the auto-default of `PYBIND11_USE_CROSSCOMPILING`, but it ended up overriding a value the project set explicitly. Emscripten/Pyodide defines `CMAKE_CROSSCOMPILING_EMULATOR` (node) yet still wants cross-compiling mode, so the flag was forced OFF and the build failed with a spurious "Cannot run the interpreter" / pointer-size mismatch. Move the emulator check up so it only guards the auto-default, and never override an explicitly set `PYBIND11_USE_CROSSCOMPILING`. Fixes #6043 Assisted-by: ClaudeCode:claude-opus-4.8
|
GPT 5.5 review in Codex: 🤖 AI text below 🤖 The change fixes respecting explicit cross-compiling settings with an emulator, but it regresses the intended CMP0190 default in normal top-level/add_subdirectory builds because the option default makes the variable defined before this file is included. Review comment:
|
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
|
Claude Opus 4.8: 🤖 AI text below 🤖 Good catch — fixed in 692b031. The The fix records, right before the if(NOT DEFINED PYBIND11_USE_CROSSCOMPILING)
set(_PYBIND11_USE_CROSSCOMPILING_DEFAULTED ON)
endif()
option(PYBIND11_USE_CROSSCOMPILING "Respect CMAKE_CROSSCOMPILING" OFF)and if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.1"
AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR
AND (NOT DEFINED PYBIND11_USE_CROSSCOMPILING OR _PYBIND11_USE_CROSSCOMPILING_DEFAULTED))This preserves all cases: explicit user value (any flow) respected; CMP0190 auto-default restored for |
Implemented with Claude Code Opus 4.8 (see linux kernel style trailer in commit messages)
🤖 AI text below 🤖
Description
Fixes #6043.
Cross-compiling to Emscripten/Pyodide (and any target that defines
CMAKE_CROSSCOMPILING_EMULATOR) broke with CMake ≥ 4.1 and pybind11 ≥ 3.0.2, failing with a spuriousCannot run the interpreter/ pointer-size mismatch.PR #5829 added
AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATORto the condition that sets the internal_PYBIND11_CROSSCOMPILINGflag. That check was meant only to gate whether pybind11 auto-defaultsPYBIND11_USE_CROSSCOMPILINGtoON, but it ended up overriding a value the project had set explicitly. Emscripten definesCMAKE_CROSSCOMPILING_EMULATOR(node) while still wanting cross-compiling mode, so the flag was forcedOFF.This moves the emulator check up so it only guards the auto-default (which also no longer fires if the project already set the variable), and restores the second condition to
CMAKE_CROSSCOMPILING AND PYBIND11_USE_CROSSCOMPILING. This is the fix proposed by the original PR author (@mhsmith) in the issue thread.Behavior preserved across all cases:
PYBIND11_USE_CROSSCOMPILING=ONexplicitly → respected →ONNEW, no emulator, variable unset) → still auto-defaults toONOFF→ respectedSuggested changelog entry:
PYBIND11_USE_CROSSCOMPILINGwhenCMAKE_CROSSCOMPILING_EMULATORis defined.