From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Nieuwenhuizen Subject: [RFCv2] build: i686-w64-mingw32: new cross target. Date: Sun, 27 Mar 2016 16:20:13 +0200 Message-ID: <87mvpk2eaq.fsf@drakenvlieg.flower> References: <87vb492l7s.fsf@drakenvlieg.flower> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:50424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1akBYV-0008PG-23 for guix-devel@gnu.org; Sun, 27 Mar 2016 10:20:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1akBYR-0003Rd-66 for guix-devel@gnu.org; Sun, 27 Mar 2016 10:20:38 -0400 In-Reply-To: <87vb492l7s.fsf@drakenvlieg.flower> (Jan Nieuwenhuizen's message of "Sat, 26 Mar 2016 18:38:31 +0100") List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: guix-devel@gnu.org --=-=-= Content-Type: text/plain 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 janneke@drakenvlieg:~/src/mingw-guix $ ./pre-inst-env guix build --keep-failed --target=i686-w64-mingw32 hello /gnu/store/2j8qaqbc9q1w3z6k054nmp7j432yxfq7-hello-2.10 16:15:29 janneke@drakenvlieg:~/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 janneke@drakenvlieg:~/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/ --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-build-i686-w64-mingw32-new-cross-target.patch >From 7a58b7d85c798e1ca2f11d61e0b344cf2e3bcb10 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen 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 . (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 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Jan Nieuwenhuizen | GNU LilyPond http://lilypond.org Freelance IT http://JoyofSource.com | Avatar=C2=AE http://AvatarAcademy.nl= =20=20 --=-=-=--