Linking error when building VTK 9.0 due to missing python libraries
When building VTK 9 or paraview 5.8.0 on openSUSE, compilation fails at the linking stage for Python bindings because it doesn't explicitly link against libpython3.X.so
or libpython3.Xm.so
(for python < 3.8.0). We have to fix this by patching sources at various places, thus:
Index: VTK-9.0.0/Web/Core/CMakeLists.txt
===================================================================
--- VTK-9.0.0.orig/Web/Core/CMakeLists.txt
+++ VTK-9.0.0/Web/Core/CMakeLists.txt
@@ -1,3 +1,10 @@
+if ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR})
+else ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}m)
+endif ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+
+
set(classes
vtkDataEncoder
vtkObjectIdMap
Index: VTK-9.0.0/Wrapping/PythonCore/CMakeLists.txt
===================================================================
--- VTK-9.0.0.orig/Wrapping/PythonCore/CMakeLists.txt
+++ VTK-9.0.0/Wrapping/PythonCore/CMakeLists.txt
@@ -1,3 +1,9 @@
+if ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR})
+else ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}m)
+endif ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+
set(classes
vtkPythonArgs
vtkPythonCommand
Index: VTK-9.0.0/Utilities/PythonInterpreter/CMakeLists.txt
===================================================================
--- VTK-9.0.0.orig/Utilities/PythonInterpreter/CMakeLists.txt
+++ VTK-9.0.0/Utilities/PythonInterpreter/CMakeLists.txt
@@ -1,3 +1,9 @@
+if ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR})
+else ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}m)
+endif ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+
set(classes
vtkPythonInteractiveInterpreter
vtkPythonInterpreter)
Index: VTK-9.0.0/CMake/vtkModuleWrapPython.cmake
===================================================================
--- VTK-9.0.0.orig/CMake/vtkModuleWrapPython.cmake
+++ VTK-9.0.0/CMake/vtkModuleWrapPython.cmake
@@ -88,6 +88,8 @@ function (vtk_module_python_default_dest
endif ()
set("${var}" "${destination}" PARENT_SCOPE)
+ set(VTK_PYTHON_VERSION_MAJOR "${Python${_vtk_module_python_MAJOR_VERSION}_VERSION_MAJOR}" PARENT_SCOPE)
+ set(VTK_PYTHON_VERSION_MINOR "${Python${_vtk_module_python_MAJOR_VERSION}_VERSION_MINOR}" PARENT_SCOPE)
endfunction ()
#[==[
Index: VTK-9.0.0/Parallel/MPI4Py/CMakeLists.txt
===================================================================
--- VTK-9.0.0.orig/Parallel/MPI4Py/CMakeLists.txt
+++ VTK-9.0.0/Parallel/MPI4Py/CMakeLists.txt
@@ -1,3 +1,9 @@
+if ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR})
+else ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+ link_libraries(python${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}m)
+endif ("${VTK_PYTHON_VERSION_MAJOR}.${VTK_PYTHON_VERSION_MINOR}" VERSION_GREATER "3.7")
+
set(classes
vtkMPI4PyCommunicator)
Is there a better solution to this, or perhaps this patch can be merged?
The full spec file I use to build is here: https://build.opensuse.org/package/view_file/home:badshah400:branches:science/vtk/vtk.spec
Thanks.