diff mbox series

[bug#37012] gnu: mingw: Add x86_64 support.

Message ID y9GTolNpEpkHH35zvM9UsZZe3UXf8omDVHkvEwdHU6f7mgUPmz9IUioco_XiweX1Lr8xuEa36Jxz64MXUcLylRM37uCZ6iQMM4WgNzMU67M=@carldong.me
State Accepted
Headers show
Series [bug#37012] gnu: mingw: Add x86_64 support. | expand

Commit Message

Carl Dong Aug. 14, 2019, 5:54 p.m. UTC
Here's the updated patch that I've tested. Let me know if this works for you! :-)

From e6df2d6f9b47b02abec01a16f2d0b1271dcec1d2 Mon Sep 17 00:00:00 2001
From: Carl Dong <contact@carldong.me>
Date: Wed, 14 Aug 2019 13:46:53 -0400
Subject: [PATCH] gnu: mingw: Add x86_64 support.

This patch parameterizes previously hard-coded instances of
i686-w64-mingw32, adding support for x86_64-w64-mingw32.

* gnu/packages/mingw.scm (make-mingw-w64): New procedure.
(mingw-w64-i686, mingw-w64-x86_64): New variables.
(%mingw-triplet): Remove.
(mingw-w64): Update to point to 'mingw-w64-i686'.
* gnu/packages/cross-base.scm (cross-gcc): Use 'libc' keyword argument
if specified, instead of treating it as a boolean.
(native-libc): Return the correct mingw-w64 depending on machine
specified in target.
* gnu/packages/bootstrap.scm (glibc-dynamic-linker): Add "x86_64-mingw".
* gnu/build/cross-toolchain.scm (set-cross-path/mingw): Replace
hardcoded 'i686-w64-mingw32' instances with 'target' keyword argument.
(cross-gcc-build-phases): Update accordingly; use 'target-mingw?'
implementation of target checking and add commentary.
* gnu/ci.scm (%cross-targets): Add "x86_64-w64-mingw32".
---
 gnu/build/cross-toolchain.scm |  15 +++--
 gnu/ci.scm                    |   3 +-
 gnu/packages/bootstrap.scm    |   2 +
 gnu/packages/cross-base.scm   |   6 +-
 gnu/packages/mingw.scm        | 111 ++++++++++++++++++----------------
 5 files changed, 78 insertions(+), 59 deletions(-)

--
2.22.0

Cheers,
Carl Dong
contact@carldong.me
"I fight for the users"

Comments

Janneke Nieuwenhuizen Aug. 14, 2019, 6:40 p.m. UTC | #1
Carl Dong writes:

Hello Carl,

> Here's the updated patch that I've tested. Let me know if this works for you! :-)

Thanks!

> From e6df2d6f9b47b02abec01a16f2d0b1271dcec1d2 Mon Sep 17 00:00:00 2001
> From: Carl Dong <contact@carldong.me>
> Date: Wed, 14 Aug 2019 13:46:53 -0400
> Subject: [PATCH] gnu: mingw: Add x86_64 support.

It looks good and I can compile `hello'; the traditional 32 bit version:

    ./pre-inst-env guix build --target=i686-w64-mingw32 hello

and now also

    ./pre-inst-env guix build --target=x86_64-w64-mingw32 hello

However, while the 32 bit still works for me, the 64 bit version does
not.  How is that for you?  Do you have any idea how to verify if the
x86_64 hello.exe is OK or how to debug that?

--8<---------------cut here---------------start------------->8---
20:33:04 janneke@dundal:~/src/guix/wip [env]
$ file /gnu/store/4hayc4wmxz0b0bw555n5gny7xkhg7w6y-hello-2.10/bin/hello.exe
/gnu/store/4hayc4wmxz0b0bw555n5gny7xkhg7w6y-hello-2.10/bin/hello.exe: PE32 executable (console) Intel 80386, for MS Windows
20:34:04 janneke@dundal:~/src/guix/wip [env]
$ guix environment --ad-hoc wine -- wine /gnu/store/4hayc4wmxz0b0bw555n5gny7xkhg7w6y-hello-2.10/bin/hello.exe 
Hello, world!
20:34:14 janneke@dundal:~/src/guix/wip [env]
$ file /gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe 
/gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe: PE32+ executable (console) x86-64, for MS Windows
20:34:22 janneke@dundal:~/src/guix/wip [env]
$ guix environment --ad-hoc wine -- wine /gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe
wine: Bad EXE format for Z:\gnu\store\v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10\bin\hello.exe.
[193]
--8<---------------cut here---------------end--------------->8---

Possibly I'm even using wine wrong?

Other than that the patch looks fine.  It would be nice if we knew
wether the 64bit version can produce something useful, though.  Can
you/someone please shed some light on that?

Greetings,
janneke
Carl Dong Aug. 14, 2019, 6:50 p.m. UTC | #2
Hey janneke!

It would seem from the synopsis that the version of wine packaged with Guix is 32-bit only. I will test out the 64-bit hello binary when I get home on my Windows machine!

Cheers,
Carl Dong
contact@carldong.me
"I fight for the users"

‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Wednesday, August 14, 2019 6:40 PM, Jan Nieuwenhuizen <janneke@gnu.org> wrote:

> Carl Dong writes:
>
> Hello Carl,
>
> > Here's the updated patch that I've tested. Let me know if this works for you! :-)
>
> Thanks!
>
> > From e6df2d6f9b47b02abec01a16f2d0b1271dcec1d2 Mon Sep 17 00:00:00 2001
> > From: Carl Dong contact@carldong.me
> > Date: Wed, 14 Aug 2019 13:46:53 -0400
> > Subject: [PATCH] gnu: mingw: Add x86_64 support.
>
> It looks good and I can compile `hello'; the traditional 32 bit version:
>
> ./pre-inst-env guix build --target=i686-w64-mingw32 hello
>
> and now also
>
> ./pre-inst-env guix build --target=x86_64-w64-mingw32 hello
>
> However, while the 32 bit still works for me, the 64 bit version does
> not. How is that for you? Do you have any idea how to verify if the
> x86_64 hello.exe is OK or how to debug that?
>
> --8<---------------cut here---------------start------------->8---
> 20:33:04 janneke@dundal:~/src/guix/wip [env]
> $ file /gnu/store/4hayc4wmxz0b0bw555n5gny7xkhg7w6y-hello-2.10/bin/hello.exe
> /gnu/store/4hayc4wmxz0b0bw555n5gny7xkhg7w6y-hello-2.10/bin/hello.exe: PE32 executable (console) Intel 80386, for MS Windows
> 20:34:04 janneke@dundal:~/src/guix/wip [env]
> $ guix environment --ad-hoc wine -- wine /gnu/store/4hayc4wmxz0b0bw555n5gny7xkhg7w6y-hello-2.10/bin/hello.exe
> Hello, world!
> 20:34:14 janneke@dundal:~/src/guix/wip [env]
> $ file /gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe
> /gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe: PE32+ executable (console) x86-64, for MS Windows
> 20:34:22 janneke@dundal:~/src/guix/wip [env]
> $ guix environment --ad-hoc wine -- wine /gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe
> wine: Bad EXE format for Z:\gnu\store\v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10\bin\hello.exe.
> [193]
> --8<---------------cut here---------------end--------------->8---
>
> Possibly I'm even using wine wrong?
>
> Other than that the patch looks fine. It would be nice if we knew
> wether the 64bit version can produce something useful, though. Can
> you/someone please shed some light on that?
>
> Greetings,
> janneke
>
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Jan Nieuwenhuizen janneke@gnu.org | GNU LilyPond http://lilypond.org
> Freelance IT http://JoyofSource.com | Avatar® http://AvatarAcademy.com
Janneke Nieuwenhuizen Aug. 14, 2019, 7:33 p.m. UTC | #3
Carl Dong writes:

Hello Carl,

> It would seem from the synopsis that the version of wine packaged with
> Guix is 32-bit only.

'Doh!

> I will test out the 64-bit hello binary when I get home on my Windows
> machine!

Thanks, but no pressing need for that now, look:

--8<---------------cut here---------------start------------->8---
21:27:49 janneke@dundal:~/src/guix/wip [env]
$ guix environment --ad-hoc wine64 -- wine64 /gnu/store/v83ag9ahcg5g5qp06rlvjmvrydyriv7p-hello-2.10/bin/hello.exe
Hello, world!
--8<---------------cut here---------------end--------------->8---

Pushed to master as 67dac6b8920755cb011047157bb7b4fae4760143

Thanks again!
janneke
diff mbox series

Patch

diff --git a/gnu/build/cross-toolchain.scm b/gnu/build/cross-toolchain.scm
index d430b8afc4..201b36ff7c 100644
--- a/gnu/build/cross-toolchain.scm
+++ b/gnu/build/cross-toolchain.scm
@@ -3,6 +3,7 @@ 
 ;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
+;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -95,7 +96,7 @@  C_INCLUDE_PATH et al."
      ;; We're building the sans-libc cross-compiler, so nothing to do.
      #t)))

-(define* (set-cross-path/mingw #:key inputs #:allow-other-keys)
+(define* (set-cross-path/mingw #:key inputs target #:allow-other-keys)
   "Add the cross MinGW headers to CROSS_C_*_INCLUDE_PATH, and remove them from
 C_*INCLUDE_PATH."
   (let ((libc (assoc-ref inputs "libc"))
@@ -112,7 +113,7 @@  C_*INCLUDE_PATH."

     (if libc
         (let ((cpath (string-append libc "/include"
-                                    ":" libc "/i686-w64-mingw32/include")))
+                                    ":" libc "/" target "/include")))
           (for-each (cut setenv <> cpath)
                     %gcc-cross-include-paths))

@@ -142,7 +143,7 @@  C_*INCLUDE_PATH."
     (when libc
       (setenv "CROSS_LIBRARY_PATH"
               (string-append libc "/lib"
-                             ":" libc "/i686-w64-mingw32/lib")))
+                             ":" libc "/" target "/lib")))

     (setenv "CPP" (string-append gcc "/bin/cpp"))
     (for-each (lambda (var)
@@ -168,8 +169,12 @@  C_*INCLUDE_PATH."
 a target triplet."
   (modify-phases phases
     (add-before 'configure 'set-cross-path
-      (if (string-contains target "mingw")
-          set-cross-path/mingw
+      ;; This mingw32 target checking logic should match that of target-mingw?
+      ;; in (guix utils), but (guix utils) is too large too copy over to the
+      ;; build side entirely and for now we have no way to select variables to
+      ;; copy over. See (gnu packages cross-base) for more details.
+      (if (string-suffix? "-mingw32" target)
+          (cut set-cross-path/mingw #:target target <...>)
           set-cross-path))
     (add-after 'install 'make-cross-binutils-visible
       (cut make-cross-binutils-visible #:target target <...>))
diff --git a/gnu/ci.scm b/gnu/ci.scm
index 4885870e16..aeebd4f14b 100644
--- a/gnu/ci.scm
+++ b/gnu/ci.scm
@@ -130,7 +130,8 @@  SYSTEM."
     "aarch64-linux-gnu"
     "powerpc-linux-gnu"
     "i586-pc-gnu"                                 ;aka. GNU/Hurd
-    "i686-w64-mingw32"))
+    "i686-w64-mingw32"
+    "x86_64-w64-mingw32"))

 (define %guixsd-supported-systems
   '("x86_64-linux" "i686-linux" "armhf-linux"))
diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index 5030b815b9..cd99425379 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -2,6 +2,7 @@ 
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -187,6 +188,7 @@  return value is ignored."
         ((string=? system "avr") "no-ld.so")
         ((string=? system "propeller-elf") "no-ld.so")
         ((string=? system "i686-mingw") "no-ld.so")
+        ((string=? system "x86_64-mingw") "no-ld.so")
         ((string=? system "vc4-elf") "no-ld.so")

         (else (error "dynamic linker name not known for this system"
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index a0341ebc5d..e277139f25 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -4,6 +4,7 @@ 
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2016 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -249,7 +250,7 @@  target that libc."
            (cond
             ((target-mingw? target)
              (if libc
-                 `(("libc" ,mingw-w64)
+                 `(("libc" ,libc)
                    ,@inputs)
                  `(("mingw-source" ,(package-source mingw-w64))
                    ,@inputs)))
@@ -509,7 +510,8 @@  and the cross tool chain."
                      #:optional
                      (libc glibc))
   (if (target-mingw? target)
-      mingw-w64
+      (let ((machine (substring target 0 (string-index target #\-))))
+        (make-mingw-w64 machine))
       libc))

 (define* (cross-newlib? target
diff --git a/gnu/packages/mingw.scm b/gnu/packages/mingw.scm
index 3e96f2c475..017f9453ab 100644
--- a/gnu/packages/mingw.scm
+++ b/gnu/packages/mingw.scm
@@ -1,6 +1,7 @@ 
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,56 +32,56 @@ 
   #:use-module (guix utils)
   #:use-module (ice-9 match))

-(define %mingw-triplet
-  "i686-w64-mingw32")
-
-(define-public mingw-w64
-  (package
-    (name "mingw-w64")
-    (version "5.0.4")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://sourceforge.net/projects/mingw-w64/files/mingw-w64/"
-                    "mingw-w64-release/mingw-w64-v" version ".tar.bz2"))
-              (sha256
-               (base32 "00zq3z1hbzd5yzmskskjg79xrzwsqx7ihyprfaxy4hb897vf29sm"))
-              (patches (search-patches "mingw-w64-5.0rc2-gcc-4.9.3.patch"))))
-    (native-inputs `(("xgcc-core" ,(cross-gcc %mingw-triplet))
-                     ("xbinutils" ,(cross-binutils %mingw-triplet))))
-    (build-system gnu-build-system)
-    (search-paths
-     (list (search-path-specification
-            (variable "CROSS_C_INCLUDE_PATH")
-            (files '("include" "i686-w64-mingw32/include")))
-           (search-path-specification
-            (variable "CROSS_LIBRARY_PATH")
-            (files
-             '("lib" "lib64" "i686-w64-mingw32/lib" "i686-w64-mingw32/lib64")))))
-    (arguments
-     `(#:configure-flags '("--host=i686-w64-mingw32")
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'setenv
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((xgcc-core (assoc-ref inputs "xgcc-core"))
-                   (mingw-headers (string-append (getcwd) "/mingw-w64-headers")))
-               (setenv "CPP"
-                       (string-append xgcc-core "/bin/i686-w64-mingw32-cpp"))
-               (setenv "CROSS_C_INCLUDE_PATH"
-                       (string-append
-                        mingw-headers
-                        ":" mingw-headers "/include"
-                        ":" mingw-headers "/crt"
-                        ":" mingw-headers "/defaults/include"
-                        ":" mingw-headers "/direct-x/include"))))))
-       #:make-flags (list "DEFS=-DHAVE_CONFIG_H -D__MINGW_HAS_DXSDK=1")
-       #:tests? #f ; compiles and includes glibc headers
-       #:strip-binaries? #f))
-    (home-page "https://mingw-w64.org")
-    (synopsis "Minimalist GNU for Windows")
-    (description
-     "Minimalist GNU for Windows (@dfn{MinGW}) is a complete software
+(define-public (make-mingw-w64 machine)
+  (let ((triplet (string-append machine "-" "w64-mingw32")))
+    (package
+      (name (string-append "mingw-w64" "-" machine))
+      (version "5.0.4")
+      (source (origin
+                (method url-fetch)
+                (uri (string-append
+                      "https://sourceforge.net/projects/mingw-w64/files/mingw-w64/"
+                      "mingw-w64-release/mingw-w64-v" version ".tar.bz2"))
+                (sha256
+                 (base32 "00zq3z1hbzd5yzmskskjg79xrzwsqx7ihyprfaxy4hb897vf29sm"))
+                (patches (search-patches "mingw-w64-5.0rc2-gcc-4.9.3.patch"))))
+      (native-inputs `(("xgcc-core" ,(cross-gcc triplet))
+                       ("xbinutils" ,(cross-binutils triplet))))
+      (build-system gnu-build-system)
+      (search-paths
+       (list (search-path-specification
+              (variable "CROSS_C_INCLUDE_PATH")
+              (files `("include" ,(string-append triplet "/include"))))
+             (search-path-specification
+              (variable "CROSS_LIBRARY_PATH")
+              (files
+               `("lib" "lib64"
+                 ,(string-append triplet "/lib")
+                 ,(string-append triplet "/lib64"))))))
+      (arguments
+       `(#:configure-flags '(,(string-append "--host=" triplet))
+         #:phases
+         (modify-phases %standard-phases
+           (add-before 'configure 'setenv
+             (lambda* (#:key inputs #:allow-other-keys)
+               (let ((xgcc-core (assoc-ref inputs "xgcc-core"))
+                     (mingw-headers (string-append (getcwd) "/mingw-w64-headers")))
+                 (setenv "CPP"
+                         (string-append xgcc-core ,(string-append "/bin/" triplet "-cpp")))
+                 (setenv "CROSS_C_INCLUDE_PATH"
+                         (string-append
+                          mingw-headers
+                          ":" mingw-headers "/include"
+                          ":" mingw-headers "/crt"
+                          ":" mingw-headers "/defaults/include"
+                          ":" mingw-headers "/direct-x/include"))))))
+         #:make-flags (list "DEFS=-DHAVE_CONFIG_H -D__MINGW_HAS_DXSDK=1")
+         #:tests? #f ; compiles and includes glibc headers
+         #:strip-binaries? #f))
+      (home-page "https://mingw-w64.org")
+      (synopsis "Minimalist GNU for Windows")
+      (description
+       "Minimalist GNU for Windows (@dfn{MinGW}) is a complete software
 development environment for creating native Microsoft Windows applications.

 It includes a set of Windows-specific header files and static import libraries
@@ -89,4 +90,12 @@  runtime dynamic-link libraries (@dfn{DLL}s).

 Mingw-w64 is an advancement of the original mingw.org project and provides
 several new APIs such as DirectX and DDK, and 64-bit support.")
-    (license license:fdl1.3+)))
+      (license license:fdl1.3+))))
+
+(define-public mingw-w64-i686
+  (make-mingw-w64 "i686"))
+
+(define-public mingw-w64-x86_64
+  (make-mingw-w64 "x86_64"))
+
+(define-public mingw-w64 mingw-w64-i686)