lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FWD: [RFCv2] build: i686-w64-mingw32: new cross target.


From: Jan Nieuwenhuizen
Subject: FWD: [RFCv2] build: i686-w64-mingw32: new cross target.
Date: Sun, 27 Mar 2016 17:21:13 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Hi,

Just to give you a headsup.  It's too early to tell if this will fly,
but hello world is there.

    https://lists.gnu.org/archive/html/guix-devel/2016-03/msg01116.html

Greetings,
Jan

--- Begin Message --- Subject: [RFCv2] build: i686-w64-mingw32: new cross target. Date: Sun, 27 Mar 2016 16:20:13 +0200 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)
Jan Nieuwenhuizen writes:

> I'm working on a cross target in an effort to get rid of GUB 1) in
> favour of Guix and could do with some help.

It now builds fully from source.  See
https://github.com/janneke/guix/tree/wip-mingw32 or attached patch.

    16:15:25 address@hidden:~/src/mingw-guix
    $ ./pre-inst-env guix build --keep-failed --target=i686-w64-mingw32 hello
    /gnu/store/2j8qaqbc9q1w3z6k054nmp7j432yxfq7-hello-2.10
    16:15:29 address@hidden:~/src/mingw-guix
    $ ./pre-inst-env guix environment --ad-hoc wine -- wine 
/gnu/store/2j8qaqbc9q1w3z6k054nmp7j432yxfq7-hello-2.10/bin/hello.exe
    Hello, world!
    16:15:40 address@hidden:~/src/mingw-guix
    $ 

The gcc-cross-core package needs some cleanups and I still need to
figure out to remove the i686-w64-mingw32 special casing, i.e, find
a way to handle the libc/#f/newlib case.

Greetings,
Jan

1) GUB -- http://lilypond.org/gub/

>From 7a58b7d85c798e1ca2f11d61e0b344cf2e3bcb10 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <address@hidden>
Date: Sun, 27 Mar 2016 16:00:36 +0200
Subject: [PATCH] build: i686-w64-mingw32: new cross target.

* gnu/packages/cross-base.scm (gcc-cross-core, mingw-w64,
  xgcc-i686-w64-mingw32): New variables.
  (cross-gcc): Use them to support i686-w64-mingw32 target.
* gnu/packages/bootstrap.scm (glibc-dynamic-linker): Add i686-mingw.
* guix/build-system/gnu.scm (standard-cross-packages): Set libc to #f
  for i686-w64-mingw32.
---
 gnu/packages/bootstrap.scm  |   1 +
 gnu/packages/cross-base.scm | 276 +++++++++++++++++++++++++++++++++++++++++---
 guix/build-system/gnu.scm   |   4 +-
 3 files changed, 263 insertions(+), 18 deletions(-)

diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index f5bf069..979ab1d 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -171,6 +171,7 @@ successful, or false to signal an error."
         ;; here just so we can keep going.
         ((string=? system "xtensa-elf") "no-ld.so")
         ((string=? system "avr") "no-ld.so")
+        ((string=? system "i686-mingw") "no-ld.so")
 
         (else (error "dynamic linker name not known for this system"
                      system))))
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 8bd599c..be2f4c0 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -18,12 +18,16 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages cross-base)
-  #:use-module (guix licenses)
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
-  #:use-module (gnu packages gcc)
   #:use-module (gnu packages base)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages gawk)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages commencement)
+  #:use-module (gnu packages compression)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages multiprecision)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
@@ -101,7 +105,7 @@ may be either a libc package or #f.)"
         `(append (list ,(string-append "--target=" target)
                        ,@(if libc
                              `( ;; Disable libcilkrts because it is not
-                                ;; ported to GNU/Hurd. 
+                                ;; ported to GNU/Hurd.
                                "--disable-libcilkrts")
                              `( ;; Disable features not needed at this stage.
                                "--disable-shared" "--enable-static"
@@ -120,20 +124,32 @@ may be either a libc package or #f.)"
                                "--disable-libquadmath"
                                "--disable-decimal-float" ;would need libc
                                "--disable-libcilkrts"
-                               )))
+                                ))
+                        ,@(if (equal? target "i686-w64-mingw32")
+                              '("--with-newlib"
+                                "--without-headers")
+                              '()))
 
                  ,(if libc
                       flags
                       `(remove (cut string-match "--enable-languages.*" <>)
                                ,flags))))
        ((#:make-flags flags)
-        (if libc
+         (cond
+          ((equal? target "i686-w64-mingw32")
+           `(append (let ((runtime (assoc-ref %build-inputs "mingw-w64")))
+                      (if runtime
+                          (list
+                           (string-append "FLAGS_FOR_TARGET=-B" runtime 
"/lib"))
+                          '()))
+                    ,flags))
+          (libc
             `(let ((libc (assoc-ref %build-inputs "libc")))
                ;; FLAGS_FOR_TARGET are needed for the target libraries to 
receive
                ;; the -Bxxx for the startfiles.
                (cons (string-append "FLAGS_FOR_TARGET=-B" libc "/lib")
-                     ,flags))
-            flags))
+                    ,flags)))
+          (else flags)))
        ((#:phases phases)
         (let ((phases
                `(alist-cons-after
@@ -162,13 +178,50 @@ may be either a libc package or #f.)"
                     ;; for cross-compilers.
                     (zero? (system* "make" "install-strip")))
                   ,phases))))
+           (cond
+            ((equal? target "i686-w64-mingw32")
+             `(modify-phases ,phases
+                (add-before
+                 'configure 'set-cross-path
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; Add the cross Linux headers to CROSS_CPATH, and remove 
them
+                   ;; from CPATH.
+                   (let ((libc (assoc-ref inputs "mingw-w64"))
+                         (gcc (assoc-ref inputs "gcc")))
+                     (define (cross? x)
+                       (and libc (string-prefix? libc x)))
+
+                     (if libc
+                         (setenv "CROSS_CPATH"
+                                 (string-append libc "/include"
+                                                ":" libc 
"/i686-w64-mingw32/include")))
           (if libc
+                         (setenv "CROSS_LIBRARY_PATH"
+                                 (string-append libc "/lib"
+                                                ":" libc 
"/i686-w64-mingw32/lib")))
+
+                     (setenv "CPP" (string-append gcc "/bin/cpp"))
+
+                     (let ((cpath   (search-path-as-string->list
+                                     (getenv "C_INCLUDE_PATH")))
+                           (libpath (search-path-as-string->list
+                                     (getenv "LIBRARY_PATH"))))
+                       (setenv "CPATH"
+                               (list->search-path-as-string
+                                (remove cross? cpath) ":"))
+                       (for-each unsetenv
+                                 '("C_INCLUDE_PATH" "CPLUS_INCLUDE_PATH"))
+                       (setenv "LIBRARY_PATH"
+                               (list->search-path-as-string
+                                (remove cross? libpath) ":"))
+                       #t))))))
+            (libc
               `(alist-cons-before
                 'configure 'set-cross-path
                 (lambda* (#:key inputs #:allow-other-keys)
                   ;; Add the cross Linux headers to CROSS_CPATH, and remove 
them
                   ;; from CPATH.
-                  (let ((libc  (assoc-ref inputs "libc"))
+                  (let ((libc (assoc-ref inputs libc))
                         (linux (assoc-ref inputs "xlinux-headers")))
                     (define (cross? x)
                       ;; Return #t if X is a cross-libc or cross Linux.
@@ -194,8 +247,8 @@ may be either a libc package or #f.)"
                               (list->search-path-as-string
                                (remove cross? libpath) ":"))
                       #t)))
-                ,phases)
-              phases)))))))
+               ,phases))
+            (else phases))))))))
 
 (define (cross-gcc-patches target)
   "Return GCC patches needed for TARGET."
@@ -240,6 +293,7 @@ GCC that does not target a libc; otherwise, target that 
libc."
                              #:target target
                              #:binutils xbinutils))
        ("binutils-cross" ,xbinutils)
+       ("gcc" ,gcc)
 
        ;; Call it differently so that the builder can check whether the "libc"
        ;; input is #f.
@@ -248,13 +302,17 @@ GCC that does not target a libc; otherwise, target that 
libc."
        ;; Remaining inputs.
        ,@(let ((inputs (append (package-inputs %xgcc)
                                (alist-delete "libc" %final-inputs))))
-           (if libc
+           (cond
+            ((equal? target "i686-w64-mingw32")
+             `(("mingw-w64" ,mingw-w64)
+               ,@inputs))
+            (libc
                `(("libc" ,libc)
                  ("xlinux-headers"                ;the target headers
                   ,@(assoc-ref (package-propagated-inputs libc)
                                "linux-headers"))
-                 ,@inputs)
-               inputs))))
+               ,@inputs))
+            (else inputs)))))
 
     (inputs '())
 
@@ -268,13 +326,105 @@ GCC that does not target a libc; otherwise, target that 
libc."
             (files '("lib" "lib64")))))
     (native-search-paths '())))
 
+(define* (cross-gcc-core target
+                         #:optional (xbinutils (cross-binutils target)))
+  "Return a cross-compiler-core to be used to build the c library for TARGET,
+where TARGET is a GNU triplet.  Use XBINUTILS as the associated
+cross-Binutils."
+  (package (inherit (cross-gcc target xbinutils))
+           (name (string-append "gcc-core-cross-" target))
+           (inputs `())
+           ;; FIXME: no effect? must add inputs to mingw-source
+           (propagated-inputs
+            `(("gmp" ,gmp)
+              ("mpfr" ,mpfr)
+              ("mpc" ,mpc)
+              ("zlib" ,zlib)))
+           (native-inputs `(("ld-wrapper-cross" ,(make-ld-wrapper
+                                                  (string-append "ld-wrapper-" 
target)
+                                                  #:target target
+                                                  #:binutils xbinutils))
+                            ("cross-binutils" ,xbinutils)
+
+                            ("tar" ,tar)
+                            ("xz" ,xz)
+
+                            ;;("static-bash" ,static-bash) ;; /bin/sh
+                            ("bash" ,bash)
+                            ("glibc" ,glibc)
+
+                            ("coreutils" ,coreutils)
+                            ("sed" ,sed)
+
+                            ("gcc" ,gcc)
+                            ("binutils" ,binutils)
+                            ("gawk" ,gawk)
+                            ("grep" ,grep)
+
+                            ("make" ,gnu-make)
+                            ("mingw-source" ,(package-source mingw-w64))
+                            ("bzip2" ,bzip2) ;; unpack mingw .bz2
+                            ("diffutils" ,diffutils) ;; cmp: are we fdl?
+                            ("gzip" ,gzip))) ;; info docs
+           (arguments
+            (let ((args `(,@(package-arguments (cross-gcc target xbinutils)))))
+              (substitute-keyword-arguments args
+                ((#:configure-flags flags)
+                 `(append (list
+                           ,(string-append "--target=" target))
+                          (remove (cut string-match "--enable-languages.*" <>)
+                                  ,flags)
+                          '("--with-newlib"
+                            "--without-headers")))
+                ((#:make-flags flags)
+                 `(append '("all-gcc" "all-target-libgcc")
+                          ,flags))
+                ((#:phases phases)
+                 `(modify-phases ,phases
+                    (add-before
+                     'configure 'setenv
+                     (lambda* (#:key outputs inputs #:allow-other-keys)
+                       (let* ((gmp (assoc-ref inputs "gmp"))
+                              (mpfr (assoc-ref inputs "mpfr"))
+                              (mpc (assoc-ref inputs "mpc"))
+                              (zlib (assoc-ref inputs "zlib")))
+                         (setenv "LD_LIBRARY_PATH"
+                                 (string-append
+                                  gmp "/lib"
+                                  ":" mpfr "/lib"
+                                  ":" mpc "/lib"
+                                  ":" zlib "/lib"))
+                         (cond
+                          ((equal? ,target "i686-w64-mingw32")
+                           (let ((mingw-source (assoc-ref inputs 
"mingw-source"))
+                                 (mingw-headers
+                                  (string-append (getcwd) 
"/mingw-w64-v5.0-rc2/mingw-w64-headers")))
+                             (system* "tar" "xf" mingw-source)
+                             (copy-file (string-append mingw-headers 
"/crt/_mingw.h.in")
+                                        (string-append mingw-headers 
"/crt/_mingw.h"))
+                             (substitute* (string-append mingw-headers 
"/crt/_mingw.h")
+                               (("@MINGW_HAS_SECURE_API@") "#define 
MINGW_HAS_SECURE_API 1"))
+                             (setenv "CROSS_CPATH"
+                                     (string-append
+                                      mingw-headers "/include"
+                                      ":" mingw-headers "/crt"
+                                      ":" mingw-headers 
"/defaults/include"))))))))
+                    (replace 'install
+                             (lambda _
+                               (zero? (system* "make" "install-gcc" 
"install-target-libgcc"))))
+                    (delete 'make-cross-binutils-visible)
+                    (delete 'validate-runpath))))))))
+
 (define* (cross-libc target
                      #:optional
                      (xgcc (cross-gcc target))
                      (xbinutils (cross-binutils target)))
   "Return a libc cross-built for TARGET, a GNU triplet.  Use XGCC and
 XBINUTILS and the cross tool chain."
-  (define xlinux-headers
+  (cond
+   ((equal? target "i686-w64-mingw32") mingw-w64)
+   (else
+    (let ((xlinux-headers
     (package (inherit linux-libre-headers)
       (name (string-append (package-name linux-libre-headers)
                            "-cross-" target))
@@ -294,8 +444,7 @@ XBINUTILS and the cross tool chain."
             ,phases))))
       (native-inputs `(("cross-gcc" ,xgcc)
                        ("cross-binutils" ,xbinutils)
-                       ,@(package-native-inputs linux-libre-headers)))))
-
+                       ,@(package-native-inputs linux-libre-headers))))))
   (package (inherit glibc)
     (name (string-append "glibc-cross-" target))
     (arguments
@@ -333,7 +482,91 @@ XBINUTILS and the cross tool chain."
     (native-inputs `(("cross-gcc" ,xgcc)
                      ("cross-binutils" ,xbinutils)
                      ,@(package-inputs glibc)     ;FIXME: static-bash
-                     ,@(package-native-inputs glibc)))))
+                     ,@(package-native-inputs glibc))))))))
+
+(define-public mingw-w64
+  (package
+    (name "mingw-w64")
+    (version "5.0-rc2")
+    (source (origin
+              (method url-fetch)
+              (uri 
"https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v5.0-rc2.tar.bz2";)
+              (sha256
+               (base32 
"0imdary8j07if8ih73pfgxiclpf2ax8h3mz8mxln07i8sbbd30c9"))))
+    (build-system gnu-build-system)
+    (search-paths
+     (list (search-path-specification
+            (variable "CROSS_CPATH")
+            (files '("include" "i686-w64-mingw32/include")))
+           (search-path-specification
+            (variable "CROSS_LIBRARY_PATH")
+            (files '("lib" "lib64" "i686-w64-mingw32/lib" 
"i686-w64-mingw32/lib64")))))
+    (native-inputs `(("xgcc-core" ,xgcc-core-i686-w64-mingw32)
+                     ("xbinutils" ,xbinutils-i686-w64-mingw32)
+                     ;; FIXME: these do not propagate along
+                     ("gmp" ,gmp)
+                     ("mpfr" ,mpfr)
+                     ("mpc" ,mpc)
+                     ("zlib" ,zlib)))
+    (arguments
+     `(#:configure-flags (list
+                          "--host=i686-w64-mingw32"
+                          "--target=i686-w64-mingw32"
+                          "--with-as=i686-w64-mingw32-as"
+                          ;;"--with-cpp=i686-w64-mingw32-cpp"
+                          "--with-ld=i686-w64-mingw32-ld"
+                          "--with-nm=i686-w64-mingw32-nm")
+                         ;; FIXME: include _mingw_directx.h ?
+                         #:make-flags (list "DEFS=-DHAVE_CONFIG_H 
-D__MINGW_HAS_DXSDK=1")
+                         #:tests? #f ;; FIXME: compiles and includes glibc 
headers
+                         #:phases
+                         (modify-phases %standard-phases
+                           (add-before
+                            'configure 'setenv
+                            (lambda _
+                              (let (;; FIXME: these do not propagate along
+                                    (xgcc-core (assoc-ref %build-inputs 
"xgcc-core"))
+                                    (xbinutils (assoc-ref %build-inputs 
"xbinutils"))
+                                    (gmp (assoc-ref %build-inputs "gmp"))
+                                    (mpfr (assoc-ref %build-inputs "mpfr"))
+                                    (mpc (assoc-ref %build-inputs "mpc"))
+                                    (zlib (assoc-ref %build-inputs "zlib"))
+                                    (mingw-headers (string-append (getcwd) 
"/mingw-w64-headers")))
+                                ;; FIXME: LD_LIBRARY_PATH does not propagate 
along
+                                (setenv "LD_LIBRARY_PATH"
+                                        (string-append
+                                         gmp "/lib"
+                                         ":" mpfr "/lib"
+                                         ":" mpc "/lib"
+                                         ":" zlib "/lib"))
+                                (format (current-error-port) 
"LD_LIBRARY_PATH:~a\n" (getenv "LD_LIBRARY_PATH"))
+                                (setenv "PATH"
+                                        (string-append xbinutils "/" 
"i686-w64-mingw32" "/bin"
+                                                       ":" (getenv "PATH")))
+                                (setenv "CPP" (string-append xgcc-core 
"/bin/i686-w64-mingw32-cpp"))
+                                (setenv "C_INCLUDE_PATH"
+                                        (string-append
+                                         ;;__MINGW_HAS_DXSDK 1
+                                         mingw-headers
+                                         ":" mingw-headers "/include"
+                                         ":" mingw-headers "/crt"
+                                         ":" mingw-headers "/defaults/include"
+                                         ":" mingw-headers 
"/direct-x/include"))))))))
+    (home-page "http://mingw.org";)
+    (synopsis "Minimalist GNU for Windows")
+    (description "MinGW provides a complete Open Source programming tool set
+which is suitable for the development of native MS-Windows applications, and
+which do not depend on any 3rd-party C-Runtime dlls.")
+    (license license:fdl1.3+)))
+
+(define-public xgcc-core-i686-w64-mingw32
+  (let ((triplet "i686-w64-mingw32"))
+    (cross-gcc-core triplet
+                    (cross-binutils triplet))))
+
+(define-public xbinutils-i686-w64-mingw32
+  (let ((triplet "i686-w64-mingw32"))
+    (cross-binutils triplet)))
 
 
 ;;;
@@ -375,3 +608,12 @@ XBINUTILS and the cross tool chain."
 ;;     (cross-gcc triplet
 ;;                (cross-binutils triplet)
 ;;                (cross-libc triplet))))
+
+(define-public xgcc-i686-w64-mingw32
+  (let ((triplet "i686-w64-mingw32"))
+    (cross-gcc triplet
+               (cross-binutils triplet)
+               #f)))
+
+(define-public xgcc-i686-w64-mingw32-sans-libc
+  xgcc-i686-w64-mingw32)
diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm
index afd5766..d31a8f8 100644
--- a/guix/build-system/gnu.scm
+++ b/guix/build-system/gnu.scm
@@ -398,7 +398,9 @@ is one of `host' or `target'."
          ((host)
           `(("cross-gcc" ,(gcc target
                                (binutils target)
-                               (libc target)))
+                               (if (equal? target "i686-w64-mingw32")
+                                   #f
+                                   (libc target))))
             ("cross-binutils" ,(binutils target))))
          ((target)
           `(("cross-libc" ,(libc target)))))))))
-- 
2.6.3

-- 
Jan Nieuwenhuizen <address@hidden> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | AvatarĀ®  http://AvatarAcademy.nl  

--- End Message ---

-- 
Jan Nieuwenhuizen <address@hidden> | GNU LilyPond http://lilypond.org
Freelance IT http://JoyofSource.com | AvatarĀ®  http://AvatarAcademy.nl  

reply via email to

[Prev in Thread] Current Thread [Next in Thread]