Merge branch 'master' into staging
[jackhill/guix/guix.git] / gnu / packages / wine.scm
index b0cba94..35defc3 100644 (file)
@@ -3,8 +3,9 @@
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017, 2018, 2019 Rutger Helling <rhelling@mykolab.com>
-;;; Copyright © 2017 Nicolas Goaziou <mail@nicolasgoaziou.fr>
-;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2020 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Pierre Neidhardt <mail@ambrevar.xyz>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,6 +29,7 @@
   #:use-module (guix git-download)
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system meson)
   #:use-module (guix build-system trivial)
   #:use-module (gnu packages)
   #:use-module (gnu packages admin)
@@ -42,6 +44,7 @@
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages image)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages gl)
@@ -50,6 +53,7 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages kerberos)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages mingw)
   #:use-module (gnu packages openldap)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages vulkan)
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
-  #:use-module (ice-9 match))
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1))
 
 (define-public wine
   (package
     (name "wine")
-    (version "3.0.4")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://dl.winehq.org/wine/source/"
-                                  (version-major+minor version)
-                                  "/wine-" version ".tar.xz"))
-              (sha256
-               (base32
-                "037vlrk80lagy362w7500i2ldwvdwsadrknajzi67cvxpvnqhnnl"))))
+    (version "5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://dl.winehq.org/wine/source/"
+                           (version-major+minor version)
+                           "/wine-" version ".tar.xz"))
+       (sha256
+        (base32 "1d0kcy338radq07hrnzcpc9lc9j2fvzjh37q673002x8d6x5058q"))))
     (build-system gnu-build-system)
     (native-inputs `(("pkg-config" ,pkg-config)
                      ("gettext" ,gettext-minimal)
@@ -91,6 +96,7 @@
        ("dbus" ,dbus)
        ("cups" ,cups)
        ("eudev" ,eudev)
+       ("faudio" ,faudio)
        ("fontconfig" ,fontconfig)
        ("freetype" ,freetype)
        ("glu" ,glu)
        ("ncurses" ,ncurses)
        ("openal" ,openal)
        ("pulseaudio" ,pulseaudio)
+       ("sdl2" ,sdl2)
        ("unixodbc" ,unixodbc)
        ("v4l-utils" ,v4l-utils)
+       ("vkd3d" ,vkd3d)
+       ("vulkan-loader" ,vulkan-loader)
        ("zlib" ,zlib)))
     (arguments
      `(;; Force a 32-bit build targeting a similar architecture, i.e.:
 
        #:phases
        (modify-phases %standard-phases
+         ;; Explicitly set the 32-bit version of vulkan-loader when installing
+         ;; to i686-linux or x86_64-linux.
+         ;; TODO: Add more JSON files as they become available in Mesa.
+         ,@(match (%current-system)
+             ((or "i686-linux" "x86_64-linux")
+              `((add-after 'install 'wrap-executable
+                  (lambda* (#:key inputs outputs #:allow-other-keys)
+                    (let* ((out (assoc-ref outputs "out"))
+                           (icd (string-append out "/share/vulkan/icd.d")))
+                      (mkdir-p icd)
+                      (copy-file (string-append (assoc-ref inputs "mesa")
+                                 "/share/vulkan/icd.d/radeon_icd.i686.json")
+                                 (string-append icd "/radeon_icd.i686.json"))
+                      (copy-file (string-append (assoc-ref inputs "mesa")
+                                 "/share/vulkan/icd.d/intel_icd.i686.json")
+                                 (string-append icd "/intel_icd.i686.json"))
+                      (wrap-program (string-append out "/bin/wine-preloader")
+                                    `("VK_ICD_FILENAMES" ":" =
+                                      (,(string-append icd
+                                        "/radeon_icd.i686.json" ":"
+                                        icd "/intel_icd.i686.json"))))
+                      #t)))))
+             (_
+              `())
+             )
          (add-after 'configure 'patch-dlopen-paths
            ;; Hardcode dlopened sonames to absolute paths.
            (lambda _
@@ -184,6 +218,38 @@ integrate Windows applications into your desktop.")
              (string-append "libdir=" %output "/lib/wine64"))
        #:phases
        (modify-phases %standard-phases
+         ;; Explicitly set both the 64-bit and 32-bit versions of vulkan-loader
+         ;; when installing to x86_64-linux so both are available.
+         ;; TODO: Add more JSON files as they become available in Mesa.
+         ,@(match (%current-system)
+           ((or "x86_64-linux")
+             `((add-after 'copy-wine32-binaries 'wrap-executable
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (let* ((out (assoc-ref outputs "out")))
+                   (wrap-program (string-append out "/bin/wine-preloader")
+                                 `("VK_ICD_FILENAMES" ":" =
+                                   (,(string-append (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/radeon_icd.x86_64.json" ":"
+                                     (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/intel_icd.x86_64.json" ":"
+                                     (assoc-ref inputs "wine")
+                                     "/share/vulkan/icd.d/radeon_icd.i686.json" ":"
+                                     (assoc-ref inputs "wine")
+                                     "/share/vulkan/icd.d/intel_icd.i686.json"))))
+                   (wrap-program (string-append out "/bin/wine64-preloader")
+                                 `("VK_ICD_FILENAMES" ":" =
+                                   (,(string-append (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/radeon_icd.x86_64.json"
+                                     ":" (assoc-ref inputs "mesa")
+                                     "/share/vulkan/icd.d/intel_icd.x86_64.json"
+                                     ":" (assoc-ref inputs "wine")
+                                     "/share/vulkan/icd.d/radeon_icd.i686.json"
+                                     ":" (assoc-ref inputs "wine")
+                                     "/share/vulkan/icd.d/intel_icd.i686.json"))))
+                   #t)))))
+           (_
+            `())
+           )
          (add-after 'install 'copy-wine32-binaries
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((wine32 (assoc-ref %build-inputs "wine"))
@@ -191,7 +257,9 @@ integrate Windows applications into your desktop.")
                ;; Copy the 32-bit binaries needed for WoW64.
                (copy-file (string-append wine32 "/bin/wine")
                           (string-append out "/bin/wine"))
-               (copy-file (string-append wine32 "/bin/wine-preloader")
+               ;; Copy the real 32-bit wine-preloader instead of the wrapped
+               ;; version.
+               (copy-file (string-append wine32 "/bin/.wine-preloader-real")
                           (string-append out "/bin/wine-preloader"))
                #t)))
          (add-after 'compress-documentation 'copy-wine32-manpage
@@ -222,10 +290,40 @@ integrate Windows applications into your desktop.")
     (synopsis "Implementation of the Windows API (WoW64 version)")
     (supported-systems '("x86_64-linux" "aarch64-linux"))))
 
+;; This minimal build of Wine is needed to prevent a circular dependency with
+;; vkd3d.
+(define-public wine-minimal
+  (package
+    (inherit wine)
+    (name "wine-minimal")
+    (native-inputs (fold alist-delete (package-native-inputs wine)
+               '("gettext" "perl" "pkg-config")))
+    (inputs `())
+    (arguments
+     `(#:validate-runpath? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'configure 'patch-dlopen-paths
+           ;; Hardcode dlopened sonames to absolute paths.
+           (lambda _
+             (let* ((library-path (search-path-as-string->list
+                                   (getenv "LIBRARY_PATH")))
+                    (find-so (lambda (soname)
+                               (search-path library-path soname))))
+               (substitute* "include/config.h"
+                 (("(#define SONAME_.* )\"(.*)\"" _ defso soname)
+                  (format #f "~a\"~a\"" defso (find-so soname))))
+               #t))))
+       #:configure-flags
+       (list "--without-freetype"
+             "--without-x")
+       ,@(strip-keyword-arguments '(#:configure-flags #:phases)
+                                  (package-arguments wine))))))
+
 (define-public wine-staging-patchset-data
   (package
     (name "wine-staging-patchset-data")
-    (version "4.0-rc5")
+    (version "5.0")
     (source
      (origin
        (method git-fetch)
@@ -234,8 +332,7 @@ integrate Windows applications into your desktop.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32
-         "0smp6ngs77vk1yg0saavhhn7kmi9ri8y8gc3vcgg837ycwg5i5qb"))))
+        (base32 "054m2glvav29qnlgr3p36kahyv3kbxzba82djzqpc7cmsrin0d3f"))))
     (build-system trivial-build-system)
     (native-inputs
      `(("bash" ,bash)
@@ -272,32 +369,33 @@ integrate Windows applications into your desktop.")
     (inherit wine)
     (name "wine-staging")
     (version (package-version wine-staging-patchset-data))
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://dl.winehq.org/wine/source/"
-                    (version-major version) ".0"
-                    "/wine-" version ".tar.xz"))
-              (file-name (string-append name "-" version ".tar.xz"))
-              (sha256
-               (base32
-                "0nx5ahahfnmimd2b7zh2wx36b877vad10i2kr2zib9m9b2w8wyfd"))))
-    (inputs `(("autoconf" ,autoconf) ; for autoreconf
+    (source
+     (origin
+       (method url-fetch)
+       (uri (let ((dir (string-append
+                        (version-major version)
+                        (if (string-suffix? ".0" (version-major+minor version))
+                            ".0"
+                            ".x"))))
+              (string-append
+               "https://dl.winehq.org/wine/source/" dir
+               "/wine-" version ".tar.xz")))
+       (file-name (string-append name "-" version ".tar.xz"))
+       (sha256
+        (base32 "1d0kcy338radq07hrnzcpc9lc9j2fvzjh37q673002x8d6x5058q"))))
+    (inputs `(("autoconf" ,autoconf)    ; for autoreconf
               ("ffmpeg" ,ffmpeg)
               ("gtk+" ,gtk+)
               ("libva" ,libva)
               ("mesa" ,mesa)
               ("python" ,python)
-              ("sdl2" ,sdl2)
               ("util-linux" ,util-linux) ; for hexdump
-              ("vkd3d" ,vkd3d)
-              ("vulkan-loader" ,vulkan-loader)
               ("wine-staging-patchset-data" ,wine-staging-patchset-data)
               ,@(package-inputs wine)))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         ;; Explicitely set the 32-bit version of vulkan-loader when installing
+         ;; Explicitly set the 32-bit version of vulkan-loader when installing
          ;; to i686-linux or x86_64-linux.
          ;; TODO: Add more JSON files as they become available in Mesa.
          ,@(match (%current-system)
@@ -310,10 +408,14 @@ integrate Windows applications into your desktop.")
                       (copy-file (string-append (assoc-ref inputs "mesa")
                                  "/share/vulkan/icd.d/radeon_icd.i686.json")
                                  (string-append icd "/radeon_icd.i686.json"))
+                      (copy-file (string-append (assoc-ref inputs "mesa")
+                                 "/share/vulkan/icd.d/intel_icd.i686.json")
+                                 (string-append icd "/intel_icd.i686.json"))
                       (wrap-program (string-append out "/bin/wine-preloader")
                                     `("VK_ICD_FILENAMES" ":" =
                                       (,(string-append icd
-                                        "/radeon_icd.i686.json"))))
+                                        "/radeon_icd.i686.json" ":"
+                                        icd "/intel_icd.i686.json"))))
                       #t)))))
              (_
               `())
@@ -366,7 +468,7 @@ integrated into the main branch.")
              (string-append "libdir=" %output "/lib/wine64"))
        #:phases
        (modify-phases %standard-phases
-         ;; Explicitely set both the 64-bit and 32-bit versions of vulkan-loader
+         ;; Explicitly set both the 64-bit and 32-bit versions of vulkan-loader
          ;; when installing to x86_64-linux so both are available.
          ;; TODO: Add more JSON files as they become available in Mesa.
          ,@(match (%current-system)
@@ -381,7 +483,9 @@ integrated into the main branch.")
                                      (assoc-ref inputs "mesa")
                                      "/share/vulkan/icd.d/intel_icd.x86_64.json" ":"
                                      (assoc-ref inputs "wine-staging")
-                                     "/share/vulkan/icd.d/radeon_icd.i686.json"))))
+                                     "/share/vulkan/icd.d/radeon_icd.i686.json" ":"
+                                     (assoc-ref inputs "wine-staging")
+                                     "/share/vulkan/icd.d/intel_icd.i686.json"))))
                    (wrap-program (string-append out "/bin/wine64-preloader")
                                  `("VK_ICD_FILENAMES" ":" =
                                    (,(string-append (assoc-ref inputs "mesa")
@@ -389,7 +493,9 @@ integrated into the main branch.")
                                      ":" (assoc-ref inputs "mesa")
                                      "/share/vulkan/icd.d/intel_icd.x86_64.json"
                                      ":" (assoc-ref inputs "wine-staging")
-                                     "/share/vulkan/icd.d/radeon_icd.i686.json"))))
+                                     "/share/vulkan/icd.d/radeon_icd.i686.json"
+                                     ":" (assoc-ref inputs "wine-staging")
+                                     "/share/vulkan/icd.d/intel_icd.i686.json"))))
                    #t)))))
            (_
             `())
@@ -443,3 +549,89 @@ integrated into the main branch.")
     (synopsis "Implementation of the Windows API (staging branch, WoW64
 version)")
     (supported-systems '("x86_64-linux" "aarch64-linux"))))
+
+(define dxvk32
+  ;; This package provides 32-bit dxvk libraries on 64-bit systems.
+  (package
+    (name "dxvk32")
+    (version "1.5.4")
+    (home-page "https://github.com/doitsujin/dxvk/")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0yhxd5rnn5mcvcb2n062z9wqqwxjq5c0rzfbjz1z9ppznj8gn37i"))))
+    (build-system meson-build-system)
+    (arguments
+     `(#:system "i686-linux"
+       #:configure-flags (list "--cross-file"
+                               (string-append (assoc-ref %build-inputs "source")
+                                              "/build-wine32.txt"))))
+    (native-inputs
+     ;; Since 1.5 dxvk needs gcc-8.1.  See
+     ;; https://github.com/doitsujin/dxvk/issues/1292#issuecomment-567067373.
+     `(("gcc" ,gcc-9)
+       ("glslang" ,glslang)))
+    (inputs
+     `(("wine" ,wine-staging)))
+    (synopsis "Vulkan-based D3D9, D3D10 and D3D11 implementation for Wine")
+    (description "A Vulkan-based translation layer for Direct3D 9/10/11 which
+allows running complex 3D applications with high performance using Wine.
+
+Use @command{setup_dxvk} to install the required libraries to a Wine prefix.")
+    (supported-systems '("x86_64-linux"))
+    (license license:zlib)))
+
+(define-public dxvk
+  (package
+    (inherit dxvk32)
+    (name "dxvk")
+    (arguments
+     `(#:configure-flags (list "--cross-file"
+                               (string-append (assoc-ref %build-inputs "source")
+                                              "/build-wine"
+                                              ,(match (%current-system)
+                                                 ("x86_64-linux" "64")
+                                                 (_ "32"))
+                                              ".txt"))
+       #:phases
+       (modify-phases %standard-phases
+         ,@(if (string=? (%current-system) "x86_64-linux")
+             `((add-after 'unpack 'install-32
+                 (lambda* (#:key inputs outputs #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out"))
+                          (dxvk32 (assoc-ref inputs "dxvk32")))
+                     (mkdir-p (string-append out "/lib32"))
+                     (copy-recursively (string-append dxvk32 "/lib")
+                                       (string-append out "/lib32"))))))
+             '())
+         (add-after 'install 'install-setup
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin/setup_dxvk")))
+               (mkdir-p (string-append out "/bin"))
+               (copy-file "../source/setup_dxvk.sh"
+                          bin)
+               (chmod bin #o755)
+               (substitute* bin
+                 (("wine=\"wine\"")
+                  (string-append "wine=" (assoc-ref inputs "wine") "/bin/wine"))
+                 (("x32") ,(match (%current-system)
+                             ("x86_64-linux" "../lib32")
+                             (_ "../lib")))
+                 (("x64") "../lib"))))))))
+    (inputs
+     `(("wine" ,(match (%current-system)
+                  ;; ("x86_64-linux" wine64)
+                  ("x86_64-linux" wine64-staging)
+                  ;; ("x86_64-linux" mingw-w64-x86_64)
+                  (_ wine)))
+       ,@(match (%current-system)
+           ("x86_64-linux"
+            `(("dxvk32" ,dxvk32)))
+           (_ '()))))
+    (supported-systems '("i686-linux" "x86_64-linux"))))