CMake/Tests/RunCMake/FindPython/RunCMakeTest.cmake
2025-03-05 17:11:56 +01:00

368 lines
19 KiB
CMake

include(RunCMake)
if(RunCMake_BUILD_TYPE)
set(Python_BUILD_TYPE "${RunCMake_BUILD_TYPE}")
else()
set(Python_BUILD_TYPE "Release")
endif()
function(run_python test)
set(options_args CHECK_RESULT)
set(one_value_args TYPE ACTION VARIANT STRATEGY)
set(multi_value_args OPTIONS)
cmake_parse_arguments(PARSE_ARGV 1 RP "${options_args}" "${one_value_args}" "${multi_value_args}")
if(RP_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "run_python: unparsed arguments: ${RP_UNPARSED_ARGUMENTS}")
endif()
set(test_name "${test}")
if(RP_VARIANT)
string(APPEND test_name ".${RP_VARIANT}")
set(RunCMake_TEST_VARIANT_DESCRIPTION ".${RP_VARIANT}")
endif()
set(options ${RP_OPTIONS})
if(RP_STRATEGY)
string(APPEND test_name ".${RP_STRATEGY}")
string(APPEND RunCMake_TEST_VARIANT_DESCRIPTION ".${RP_STRATEGY}")
if (NOT RP_TYPE)
set(RP_TYPE ${test})
endif()
list(APPEND options -D${RP_TYPE}_FIND_STRATEGY=${RP_STRATEGY})
endif()
if(RP_TYPE)
list(APPEND options -DPYTHON=${RP_TYPE})
endif()
if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
list(APPEND options -DCMAKE_BUILD_TYPE=${Python_BUILD_TYPE})
endif()
if(RP_CHECK_RESULT)
set(RunCMake_TEST_EXPECT_RESULT 1)
file(READ "${RunCMake_SOURCE_DIR}/${test_name}-stderr.txt" RunCMake_TEST_EXPECT_stderr)
endif()
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test_name}-build")
if(options)
run_cmake_with_options(${test} ${options})
else()
run_cmake(${test})
endif()
if(NOT RP_ACTION)
return()
endif()
set(RunCMake_TEST_NO_CLEAN 1)
unset(RunCMake_TEST_VARIANT_DESCRIPTION)
run_cmake_command(${test_name}-build ${CMAKE_COMMAND} --build . --config ${Python_BUILD_TYPE})
if(RP_ACTION STREQUAL "BUILD")
return()
endif()
run_cmake_command(${test_name}-run ${CMAKE_CTEST_COMMAND} -C ${Python_BUILD_TYPE} -V)
endfunction()
function(run_python_with_virtualenv test)
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test}-build")
set(virtual_env "${RunCMake_TEST_BINARY_DIR}/py3venv")
run_cmake_with_options(${test} "-DPYTHON3_VIRTUAL_ENV=${virtual_env}")
set(RunCMake_TEST_NO_CLEAN 1)
set(tests Default Standard)
if(CMake_TEST_FindPython2)
list(APPEND tests Only)
endif()
if(test MATCHES "Conda")
set(RunCMake_TEST_VARIANT_DESCRIPTION ".Conda")
set(init_venv --unset=VIRTUAL_ENV "CONDA_PREFIX=${virtual_env}")
else()
set(RunCMake_TEST_VARIANT_DESCRIPTION ".CPython")
set(init_venv --unset=CONDA_PREFIX "VIRTUAL_ENV=${virtual_env}")
endif()
foreach(test IN LISTS tests)
run_cmake_script(VirtualEnv${test} -E env --unset=PYTHONHOME ${init_venv}
"${CMAKE_COMMAND}" "-DPYTHON3_VIRTUAL_ENV=${virtual_env}")
endforeach()
if(CMake_TEST_FindPython2)
string(APPEND RunCMake_TEST_VARIANT_DESCRIPTION ".Unset")
run_cmake_script(VirtualEnvOnly -E env --unset=PYTHONHOME --unset=VIRTUAL_ENV --unset=CONDA_PREFIX
"${CMAKE_COMMAND}")
endif()
endfunction()
macro(required_artifacts_check variant)
run_python(RequiredArtifactsCheck VARIANT ${variant}
OPTIONS "-DPYTHON_ARTIFACTS=${RunCMake_BINARY_DIR}/RequiredArtifacts-build/PythonArtifacts.cmake"
${ARGN})
endmacro()
function(required_artifacts)
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/RequiredArtifacts-build")
run_cmake_with_options(RequiredArtifacts "-DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}"
"-DCMake_TEST_FindPython3_SABIModule=${CMake_TEST_FindPython3_SABIModule}")
if(EXISTS "${RunCMake_TEST_BINARY_DIR}/PythonArtifacts.cmake")
required_artifacts_check("Interpreter.VALID" -DPYTHON_IS_FOUND=TRUE
-DCHECK_INTERPRETER=ON)
required_artifacts_check("Interpreter.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=INTERPRETER
-DCHECK_INTERPRETER=ON)
required_artifacts_check("Library.VALID" -DPYTHON_IS_FOUND=TRUE
-DCHECK_LIBRARY=ON)
required_artifacts_check("Library.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=LIBRARY
-DCHECK_LIBRARY=ON)
required_artifacts_check("Include.VALID" -DPYTHON_IS_FOUND=TRUE
-DCHECK_INCLUDE=ON)
required_artifacts_check("Include.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=INCLUDE
-DCHECK_INCLUDE=ON)
required_artifacts_check("Interpreter.VALID,Library.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=LIBRARY
-DCHECK_INTERPRETER=ON -DCHECK_LIBRARY=ON)
required_artifacts_check("Library.VALID,Include.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=INCLUDE
-DCHECK_LIBRARY=ON -DCHECK_INCLUDE=ON)
if (CMake_TEST_FindPython3_SABIModule AND WIN32)
required_artifacts_check("SABILibrary.VALID" -DPYTHON_IS_FOUND=TRUE
-DCHECK_SABI_LIBRARY=ON)
required_artifacts_check("SABILibrary.INVALID" -DPYTHON_IS_FOUND=FALSE -DINVALID_ARTIFACTS=SABI_LIBRARY
-DCHECK_SABI_LIBRARY=ON)
endif()
endif()
endfunction()
macro(custom_failure_message_check name components)
run_python(CustomFailureMessage VARIANT "${name}" CHECK_RESULT OPTIONS "-DCHECK_COMPONENTS=${components}" ${ARGN})
endmacro()
if(CMake_TEST_FindPython2_CPython)
run_cmake(Python2-BadComponent)
run_python(Python2Module ACTION RUN)
run_python(Python2Embedded ACTION RUN)
run_python(Python2 STRATEGY LOCATION ACTION RUN)
run_python(Python2 STRATEGY VERSION ACTION RUN)
run_python(Python STRATEGY LOCATION VARIANT V2 ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(Python STRATEGY VERSION VARIANT V2 OPTIONS ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(ExactVersion TYPE Python2 STRATEGY LOCATION VARIANT Python2
OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
run_python(ExactVersion TYPE Python2 STRATEGY VERSION VARIANT Python2
OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
run_python(ExactVersion TYPE Python STRATEGY LOCATION VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
run_python(ExactVersion TYPE Python STRATEGY VERSION VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2.1.2)
run_python(VersionRange TYPE Python2 STRATEGY LOCATION VARIANT Python2
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(VersionRange TYPE Python2 STRATEGY VERSION VARIANT Python2
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(CrossCompiling-CMP0190-OLD TYPE Python2 VARIANT Python2)
run_python(CrossCompiling-CMP0190-NEW TYPE Python2 VARIANT Python2 CHECK_RESULT)
run_python(CrossCompiling-CMP0190-OLD TYPE Python VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(CrossCompiling-CMP0190-NEW TYPE Python VARIANT Python.V2 CHECK_RESULT
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(CrossCompiling-HOST TYPE Python2 VARIANT Python2)
run_python(CrossCompiling-HOST TYPE Python VARIANT Python.V2
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 Python VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(CrossCompiling-BOTH TYPE Python2 VARIANT Python2)
run_python(CrossCompiling-BOTH TYPE Python VARIANT Python.V2
OPTIONS -DPython_REQUESTED_VERSION=2)
endif()
endif()
if(CMake_TEST_FindPython3_CPython)
run_cmake(Python3-BadComponent)
run_cmake(DifferentComponents)
run_python(Python3Module ACTION RUN)
if(NOT CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8)
run_python(Python3Embedded ACTION RUN)
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
run_cmake(UnversionedNames)
endif()
run_python(Python3 STRATEGY LOCATION ACTION RUN)
run_python(Python3 STRATEGY VERSION ACTION RUN)
run_python(Python STRATEGY LOCATION VARIANT V3 ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(Python STRATEGY VERSION VARIANT V3 ACTION RUN OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(ExactVersion TYPE Python3 STRATEGY LOCATION VARIANT Python3
OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
run_python(ExactVersion TYPE Python3 STRATEGY VERSION VARIANT Python3
OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
run_python(ExactVersion TYPE Python STRATEGY LOCATION VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
run_python(ExactVersion TYPE Python STRATEGY VERSION VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3.1.2)
run_python(VersionRange TYPE Python3 STRATEGY LOCATION VARIANT Python3
OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(VersionRange TYPE Python3 STRATEGY VERSION VARIANT Python3
OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3)
custom_failure_message_check("Interpreter" "Interpreter" -DPython3_EXECUTABLE=/not/found/interpreter)
custom_failure_message_check("Library" "Development" -DPython3_LIBRARY=/not/found/library)
custom_failure_message_check("Include" "Development" -DPython3_INCLUDE_DIR=/not/found/include)
custom_failure_message_check("Multiple" "Interpreter:Development" -DPython3_EXECUTABLE=/not/found/interpreter
-DPython3_LIBRARY=/not/found/library)
run_python(CrossCompiling-CMP0190-OLD TYPE Python3 VARIANT Python3)
run_python(CrossCompiling-CMP0190-NEW TYPE Python3 VARIANT Python3 CHECK_RESULT)
run_python(CrossCompiling-CMP0190-OLD TYPE Python VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(CrossCompiling-CMP0190-NEW TYPE Python VARIANT Python.V3 CHECK_RESULT
OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(CrossCompiling-HOST TYPE Python3 VARIANT Python3)
run_python(CrossCompiling-HOST TYPE Python VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3)
if(CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin" AND NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
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-BOTH TYPE Python3 VARIANT Python3)
run_python(CrossCompiling-BOTH TYPE Python VARIANT Python.V3
OPTIONS -DPython_REQUESTED_VERSION=3)
endif()
endif()
if(CMake_TEST_FindPython2_CPython OR CMake_TEST_FindPython3_CPython)
run_python(Python STRATEGY LOCATION VARIANT Python ACTION RUN)
run_python(Python STRATEGY VERSION VARIANT Python ACTION RUN)
endif()
if(CMake_TEST_FindPython2_IronPython)
run_python(IronPython TYPE Python2 STRATEGY LOCATION VARIANT IronPython2)
run_python(IronPython TYPE Python2 STRATEGY VERSION VARIANT IronPython2)
run_python(IronPython TYPE Python STRATEGY LOCATION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(IronPython TYPE Python STRATEGY VERSION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(VersionRange TYPE Python2 STRATEGY LOCATION VARIANT IronPython2
OPTIONS -DPython_REQUESTED_VERSION=2
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
run_python(VersionRange TYPE Python2 STRATEGY VERSION VARIANT IronPython2
OPTIONS -DPython_REQUESTED_VERSION=2
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT IronPython.V2
OPTIONS -DPython_REQUESTED_VERSION=2
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT IronPython.V2
OPTIONS -DPython_REQUESTED_VERSION=2
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
endif()
if(CMake_TEST_FindPython3_IronPython)
run_python(IronPython TYPE Python3 STRATEGY LOCATION VARIANT IronPython3)
run_python(IronPython TYPE Python3 STRATEGY VERSION VARIANT IronPython3)
run_python(IronPython TYPE Python STRATEGY LOCATION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(IronPython TYPE Python STRATEGY VERSION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(VersionRange TYPE Python3 STRATEGY LOCATION VARIANT IronPython3
OPTIONS -DPython_REQUESTED_VERSION=3
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
run_python(VersionRange TYPE Python3 STRATEGY VERSION VARIANT IronPython3
OPTIONS -DPython_REQUESTED_VERSION=3
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
run_python(VersionRange TYPE Python STRATEGY LOCATION VARIANT IronPython.V3
OPTIONS -DPython_REQUESTED_VERSION=3
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
run_python(VersionRange TYPE Python STRATEGY VERSION VARIANT IronPython.V3
OPTIONS -DPython_REQUESTED_VERSION=3
-DPython2_FIND_IMPLEMENTATIONS=IronPython)
endif()
if(CMake_TEST_FindPython2_IronPython OR CMake_TEST_FindPython3_IronPython)
run_python(IronPython TYPE Python STRATEGY LOCATION VARIANT IronPython)
run_python(IronPython TYPE Python STRATEGY VERSION VARIANT IronPython)
endif()
if (CMake_TEST_FindPython2 AND CMake_TEST_FindPython2_IronPython)
run_python(Implementation VARIANT CPython2 OPTIONS -DPython_REQUESTED_VERSION=2
-DPython_REQUESTED_IMPLEMENTATIONS=CPython)
run_python(Implementation VARIANT IronPython2 OPTIONS -DPython_REQUESTED_VERSION=2
-DPython_REQUESTED_IMPLEMENTATIONS=IronPython)
endif()
if (CMake_TEST_FindPython3 AND CMake_TEST_FindPython3_IronPython)
run_python(Implementation VARIANT CPython3 OPTIONS -DPython_REQUESTED_VERSION=3
-DPython_REQUESTED_IMPLEMENTATIONS=CPython)
run_python(Implementation VARIANT IronPython3 OPTIONS -DPython_REQUESTED_VERSION=3
-DPython_REQUESTED_IMPLEMENTATIONS=IronPython)
endif()
if(CMake_TEST_FindPython2_PyPy)
run_python(PyPy TYPE Python2 STRATEGY LOCATION VARIANT PyPy2)
run_python(PyPy TYPE Python2 STRATEGY VERSION VARIANT PyPy2)
run_python(PyPy TYPE Python STRATEGY LOCATION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
run_python(PyPy TYPE Python STRATEGY VERSION VARIANT V2 OPTIONS -DPython_REQUESTED_VERSION=2)
endif()
if(CMake_TEST_FindPython3_PyPy)
run_python(PyPy TYPE Python3 STRATEGY LOCATION VARIANT PyPy3)
run_python(PyPy TYPE Python3 STRATEGY VERSION VARIANT PyPy3)
run_python(PyPy TYPE Python STRATEGY LOCATION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
run_python(PyPy TYPE Python STRATEGY VERSION VARIANT V3 OPTIONS -DPython_REQUESTED_VERSION=3)
endif()
if(CMake_TEST_FindPython2_PyPy OR CMake_TEST_FindPython3_PyPy)
run_python(PyPy TYPE Python STRATEGY LOCATION VARIANT PyPy)
run_python(PyPy TYPE Python STRATEGY VERSION VARIANT PyPy)
endif()
if(CMake_TEST_FindPython_Various)
if(CMake_TEST_FindPython3)
run_python_with_virtualenv(VirtualEnv)
required_artifacts()
run_python(ArtifactsInteractive VARIANT "ON"
OPTIONS -DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy}
-DPython3_ARTIFACTS_INTERACTIVE=ON)
run_python(ArtifactsInteractive VARIANT "OFF"
OPTIONS -DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy}
-DPython3_ARTIFACTS_INTERACTIVE=OFF)
endif()
if(CMake_TEST_FindPython2 OR CMake_TEST_FindPython3)
if (CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
run_python(SOABI VARIANT "Interpreter" ACTION BUILD
OPTIONS -DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}
-DCMake_TEST_FindPython3=${CMake_TEST_FindPython3}
-DCMake_TEST_FindPython_COMPONENT=Interpreter)
run_python(SOABI VARIANT "Development" ACTION BUILD
OPTIONS -DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}
-DCMake_TEST_FindPython3=${CMake_TEST_FindPython3}
-DCMake_TEST_FindPython_COMPONENT=Development)
endif()
run_python(MultiplePackages ACTION RUN
OPTIONS -DCMake_TEST_FindPython2=${CMake_TEST_FindPython2}
-DCMake_TEST_FindPython3=${CMake_TEST_FindPython3})
endif()
if(CMake_TEST_FindPython2 AND CMake_TEST_FindPython3)
run_cmake(ArtifactsPrefix)
endif()
if(CMake_TEST_FindPython2_SABIModule)
run_cmake(Python2SABIModule)
endif()
if(CMake_TEST_FindPython3_SABIModule)
run_python(Python3SABIModule)
endif()
if(CMake_TEST_FindPython2_NumPy OR CMake_TEST_FindPython3_NumPy)
run_python(NumPy ACTION RUN
OPTIONS -DCMake_TEST_FindPython2_NumPy=${CMake_TEST_FindPython2_NumPy}
-DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy})
run_python(NumPyOnly ACTION RUN
OPTIONS -DCMake_TEST_FindPython2_NumPy=${CMake_TEST_FindPython2_NumPy}
-DCMake_TEST_FindPython3_NumPy=${CMake_TEST_FindPython3_NumPy})
if(CMake_TEST_FindPython3_NumPy)
custom_failure_message_check("NumPy" "Interpreter:Development:NumPy" -DPython3_NumPy_INCLUDE_DIR=/not/found/numpy/include)
endif()
endif()
if(CMake_TEST_FindPython3_Conda)
run_python_with_virtualenv(VirtualEnvConda)
endif()
endif()