--- 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 ---