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