From: Jan Nieuwenhuizen <janneke@gnu.org>
To: guix-devel@gnu.org
Subject: [PATCH 04/10] gnu: cross-build: i686-w64-mingw32: new cross target.
Date: Fri, 29 Apr 2016 17:12:25 +0200 [thread overview]
Message-ID: <1461942751-23883-4-git-send-email-janneke@gnu.org> (raw)
In-Reply-To: <1461942751-23883-1-git-send-email-janneke@gnu.org>
* guix/utils.scm (mingw-target?): New function.
* gnu/packages/cross-base.scm (cross-gcc-snippet): New function for mingw.
(cross-gcc): Use it.
(cross-gcc-arguments, cross-gcc-patches, cross-gcc): Support mingw.
(native-libc, cross-newlib?): New functions.
(cross-libc): Use cross-newlib? to support mingw.
(xbinutils-i686-w64-mingw32, xgcc-sans-libc-i686-w64-mingw32,
xgcc-i686-w64-mingw32): New variables.
---
gnu/packages/cross-base.scm | 148 +++++++++++++++++++++++++++++++++++++++-----
guix/utils.scm | 5 ++
2 files changed, 138 insertions(+), 15 deletions(-)
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index ca2cf3b..68d40bd 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -19,12 +19,17 @@
;;; 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 mingw)
+ #:use-module (gnu packages multiprecision)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix utils)
@@ -35,7 +40,8 @@
#:use-module (ice-9 match)
#:export (cross-binutils
cross-libc
- cross-gcc))
+ cross-gcc
+ cross-newlib?))
(define %xgcc
;; GCC package used as the basis for cross-compilation. It doesn't have to
@@ -121,7 +127,12 @@ may be either a libc package or #f.)"
"--disable-libquadmath"
"--disable-decimal-float" ;would need libc
"--disable-libcilkrts"
- )))
+ ))
+
+ ;; For a newlib (non-glibc) target
+ ,@(if (cross-newlib? target)
+ '("--with-newlib")
+ '()))
,(if libc
flags
@@ -163,7 +174,67 @@ may be either a libc package or #f.)"
;; for cross-compilers.
(zero? (system* "make" "install-strip")))
,phases))))
- (if libc
+ (cond
+ ((mingw-target? target)
+ `(modify-phases ,phases
+ (add-before
+ 'configure 'set-cross-path
+ (lambda* (#:key inputs #: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"))
+ (gcc (assoc-ref inputs "gcc")))
+ (define (cross? x)
+ (and libc (string-prefix? libc x)))
+ (if libc
+ (let ((cpath (string-append
+ libc "/include"
+ ":" libc "/i686-w64-mingw32/include")))
+ (for-each (cut setenv <> cpath)
+ '("CROSS_C_INCLUDE_PATH"
+ "CROSS_CPLUS_INCLUDE_PATH"
+ "CROSS_OBJC_INCLUDE_PATH"
+ "CROSS_OBJCPLUS_INCLUDE_PATH")))
+ (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"))
+ (let ((cpath (string-append
+ mingw-headers "/include"
+ ":" mingw-headers "/crt"
+ ":" mingw-headers "/defaults/include")))
+ (for-each (cut setenv <> cpath)
+ '("CROSS_C_INCLUDE_PATH"
+ "CROSS_CPLUS_INCLUDE_PATH"
+ "CROSS_OBJC_INCLUDE_PATH"
+ "CROSS_OBJCPLUS_INCLUDE_PATH"
+ "CROSS_LIBRARY_PATH")))))
+ (when libc
+ (setenv "CROSS_LIBRARY_PATH"
+ (string-append
+ libc "/lib"
+ ":" libc "/i686-w64-mingw32/lib")))
+ (setenv "CPP" (string-append gcc "/bin/cpp"))
+ (for-each
+ (lambda (var)
+ (and=> (getenv var)
+ (lambda (value)
+ (let* ((path (search-path-as-string->list
+ value))
+ (native-path (list->search-path-as-string
+ (remove cross? path) ":")))
+ (setenv var native-path)))))
+ '("C_INCLUDE_PATH"
+ "CPLUS_INCLUDE_PATH"
+ "OBJC_INCLUDE_PATH"
+ "OBJCPLUS_INCLUDE_PATH"
+ "LIBRARY_PATH"))
+ #t)))))
+ (libc
`(alist-cons-before
'configure 'set-cross-path
(lambda* (#:key inputs #:allow-other-keys)
@@ -200,17 +271,26 @@ may be either a libc package or #f.)"
"LIBRARY_PATH"))
#t))
,phases))
- (else phases)))))))
+ (else phases))))))))
(define (cross-gcc-patches target)
"Return GCC patches needed for TARGET."
(cond ((string-prefix? "xtensa-" target)
;; Patch by Qualcomm needed to build the ath9k-htc firmware.
(search-patches "ath9k-htc-firmware-gcc.patch"))
+ ((mingw-target? target)
+ (search-patches "gcc-4.9.3-mingw-gthr-default.patch"))
+ (else '())))
+
+(define (cross-gcc-snippet target)
+ "Return GCC snippet needed for TARGET."
+ (cond ((mingw-target? target)
+ '(copy-recursively "libstdc++-v3/config/os/mingw32-w64"
+ "libstdc++-v3/config/os/newlib"))
(else '())))
(define* (cross-gcc target
- #:optional (xbinutils (cross-binutils target)) libc)
+ #:optional (xbinutils (cross-binutils target)) (libc #f))
"Return a cross-compiler for TARGET, where TARGET is a GNU triplet. Use
XBINUTILS as the associated cross-Binutils. If LIBC is false, then build a
GCC that does not target a libc; otherwise, target that libc."
@@ -223,7 +303,10 @@ GCC that does not target a libc; otherwise, target that libc."
(append
(origin-patches (package-source %xgcc))
(cons (search-patch "gcc-cross-environment-variables.patch")
- (cross-gcc-patches target))))))
+ (cross-gcc-patches target))))
+ (modules '((guix build utils)))
+ (snippet
+ (cross-gcc-snippet target))))
;; For simplicity, use a single output. Otherwise libgcc_s & co. are not
;; found by default, etc.
@@ -245,6 +328,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.
@@ -253,13 +337,20 @@ 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
+ ((mingw-target? target)
+ (if libc
+ `(("libc" ,mingw-w64)
+ ,@inputs)
+ `(("mingw-source" ,(package-source 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 '())
@@ -288,7 +379,11 @@ 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
+ (cond
+ ((cross-newlib? target)
+ (cross-newlib? target))
+ (else
+ (let ((xlinux-headers
(package (inherit linux-libre-headers)
(name (string-append (package-name linux-libre-headers)
"-cross-" target))
@@ -308,8 +403,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
@@ -351,7 +445,16 @@ 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 (native-libc target)
+ (if (mingw-target? target)
+ mingw-w64
+ glibc))
+
+(define (cross-newlib? target)
+ (and (not (eq? (native-libc target) glibc))
+ (native-libc target)))
\f
;;;
@@ -393,3 +496,18 @@ XBINUTILS and the cross tool chain."
;; (cross-gcc triplet
;; (cross-binutils triplet)
;; (cross-libc triplet))))
+
+(define-public xgcc-sans-libc-i686-w64-mingw32
+ (let ((triplet "i686-w64-mingw32"))
+ (cross-gcc triplet
+ (cross-binutils triplet))))
+
+(define-public xbinutils-i686-w64-mingw32
+ (let ((triplet "i686-w64-mingw32"))
+ (cross-binutils triplet)))
+
+(define-public xgcc-i686-w64-mingw32
+ (let ((triplet "i686-w64-mingw32"))
+ (cross-gcc triplet
+ (cross-binutils triplet)
+ (cross-newlib? triplet))))
diff --git a/guix/utils.scm b/guix/utils.scm
index 6c01edd..f92367c 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -67,6 +67,7 @@
gnu-triplet->nix-system
%current-system
%current-target-system
+ mingw-target?
package-name->name+version
version-compare
version>?
@@ -585,6 +586,10 @@ returned by `config.guess'."
;; cross-building to.
(make-parameter #f))
+(define* (mingw-target? #:optional (target (%current-target-system)))
+ (and target
+ (string-suffix? "-mingw32" target)))
+
(define (package-name->name+version spec)
"Given SPEC, a package name like \"foo@0.9.1b\", return two values: \"foo\"
and \"0.9.1b\". When the version part is unavailable, SPEC and #f are
--
2.7.3
next prev parent reply other threads:[~2016-04-29 15:13 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-29 15:12 [PATCH 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 02/10] gnu: bootstrap: Add i686-mingw Jan Nieuwenhuizen
2016-04-29 15:34 ` Manolis Ragkousis
2016-04-29 18:28 ` Jan Nieuwenhuizen
2016-05-01 11:02 ` Manolis Ragkousis
2016-04-29 15:12 ` [PATCH 03/10] gnu: Add mingw-w64 Jan Nieuwenhuizen
2016-04-29 15:12 ` Jan Nieuwenhuizen [this message]
2016-05-02 8:06 ` [PATCH 04/10] gnu: cross-build: i686-w64-mingw32: new cross target Andy Wingo
2016-05-02 18:34 ` Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 05/10] gnu: gmp: build shared library for mingw Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 06/10] gnu: Add libiconv Jan Nieuwenhuizen
2016-05-01 17:07 ` Manolis Ragkousis
2016-05-01 17:43 ` John Darrington
2016-05-01 18:58 ` Jan Nieuwenhuizen
2016-05-01 19:07 ` John Darrington
2016-05-03 12:19 ` Ludovic Courtès
2016-05-01 18:27 ` Jan Nieuwenhuizen
2016-05-03 12:20 ` Ludovic Courtès
2016-05-03 16:55 ` [PATCH 06a/10] " Jan Nieuwenhuizen
2016-05-05 14:56 ` Ludovic Courtès
2016-05-03 16:56 ` [PATCH 06b/10] gnu: Add function libiconv-if-needed Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 07/10] gnu: ncurses: support mingw Jan Nieuwenhuizen
2016-05-02 8:09 ` Andy Wingo
2016-05-02 18:41 ` Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 08/10] gnu: readline: " Jan Nieuwenhuizen
2016-05-02 8:12 ` Andy Wingo
2016-05-02 18:52 ` Jan Nieuwenhuizen
2016-05-02 19:25 ` Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 09/10] gnu: libunistring: support mingw: propagate libiconv if needed Jan Nieuwenhuizen
2016-04-29 15:12 ` [PATCH 10/10] gnu: guile-2.0: support mingw Jan Nieuwenhuizen
2016-05-02 8:04 ` [PATCH 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Andy Wingo
2016-05-02 17:59 ` Jan Nieuwenhuizen
2016-05-03 12:06 ` Ludovic Courtès
2016-05-03 13:27 ` Andy Wingo
2016-05-03 12:16 ` Ludovic Courtès
2016-05-14 5:29 ` Mark H Weaver
2016-05-14 6:37 ` Jan Nieuwenhuizen
2016-05-14 8:25 ` FIXUP: " Jan Nieuwenhuizen
2016-05-14 20:05 ` Ludovic Courtès
2016-05-14 20:50 ` Jan Nieuwenhuizen
2016-05-16 21:02 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1461942751-23883-4-git-send-email-janneke@gnu.org \
--to=janneke@gnu.org \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.