Subject: Re: [bug#50052] [PATCH] Add prusa-slicer

From: Xinglu Chen <[email-masked]>
Date: Sun, 15 Aug 2021 13:02:39 +0200

On Sat, Aug 14 2021, Daniel Trujillo Viedma wrote:

> Hi! I'm Daniel Trujillo,
>
>
> This is my first-time-ever contribution to GNU Guix, so please, don't 
> hold any nitpick to yourself!! :)
>
>
> I don't know if these kind of packages are of interest, but this is 
> PrusaSlicer [0], a software to prepare 3D printings (hence I put it in 
> engineering.scm).
>
> The packaged version, 2.3.3 is the latest stable available at this 
> moment. But this version has as important problem [1]: It cannot be 
> invoked just naming the executable (through $PATH), because then, it 
> can't locate the resources directory. I learned **the hard way** that 
> the fix was applied *after* the release of the 2.3.3 version, so I 
> decided to backport the fix adding a patch because it's a show-stopper 
> to have to type the path to the executable in /gnu/store/... That's the 
> reason why the patch attached to this email contains, not only the 
> additions to engineering.scm, but also a patch that implements the 
> solution in the version 2.3.3 codebase (It's quite simple, it uses a 
> boost function to determine the path to the executable rather than 
> relying on argv[0]).
>
>
> Known improvable things:
> * It's configured to use GTK3. After many attempts to compile it under 
> GTK2 in a guix environment, sometimes it detected GTK right away, and 
> some ether times I had to add more includes. It wasn't quite reliable 
> and, according to the convention followed in gtk+ packages, probably it 
> would be better that prusa-slicer uses GTK3, and a hypothetical future 
> GTK2 version would be called prusa-slicer-gtk2.
>
> * In order for the above $PATH issue fix to work, it's crucial that the 
> cmake variable SLIC3R_FHS is set to off. This is the default value 
> according to the CMakeLists.txt, but because it's so important, probably 
> it should have been included in the configure-flags argument? Just for 
> clarity.

That’s probably a good idea, in case upstream changes the default value
in the future.

> * Currently, the version displayed in the title bar is 
> "....2.3.3+UNKNOWN". This is because of another cmake option not set. It 
> doesn't have any influence in the software, as far as I know, but it's 
> arguably ugly. The version I currently use, doesn't display that in the 
> title bar, but it does in the "About" window, and it says 
> ".....2.3.3+linux-64". Maybe something like "GNU Guix" would be 
> prettier. But if I have to include the arch, I would have to dig deeper 
> into package definitions ^_^'''
>
>
> I hope everything is in order, I'm looking forward to see your comments, 
> and hope I can start contributing more packages to Guix!!
>
>
> Cheers,
>
> Dani.
>
>
> [0] https://www.prusa3d.es/prusaslicer/
>
> [1] https://github.com/prusa3d/PrusaSlicer/issues/5542
>
>
> From 522c1904cf62afac25a9d974091211adac760c25 Mon Sep 17 00:00:00 2001
> From: Daniel Trujillo Viedma <[email-masked]>
> Date: Sat, 14 Aug 2021 00:00:55 +0200
> Subject: [PATCH] Add prusa-slicer
>
> ---

The commit message should be in the GNU ChangeLog format, see the commit
log for examples, or check the manual.

  <https://www.gnu.org/prep/standards/standards.html#Change-Logs>
  
>  gnu/packages/engineering.scm                       | 58 ++++++++++++++++++++++
>  .../patches/prusa-slicer-backport-fix-5542.patch   | 31 ++++++++++++

This patch should also be added to the gnu/local.mk file.

>  2 files changed, 89 insertions(+)
>  create mode 100644 gnu/packages/patches/prusa-slicer-backport-fix-5542.patch
>
> diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
> index 33c124a2ea..047d99c0af 100644
> --- a/gnu/packages/engineering.scm
> +++ b/gnu/packages/engineering.scm
> @@ -2863,3 +2863,61 @@ for hooking Linux system calls in user space.  This is achieved by
>  hot-patching the machine code of the standard C library in the memory of
>  a process.")
>        (license license:bsd-2))))
> +
> +(define-public prusa-slicer
> +  (package
> +    (name "prusa-slicer")
> +    (version "2.3.3")
> +    (source
> +     (origin
> +       (method git-fetch)
> +       (uri (git-reference
> +             (url "https://github.com/prusa3d/PrusaSlicer")
> +             (commit (string-append "version_" version))))

The ‘file-name’ field should be set to

  (file-name (git-file-name name version))

to give the git checkout, in the Guix store, a more descriptive name,
otherwise its name is

  /gnu/store/hc1slayzjz8xrw24q8wzgcs6xrzfk74q-git-checkout

which doesn’t really say much.  This usually only applies if some kind
of VCS repository is used, and not if ‘url-fetch’ is used.

> +       (sha256
> +        (base32 "0w0synqi3iz9aigsgv6x1c6sg123fasbx19h4w3ic1l48r8qmpwm"))
> +     (patches (search-patches "prusa-slicer-backport-fix-5542.patch"))))
> +    (build-system cmake-build-system)
> +    (arguments
> +       `(#:configure-flags `("-DSLIC3R_GTK=3")))
> +    (native-inputs
> +       `(("pkg-config" ,pkg-config)))
> +    (inputs
> +       `(("perl" ,perl)
> +         ("glibc-locales" ,glibc-locales)
> +         ("adwaita-icon-theme" ,adwaita-icon-theme)
> +         ("boost" ,boost)
> +         ("tbb" ,tbb)
> +         ("curl" ,curl)
> +         ("zlib" ,zlib)
> +         ("eigen" ,eigen)
> +         ("expat" ,expat)
> +         ("libpng" ,libpng)
> +         ("mesa" ,mesa)
> +         ("glew" ,glew)
> +         ("cereal" ,cereal)
> +         ("nlopt" ,nlopt)
> +         ("openvdb" ,openvdb)
> +         ("cgal" ,cgal)
> +         ("gmp" ,gmp)
> +         ("mpfr" ,mpfr)
> +         ("qhull" ,qhull)
> +         ("wxwidgets" ,wxwidgets-3.1)

> +         ("coreutils" ,coreutils)
> +         ("grep" ,grep)
> +         ("sed" ,sed)
> +         ("glibc" ,glibc)

These packages are already included in the ‘cmake-build-system’ by
default, no need to add them explicitly.

> +         ("gtk+" ,gtk+)
> +         ("pango" ,pango)
> +         ("dbus" ,dbus)))
> +    (home-page "https://www.prusa3d.com/prusaslicer/")
> +    (synopsis "G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)")
> +    (description
> +     "PrusaSlicer (formerly known as Slic3r Prusa Edition or Slic3r PE) is
> +our own in-house developed slicer software based on the open-source project
> +Slic3r.  PrusaSlicer is an open-source, feature-rich, frequently updated
> +tool that contains everything you need to export the perfect print files

Nit: “perfect” sounds a bit too much like marketing speak; instead of
“to export the perfect print files”, I suggest “to export to print
files”.

WDYT?

> +for your Original Prusa 3D printer.")
> +    (license license:agpl3)))

According the the LICENSE file, this should be agpl3+ (grep for “any
later version”).

  <https://github.com/prusa3d/PrusaSlicer/blob/master/LICENSE>

I didn’t manage to build the package because my machine ran out of
memory, but I assume that it built fine for you.  :-)