Skip to content

Commit c84d33b

Browse files
committed
COMP: Updating to find_package(Python3)
Now that cmake FindPython3 can be universally used, prefer to only use that set of variable names for identifying the python executables. Intial procesing with manual cleanup by: ITK/Utilities/Maintenance/FindPython3_ModernizeCMake.sh Finding the correct python version should always respect the Python3_ROOT_DIR variable provided during building.
1 parent 94e4144 commit c84d33b

File tree

116 files changed

+180
-351
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+180
-351
lines changed

CMake/FindNumPy.cmake

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,10 @@
1717
# all listed variables are TRUE
1818

1919
if(NOT NUMPY_FOUND)
20-
find_package(PythonInterp)
21-
find_package(PythonLibs)
20+
find_package(Python3 COMPONENTS Interpreter Development)
2221

23-
if(PYTHON_EXECUTABLE)
24-
execute_process(COMMAND "${PYTHON_EXECUTABLE}"
22+
if(Python3_EXECUTABLE)
23+
execute_process(COMMAND "${Python3_EXECUTABLE}"
2524
-c "import numpy; print(numpy.get_include())"
2625
OUTPUT_VARIABLE _numpy_include_dir
2726
OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -30,9 +29,11 @@ if(NOT NUMPY_FOUND)
3029
endif()
3130
endif()
3231

32+
set(_numpy_search_paths ${Python3_INCLUDE_DIRS})
33+
list(prepend _numpy_search_paths "${_numpy_include_dir}")
3334
find_path(NUMPY_INCLUDE_DIR
3435
numpy/arrayobject.h
35-
PATHS "${_numpy_include_dir}" "${PYTHON_INCLUDE_DIR}"
36+
PATHS ${_numpy_search_paths}
3637
PATH_SUFFIXES numpy/core/include
3738
)
3839

CMake/FindPythonInterp.cmake

Lines changed: 0 additions & 120 deletions
This file was deleted.

CMake/FindSphinx.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
# SPHINX_FOUND
77

88
set(_python_paths )
9-
find_package(PythonInterp)
10-
if(PYTHON_EXECUTABLE)
11-
get_filename_component(_python_dir "${PYTHON_EXECUTABLE}" DIRECTORY)
9+
find_package(Python3 COMPONENTS Interpreter)
10+
if(Python3_EXECUTABLE)
11+
get_filename_component(_python_dir "${Python3_EXECUTABLE}" DIRECTORY)
1212
list(APPEND _python_paths
1313
"${_python_dir}"
1414
"${_python_dir}/bin"

CMake/ITKDoxygenTAG.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
set(ITKDoxygenTAG_DIR ${CMAKE_BINARY_DIR}/ITKDoxygenTAG)
22
set(ITKDoxygenTAG_TEMP_DIR ${CMAKE_BINARY_DIR}/ITKDoxygenTAG-TEMP)
33

4-
find_package(PythonInterp REQUIRED)
4+
find_package(Python3 COMPONENTS Interpreter REQUIRED)
55

66
add_custom_command(OUTPUT ${ITKDoxygenTAG_DIR}/InsightDoxygen.tag
77
COMMAND ${CMAKE_COMMAND} -DITKDoxygenTAG_TEMP_DIR="${ITKDoxygenTAG_TEMP_DIR}" -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/DownloadDoxygenTAG.cmake
8-
COMMAND ${PYTHON_EXECUTABLE} "${ITKSphinxExamples_SOURCE_DIR}/Utilities/GUnzip.py" "${ITKDoxygenTAG_TEMP_DIR}/InsightDoxygen.tag.gz"
8+
COMMAND ${Python3_EXECUTABLE} "${ITKSphinxExamples_SOURCE_DIR}/Utilities/GUnzip.py" "${ITKDoxygenTAG_TEMP_DIR}/InsightDoxygen.tag.gz"
99

1010
COMMAND ${CMAKE_COMMAND} -E remove_directory "${ITKDoxygenTAG_DIR}"
1111
COMMAND ${CMAKE_COMMAND} -E rename "${ITKDoxygenTAG_TEMP_DIR}" "${ITKDoxygenTAG_DIR}"

CMake/ITKSphinxExamplesMacros.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ macro(add_module_archives _module_name)
3535
get_filename_component(_example_parent_name ${_example_parent_path} NAME)
3636
set(_archive_target ${_example_parent_name}_${_example_name}_DownloadableArchive)
3737
add_custom_target(${_archive_target}
38-
COMMAND ${PYTHON_EXECUTABLE} ${ITKSphinxExamples_SOURCE_DIR}/Utilities/CreateDownloadableArchive.py
38+
COMMAND ${Python3_EXECUTABLE} ${ITKSphinxExamples_SOURCE_DIR}/Utilities/CreateDownloadableArchive.py
3939
${_example_name} ${SPHINX_DESTINATION}
4040
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_example_parent_name}
4141
COMMENT "Creating downloadable archive for ${_example_name}"

CMakeLists.txt

Lines changed: 15 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,21 @@ foreach(link ${content_links})
138138
endforeach()
139139
ExternalData_Add_Target(ITKSphinxExamplesData)
140140

141-
if(${ITK_WRAP_PYTHON})
142-
# Use the same Python interpreter as ITK to run the tests.
143-
find_package(PythonInterp ${ITK_WRAP_PYTHON_VERSION} REQUIRED)
144-
mark_as_advanced(PYTHON_EXECUTABLE)
141+
set(PYTHON_REQUIRED_VERSION 3.7)
142+
set(Python_ADDITIONAL_VERSIONS 3.12 3.11 3.10 3.9 3.8 3.7)
143+
if(BUILD_TESTING OR ITK_BUILD_DOCUMENTATION OR ITK_WRAP_PYTHON)
144+
if(ITK_WRAP_PYTHON)
145+
# Use the same Python interpreter as ITK to run the tests.
146+
find_package(Python3 ${ITK_WRAP_PYTHON_VERSION} EXACT COMPONENTS Interpreter REQUIRED)
147+
mark_as_advanced(Python3_EXECUTABLE)
148+
else()
149+
find_package(Python3 ${PYTHON_REQUIRED_VERSION} COMPONENTS Interpreter)
150+
endif()
145151
endif()
146-
find_package(PythonInterp)
147-
if(PYTHON_EXECUTABLE AND NOT ITK_WRAP_PYTHON)
148-
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import itk"
152+
153+
if(Python3_EXECUTABLE AND NOT ITK_WRAP_PYTHON)
154+
# See if external ITK python packages are installed for this python environment
155+
execute_process(COMMAND ${Python3_EXECUTABLE} -c "import itk"
149156
RESULT_VARIABLE _have_itk_return_code
150157
OUTPUT_QUIET
151158
ERROR_QUIET
@@ -154,62 +161,6 @@ if(PYTHON_EXECUTABLE AND NOT ITK_WRAP_PYTHON)
154161
set(ITK_WRAP_PYTHON 1)
155162
endif()
156163
endif()
157-
if(BUILD_TESTING OR ITK_BUILD_DOCUMENTATION OR ITK_WRAP_PYTHON)
158-
# Prefer to use more robust FindPython3 module if greater than cmake 3.12.0
159-
if("${CMAKE_VERSION}" VERSION_LESS_EQUAL "3.12.0")
160-
# Use of PythonInterp and PythonLibs is deprecated since cmake version 3.12.0
161-
# Only use deprecated mechanisms for older versions of cmake
162-
set(Python_ADDITIONAL_VERSIONS 3.9 3.8 3.7 3.6 3.5)
163-
find_package(PythonInterp)
164-
if(ITK_WRAP_PYTHON)
165-
find_package(PythonLibs REQUIRED)
166-
# check for version mismatch.
167-
if(PYTHONLIBS_FOUND AND PYTHONINTERP_FOUND
168-
AND NOT(PYTHON_VERSION_STRING VERSION_EQUAL PYTHONLIBS_VERSION_STRING))
169-
message(FATAL_ERROR "Python executable (\"${PYTHON_VERSION_STRING}\") and library (\"${PYTHONLIBS_VERSION_STRING}\") version mismatch.")
170-
endif()
171-
endif()
172-
if(PYTHON_VERSION_STRING VERSION_LESS 3.5)
173-
# if python version is less than 3.5, unset so that it appears that no python version is found.
174-
# to emulate the same behavior as find(Python3 ..) from cmake 3.12.0+
175-
unset(PYTHON_EXECUTABLE)
176-
unset(PYTHONINTERP_FOUND)
177-
unset(PYTHON_VERSION_STRING)
178-
unset(PYTHON_INCLUDE_DIRS)
179-
else()
180-
## For forward compatibility with cmake 3.12.0 or greater, emulate variable names from FindPython3.cmake
181-
set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
182-
set(Python3_Interpreter_FOUND ${PYTHONINTERP_FOUND})
183-
set(Python3_VERSION ${PYTHON_VERSION_STRING})
184-
185-
set(Python3_Development_FOUND ${PYTHONLIBS_FOUND})
186-
set(Python3_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS})
187-
set(Python3_LIBRARIES ${PYTHON_LIBRARIES})
188-
endif()
189-
else()
190-
if(ITK_WRAP_PYTHON)
191-
if(DEFINED Python3_EXECUTABLE)
192-
set(_specified_Python3_EXECUTABLE ${Python3_EXECUTABLE})
193-
endif()
194-
find_package(Python3 COMPONENTS Interpreter Development)
195-
set(Python3_EXECUTABLE ${_specified_Python3_EXECUTABLE} CACHE INTERNAL
196-
"Path to the Python interpreter" FORCE)
197-
else()
198-
find_package(Python3 COMPONENTS Interpreter)
199-
endif()
200-
if(NOT Python3_EXECUTABLE AND _Python3_EXECUTABLE)
201-
set(Python3_EXECUTABLE ${_Python3_EXECUTABLE} CACHE INTERNAL
202-
"Path to the Python interpreter" FORCE)
203-
endif()
204-
endif()
205-
206-
if(ITK_WRAP_PYTHON AND Python3_VERSION VERSION_LESS 3.5)
207-
message(FATAL_ERROR "Python versions less than 3.5 are not supported for wrapping. Python version: \"${Python3_VERSION}\".")
208-
endif()
209-
if(ITK_WRAP_PYTHON AND NOT Python3_INCLUDE_DIRS)
210-
message(FATAL_ERROR "Python version ${Python3_VERSION} development environment not found for wrapping.")
211-
endif()
212-
endif()
213164

214165
# Build the documentation?
215166
option(BUILD_DOCUMENTATION "Build the examples documentation." OFF)
@@ -265,7 +216,6 @@ if(BUILD_DOCUMENTATION)
265216
endif()
266217

267218
# Builds the documentation.
268-
find_package(PythonInterp REQUIRED)
269219
find_package(Sphinx REQUIRED)
270220
find_program(PANDOC_BIN pandoc REQUIRED)
271221

@@ -288,7 +238,7 @@ if(BUILD_DOCUMENTATION)
288238
)
289239
add_custom_command(TARGET ${sphinx_target_base_name}_html
290240
POST_BUILD
291-
COMMAND ${PYTHON_EXECUTABLE}
241+
COMMAND ${Python3_EXECUTABLE}
292242
${ITKSphinxExamples_SOURCE_DIR}/Utilities/DocumentationTarball.py
293243
${SPHINX_DESTINATION}/html
294244
${ITKSphinxExamples_BINARY_DIR}/ITKSphinxExamples-${ITKSphinxExamples_RELEASE_VERSION}-html

Superbuild/External-Python.cmake

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
find_package(PythonInterp 3 REQUIRED)
1+
set(MIN_PYTHON_VERSION 3.7)
2+
find_package(Python3 ${MIN_PYTHON_VERSION} COMPONENTS Interpreter REQUIRED)
23

34
set(_itk_venv "${CMAKE_CURRENT_BINARY_DIR}/itkpython")
45
if(WIN32)
5-
set(ITKPYTHON_EXECUTABLE "${_itk_venv}/python.exe" CACHE FILEPATH "Python executable with the ITK package installed" FORCE)
6+
set(ITKPython3_EXECUTABLE "${_itk_venv}/python.exe" CACHE FILEPATH "Python executable with the ITK package installed" FORCE)
67
set(SPHINX_EXECUTABLE "${_itk_venv}/Scripts/sphinx-build.exe" CACHE FILEPATH "Sphinx executable" FORCE)
78
set(BLACK_EXECUTABLE "${_itk_venv}/Scripts/black.exe" CACHE FILEPATH "black executable" FORCE)
89
else()
9-
set(ITKPYTHON_EXECUTABLE "${_itk_venv}/bin/python" CACHE FILEPATH "Python executable with the ITK package installed" FORCE)
10+
set(ITKPython3_EXECUTABLE "${_itk_venv}/bin/python" CACHE FILEPATH "Python executable with the ITK package installed" FORCE)
1011
set(SPHINX_EXECUTABLE "${_itk_venv}/bin/sphinx-build" CACHE FILEPATH "Sphinx executable" FORCE)
1112
set(BLACK_EXECUTABLE "${_itk_venv}/bin/black" CACHE FILEPATH "black executable" FORCE)
1213
endif()
@@ -15,8 +16,8 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ITKBlackConfig.cmake.in"
1516

1617
ExternalProject_Add(ITKPython
1718
DOWNLOAD_COMMAND ""
18-
CONFIGURE_COMMAND ${PYTHON_EXECUTABLE} -m venv "${_itk_venv}"
19-
BUILD_COMMAND ${ITKPYTHON_EXECUTABLE} -m pip install --upgrade pip
20-
INSTALL_COMMAND ${ITKPYTHON_EXECUTABLE} -m pip install --ignore-installed itk>=5.4.0 sphinx==7.2.6 six black nbsphinx ipywidgets sphinx-contributors ipykernel matplotlib itkwidgets[lab,notebook]>=1.0a51 pydata-sphinx-theme
19+
CONFIGURE_COMMAND ${Python3_EXECUTABLE} -m venv "${_itk_venv}"
20+
BUILD_COMMAND ${ITKPython3_EXECUTABLE} -m pip install --upgrade pip
21+
INSTALL_COMMAND ${ITKPython3_EXECUTABLE} -m pip install --ignore-installed itk>=5.4.0 sphinx==7.2.6 six black nbsphinx ipywidgets sphinx-contributors ipykernel matplotlib itkwidgets[lab,notebook]>=1.0a51 pydata-sphinx-theme
2122
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/ITKBlackConfig.cmake
2223
)

Superbuild/External-VTK.cmake

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ if(NOT VTK_TAG)
55
set(VTK_TAG "v9.0.1")
66
endif()
77

8-
set(PYTHON_EXECUTABLE "${ITKPYTHON_EXECUTABLE}")
8+
set(Python3_EXECUTABLE "${ITKPython3_EXECUTABLE}")
99

1010
ExternalProject_Add(VTK
1111
GIT_REPOSITORY "https://gitlab.kitware.com/VTK/VTK.git"
@@ -23,7 +23,11 @@ ExternalProject_Add(VTK
2323
-DModule_vtkImagingMath:BOOL=ON
2424
-DVTK_WRAP_PYTHON:BOOL=ON
2525
-DExternalData_OBJECT_STORES:STRING=${ExternalData_OBJECT_STORES}
26-
"-DPython3_EXECUTABLE:FILEPATH=${PYTHON_EXECUTABLE}"
26+
"-DPython3_EXECUTABLE:FILEPATH=${Python3_EXECUTABLE}"
27+
-DVTK_USE_SYSTEM_ZLIB:BOOL=ON
28+
"-DZLIB_ROOT:PATH=${ZLIB_ROOT}"
29+
"-DZLIB_INCLUDE_DIR:PATH=${ZLIB_INCLUDE_DIR}"
30+
"-DZLIB_LIBRARY:FILEPATH=${ZLIB_LIBRARY}"
2731
INSTALL_COMMAND ""
2832
LOG_DOWNLOAD 0
2933
LOG_UPDATE 0

Superbuild/Superbuild.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ if(WIN32)
4646
set(_use_python_default OFF)
4747
endif()
4848
option(ITKSphinxExamples_USE_WRAP_PYTHON "Enable downloads of the ITK Python wrapping to the superbuild" ${_use_python_default})
49-
if(NOT EXISTS PYTHON_EXECUTABLE AND ITKSphinxExamples_USE_WRAP_PYTHON OR ITKSphinxExamples_USE_VTK)
49+
if(NOT EXISTS Python3_EXECUTABLE AND ITKSphinxExamples_USE_WRAP_PYTHON OR ITKSphinxExamples_USE_VTK)
5050
include(${CMAKE_SOURCE_DIR}/External-Python.cmake)
5151
list(APPEND ITKSphinxExamples_DEPENDENCIES ITKPython)
52-
set(_python_args "-DPYTHON_EXECUTABLE:FILEPATH=${ITKPYTHON_EXECUTABLE}")
52+
set(_python_args "-DPython3_EXECUTABLE:FILEPATH=${ITKPython3_EXECUTABLE}")
5353
endif()
5454

5555
if(NOT VTK_DIR AND ITKSphinxExamples_USE_VTK)

Utilities/CookieCutter/{{cookiecutter.example_name}}/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ add_test(NAME {{ cookiecutter.example_name }}Test
3333
)
3434

3535
if(ITK_WRAP_PYTHON)
36-
find_package(PythonInterp REQUIRED)
36+
find_package(Python3 COMPONENTS Interpreter REQUIRED)
3737
string(REPLACE . "Python." output_image "${output_image}")
3838
add_test(NAME {{ cookiecutter.example_name }}TestPython
39-
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Code.py
39+
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Code.py
4040
${input_image}
4141
${output_image}
4242
${test_options}

0 commit comments

Comments
 (0)