1{
2 version,
3 sourceSha256,
4 patches ? [ ],
5}:
6{
7 lib,
8 newScope,
9 stdenv,
10 fetchurl,
11 cmake,
12 pkg-config,
13
14 # common dependencies
15 tk,
16 mpi,
17 python3Packages,
18 catalyst,
19 cli11,
20 boost,
21 eigen,
22 verdict,
23 double-conversion,
24
25 # common data libraries
26 lz4,
27 xz,
28 zlib,
29 pugixml,
30 expat,
31 jsoncpp,
32 libxml2,
33 exprtk,
34 utf8cpp,
35 libarchive,
36 nlohmann_json,
37
38 # filters
39 openturns,
40 openslide,
41
42 # io modules
43 cgns,
44 adios2,
45 libLAS,
46 libgeotiff,
47 laszip_2,
48 gdal,
49 pdal,
50 alembic,
51 imath,
52 openvdb,
53 c-blosc,
54 unixODBC,
55 postgresql,
56 libmysqlclient,
57 ffmpeg,
58 libjpeg,
59 libpng,
60 libtiff,
61 proj,
62 sqlite,
63 libogg,
64 libharu,
65 libtheora,
66 hdf5,
67 netcdf,
68 opencascade-occt,
69
70 # threading
71 tbb,
72 llvmPackages,
73
74 # rendering
75 viskores,
76 freetype,
77 fontconfig,
78 libX11,
79 libXfixes,
80 libXrender,
81 libXcursor,
82 gl2ps,
83 libGL,
84 qt5,
85 qt6,
86
87 # custom options
88 qtVersion ? null,
89 # To avoid conflicts between the propagated vtkPackages.hdf5
90 # and the input hdf5 used by most downstream packages,
91 # we set mpiSupport to false by default.
92 mpiSupport ? false,
93 pythonSupport ? false,
94
95 # passthru.tests
96 testers,
97}:
98let
99 qtPackages =
100 if (isNull qtVersion) then
101 null
102 else if (qtVersion == "6") then
103 qt6
104 else if (qtVersion == "5") then
105 qt5
106 else
107 throw ''qtVersion must be "5", "6" or null'';
108 vtkPackages = lib.makeScope newScope (self: {
109 inherit
110 tbb
111 mpi
112 mpiSupport
113 python3Packages
114 pythonSupport
115 ;
116
117 hdf5 = hdf5.override {
118 inherit mpi mpiSupport;
119 cppSupport = !mpiSupport;
120 };
121 openvdb = self.callPackage openvdb.override { };
122 netcdf = self.callPackage netcdf.override { };
123 catalyst = self.callPackage catalyst.override { };
124 adios2 = self.callPackage adios2.override { };
125 cgns = self.callPackage cgns.override { };
126 viskores = self.callPackage viskores.override { };
127 });
128 vtkBool = feature: bool: lib.cmakeFeature feature "${if bool then "YES" else "NO"}";
129in
130stdenv.mkDerivation (finalAttrs: {
131 pname = "vtk";
132 inherit version patches;
133
134 src = fetchurl {
135 url = "https://www.vtk.org/files/release/${lib.versions.majorMinor finalAttrs.version}/VTK-${finalAttrs.version}.tar.gz";
136 hash = sourceSha256;
137 };
138
139 nativeBuildInputs = [
140 cmake
141 pkg-config # required for finding MySQl
142 ]
143 ++ lib.optional pythonSupport python3Packages.python
144 ++ lib.optional (
145 pythonSupport && stdenv.buildPlatform == stdenv.hostPlatform
146 ) python3Packages.pythonImportsCheckHook;
147
148 buildInputs = [
149 libLAS
150 libgeotiff
151 laszip_2
152 gdal
153 pdal
154 alembic
155 imath
156 c-blosc
157 unixODBC
158 postgresql
159 libmysqlclient
160 ffmpeg
161 opencascade-occt
162 fontconfig
163 openturns
164 libarchive
165 libGL
166 vtkPackages.openvdb
167 ]
168 ++ lib.optionals stdenv.hostPlatform.isLinux [
169 libXfixes
170 libXrender
171 libXcursor
172 ]
173 ++ lib.optional (!(isNull qtPackages)) qtPackages.qttools
174 ++ lib.optional mpiSupport mpi
175 ++ lib.optional pythonSupport tk;
176
177 # propagated by vtk-config.cmake
178 propagatedBuildInputs = [
179 eigen
180 boost
181 verdict
182 double-conversion
183 freetype
184 lz4
185 xz
186 zlib
187 expat
188 exprtk
189 pugixml
190 jsoncpp
191 libxml2
192 utf8cpp
193 nlohmann_json
194 libjpeg
195 libpng
196 libtiff
197 proj
198 sqlite
199 libogg
200 libharu
201 libtheora
202 cli11
203 openslide
204 vtkPackages.hdf5
205 vtkPackages.cgns
206 vtkPackages.adios2
207 vtkPackages.netcdf
208 vtkPackages.catalyst
209 vtkPackages.viskores
210 vtkPackages.tbb
211 ]
212 ++ lib.optionals stdenv.cc.isClang [
213 llvmPackages.openmp
214 ]
215 ++ lib.optionals stdenv.hostPlatform.isLinux [
216 libX11
217 gl2ps
218 ]
219 # create meta package providing dist-info for python3Pacakges.vtk that common cmake build does not do
220 ++ lib.optionals pythonSupport [
221 (python3Packages.mkPythonMetaPackage {
222 inherit (finalAttrs) pname version meta;
223 dependencies =
224 with python3Packages;
225 [
226 numpy
227 wslink
228 matplotlib
229 ]
230 ++ lib.optional mpiSupport (mpi4py.override { inherit mpi; });
231 })
232 ];
233
234 # wrapper script calls qmlplugindump, crashes due to lack of minimal platform plugin
235 # Could not find the Qt platform plugin "minimal" in ""
236 preConfigure = lib.optionalString (qtVersion == "5") ''
237 export QT_PLUGIN_PATH=${lib.getBin qt5.qtbase}/${qt5.qtbase.qtPluginPrefix}
238 '';
239
240 env = {
241 CMAKE_PREFIX_PATH = "${lib.getDev openvdb}/lib/cmake/OpenVDB";
242 NIX_LDFLAGS = "-L${lib.getLib libmysqlclient}/lib/mariadb";
243 };
244
245 cmakeFlags = [
246 (lib.cmakeFeature "CMAKE_INSTALL_BINDIR" "bin")
247 (lib.cmakeFeature "CMAKE_INSTALL_LIBDIR" "lib")
248 (lib.cmakeFeature "CMAKE_INSTALL_INCLUDEDIR" "include")
249
250 # vtk common configure options
251 (lib.cmakeBool "VTK_DISPATCH_SOA_ARRAYS" true)
252 (lib.cmakeBool "VTK_ENABLE_CATALYST" true)
253 (lib.cmakeBool "VTK_WRAP_SERIALIZATION" true)
254 (lib.cmakeBool "VTK_BUILD_ALL_MODULES" true)
255 (lib.cmakeBool "VTK_VERSIONED_INSTALL" false)
256 (lib.cmakeBool "VTK_SMP_ENABLE_OPENMP" true)
257 (lib.cmakeFeature "VTK_SMP_IMPLEMENTATION_TYPE" "TBB")
258
259 # use system packages if possible
260 (lib.cmakeBool "VTK_USE_EXTERNAL" true)
261 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_fast_float" false) # required version incompatible
262 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_pegtl" false) # required version incompatible
263 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_ioss" false) # missing in nixpkgs
264 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_token" false) # missing in nixpkgs
265 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_fmt" false) # prefer vendored fmt
266 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_scn" false) # missing in nixpkgs
267 (lib.cmakeBool "VTK_MODULE_USE_EXTERNAL_VTK_gl2ps" stdenv.hostPlatform.isLinux) # external gl2ps causes failure linking to macOS OpenGL.framework
268
269 # Rendering
270 (vtkBool "VTK_MODULE_ENABLE_VTK_RenderingRayTracing" false) # ospray
271 (vtkBool "VTK_MODULE_ENABLE_VTK_RenderingOpenXR" false) # openxr
272 (vtkBool "VTK_MODULE_ENABLE_VTK_RenderingOpenVR" false) # openvr
273 (vtkBool "VTK_MODULE_ENABLE_VTK_RenderingAnari" false) # anari
274
275 # qtSupport
276 (vtkBool "VTK_GROUP_ENABLE_Qt" (!(isNull qtPackages)))
277 (lib.cmakeFeature "VTK_QT_VERSION" "Auto") # will search for Qt6 first
278
279 # pythonSupport
280 (lib.cmakeBool "VTK_USE_TK" pythonSupport)
281 (vtkBool "VTK_GROUP_ENABLE_Tk" pythonSupport)
282 (lib.cmakeBool "VTK_WRAP_PYTHON" pythonSupport)
283 (lib.cmakeBool "VTK_BUILD_PYI_FILES" pythonSupport)
284 (lib.cmakeFeature "VTK_PYTHON_VERSION" "3")
285
286 # mpiSupport
287 (lib.cmakeBool "VTK_USE_MPI" mpiSupport)
288 (vtkBool "VTK_GROUP_ENABLE_MPI" mpiSupport)
289 ];
290
291 # byte-compile python modules since the CMake build does not do it
292 postInstall = lib.optionalString pythonSupport ''
293 python -m compileall -s $out $out/${python3Packages.python.sitePackages}
294 '';
295
296 pythonImportsCheck = [ "vtk" ];
297
298 dontWrapQtApps = true;
299
300 postFixup =
301 # Remove thirdparty find module that have been provided in nixpkgs.
302 ''
303 rm -rf $out/lib/cmake/vtk/patches
304 rm $out/lib/cmake/vtk/Find{EXPAT,Freetype,utf8cpp,LibXml2,FontConfig}.cmake
305 ''
306 # libvtkglad.so will find and load libGL.so at runtime.
307 + lib.optionalString stdenv.hostPlatform.isLinux ''
308 patchelf --add-rpath ${lib.getLib libGL}/lib $out/lib/libvtkglad.so
309 '';
310
311 passthru = {
312 inherit
313 pythonSupport
314 mpiSupport
315 ;
316
317 vtkPackages = vtkPackages.overrideScope (
318 final: prev: {
319 vtk = finalAttrs.finalPackage;
320 }
321 );
322
323 tests = {
324 cmake-config = testers.hasCmakeConfigModules {
325 moduleNames = [ "VTK" ];
326
327 package = finalAttrs.finalPackage;
328
329 nativeBuildInputs = lib.optionals (!(isNull qtPackages)) [
330 qtPackages.qttools
331 qtPackages.wrapQtAppsHook
332 ];
333 };
334 };
335 };
336
337 requiredSystemFeatures = [ "big-parallel" ];
338
339 meta = {
340 description = "Open source libraries for 3D computer graphics, image processing and visualization";
341 homepage = "https://www.vtk.org/";
342 changelog = "https://docs.vtk.org/en/latest/release_details/${lib.versions.majorMinor finalAttrs.version}.html";
343 license = lib.licenses.bsd3;
344 maintainers = with lib.maintainers; [ qbisi ];
345 platforms = lib.platforms.unix;
346 };
347})