FindPython module encountering index out of bounds error
I am encountering an index out of bounds error related to the FindPython module Support.cmake assuming all fields are not empty during list(GET) lookup. Lines 1870-1887, CMAKE v3.25.1.
set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 0 ${_PYTHON_PREFIX}_INTERPRETER_ID)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 1 ${_PYTHON_PREFIX}_VERSION_MAJOR)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 2 ${_PYTHON_PREFIX}_VERSION_MINOR)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 3 ${_PYTHON_PREFIX}_VERSION_PATCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 4 _${_PYTHON_PREFIX}_ARCH)
set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 5 _${_PYTHON_PREFIX}_ABIFLAGS)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 6 ${_PYTHON_PREFIX}_SOABI)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 7 ${_PYTHON_PREFIX}_STDLIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_STDARCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_SITELIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_SITEARCH)
In my environment, index 5 is empty and thus the old CMAKE policy ends up trimming the list to 9 values. This results in the error message:
CMake Error at C:/Program Files/CMake/share/cmake-3.25/Modules/FindPython/Support.cmake:1887 (list):
list index: 10 out of range (-10, 9)
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.25/Modules/FindPython.cmake:519 (include)
D:/vcpkg/gtsam/scripts/buildsystems/vcpkg.cmake:843 (_find_package)
wrap/cmake/GtwrapUtils.cmake:96 (find_package)
wrap/CMakeLists.txt:11 (gtwrap_get_python_version)
Earlier in the output, there is a CMAKE warning with regards to the CMP0007 policy:
CMake Warning (dev) at C:/Program Files/CMake/share/cmake-3.25/Modules/FindPython/Support.cmake:1887 (list):
Policy CMP0007 is not set: list command no longer ignores empty elements.
Run "cmake --help-policy CMP0007" for policy details. Use the cmake_policy
command to set the policy and suppress this warning. List has value =
[Python;3;9;5;64;;cp39-win_amd64;C:\Python39\Lib;C:\Python39\Lib;C:\Python39\Lib\site-packages;C:\Python39\Lib\site-packages].
Call Stack (most recent call first):
C:/Program Files/CMake/share/cmake-3.25/Modules/FindPython.cmake:519 (include)
D:/vcpkg/gtsam/scripts/buildsystems/vcpkg.cmake:843 (_find_package)
wrap/cmake/GtwrapUtils.cmake:96 (find_package)
wrap/CMakeLists.txt:11 (gtwrap_get_python_version)
This warning is for project developers. Use -Wno-dev to suppress it.
Notably, this is probably an issue caused by my hastily set up environment, but the issue is still valid. If I change the code to add a block guard, and specifically use the NEW CMP0007 policy, I no longer have this issue:
block(SCOPE_FOR POLICIES)
cmake_policy(SET CMP0007 NEW)
set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 0 ${_PYTHON_PREFIX}_INTERPRETER_ID)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 1 ${_PYTHON_PREFIX}_VERSION_MAJOR)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 2 ${_PYTHON_PREFIX}_VERSION_MINOR)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 3 ${_PYTHON_PREFIX}_VERSION_PATCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 4 _${_PYTHON_PREFIX}_ARCH)
set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 5 _${_PYTHON_PREFIX}_ABIFLAGS)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 6 ${_PYTHON_PREFIX}_SOABI)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 7 ${_PYTHON_PREFIX}_STDLIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_STDARCH)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_SITELIB)
list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_SITEARCH)
endblock()
The above implementation is probably not ideal, but expresses the issue and a path forward. Thank you all for your time and awesomeness!