diff --git a/CMakeLists.txt b/CMakeLists.txt index bca0c22dc0..73c5928b1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/tools/pybind11Common.cmake b/tools/pybind11Common.cmake index 1311d3faf9..e215dd4582 100644 --- a/tools/pybind11Common.cmake +++ b/tools/pybind11Common.cmake @@ -43,16 +43,21 @@ set(pybind11_INCLUDE_DIRS # CMP0190 prohibits calling FindPython with both Interpreter and Development components # when cross-compiling, unless the CMAKE_CROSSCOMPILING_EMULATOR variable is defined. -if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.1") +# 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 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") endif() endif() -if(CMAKE_CROSSCOMPILING - AND PYBIND11_USE_CROSSCOMPILING - AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR) +if(CMAKE_CROSSCOMPILING AND PYBIND11_USE_CROSSCOMPILING) set(_PYBIND11_CROSSCOMPILING ON CACHE INTERNAL "")