mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-19 19:43:23 +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" "" "")
|
||||
if (_PVI_UNPARSED_ARGUMENTS)
|
||||
set (expected_version ${_PVI_UNPARSED_ARGUMENTS})
|
||||
set (expected_version "${_PVI_UNPARSED_ARGUMENTS}")
|
||||
else()
|
||||
unset (expected_version)
|
||||
endif()
|
||||
@@ -585,18 +585,18 @@ function (_PYTHON_VALIDATE_INTERPRETER)
|
||||
endfunction()
|
||||
|
||||
|
||||
function (_PYTHON_VALIDATE_COMPILER expected_version)
|
||||
function (_PYTHON_VALIDATE_COMPILER)
|
||||
if (NOT _${_PYTHON_PREFIX}_COMPILER)
|
||||
return()
|
||||
endif()
|
||||
|
||||
cmake_parse_arguments (_PVC "EXACT;CHECK_EXISTS" "" "" ${ARGN})
|
||||
cmake_parse_arguments (PARSE_ARGV 0 _PVC "EXACT;CHECK_EXISTS" "" "")
|
||||
if (_PVC_UNPARSED_ARGUMENTS)
|
||||
set (major_version FALSE)
|
||||
set (expected_version ${_PVC_UNPARSED_ARGUMENTS})
|
||||
set (expected_version "${_PVC_UNPARSED_ARGUMENTS}")
|
||||
else()
|
||||
set (major_version TRUE)
|
||||
set (expected_version ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR})
|
||||
set (expected_version "${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}")
|
||||
set (_PVC_EXACT TRUE)
|
||||
endif()
|
||||
|
||||
@@ -625,15 +625,15 @@ function (_PYTHON_VALIDATE_COMPILER expected_version)
|
||||
RESULT_VARIABLE result
|
||||
OUTPUT_VARIABLE version
|
||||
ERROR_QUIET)
|
||||
file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
|
||||
|
||||
if (result OR (_PVC_EXACT AND NOT version VERSION_EQUAL expected_version) OR (version VERSION_LESS expected_version))
|
||||
# Compiler not usable or has wrong version
|
||||
if (result)
|
||||
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
||||
else()
|
||||
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
||||
endif()
|
||||
file (REMOVE_RECURSE "${working_dir}")
|
||||
if (result)
|
||||
# compiler is not usable
|
||||
set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
|
||||
set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
|
||||
elseif ((_PVC_EXACT AND NOT version VERSION_EQUAL expected_version)
|
||||
OR NOT version VERSION_GREATER_EQUAL expected_version)
|
||||
# Compiler has wrong version
|
||||
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")
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -963,7 +963,8 @@ unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
|
||||
|
||||
# first step, search for the interpreter
|
||||
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)
|
||||
list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
|
||||
endif()
|
||||
|
@@ -1470,7 +1470,8 @@ ${CMake_SOURCE_DIR}/Utilities/Release/push.bash --dir dev -- '${CMake_BUILD_NIGH
|
||||
add_subdirectory(GoogleTest)
|
||||
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)
|
||||
endif()
|
||||
|
||||
|
@@ -249,9 +249,9 @@ if(CMake_TEST_FindPython_NumPy)
|
||||
--build-options ${build_options}
|
||||
--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
|
||||
${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
|
||||
--build-and-test
|
||||
@@ -262,4 +262,68 @@ if(CMake_TEST_FindPython_NumPy)
|
||||
--build-options ${build_options}
|
||||
--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