Subject: Re: [PATCH v3] gnu: Add citra

From: Liliana Marie Prikler <[email-masked]>
Date: Wed, 02 Nov 2022 09:04:20 +0100

Am Dienstag, dem 01.11.2022 um 17:58 +0000 schrieb
[email-masked]:
> From: florhizome <[email-masked]>
> 
> * gnu/packages/emulators.scm (citra): New variable.
> ---
>  gnu/packages/emulators.scm | 100
> +++++++++++++++++++++++++++++++++++++
>  1 file changed, 100 insertions(+)
> 
> diff --git a/gnu/packages/emulators.scm b/gnu/packages/emulators.scm
> index 4d7710f8ea..3ea3bfe327 100644
> --- a/gnu/packages/emulators.scm
> +++ b/gnu/packages/emulators.scm
> @@ -61,6 +61,7 @@ (define-module (gnu packages emulators)
>    #:use-module (gnu packages cross-base)
>    #:use-module (gnu packages curl)
>    #:use-module (gnu packages digest)
> +  #:use-module (gnu packages documentation)
>    #:use-module (gnu packages elf)
>    #:use-module (gnu packages flex)
>    #:use-module (gnu packages fltk)
> @@ -74,6 +75,7 @@ (define-module (gnu packages emulators)
>    #:use-module (gnu packages gl)
>    #:use-module (gnu packages glib)
>    #:use-module (gnu packages gnome)
> +  #:use-module (gnu packages gstreamer)
>    #:use-module (gnu packages gtk)
>    #:use-module (gnu packages image)
>    #:use-module (gnu packages libedit)
> @@ -105,6 +107,7 @@ (define-module (gnu packages emulators)
>    #:use-module (gnu packages xorg)
>    #:use-module (gnu packages web)
>    #:use-module (guix build-system cmake)
> +  #:use-module (guix build-system qt)
>    #:use-module (guix build-system glib-or-gtk)
>    #:use-module (guix build-system gnu)
>    #:use-module (guix build-system meson)
> @@ -245,9 +248,106 @@ (define-public desmume
>       "DeSmuME is an emulator for the Nintendo DS handheld gaming
> console.")
>      (license license:gpl2)))
>  
> +(define-public citra
> +  ;; we use the 'nightly' revision, picking stable features
> +  (let ((revision "1785")
> +        (commit "baecc18d8c5365af0dddb231bc8c0a9c03850bf6"))
Note that the latest citra revision is now 1802.  Feel free to bump it
during review.
> +  (package
> +    (name "citra")
> +    (version (git-version "0" revision commit))
> +    (source
> +     (origin
> +       (method git-fetch)
> +       (uri (git-reference
> +             (url "https://github.com/citra-emu/citra-nightly")
> +             (commit
> +              (string-append "nightly-" revision))
> +             ;;some submodules can't be avoided
> +             ;;TODO devendor the rest
> +             (recursive? #t)))
For those submodules that can't be avoided, the "unpack after unpack"
pattern is still preferable to recursive checkouts; the latter can pull
in new vendored modules sneakily.

For instance, the first package that fails the build because it's
missing is cryptopp [1].  They vendor version 8.5 while the latest is
8.7.  I think packaging cryptopp and trying to unvendor it makes sense.
Even if not completely unvendored (i.e. we still pull in the source
instead of the built package, as is e.g. done for armips in ppsspp),
I'd prefer the origin to be explicit.
> +       (sha256
> +        (base32
> +         "1grkrrxs1497i51spgnwmgfkqgkm7gplylhcrk67agaklx65d5s9"))
> +       (file-name (git-file-name name version))
> +       (modules '((guix build utils)))
> +         (snippet
> +          '(begin
> +             ;; Remove as much external stuff as we can
> +             ;; f.e. some files in boost are still needed
> +             (for-each (lambda (dir)
> +                         (delete-file-recursively
> +                          (string-append "externals/" dir)))
> +                       '("android-ifaddrs"
> +                         "catch"
> +                         "discord-rpc"
> +                         "getopt"
> +                         "libyuv"
> +                         "libressl"
> +                         "libusb"))
> +             ;; Clean up source.
> +             (for-each delete-file
> +                       (find-files "."
> ".*\\.(bin|dsy|exe|jar|rar)$"))
> +             #t))))
> +    (build-system qt-build-system)
> +    (arguments
> +     (list
> +      #:configure-flags
> +      #~(list
> +         "-DUSE_SYSTEM_BOOST=ON"
> +         "-DCITRA_USE_BUNDLED_FFMPEG=OFF"
> +         "-DCITRA_USE_BUNDLED_QT=OFF"
> +         "-DCITRA_USE_BUNDLED_SDL2=OFF"
> +         "-DCITRA_ENABLE_COMPATIBILITY_REPORTING=OFF"
> +         "-DCMAKE_BUILD_TYPE=Release"
> +         "-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF"
> +         "-DENABLE_FFMPEG_AUDIO_DECODER=ON"
> +         "-DENABLE_QT_TRANSLATION=ON"
> +         "-DENABLE_WEB_SERVICE=ON")
The web service should be disabled, we don't let our software phone
home.
> +       #:phases
> +       #~(modify-phases %standard-phases
> +           (add-before 'configure 'delete-check
> +             (lambda _
> +               (substitute* "CMakeLists.txt"
> +                 (("check_submodules_present\\(\\)")""))))
Instead of 'delete-check, I'd name this 'patch-cmake.  'delete-check
implies that we're disabling checks, which we don't.
> +           (add-after 'qt-wrap 'wrap-gst-plugins
> +             (lambda* (#:key outputs #:allow-other-keys)
> +               (for-each
> +                (lambda (bin)
> +                  (wrap-program bin)
> +                  `("GST_PLUGIN_SYSTEM_PATH" prefix
> +                    (,(getenv "GST_PLUGIN_SYSTEM_PATH"))))
> +                `(,(search-input-file outputs "bin/citra")
> +                  ,(search-input-file outputs "bin/citra-qt"))))))))
> +    (native-inputs
> +     (list catch2 doxygen pkg-config))
> +    (inputs
> +     (list boost
> +           curl
> +           ffmpeg
> +           gst-plugins-bad-minimal      ;camera-support
> +           libfdk
> +           libpng
> +           libusb
> +           libxkbcommon
> +           openssl
> +           pulseaudio
> +           qtbase-5
> +           qtmultimedia-5
> +           qttools-5
> +           qtwayland-5
> +           sdl2))
There seem to be more missing inputs, for instance json-modern-cxx
which has nlohmann::json (somewhat related, I do think that it's a
silly package name and we should rename it for searchability's sake).
> +    (propagated-inputs (list xdg-utils shared-mime-info))
> +    (home-page "https://citra-emu.org")
> +    (synopsis "Nintendo 3DS Emulator")
> +    (description "Citra is an experimental emulator/debugger for the
> Nintendo 3DS
I'd write out "and" instead of the slash.
> + written in C++.  It emulates a subset of the Nintendo 3DS'
> hardware.")
> +    (license license:gpl2+))))
> +
> +
Gratuitous newline.
>  ;; Building from recent Git because the official 5.0 release no
> longer builds.
>  ;; Following commits and revision numbers of beta versions listed at
>  ;; https://dolphin-emu.org/download/.
> +
Gratuitous newline.
>  (define-public dolphin-emu
>    (let ((commit "a34823df61df65168aa40ef5e82e44defd4a0138")
>          (revision "13178"))

Cheers

[1] https://github.com/weidai11/cryptopp