mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-20 04:24:36 +08:00
FindPython: fix python compiler validation
Ensure also the cache of properties is erased in case of multiple searches. Fixes: #20626, #20627
This commit is contained in:
@@ -474,7 +474,7 @@ function (_PYTHON_VALIDATE_INTERPRETER)
|
|||||||
|
|
||||||
cmake_parse_arguments (PARSE_ARGV 0 _PVI "EXACT;CHECK_EXISTS" "" "")
|
cmake_parse_arguments (PARSE_ARGV 0 _PVI "EXACT;CHECK_EXISTS" "" "")
|
||||||
if (_PVI_UNPARSED_ARGUMENTS)
|
if (_PVI_UNPARSED_ARGUMENTS)
|
||||||
set (expected_version ${_PVI_UNPARSED_ARGUMENTS})
|
set (expected_version "${_PVI_UNPARSED_ARGUMENTS}")
|
||||||
else()
|
else()
|
||||||
unset (expected_version)
|
unset (expected_version)
|
||||||
endif()
|
endif()
|
||||||
@@ -585,18 +585,18 @@ function (_PYTHON_VALIDATE_INTERPRETER)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
function (_PYTHON_VALIDATE_COMPILER expected_version)
|
function (_PYTHON_VALIDATE_COMPILER)
|
||||||
if (NOT _${_PYTHON_PREFIX}_COMPILER)
|
if (NOT _${_PYTHON_PREFIX}_COMPILER)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_parse_arguments (_PVC "EXACT;CHECK_EXISTS" "" "" ${ARGN})
|
cmake_parse_arguments (PARSE_ARGV 0 _PVC "EXACT;CHECK_EXISTS" "" "")
|
||||||
if (_PVC_UNPARSED_ARGUMENTS)
|
if (_PVC_UNPARSED_ARGUMENTS)
|
||||||
set (major_version FALSE)
|
set (major_version FALSE)
|
||||||
set (expected_version ${_PVC_UNPARSED_ARGUMENTS})
|
set (expected_version "${_PVC_UNPARSED_ARGUMENTS}")
|
||||||
else()
|
else()
|
||||||
set (major_version TRUE)
|
set (major_version TRUE)
|
||||||
set (expected_version ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR})
|
set (expected_version "${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}")
|
||||||
set (_PVC_EXACT TRUE)
|
set (_PVC_EXACT TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -625,15 +625,15 @@ function (_PYTHON_VALIDATE_COMPILER expected_version)
|
|||||||
RESULT_VARIABLE result
|
RESULT_VARIABLE result
|
||||||
OUTPUT_VARIABLE version
|
OUTPUT_VARIABLE version
|
||||||
ERROR_QUIET)
|
ERROR_QUIET)
|
||||||
file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
|
file (REMOVE_RECURSE "${working_dir}")
|
||||||
|
if (result)
|
||||||
if (result OR (_PVC_EXACT AND NOT version VERSION_EQUAL expected_version) OR (version VERSION_LESS expected_version))
|
# compiler is not usable
|
||||||
# Compiler not usable or has wrong version
|
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
||||||
if (result)
|
set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
|
||||||
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
elseif ((_PVC_EXACT AND NOT version VERSION_EQUAL expected_version)
|
||||||
else()
|
OR NOT version VERSION_GREATER_EQUAL expected_version)
|
||||||
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
# Compiler has wrong version
|
||||||
endif()
|
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
||||||
set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
|
set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -963,7 +963,8 @@ unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
|
|||||||
|
|
||||||
# first step, search for the interpreter
|
# first step, search for the interpreter
|
||||||
if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
|
if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
|
||||||
list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_EXECUTABLE)
|
list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_EXECUTABLE
|
||||||
|
_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES)
|
||||||
if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
|
if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
|
||||||
list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
|
list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
|
||||||
endif()
|
endif()
|
||||||
|
@@ -1470,7 +1470,8 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
|
|||||||
add_subdirectory(GoogleTest)
|
add_subdirectory(GoogleTest)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMake_TEST_FindPython OR CMake_TEST_FindPython_NumPy OR CMake_TEST_FindPython_Conda)
|
if(CMake_TEST_FindPython OR CMake_TEST_FindPython_NumPy
|
||||||
|
OR CMake_TEST_FindPython_Conda OR CMake_TEST_FindPython_IronPython)
|
||||||
add_subdirectory(FindPython)
|
add_subdirectory(FindPython)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@@ -249,9 +249,9 @@ if(CMake_TEST_FindPython_NumPy)
|
|||||||
--build-options ${build_options}
|
--build-options ${build_options}
|
||||||
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMake_TEST_FindPython_Conda)
|
if(CMake_TEST_FindPython_Conda)
|
||||||
add_test(NAME FindPython.VirtualEnvConda COMMAND
|
add_test(NAME FindPython.VirtualEnvConda COMMAND
|
||||||
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
--build-and-test
|
--build-and-test
|
||||||
@@ -262,4 +262,68 @@ if(CMake_TEST_FindPython_NumPy)
|
|||||||
--build-options ${build_options}
|
--build-options ${build_options}
|
||||||
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CMake_TEST_FindPython_IronPython)
|
||||||
|
add_test(NAME FindPython.IronPython2.LOCATION COMMAND
|
||||||
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindPython/IronPython2"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindPython/IronPython2.LOCATION"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project TestIronPython2
|
||||||
|
--build-options ${build_options} -DPython2_FIND_STRATEGY=LOCATION
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
|
)
|
||||||
|
add_test(NAME FindPython.IronPython2.VERSION COMMAND
|
||||||
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindPython/IronPython2"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindPython/IronPython2.VERSION"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project TestIronPython2
|
||||||
|
--build-options ${build_options} -DPython2_FIND_STRATEGY=VERSION
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
|
)
|
||||||
|
|
||||||
|
add_test(NAME FindPython.IronPython.LOCATION COMMAND
|
||||||
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindPython/IronPython"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindPython/IronPython.LOCATION"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project TestIronPython
|
||||||
|
--build-options ${build_options} -DPython_FIND_STRATEGY=LOCATION
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
|
)
|
||||||
|
add_test(NAME FindPython.IronPython.VERSION COMMAND
|
||||||
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindPython/IronPython"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindPython/IronPython.VERSION"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project TestIronPython
|
||||||
|
--build-options ${build_options} -DPython_FIND_STRATEGY=VERSION
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
|
)
|
||||||
|
add_test(NAME FindPython.IronPython.V2.LOCATION COMMAND
|
||||||
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindPython/IronPython"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindPython/IronPython.V2.LOCATION"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project TestIronPython
|
||||||
|
--build-options ${build_options} -DPython_REQUESTED_VERSION=2 -DPython_FIND_STRATEGY=LOCATION
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
|
)
|
||||||
|
add_test(NAME FindPython.IronPython.V2.VERSION COMMAND
|
||||||
|
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||||
|
--build-and-test
|
||||||
|
"${CMake_SOURCE_DIR}/Tests/FindPython/IronPython"
|
||||||
|
"${CMake_BINARY_DIR}/Tests/FindPython/IronPython.V2.VERSION"
|
||||||
|
${build_generator_args}
|
||||||
|
--build-project TestIronPython
|
||||||
|
--build-options ${build_options} -DPython_REQUESTED_VERSION=2 -DPython_FIND_STRATEGY=VERSION
|
||||||
|
--test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
22
Tests/FindPython/IronPython/CMakeLists.txt
Normal file
22
Tests/FindPython/IronPython/CMakeLists.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.1)
|
||||||
|
|
||||||
|
project(TestIronPython C)
|
||||||
|
|
||||||
|
find_package(Python ${Python_REQUESTED_VERSION} REQUIRED COMPONENTS Interpreter Compiler)
|
||||||
|
if (NOT Python_FOUND)
|
||||||
|
message (FATAL_ERROR "Fail to found Python ${Python_REQUESTED_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT Python_Compiler_FOUND)
|
||||||
|
message (FATAL_ERROR "Fail to found Python Compiler")
|
||||||
|
endif()
|
||||||
|
if (NOT Python_COMPILER_ID STREQUAL "IronPython")
|
||||||
|
message (FATAL_ERROR "Erroneous compiler ID (${Python_COMPILER_ID})")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT TARGET Python::Interpreter)
|
||||||
|
message(SEND_ERROR "Python::Interpreter not found")
|
||||||
|
endif()
|
||||||
|
if(NOT TARGET Python::Compiler)
|
||||||
|
message(SEND_ERROR "Python::Interpreter not found")
|
||||||
|
endif()
|
22
Tests/FindPython/IronPython2/CMakeLists.txt
Normal file
22
Tests/FindPython/IronPython2/CMakeLists.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.1)
|
||||||
|
|
||||||
|
project(TestIronPython2 C)
|
||||||
|
|
||||||
|
find_package(Python2 REQUIRED COMPONENTS Interpreter Compiler)
|
||||||
|
if (NOT Python2_FOUND)
|
||||||
|
message (FATAL_ERROR "Fail to found Python 2")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT Python2_Compiler_FOUND)
|
||||||
|
message (FATAL_ERROR "Fail to found Python 2 Compiler")
|
||||||
|
endif()
|
||||||
|
if (NOT Python2_COMPILER_ID STREQUAL "IronPython")
|
||||||
|
message (FATAL_ERROR "Erroneous compiler ID (${Python2_COMPILER_ID})")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT TARGET Python2::Interpreter)
|
||||||
|
message(SEND_ERROR "Python2::Interpreter not found")
|
||||||
|
endif()
|
||||||
|
if(NOT TARGET Python2::Compiler)
|
||||||
|
message(SEND_ERROR "Python2::Compiler not found")
|
||||||
|
endif()
|
Reference in New Issue
Block a user