[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
rfc/rfh: i686-w64-mingw32 cross target
From: |
Jan Nieuwenhuizen |
Subject: |
rfc/rfh: i686-w64-mingw32 cross target |
Date: |
Sat, 26 Mar 2016 18:38:31 +0100 |
Hi,
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.
I have just succeeded in cross-building hello and running it,
doing
18:18:36 address@hidden:~/src/mingw-guix
$ ./pre-inst-env guix build --keep-failed --target=i686-w64-mingw32 hello
/gnu/store/6556syz1732jnffnp0njikr5g6diqvch-hello-2.10
18:18:36 address@hidden:~/src/mingw-guix
$ /gnu/store/5y252qkblhpj639g3bnrc671mz8x920w-profile/bin/wine
/gnu/store/6556syz1732jnffnp0njikr5g6diqvch-hello-2.10/bin/hello.exe
Hello, world!
18:18:39 address@hidden:~/src/mingw-guix
See https://github.com/janneke/guix/tree/wip-mingw32 or attached patch.
This platform does not have glibc, it uses --with-newlib and I'm not
sure how to fit that in.
In a couple of places I have changed
(if libc A B)
into
(cond
((equal? target "i686-w64-mingw32") .. specific code)
(libc A)
(else B))
and I'm wondering whether to create a `newlib' category, or try
to fit newlib into libc somehow, or...any ideas welcome.
I was hoping to have (cross-libc <target>) evaluate to
i686-w64-mingw32-runtime, but am puzzled by the effect of this
code in
gnu.scm (standard-cross-packages):
`(("cross-gcc" ,(gcc target
(binutils target)
(if (equal? target "i686-w64-mingw32")
#f ;;(module-ref cross 'i686-w64-mingw32-runtime)
(libc target))))
unless I use #f here, guix wants to build a cross gcc WITH glibc,
instead of using the sans-libc variant.
Anaway, I am using a precompiled binary mingw runtime, as a next step
I'll be looking into building that from source.
Greetings,
Jan
1) GUB -- http://lilypond.org/gub/
>From 65917cb25c496219af0c118a6cd6664646839db4 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <address@hidden>
Date: Fri, 25 Mar 2016 08:03:54 +0100
Subject: [PATCH] i686-w64-mingw32: new cross target. WIP
---
gnu/packages/bootstrap.scm | 1 +
gnu/packages/cross-base.scm | 594 ++++++++++++++++++++++++++------------------
guix/build-system/gnu.scm | 4 +-
3 files changed, 352 insertions(+), 247 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..e2b1dd1 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -23,6 +23,7 @@
#:use-module (gnu packages gcc)
#:use-module (gnu packages base)
#:use-module (gnu packages commencement)
+ #:use-module (gnu packages compression)
#:use-module (gnu packages linux)
#:use-module (guix packages)
#:use-module (guix download)
@@ -43,38 +44,38 @@
(define (cross p target)
(package (inherit p)
- (name (string-append (package-name p) "-cross-" target))
- (arguments
- (substitute-keyword-arguments (package-arguments p)
- ((#:configure-flags flags)
- `(cons ,(string-append "--target=" target)
- ,flags))))))
+ (name (string-append (package-name p) "-cross-" target))
+ (arguments
+ (substitute-keyword-arguments (package-arguments p)
+ ((#:configure-flags flags)
+ `(cons ,(string-append "--target=" target)
+ ,flags))))))
(define (package-with-patch original patch)
"Return package ORIGINAL with PATCH applied."
(package (inherit original)
- (source (origin (inherit (package-source original))
- (patches (list patch))))))
+ (source (origin (inherit (package-source original))
+ (patches (list patch))))))
(define (cross-binutils target)
"Return a cross-Binutils for TARGET."
(let ((binutils (package (inherit binutils)
- (arguments
- (substitute-keyword-arguments (package-arguments
- binutils)
- ((#:configure-flags flags)
- ;; Build with `--with-sysroot' so that ld honors
- ;; DT_RUNPATH entries when searching for a needed
- ;; library. This works because as a side effect
- ;; `genscripts.sh' sets `USE_LIBPATH=yes', which tells
- ;; elf32.em to use DT_RUNPATH in its search list.
- ;; See
<http://sourceware.org/ml/binutils/2013-05/msg00312.html>.
- ;;
- ;; In theory choosing / as the sysroot could lead ld
- ;; to pick up native libs instead of target ones. In
- ;; practice the RUNPATH of target libs only refers to
- ;; target libs, not native libs, so this is safe.
- `(cons "--with-sysroot=/" ,flags)))))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments
+ binutils)
+ ((#:configure-flags flags)
+ ;; Build with `--with-sysroot' so that ld honors
+ ;; DT_RUNPATH entries when searching for a
needed
+ ;; library. This works because as a side effect
+ ;; `genscripts.sh' sets `USE_LIBPATH=yes',
which tells
+ ;; elf32.em to use DT_RUNPATH in its search
list.
+ ;; See
<http://sourceware.org/ml/binutils/2013-05/msg00312.html>.
+ ;;
+ ;; In theory choosing / as the sysroot could
lead ld
+ ;; to pick up native libs instead of target
ones. In
+ ;; practice the RUNPATH of target libs only
refers to
+ ;; target libs, not native libs, so this is
safe.
+ `(cons "--with-sysroot=/" ,flags)))))))
;; For Xtensa, apply Qualcomm's patch.
(cross (if (string-prefix? "xtensa-" target)
@@ -95,107 +96,152 @@ may be either a libc package or #f.)"
;; <http://lists.fedoraproject.org/pipermail/arm/2010-August/000663.html>
;; for instance.
(let ((args `(#:strip-binaries? #f
- ,@(package-arguments %xgcc))))
- (substitute-keyword-arguments args
- ((#:configure-flags flags)
- `(append (list ,(string-append "--target=" target)
- ,@(if libc
- `( ;; Disable libcilkrts because it is not
- ;; ported to GNU/Hurd.
- "--disable-libcilkrts")
- `( ;; Disable features not needed at this stage.
- "--disable-shared" "--enable-static"
- "--enable-languages=c,c++"
-
- ;; libstdc++ cannot be built at this stage
- ;; ("Link tests are not allowed after
- ;; GCC_NO_EXECUTABLES.").
- "--disable-libstdc++-v3"
-
- "--disable-threads" ;libgcc, would need libc
- "--disable-libatomic"
- "--disable-libmudflap"
- "--disable-libgomp"
- "--disable-libssp"
- "--disable-libquadmath"
- "--disable-decimal-float" ;would need libc
- "--disable-libcilkrts"
- )))
-
- ,(if libc
- flags
- `(remove (cut string-match "--enable-languages.*" <>)
- ,flags))))
- ((#:make-flags flags)
- (if 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))
- ((#:phases phases)
- (let ((phases
- `(alist-cons-after
- 'install 'make-cross-binutils-visible
- (lambda* (#:key outputs inputs #:allow-other-keys)
- (let* ((out (assoc-ref outputs "out"))
- (libexec (string-append out "/libexec/gcc/"
- ,target))
- (binutils (string-append
- (assoc-ref inputs "binutils-cross")
- "/bin/" ,target "-"))
- (wrapper (string-append
- (assoc-ref inputs "ld-wrapper-cross")
- "/bin/" ,target "-ld")))
- (for-each (lambda (file)
- (symlink (string-append binutils file)
- (string-append libexec "/"
- file)))
- '("as" "nm"))
- (symlink wrapper (string-append libexec "/ld"))
- #t))
- (alist-replace
- 'install
- (lambda _
- ;; Unlike our 'strip' phase, this will do the right thing
- ;; for cross-compilers.
- (zero? (system* "make" "install-strip")))
- ,phases))))
- (if 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"))
- (linux (assoc-ref inputs "xlinux-headers")))
- (define (cross? x)
- ;; Return #t if X is a cross-libc or cross Linux.
- (or (string-prefix? libc x)
- (string-prefix? linux x)))
-
- (setenv "CROSS_CPATH"
- (string-append libc "/include:"
- linux "/include"))
- (setenv "CROSS_LIBRARY_PATH"
- (string-append libc "/lib"))
-
- (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)))
- ,phases)
- phases)))))))
+ ,@(package-arguments %xgcc))))
+ (substitute-keyword-arguments args
+ ((#:configure-flags flags)
+ `(append (list ,(string-append "--target=" target)
+ ,@(if libc
+ `( ;; Disable libcilkrts because it is not
+ ;; ported to GNU/Hurd.
+ "--disable-libcilkrts")
+ `( ;; Disable features not needed at this stage.
+ "--disable-shared" "--enable-static"
+ "--enable-languages=c,c++"
+
+ ;; libstdc++ cannot be built at this stage
+ ;; ("Link tests are not allowed after
+ ;; GCC_NO_EXECUTABLES.").
+ "--disable-libstdc++-v3"
+
+ "--disable-threads" ;libgcc, would need libc
+ "--disable-libatomic"
+ "--disable-libmudflap"
+ "--disable-libgomp"
+ "--disable-libssp"
+ "--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)
+ (cond
+ ((equal? target "i686-w64-mingw32")
+ `(cons (string-append "FLAGS_FOR_TARGET=-B"
+ (assoc-ref %build-inputs
"i686-w64-mingw32-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)))
+ (else flags)))
+ ((#:phases phases)
+ (let ((phases
+ `(alist-cons-after
+ 'install 'make-cross-binutils-visible
+ (lambda* (#:key outputs inputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (libexec (string-append out "/libexec/gcc/"
+ ,target))
+ (binutils (string-append
+ (assoc-ref inputs "binutils-cross")
+ "/bin/" ,target "-"))
+ (wrapper (string-append
+ (assoc-ref inputs "ld-wrapper-cross")
+ "/bin/" ,target "-ld")))
+ (for-each (lambda (file)
+ (symlink (string-append binutils file)
+ (string-append libexec "/"
+ file)))
+ '("as" "nm"))
+ (symlink wrapper (string-append libexec "/ld"))
+ #t))
+ (alist-replace
+ 'install
+ (lambda _
+ ;; Unlike our 'strip' phase, this will do the right thing
+ ;; 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 "i686-w64-mingw32-runtime"))
+ (gcc (assoc-ref inputs "gcc")))
+ (define (cross? x)
+ (string-prefix? libc x))
+
+ (setenv "CROSS_CPATH"
+ (string-append libc "/include"
+ ":" libc
"/i686-w64-mingw32/include"))
+ (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))
+ (linux (assoc-ref inputs "xlinux-headers")))
+ (define (cross? x)
+ ;; Return #t if X is a cross-libc or cross Linux.
+ (or (string-prefix? libc x)
+ (string-prefix? linux x)))
+
+ (setenv "CROSS_CPATH"
+ (string-append libc "/include:"
+ linux "/include"))
+ (setenv "CROSS_LIBRARY_PATH"
+ (string-append libc "/lib"))
+
+ (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)))
+ ,phases))
+ (else phases))))))))
(define (cross-gcc-patches target)
"Return GCC patches needed for TARGET."
@@ -210,63 +256,68 @@ may be either a libc package or #f.)"
XBINUTILS as the associated cross-Binutils. If LIBC is false, then build a
GCC that does not target a libc; otherwise, target that libc."
(package (inherit %xgcc)
- (name (string-append "gcc-cross-"
- (if libc "" "sans-libc-")
- target))
- (source (origin (inherit (package-source %xgcc))
- (patches
- (append
- (origin-patches (package-source %xgcc))
- (cons (search-patch "gcc-cross-environment-variables.patch")
- (cross-gcc-patches target))))))
-
- ;; For simplicity, use a single output. Otherwise libgcc_s & co. are not
- ;; found by default, etc.
- (outputs '("out"))
-
- (arguments
- `(#:implicit-inputs? #f
- #:modules ((guix build gnu-build-system)
- (guix build utils)
- (ice-9 regex)
- (srfi srfi-1)
- (srfi srfi-26))
-
- ,@(cross-gcc-arguments target libc)))
-
- (native-inputs
- `(("ld-wrapper-cross" ,(make-ld-wrapper
- (string-append "ld-wrapper-" target)
- #:target target
- #:binutils xbinutils))
- ("binutils-cross" ,xbinutils)
-
- ;; Call it differently so that the builder can check whether the "libc"
- ;; input is #f.
- ("libc-native" ,@(assoc-ref %final-inputs "libc"))
-
- ;; Remaining inputs.
- ,@(let ((inputs (append (package-inputs %xgcc)
- (alist-delete "libc" %final-inputs))))
- (if libc
- `(("libc" ,libc)
- ("xlinux-headers" ;the target headers
- ,@(assoc-ref (package-propagated-inputs libc)
- "linux-headers"))
- ,@inputs)
- inputs))))
-
- (inputs '())
-
- ;; Only search target inputs, not host inputs.
- (search-paths
- (list (search-path-specification
- (variable "CROSS_CPATH")
- (files '("include")))
- (search-path-specification
- (variable "CROSS_LIBRARY_PATH")
- (files '("lib" "lib64")))))
- (native-search-paths '())))
+ (name (string-append "gcc-cross-"
+ (if libc "" "sans-libc-")
+ target))
+ (source (origin (inherit (package-source %xgcc))
+ (patches
+ (append
+ (origin-patches (package-source %xgcc))
+ (cons (search-patch
"gcc-cross-environment-variables.patch")
+ (cross-gcc-patches target))))))
+
+ ;; For simplicity, use a single output. Otherwise libgcc_s & co.
are not
+ ;; found by default, etc.
+ (outputs '("out"))
+
+ (arguments
+ `(#:implicit-inputs? #f
+ #:modules ((guix build gnu-build-system)
+ (guix build utils)
+ (ice-9 regex)
+ (srfi srfi-1)
+ (srfi srfi-26))
+
+ ,@(cross-gcc-arguments target libc)))
+
+ (native-inputs
+ `(("ld-wrapper-cross" ,(make-ld-wrapper
+ (string-append "ld-wrapper-" target)
+ #:target target
+ #:binutils xbinutils))
+ ("binutils-cross" ,xbinutils)
+ ("gcc" ,gcc)
+
+ ;; Call it differently so that the builder can check whether the
"libc"
+ ;; input is #f.
+ ("libc-native" ,@(assoc-ref %final-inputs "libc"))
+
+ ;; Remaining inputs.
+ ,@(let ((inputs (append (package-inputs %xgcc)
+ (alist-delete "libc" %final-inputs))))
+ (cond
+ ((equal? target "i686-w64-mingw32")
+ `(("i686-w64-mingw32-runtime" ,i686-w64-mingw32-runtime)
+ ,@inputs))
+ (libc
+ `(("libc" ,libc)
+ ("xlinux-headers" ;the target headers
+ ,@(assoc-ref (package-propagated-inputs libc)
+ "linux-headers"))
+ ,@inputs))
+ (else inputs)))))
+
+ (inputs '())
+
+ ;; Only search target inputs, not host inputs.
+ (search-paths
+ (list (search-path-specification
+ (variable "CROSS_CPATH")
+ (files '("include")))
+ (search-path-specification
+ (variable "CROSS_LIBRARY_PATH")
+ (files '("lib" "lib64")))))
+ (native-search-paths '())))
(define* (cross-libc target
#:optional
@@ -274,66 +325,68 @@ GCC that does not target a libc; otherwise, target that
libc."
(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
- (package (inherit linux-libre-headers)
- (name (string-append (package-name linux-libre-headers)
- "-cross-" target))
- (arguments
- (substitute-keyword-arguments
- `(#:implicit-cross-inputs? #f
- ,@(package-arguments linux-libre-headers))
- ((#:phases phases)
- `(alist-replace
- 'build
- (lambda _
- (setenv "ARCH" ,(system->linux-architecture target))
- (format #t "`ARCH' set to `~a' (cross compiling)~%" (getenv
"ARCH"))
-
- (and (zero? (system* "make" "defconfig"))
- (zero? (system* "make" "mrproper" "headers_check"))))
- ,phases))))
- (native-inputs `(("cross-gcc" ,xgcc)
- ("cross-binutils" ,xbinutils)
- ,@(package-native-inputs linux-libre-headers)))))
-
- (package (inherit glibc)
- (name (string-append "glibc-cross-" target))
- (arguments
- (substitute-keyword-arguments
- `(;; Disable stripping (see above.)
- #:strip-binaries? #f
-
- ;; This package is used as a target input, but it should not have
- ;; the usual cross-compilation inputs since that would include
- ;; itself.
- #:implicit-cross-inputs? #f
-
- ,@(package-arguments glibc))
- ((#:configure-flags flags)
- `(cons ,(string-append "--host=" target)
- ,flags))
- ((#:phases phases)
- `(alist-cons-before
- 'configure 'set-cross-linux-headers-path
- (lambda* (#:key inputs #:allow-other-keys)
- (let ((linux (assoc-ref inputs "linux-headers")))
- (setenv "CROSS_CPATH"
- (string-append linux "/include"))
- #t))
- ,phases))))
-
- ;; Shadow the native "linux-headers" because glibc's recipe expects the
- ;; "linux-headers" input to point to the right thing.
- (propagated-inputs `(("linux-headers" ,xlinux-headers)))
-
- ;; FIXME: 'static-bash' should really be an input, not a native input, but
- ;; to do that will require building an intermediate cross libc.
- (inputs '())
-
- (native-inputs `(("cross-gcc" ,xgcc)
- ("cross-binutils" ,xbinutils)
- ,@(package-inputs glibc) ;FIXME: static-bash
- ,@(package-native-inputs glibc)))))
+ (cond
+ ((equal? target "i686-w64-mingw32") i686-w64-mingw32-runtime)
+ (else
+ (let ((xlinux-headers
+ (package (inherit linux-libre-headers)
+ (name (string-append (package-name linux-libre-headers)
+ "-cross-" target))
+ (arguments
+ (substitute-keyword-arguments
+ `(#:implicit-cross-inputs? #f
+ ,@(package-arguments
linux-libre-headers))
+ ((#:phases phases)
+ `(alist-replace
+ 'build
+ (lambda _
+ (setenv "ARCH" ,(system->linux-architecture
target))
+ (format #t "`ARCH' set to `~a' (cross
compiling)~%" (getenv "ARCH"))
+
+ (and (zero? (system* "make" "defconfig"))
+ (zero? (system* "make" "mrproper"
"headers_check"))))
+ ,phases))))
+ (native-inputs `(("cross-gcc" ,xgcc)
+ ("cross-binutils" ,xbinutils)
+ ,@(package-native-inputs
linux-libre-headers))))))
+ (package (inherit glibc)
+ (name (string-append "glibc-cross-" target))
+ (arguments
+ (substitute-keyword-arguments
+ `( ;; Disable stripping (see above.)
+ #:strip-binaries? #f
+
+ ;; This package is used as a target
input, but it should not have
+ ;; the usual cross-compilation inputs
since that would include
+ ;; itself.
+ #:implicit-cross-inputs? #f
+
+ ,@(package-arguments glibc))
+ ((#:configure-flags flags)
+ `(cons ,(string-append "--host=" target)
+ ,flags))
+ ((#:phases phases)
+ `(alist-cons-before
+ 'configure 'set-cross-linux-headers-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((linux (assoc-ref inputs "linux-headers")))
+ (setenv "CROSS_CPATH"
+ (string-append linux "/include"))
+ #t))
+ ,phases))))
+
+ ;; Shadow the native "linux-headers" because glibc's recipe
expects the
+ ;; "linux-headers" input to point to the right thing.
+ (propagated-inputs `(("linux-headers" ,xlinux-headers)))
+
+ ;; FIXME: 'static-bash' should really be an input, not a native
input, but
+ ;; to do that will require building an intermediate cross libc.
+ (inputs '())
+
+ (native-inputs `(("cross-gcc" ,xgcc)
+ ("cross-binutils" ,xbinutils)
+ ,@(package-inputs glibc) ;FIXME: static-bash
+ ,@(package-native-inputs glibc))))))))
;;;
@@ -348,9 +401,9 @@ XBINUTILS and the cross tool chain."
;; Don't attempt to build this cross-compiler on i686;
;; see <http://bugs.gnu.org/19598>.
(package (inherit xgcc)
- (supported-systems (fold delete
- (package-supported-systems xgcc)
- '("mips64el-linux" "i686-linux"))))))
+ (supported-systems (fold delete
+ (package-supported-systems xgcc)
+ '("mips64el-linux" "i686-linux"))))))
(define-public xgcc-avr
;; AVR cross-compiler, used to build AVR-Libc.
@@ -368,10 +421,59 @@ XBINUTILS and the cross tool chain."
(cross-binutils triplet)
(cross-libc triplet))))
(package (inherit xgcc)
- (supported-systems (delete "armhf-linux" %supported-systems)))))
+ (supported-systems (delete "armhf-linux" %supported-systems)))))
;; (define-public xgcc-armel
;; (let ((triplet "armel-linux-gnueabi"))
;; (cross-gcc triplet
;; (cross-binutils triplet)
;; (cross-libc triplet))))
+
+(define-public i686-w64-mingw32-runtime
+ (package
+ (name "i686-w64-mingw32-runtime")
+ (version "4.9.2.v3.rev1.7")
+ (source (origin
+ (method url-fetch)
+ (uri
+ ;; FIXME: 7z
+
;;"https://sourceforge.net/projects/mingw/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/4.9.2/threads-posix/sjlj/i686-4.9.2-release-posix-sjlj-rt_v4-rev4.7z"
+
"http://lilypond.org/download/gub-sources/mingw-w64-runtime/i686-4.9.2-release-posix-sjlj-rt_v4-rev4.7.tar.gz")
+ (sha256
+ (base32
+ "00hkvy2rm5sbvngm0l4ajh2b3b497cgkbz0wc9sbfd8r92bs2lkx"))))
+ (build-system trivial-build-system)
+ (native-inputs `(("gzip" ,gzip)
+ ("source" ,source)
+ ("tar" ,tar)))
+ (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")))))
+ (arguments
+ `(#:modules ((guix build utils))
+ #:builder (begin
+ (use-modules (guix build utils))
+ (let ((gzip (assoc-ref %build-inputs "gzip"))
+ (source (assoc-ref %build-inputs "source"))
+ (tar (assoc-ref %build-inputs "tar")))
+ (setenv "PATH" (string-append gzip "/bin"
+ ":" tar "/bin"
+ ":" (getenv
"PATH")))
+ (mkdir-p %output)
+ (system* "tar" "-C" %output
"--strip-components=1" "-xf" source)))))
+ (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 fdl1.3+)))
+
+(define-public xgcc-i686-w64-mingw32
+ (let ((triplet "i686-w64-mingw32"))
+ (cross-gcc triplet
+ (cross-binutils triplet)
+ (cross-libc triplet))))
diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm
index afd5766..4618182 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 ;;(module-ref cross
'i686-w64-mingw32-runtime)
+ (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
- rfc/rfh: i686-w64-mingw32 cross target,
Jan Nieuwenhuizen <=