anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / applications / misc / prusa-slicer / default.nix
blob8d68045e94dd4fc3f11fe366582899ee19408746
1 { stdenv
2 , lib
3 , binutils
4 , fetchFromGitHub
5 , fetchpatch
6 , cmake
7 , pkg-config
8 , wrapGAppsHook3
9 , boost
10 , cereal
11 , cgal
12 , curl
13 , darwin
14 , dbus
15 , eigen
16 , expat
17 , glew
18 , glib
19 , glib-networking
20 , gmp
21 , gtk3
22 , hicolor-icon-theme
23 , ilmbase
24 , libpng
25 , mpfr
26 , nanosvg
27 , nlopt
28 , opencascade-occt_7_6
29 , openvdb
30 , pcre
31 , qhull
32 , tbb_2021_11
33 , wxGTK32
34 , xorg
35 , libbgcode
36 , heatshrink
37 , catch2
38 , withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, systemd
39 , wxGTK-override ? null
41 let
42   opencascade-occt = opencascade-occt_7_6;
43   wxGTK-prusa = wxGTK32.overrideAttrs (old: rec {
44     pname = "wxwidgets-prusa3d-patched";
45     version = "3.2.0";
46     configureFlags = old.configureFlags ++ [ "--disable-glcanvasegl" ];
47     patches = [ ./wxWidgets-Makefile.in-fix.patch ];
48     src = fetchFromGitHub {
49       owner = "prusa3d";
50       repo = "wxWidgets";
51       rev = "78aa2dc0ea7ce99dc19adc1140f74c3e2e3f3a26";
52       hash = "sha256-rYvmNmvv48JSKVT4ph9AS+JdstnLSRmcpWz1IdgBzQo=";
53       fetchSubmodules = true;
54     };
55   });
56   nanosvg-fltk = nanosvg.overrideAttrs (old: rec {
57     pname = "nanosvg-fltk";
58     version = "unstable-2022-12-22";
60     src = fetchFromGitHub {
61       owner = "fltk";
62       repo = "nanosvg";
63       rev = "abcd277ea45e9098bed752cf9c6875b533c0892f";
64       hash = "sha256-WNdAYu66ggpSYJ8Kt57yEA4mSTv+Rvzj9Rm1q765HpY=";
65     };
66   });
67   openvdb_tbb_2021_8 = openvdb.override { tbb = tbb_2021_11; };
68   wxGTK-override' = if wxGTK-override == null then wxGTK-prusa else wxGTK-override;
70   patches = [
71     (fetchpatch {
72       url = "https://raw.githubusercontent.com/gentoo/gentoo/master/media-gfx/prusaslicer/files/prusaslicer-2.8.0-missing-includes.patch";
73       hash = "sha256-/R9jv9zSP1lDW6IltZ8V06xyLdxfaYrk3zD6JRFUxHg=";
74     })
75     (fetchpatch {
76       url = "https://raw.githubusercontent.com/gentoo/gentoo/master/media-gfx/prusaslicer/files/prusaslicer-2.8.0-fixed-linking.patch";
77       hash = "sha256-G1JNdVH+goBelag9aX0NctHFVqtoYFnqjwK/43FVgvM=";
78     })
79   ];
81 stdenv.mkDerivation (finalAttrs: {
82   pname = "prusa-slicer";
83   version = "2.8.0";
84   inherit patches;
86   src = fetchFromGitHub {
87     owner = "prusa3d";
88     repo = "PrusaSlicer";
89     hash = "sha256-A/uxNIEXCchLw3t5erWdhqFAeh6nudcMfASi+RoJkFg=";
90     rev = "version_${finalAttrs.version}";
91   };
93   nativeBuildInputs = [
94     cmake
95     pkg-config
96     wrapGAppsHook3
97   ];
99   buildInputs = [
100     binutils
101     boost
102     cereal
103     cgal
104     curl
105     dbus
106     eigen
107     expat
108     glew
109     glib
110     glib-networking
111     gmp
112     gtk3
113     hicolor-icon-theme
114     ilmbase
115     libpng
116     mpfr
117     nanosvg-fltk
118     nlopt
119     opencascade-occt
120     openvdb_tbb_2021_8
121     pcre
122     qhull
123     tbb_2021_11
124     wxGTK-override'
125     xorg.libX11
126     libbgcode
127     heatshrink
128     catch2
129   ] ++ lib.optionals withSystemd [
130     systemd
131   ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
132     darwin.apple_sdk_11_0.frameworks.CoreWLAN
133   ];
135   separateDebugInfo = true;
137   # The build system uses custom logic - defined in
138   # cmake/modules/FindNLopt.cmake in the package source - for finding the nlopt
139   # library, which doesn't pick up the package in the nix store.  We
140   # additionally need to set the path via the NLOPT environment variable.
141   NLOPT = nlopt;
143   # prusa-slicer uses dlopen on `libudev.so` at runtime
144   NIX_LDFLAGS = lib.optionalString withSystemd "-ludev";
146   prePatch = ''
147     # Since version 2.5.0 of nlopt we need to link to libnlopt, as libnlopt_cxx
148     # now seems to be integrated into the main lib.
149     sed -i 's|nlopt_cxx|nlopt|g' cmake/modules/FindNLopt.cmake
151     # Disable slic3r_jobs_tests.cpp as the test fails sometimes
152     sed -i 's|slic3r_jobs_tests.cpp||g' tests/slic3rutils/CMakeLists.txt
154     # prusa-slicer expects the OCCTWrapper shared library in the same folder as
155     # the executable when loading STEP files. We force the loader to find it in
156     # the usual locations (i.e. LD_LIBRARY_PATH) instead. See the manpage
157     # dlopen(3) for context.
158     if [ -f "src/libslic3r/Format/STEP.cpp" ]; then
159       substituteInPlace src/libslic3r/Format/STEP.cpp \
160         --replace 'libpath /= "OCCTWrapper.so";' 'libpath = "OCCTWrapper.so";'
161     fi
162     # https://github.com/prusa3d/PrusaSlicer/issues/9581
163     if [ -f "cmake/modules/FindEXPAT.cmake" ]; then
164       rm cmake/modules/FindEXPAT.cmake
165     fi
167     # Fix resources folder location on macOS
168     substituteInPlace src/PrusaSlicer.cpp \
169       --replace "#ifdef __APPLE__" "#if 0"
170   '';
172   cmakeFlags = [
173     "-DSLIC3R_STATIC=0"
174     "-DSLIC3R_FHS=1"
175     "-DSLIC3R_GTK=3"
176   ];
178   postInstall = ''
179     ln -s "$out/bin/prusa-slicer" "$out/bin/prusa-gcodeviewer"
181     mkdir -p "$out/lib"
182     mv -v $out/bin/*.* $out/lib/
184     mkdir -p "$out/share/pixmaps/"
185     ln -s "$out/share/PrusaSlicer/icons/PrusaSlicer.png" "$out/share/pixmaps/PrusaSlicer.png"
186     ln -s "$out/share/PrusaSlicer/icons/PrusaSlicer-gcodeviewer_192px.png" "$out/share/pixmaps/PrusaSlicer-gcodeviewer.png"
187   '';
189   preFixup = ''
190     gappsWrapperArgs+=(
191       --prefix LD_LIBRARY_PATH : "$out/lib"
192     )
193   '';
195   doCheck = true;
197   checkPhase = ''
198     runHook preCheck
200     ctest \
201       --force-new-ctest-process \
202       -E 'libslic3r_tests|sla_print_tests'
204     runHook postCheck
205   '';
207   meta = with lib; {
208     description = "G-code generator for 3D printer";
209     homepage = "https://github.com/prusa3d/PrusaSlicer";
210     license = licenses.agpl3Plus;
211     maintainers = with maintainers; [ tweber tmarkus ];
212     platforms = platforms.unix;
213   } // lib.optionalAttrs (stdenv.hostPlatform.isDarwin) {
214     mainProgram = "PrusaSlicer";
215   };