diff --git a/Help/release/dev/FindPython-CROSSCOMPILING_EMULATOR.rst b/Help/release/dev/FindPython-CROSSCOMPILING_EMULATOR.rst new file mode 100644 index 0000000000..af591d3752 --- /dev/null +++ b/Help/release/dev/FindPython-CROSSCOMPILING_EMULATOR.rst @@ -0,0 +1,8 @@ +FindPython-CROSSCOMPILING_EMULATOR +---------------------------------- + +* The :module:`FindPython`, :module:`FindPython2`, and :module:`FindPython3` + modules gained the possibility to override the + :variable:`CMAKE_CROSSCOMPILING_EMULATOR` variable by respectively, the + variables ``Python_CROSSCOMPILING_EMULATOR``, + ``Python2_CROSSCOMPILING_EMULATOR``, and ``Python3_CROSSCOMPILING_EMULATOR``. diff --git a/Modules/FindPython.cmake b/Modules/FindPython.cmake index 3734ed9cd4..44a6b8dee7 100644 --- a/Modules/FindPython.cmake +++ b/Modules/FindPython.cmake @@ -652,6 +652,19 @@ can be controlled with the following variable: ``_FOUND`` variables (i.e. without the custom prefix) are also defined by each call to the :command:`find_package` command. +``Python_CROSSCOMPILING_EMULATOR`` + .. versionadded:: 4.5 + + This variable is only used when the :variable:`CMAKE_CROSSCOMPILING` variable + is on and the policy :policy:`CMP0190` is ``NEW``. It should point to a + command on the host system that can run executable built for the target + system. This variable takes precedence over the + :variable:`CMAKE_CROSSCOMPILING_EMULATOR` variable. + + Moreover, to support some specific cases (like + `crossenv `_), it is possible to set an + empty string to this variable. + Commands ^^^^^^^^ diff --git a/Modules/FindPython/Support.cmake b/Modules/FindPython/Support.cmake index 0858217766..81dde3c8ed 100644 --- a/Modules/FindPython/Support.cmake +++ b/Modules/FindPython/Support.cmake @@ -1034,7 +1034,7 @@ function (_PYTHON_GET_LAUNCHER _PYTHON_PGL_NAME) endif() if (_${_PYTHON_PREFIX}_CROSSCOMPILING) - set (${_PYTHON_PGL_NAME} "${CMAKE_CROSSCOMPILING_EMULATOR}" PARENT_SCOPE) + set (${_PYTHON_PGL_NAME} "${_${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR}" PARENT_SCOPE) return() endif() @@ -1642,16 +1642,23 @@ endif() ## handle cross-compiling constraints for components: ## If Interpreter and/or Compiler are specified with Development components -## the CMAKE_CROSSCOMPILING_EMULATOR variable should be defined +## the Python_CROSSCOMPILING_EMULATOR or CMAKE_CROSSCOMPILING_EMULATOR variable +## should be defined cmake_policy (GET CMP0190 _${_PYTHON_PREFIX}_CROSSCOMPILING_POLICY) unset (_${_PYTHON_PREFIX}_CROSSCOMPILING) +unset (_${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR) if (CMAKE_CROSSCOMPILING AND _${_PYTHON_PREFIX}_CROSSCOMPILING_POLICY STREQUAL "NEW") if (${_PYTHON_BASE}_FIND_COMPONENTS MATCHES "Interpreter|Compiler" AND ${_PYTHON_BASE}_FIND_COMPONENTS MATCHES "Development") - if (CMAKE_CROSSCOMPILING_EMULATOR) + if (DEFINED ${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR OR CMAKE_CROSSCOMPILING_EMULATOR) set (_${_PYTHON_PREFIX}_CROSSCOMPILING TRUE) + if (DEFINED ${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR) + set (_${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR "${${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR}") + else() + set (_${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR "${CMAKE_CROSSCOMPILING_EMULATOR}") + endif() else() - _python_display_failure ("${_PYTHON_PREFIX}: When cross-compiling, Interpreter and/or Compiler components cannot be searched when CMAKE_CROSSCOMPILING_EMULATOR variable is not specified (see policy CMP0190)." FATAL) + _python_display_failure ("${_PYTHON_PREFIX}: When cross-compiling, Interpreter and/or Compiler components cannot be searched when ${_PYTHON_PREFIX}_CROSSCOMPILING_EMULATOR or CMAKE_CROSSCOMPILING_EMULATOR variable is not specified (see policy CMP0190)." FATAL) endif() endif() endif() diff --git a/Modules/FindPython2.cmake b/Modules/FindPython2.cmake index adcfe63de8..6d0eb67df5 100644 --- a/Modules/FindPython2.cmake +++ b/Modules/FindPython2.cmake @@ -497,6 +497,19 @@ can be controlled with the following variable: ``_FOUND`` variables (i.e. without the custom prefix) are also defined by each call to the :command:`find_package` command. +``Python2_CROSSCOMPILING_EMULATOR`` + .. versionadded:: 4.5 + + This variable is only used when the :variable:`CMAKE_CROSSCOMPILING` variable + is on and the policy :policy:`CMP0190` is ``NEW``. It should point to a + command on the host system that can run executable built for the target + system. This variable takes precedence over the + :variable:`CMAKE_CROSSCOMPILING_EMULATOR` variable. + + Moreover, to support some specific cases (like + `crossenv `_), it is possible to set an + empty string to this variable. + Commands ^^^^^^^^ diff --git a/Modules/FindPython3.cmake b/Modules/FindPython3.cmake index c8c3ba8ceb..5b8de7e6f5 100644 --- a/Modules/FindPython3.cmake +++ b/Modules/FindPython3.cmake @@ -651,6 +651,19 @@ can be controlled with the following variable: ``_FOUND`` variables (i.e. without the custom prefix) are also defined by each call to the :command:`find_package` command. +``Python3_CROSSCOMPILING_EMULATOR`` + .. versionadded:: 4.5 + + This variable is only used when the :variable:`CMAKE_CROSSCOMPILING` variable + is on and the policy :policy:`CMP0190` is ``NEW``. It should point to a + command on the host system that can run executable built for the target + system. This variable takes precedence over the + :variable:`CMAKE_CROSSCOMPILING_EMULATOR` variable. + + Moreover, to support some specific cases (like + `crossenv `_), it is possible to set an + empty string to this variable. + Commands ^^^^^^^^ diff --git a/Tests/RunCMake/FindPython/CrossCompiling-BOTH.cmake b/Tests/RunCMake/FindPython/CrossCompiling-BOTH.cmake index 3f7cfee25a..e8b6fca7af 100644 --- a/Tests/RunCMake/FindPython/CrossCompiling-BOTH.cmake +++ b/Tests/RunCMake/FindPython/CrossCompiling-BOTH.cmake @@ -12,22 +12,25 @@ unset(${PYTHON}_ARTIFACTS_PREFIX) # Search cross-compilation artifacts -## First, built an pseudo-emulator -set(PSEUDO_EMULATOR_DIR "${CMAKE_CURRENT_BINARY_DIR}/pseudo_emulator") -file(MAKE_DIRECTORY "${PSEUDO_EMULATOR_DIR}") +if (NOT DEFINED ${PYTHON}_CROSSCOMPILING_EMULATOR) + ## First, built an pseudo-emulator + set(PSEUDO_EMULATOR_DIR "${CMAKE_CURRENT_BINARY_DIR}/pseudo_emulator") -execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release - -S "${CMAKE_CURRENT_SOURCE_DIR}/pseudo_emulator" - -B "${PSEUDO_EMULATOR_DIR}" - COMMAND_ERROR_IS_FATAL ANY) + file(MAKE_DIRECTORY "${PSEUDO_EMULATOR_DIR}") -execute_process(COMMAND "${CMAKE_COMMAND}" --build "${PSEUDO_EMULATOR_DIR}" - COMMAND_ERROR_IS_FATAL ANY) + execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release + -S "${CMAKE_CURRENT_SOURCE_DIR}/pseudo_emulator" + -B "${PSEUDO_EMULATOR_DIR}" + COMMAND_ERROR_IS_FATAL ANY) + + execute_process(COMMAND "${CMAKE_COMMAND}" --build "${PSEUDO_EMULATOR_DIR}" + COMMAND_ERROR_IS_FATAL ANY) + + ## Now, configure this pseudo-emulator + set(CMAKE_CROSSCOMPILING_EMULATOR "${PSEUDO_EMULATOR_DIR}/pseudo_emulator") +endif() -## Now, configure this pseudo-emulator set(CMAKE_CROSSCOMPILING TRUE) -set(CMAKE_CROSSCOMPILING_EMULATOR "${PSEUDO_EMULATOR_DIR}/pseudo_emulator") - find_package(${PYTHON} ${Python_REQUESTED_VERSION} REQUIRED COMPONENTS Interpreter Development) diff --git a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V2-stderr.txt b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V2-stderr.txt index 7dd7d85c31..30ba86662c 100644 --- a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V2-stderr.txt +++ b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V2-stderr.txt @@ -1,4 +1,5 @@ CMake Error at .+/Support\.cmake:[0-9]+ \(message\): Python: When cross-compiling, Interpreter and/or Compiler components cannot - be searched when CMAKE_CROSSCOMPILING_EMULATOR variable is not specified - \(see policy CMP0190\)\. + be searched when Python_CROSSCOMPILING_EMULATOR or + CMAKE_CROSSCOMPILING_EMULATOR variable is not specified \(see policy + CMP0190\)\. diff --git a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V3-stderr.txt b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V3-stderr.txt index 7dd7d85c31..30ba86662c 100644 --- a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V3-stderr.txt +++ b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python.V3-stderr.txt @@ -1,4 +1,5 @@ CMake Error at .+/Support\.cmake:[0-9]+ \(message\): Python: When cross-compiling, Interpreter and/or Compiler components cannot - be searched when CMAKE_CROSSCOMPILING_EMULATOR variable is not specified - \(see policy CMP0190\)\. + be searched when Python_CROSSCOMPILING_EMULATOR or + CMAKE_CROSSCOMPILING_EMULATOR variable is not specified \(see policy + CMP0190\)\. diff --git a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python2-stderr.txt b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python2-stderr.txt index f2096d2736..639a3cad1e 100644 --- a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python2-stderr.txt +++ b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python2-stderr.txt @@ -1,4 +1,5 @@ CMake Error at .+/Support\.cmake:[0-9]+ \(message\): Python2: When cross-compiling, Interpreter and/or Compiler components - cannot be searched when CMAKE_CROSSCOMPILING_EMULATOR variable is not - specified \(see policy CMP0190\)\. + cannot be searched when Python2_CROSSCOMPILING_EMULATOR or + CMAKE_CROSSCOMPILING_EMULATOR variable is not specified \(see policy + CMP0190\)\. diff --git a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python3-stderr.txt b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python3-stderr.txt index 3347d3a08a..00b23ff3ad 100644 --- a/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python3-stderr.txt +++ b/Tests/RunCMake/FindPython/CrossCompiling-CMP0190-NEW.Python3-stderr.txt @@ -1,4 +1,5 @@ CMake Error at .+/Support\.cmake:[0-9]+ \(message\): Python3: When cross-compiling, Interpreter and/or Compiler components - cannot be searched when CMAKE_CROSSCOMPILING_EMULATOR variable is not - specified \(see policy CMP0190\)\. + cannot be searched when Python3_CROSSCOMPILING_EMULATOR or + CMAKE_CROSSCOMPILING_EMULATOR variable is not specified \(see policy + CMP0190\)\. diff --git a/Tests/RunCMake/FindPython/CrossCompiling-TARGET.cmake b/Tests/RunCMake/FindPython/CrossCompiling-TARGET.cmake index e2726191ae..5861976eb8 100644 --- a/Tests/RunCMake/FindPython/CrossCompiling-TARGET.cmake +++ b/Tests/RunCMake/FindPython/CrossCompiling-TARGET.cmake @@ -2,22 +2,24 @@ cmake_policy(SET CMP0190 NEW) enable_language(C) -## First, built an pseudo-emulator -set(PSEUDO_EMULATOR_DIR "${CMAKE_CURRENT_BINARY_DIR}/pseudo_emulator") +if (NOT DEFINED ${PYTHON}_CROSSCOMPILING_EMULATOR) + ## First, built an pseudo-emulator + set(PSEUDO_EMULATOR_DIR "${CMAKE_CURRENT_BINARY_DIR}/pseudo_emulator") -file(MAKE_DIRECTORY "${PSEUDO_EMULATOR_DIR}") + file(MAKE_DIRECTORY "${PSEUDO_EMULATOR_DIR}") -execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release - -S "${CMAKE_CURRENT_SOURCE_DIR}/pseudo_emulator" - -B "${PSEUDO_EMULATOR_DIR}" - COMMAND_ERROR_IS_FATAL ANY) + execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release + -S "${CMAKE_CURRENT_SOURCE_DIR}/pseudo_emulator" + -B "${PSEUDO_EMULATOR_DIR}" + COMMAND_ERROR_IS_FATAL ANY) -execute_process(COMMAND "${CMAKE_COMMAND}" --build "${PSEUDO_EMULATOR_DIR}" - COMMAND_ERROR_IS_FATAL ANY) + execute_process(COMMAND "${CMAKE_COMMAND}" --build "${PSEUDO_EMULATOR_DIR}" + COMMAND_ERROR_IS_FATAL ANY) + + ## Now, configure this pseudo-emulator + set(CMAKE_CROSSCOMPILING_EMULATOR "${PSEUDO_EMULATOR_DIR}/pseudo_emulator") +endif() -## Now, configure this pseudo-emulator set(CMAKE_CROSSCOMPILING TRUE) -set(CMAKE_CROSSCOMPILING_EMULATOR "${PSEUDO_EMULATOR_DIR}/pseudo_emulator") - find_package(${PYTHON} ${Python_REQUESTED_VERSION} REQUIRED COMPONENTS Interpreter Development) diff --git a/Tests/RunCMake/FindPython/RunCMakeTest.cmake b/Tests/RunCMake/FindPython/RunCMakeTest.cmake index 1719069079..9bd1b8b1ac 100644 --- a/Tests/RunCMake/FindPython/RunCMakeTest.cmake +++ b/Tests/RunCMake/FindPython/RunCMakeTest.cmake @@ -167,11 +167,21 @@ if(CMake_TEST_FindPython2_CPython) OPTIONS -DPython_REQUESTED_VERSION=2) if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin" AND NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) run_python(CrossCompiling-TARGET TYPE Python2 VARIANT Python2) + run_python(CrossCompiling-TARGET TYPE Python2 VARIANT Python2.crossenv + OPTIONS "-DPython2_CROSSCOMPILING_EMULATOR=") run_python(CrossCompiling-TARGET TYPE Python VARIANT Python.V2 OPTIONS -DPython_REQUESTED_VERSION=2) + run_python(CrossCompiling-TARGET TYPE Python VARIANT Python.V2.crossenv + OPTIONS -DPython_REQUESTED_VERSION=2 + "-DPython_CROSSCOMPILING_EMULATOR=") run_python(CrossCompiling-BOTH TYPE Python2 VARIANT Python2) + run_python(CrossCompiling-BOTH TYPE Python2 VARIANT Python2.crossenv + OPTIONS "-DPython2_CROSSCOMPILING_EMULATOR=") run_python(CrossCompiling-BOTH TYPE Python VARIANT Python.V2 OPTIONS -DPython_REQUESTED_VERSION=2) + run_python(CrossCompiling-BOTH TYPE Python VARIANT Python.V2.crossenv + OPTIONS -DPython_REQUESTED_VERSION=2 + "-DPython_CROSSCOMPILING_EMULATOR=") endif() endif() @@ -225,9 +235,19 @@ if(CMake_TEST_FindPython3_CPython) run_python(CrossCompiling-TARGET TYPE Python3 VARIANT Python3) run_python(CrossCompiling-TARGET TYPE Python VARIANT Python.V3 OPTIONS -DPython_REQUESTED_VERSION=3) + run_python(CrossCompiling-TARGET TYPE Python3 VARIANT Python3.crossenv + OPTIONS "-DPython3_CROSSCOMPILING_EMULATOR=") + run_python(CrossCompiling-TARGET TYPE Python VARIANT Python.V3.crossenv + OPTIONS -DPython_REQUESTED_VERSION=3 + "-DPython_CROSSCOMPILING_EMULATOR=") run_python(CrossCompiling-BOTH TYPE Python3 VARIANT Python3) + run_python(CrossCompiling-BOTH TYPE Python3 VARIANT Python3.crossenv + OPTIONS "-DPython3_CROSSCOMPILING_EMULATOR=") run_python(CrossCompiling-BOTH TYPE Python VARIANT Python.V3 OPTIONS -DPython_REQUESTED_VERSION=3) + run_python(CrossCompiling-BOTH TYPE Python VARIANT Python.V3.crossenv + OPTIONS -DPython_REQUESTED_VERSION=3 + "-DPython_CROSSCOMPILING_EMULATOR=") endif() endif()