unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
@ 2016-04-27 19:27 Jan Nieuwenhuizen
  2016-04-28  8:18 ` Andy Wingo
  0 siblings, 1 reply; 6+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-27 19:27 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 484 bytes --]

Hi!

Highlights in this iteration

   * removed indentation from commit messages
   * replaced and-let* with and=>
   * have added #:phases return #t
   * removed extra cross-gcc mingw configure flags
   * removed custom cross-gcc-mingw install phase
   * use name "libc" instead of "mingw-w64", allowing a clean-up
   * add some comments
   * document gcc-cross-environment-variables.patch harder

Usage
    ./pre-inst-env guix build --target=i686-w64-mingw32 guile

Greetings,
Jan


[-- Attachment #2: 0001-gnu-cross-Use-CROSS_-_INCLUDE_PATH-for-system-header.patch --]
[-- Type: text/x-diff, Size: 10574 bytes --]

From b9b3059fee137152b1155c1aff590659ddb3c7f9 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 26 Apr 2016 10:51:52 +0200
Subject: [PATCH 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system
 headers.

* gnu/packages/patches/gcc-cross-environment-variables.patch: Also use CROSS_
variants: CROSS_C_INCLUDE_PATH, CROSS_CPLUS_INCLUDE_PATH,
CROSS_OBJC_INCLUDE_PATH, CROSS_OBJCPLUS_INCLUDE_PATH to be used for system
libraries, see
https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00620.html.
* gnu/packages/cross-base.scm (cross-gcc, cross-gcc-arguments, cross-libc):
Use CROSS_*_INCLUDE_PATH (WAS: CPATH).
---
 gnu/packages/cross-base.scm                        | 70 +++++++++++-------
 .../patches/gcc-cross-environment-variables.patch  | 82 +++++++++++++++++-----
 2 files changed, 107 insertions(+), 45 deletions(-)

diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 8bd599c..60cc1e4 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -166,36 +167,40 @@ may be either a libc package or #f.)"
               `(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.
+                  ;; Add the cross Linux headers to CROSS_C_*_INCLUDE_PATH,
+                  ;; and remove them from C_*INCLUDE_PATH.
                   (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"))
+                    (let ((cpath (string-append
+                                  libc "/include"
+                                  ":" linux "/include")))
+                      (for-each (cut setenv <> cpath)
+                                '("CROSS_C_INCLUDE_PATH"
+                                  "CROSS_CPLUS_INCLUDE_PATH"
+                                  "CROSS_OBJC_INCLUDE_PATH"
+                                  "CROSS_OBJCPLUS_INCLUDE_PATH")))
                     (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)))))))
+                    (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))
+                ,phases))
+          (else phases)))))))
 
 (define (cross-gcc-patches target)
   "Return GCC patches needed for TARGET."
@@ -261,7 +266,16 @@ GCC that does not target a libc; otherwise, target that libc."
     ;; Only search target inputs, not host inputs.
     (search-paths
      (list (search-path-specification
-            (variable "CROSS_CPATH")
+            (variable "CROSS_C_INCLUDE_PATH")
+            (files '("include")))
+           (search-path-specification
+            (variable "CROSS_CPLUS_INCLUDE_PATH")
+            (files '("include")))
+           (search-path-specification
+            (variable "CROSS_OBJC_INCLUDE_PATH")
+            (files '("include")))
+           (search-path-specification
+            (variable "CROSS_OBJCPLUS_INCLUDE_PATH")
             (files '("include")))
            (search-path-specification
             (variable "CROSS_LIBRARY_PATH")
@@ -316,9 +330,13 @@ XBINUTILS and the cross tool chain."
         `(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"))
+            (let* ((linux (assoc-ref inputs "linux-headers"))
+                   (cpath (string-append linux "/include")))
+              (for-each (cut setenv <> cpath)
+                        '("CROSS_C_INCLUDE_PATH"
+                          "CROSS_CPLUS_INCLUDE_PATH"
+                          "CROSS_OBJC_INCLUDE_PATH"
+                          "CROSS_OBJCPLUS_INCLUDE_PATH"))              
               #t))
           ,phases))))
 
diff --git a/gnu/packages/patches/gcc-cross-environment-variables.patch b/gnu/packages/patches/gcc-cross-environment-variables.patch
index 0bd0be5..38f3456 100644
--- a/gnu/packages/patches/gcc-cross-environment-variables.patch
+++ b/gnu/packages/patches/gcc-cross-environment-variables.patch
@@ -1,9 +1,50 @@
-Search path environment variables for cross-compilers.  See the discussion
-at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
+From a1d8c3d926cb43e51a2b4838ad5cca9c2510fbbb Mon Sep 17 00:00:00 2001
+From: Jan Nieuwenhuizen <janneke@gnu.org>
+Date: Sat, 16 Apr 2016 10:08:16 +0200
+Subject: [PATCH] Search path environment variables for cross-compilers.
 
---- gcc-4.7.2/gcc/incpath.c	2012-01-27 00:34:58.000000000 +0100
-+++ gcc-4.7.2/gcc/incpath.c	2013-02-12 10:11:27.000000000 +0100
-@@ -452,7 +452,7 @@ register_include_chains (cpp_reader *pfi
+See the discussion at
+
+    <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>
+
+which lead to the previous iteration of this patch, introducing CROSS_CPATH,
+CROSS_LIBRARY_PATH and advocated the use of CPATH/CROSS_CPATH.
+
+As a concequence of the bug report
+
+    http://bugs.gnu.org/22186
+
+usage of C_INCLUDE_PATH was re-introduced.  As noted in he discussion at
+
+    <https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00533.html>
+
+this introduces native headers in the search path and it was decided to keep
+using C_INCLUDE_PATH for system headers and introduce CROSS_C_INCLUDE_PATH et
+al., next to CROSS_CPATH to support cross compiling.
+
+---
+ gcc/gcc.c     | 2 +-
+ gcc/incpath.c | 6 +++---
+ gcc/system.h  | 2 ++
+ gcc/tlink.c   | 2 +-
+ 4 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/gcc/incpath.c b/gcc/incpath.c
+index f495c0a..ba12249 100644
+--- a/gcc/incpath.c
++++ b/gcc/incpath.c
+@@ -461,8 +461,8 @@ register_include_chains (cpp_reader *pfile, const char *sysroot,
+ 			 int stdinc, int cxx_stdinc, int verbose)
+ {
+   static const char *const lang_env_vars[] =
+-    { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH",
+-      "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" };
++    { "CROSS_C_INCLUDE_PATH", "CROSS_CPLUS_INCLUDE_PATH",
++      "CROSS_OBJC_INCLUDE_PATH", "CROSS_OBJCPLUS_INCLUDE_PATH" };
+   cpp_options *cpp_opts = cpp_get_options (pfile);
+   size_t idx = (cpp_opts->objc ? 2: 0);
+ 
+@@ -473,7 +473,7 @@ register_include_chains (cpp_reader *pfile, const char *sysroot,
  
    /* CPATH and language-dependent environment variables may add to the
       include chain.  */
@@ -12,20 +53,22 @@ at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
    add_env_var_paths (lang_env_vars[idx], SYSTEM);
  
    target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc);
-
---- gcc-4.7.2/gcc/system.h	2012-02-17 00:16:28.000000000 +0100
-+++ gcc-4.7.2/gcc/system.h	2013-02-12 10:22:17.000000000 +0100
-@@ -1023,4 +1023,6 @@ helper_const_non_const_cast (const char
- #define DEBUG_VARIABLE
- #endif
+diff --git a/gcc/system.h b/gcc/system.h
+index 42bc509..af3b9ad 100644
+--- a/gcc/system.h
++++ b/gcc/system.h
+@@ -1063,4 +1063,6 @@ helper_const_non_const_cast (const char *p)
+ /* Get definitions of HOST_WIDE_INT and HOST_WIDEST_INT.  */
+ #include "hwint.h"
  
 +#define LIBRARY_PATH_ENV "CROSS_LIBRARY_PATH"
 +
  #endif /* ! GCC_SYSTEM_H */
-
---- gcc-4.7.2/gcc/tlink.c	2012-02-11 09:50:23.000000000 +0100
-+++ gcc-4.7.2/gcc/tlink.c	2013-05-23 22:06:19.000000000 +0200
-@@ -461,7 +461,7 @@ recompile_files (void)
+diff --git a/gcc/tlink.c b/gcc/tlink.c
+index bc358b8..ad6242f 100644
+--- a/gcc/tlink.c
++++ b/gcc/tlink.c
+@@ -458,7 +458,7 @@ recompile_files (void)
    file *f;
  
    putenv (xstrdup ("COMPILER_PATH="));
@@ -34,10 +77,11 @@ at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
  
    while ((f = file_pop ()) != NULL)
      {
-
---- gcc-4.7.3/gcc/gcc.c	2013-03-08 08:25:09.000000000 +0100
-+++ gcc-4.7.3/gcc/gcc.c	2013-05-24 08:58:16.000000000 +0200
-@@ -3726,7 +3726,7 @@ process_command (unsigned int decoded_op
+diff --git a/gcc/gcc.c b/gcc/gcc.c
+index adbf0c4..70448c6 100644
+--- a/gcc/gcc.c
++++ b/gcc/gcc.c
+@@ -3853,7 +3853,7 @@ process_command (unsigned int decoded_options_count,
      }
  
    temp = getenv (LIBRARY_PATH_ENV);
-- 
2.7.3


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-gnu-bootstrap-Add-i686-mingw.patch --]
[-- Type: text/x-diff, Size: 886 bytes --]

From eeea38be5c8ae911303678bbe6a439058b4be7c9 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Thu, 14 Apr 2016 07:31:35 +0200
Subject: [PATCH 02/10] gnu: bootstrap: Add i686-mingw.

* gnu/packages/bootstrap.scm (glibc-dynamic-linker): Add i686-mingw.
---
 gnu/packages/bootstrap.scm | 1 +
 1 file changed, 1 insertion(+)

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


[-- Attachment #4: 0003-gnu-Add-mingw-w64.patch --]
[-- Type: text/x-diff, Size: 8466 bytes --]

From 60ce4319c903a1d5ecc6722f86555cb2b72af726 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Thu, 14 Apr 2016 07:35:40 +0200
Subject: [PATCH 03/10] gnu: Add mingw-w64.

* gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch,
gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch,
gnu/packages/mingw.scm: New files.
* gnu-system.am: Add them.
---
 gnu-system.am                                      |  3 +
 gnu/packages/mingw.scm                             | 82 ++++++++++++++++++++++
 .../patches/gcc-4.9.3-mingw-gthr-default.patch     | 11 +++
 .../patches/mingw-w64-5.0rc2-gcc-4.9.3.patch       | 38 ++++++++++
 4 files changed, 134 insertions(+)
 create mode 100644 gnu/packages/mingw.scm
 create mode 100644 gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch
 create mode 100644 gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch

diff --git a/gnu-system.am b/gnu-system.am
index 8822d0b..7ab45cd 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -225,6 +225,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/mcrypt.scm			\
   gnu/packages/messaging.scm			\
   gnu/packages/mg.scm				\
+  gnu/packages/mingw.scm			\
   gnu/packages/mit-krb5.scm			\
   gnu/packages/moe.scm				\
   gnu/packages/moreutils.scm			\
@@ -478,6 +479,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/gcc-arm-link-spec-fix.patch		\
   gnu/packages/patches/gcc-cross-environment-variables.patch	\
   gnu/packages/patches/gcc-libvtv-runpath.patch			\
+  gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch	\
   gnu/packages/patches/gcc-5.0-libvtv-runpath.patch		\
   gnu/packages/patches/geoclue-config.patch			\
   gnu/packages/patches/ghostscript-CVE-2015-3228.patch		\
@@ -606,6 +608,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/mcron-install.patch			\
   gnu/packages/patches/mdadm-gcc-4.9-fix.patch			\
   gnu/packages/patches/mhash-keygen-test-segfault.patch		\
+  gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch		\
   gnu/packages/patches/mit-krb5-CVE-2015-8629.patch		\
   gnu/packages/patches/mit-krb5-CVE-2015-8630.patch		\
   gnu/packages/patches/mit-krb5-CVE-2015-8631.patch		\
diff --git a/gnu/packages/mingw.scm b/gnu/packages/mingw.scm
new file mode 100644
index 0000000..6c124a2
--- /dev/null
+++ b/gnu/packages/mingw.scm
@@ -0,0 +1,82 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages mingw)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages cross-base)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix utils)
+  #:use-module (ice-9 match))
+
+(define-public mingw-w64
+  (package
+    (name "mingw-w64")
+    (version "5.0-rc2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://sourceforge.net/projects/mingw-w64/files/mingw-w64/"
+                    "mingw-w64-release/mingw-w64-v" version ".tar.bz2"))
+              (sha256
+               (base32 "0imdary8j07if8ih73pfgxiclpf2ax8h3mz8mxln07i8sbbd30c9"))
+              (patches (list
+                        (search-patch "mingw-w64-5.0rc2-gcc-4.9.3.patch")))))
+    (native-inputs `(("xgcc-core" ,xgcc-sans-libc-i686-w64-mingw32)
+                     ("xbinutils" ,xbinutils-i686-w64-mingw32)))
+    (build-system gnu-build-system)
+    (search-paths
+     (list (search-path-specification
+            (variable "CROSS_C_INCLUDE_PATH")
+            (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
+     `(#:configure-flags '("--host=i686-w64-mingw32")
+       #:phases (modify-phases %standard-phases
+         (add-before
+             'configure 'setenv
+           (lambda _
+             (let ((xgcc-core (assoc-ref %build-inputs "xgcc-core"))
+                   (mingw-headers (string-append (getcwd) "/mingw-w64-headers")))
+               (setenv "CPP"
+                       (string-append xgcc-core "/bin/i686-w64-mingw32-cpp"))
+               (setenv "CROSS_C_INCLUDE_PATH"
+                       (string-append
+                        mingw-headers
+                        ":" mingw-headers "/include"
+                        ":" mingw-headers "/crt"
+                        ":" mingw-headers "/defaults/include"
+                        ":" mingw-headers "/direct-x/include"))))))
+       #:make-flags (list "DEFS=-DHAVE_CONFIG_H -D__MINGW_HAS_DXSDK=1")
+       #:tests? #f ; compiles and includes glibc headers
+       #:strip-binaries? #f))
+    (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 does not depend on any 3rd-party C-Runtime dlls.")
+    (license license:fdl1.3+)))
diff --git a/gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch b/gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch
new file mode 100644
index 0000000..0ea008a
--- /dev/null
+++ b/gnu/packages/patches/gcc-4.9.3-mingw-gthr-default.patch
@@ -0,0 +1,11 @@
+--- a/libgcc/config/i386/gthr-win32.h	2016-03-30 07:45:33.388684463 +0200
++++ b/libgcc/config/i386/gthr-win32.h	2016-03-30 15:51:24.123896436 +0200
+@@ -30,7 +30,7 @@
+
+ /* Make sure CONST_CAST2 (origin in system.h) is declared.  */
+ #ifndef CONST_CAST2
+-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq)
++#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)X)
+ #endif
+
+ /* Windows32 threads specific definitions. The windows32 threading model
diff --git a/gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch b/gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch
new file mode 100644
index 0000000..6048fb2
--- /dev/null
+++ b/gnu/packages/patches/mingw-w64-5.0rc2-gcc-4.9.3.patch
@@ -0,0 +1,38 @@
+--- mingw-w64-v5.0-rc2/mingw-w64-headers/include/winnt.h.orig	2016-03-30 21:32:21.111586941 +0200
++++ mingw-w64-v5.0-rc2/mingw-w64-headers/include/winnt.h	2016-03-30 21:31:53.607559496 +0200
+@@ -6895,7 +6895,7 @@
+ 	  DWORD Reg : 3;
+ 	  DWORD R : 1;
+ 	  DWORD L : 1;
+-	  DWORD C : 1;
++	  DWORD C_ : 1;
+ 	  DWORD StackAdjust : 10;
+ 	} DUMMYSTRUCTNAME;
+       } DUMMYUNIONNAME;
+--- mingw-w64-v5.0-rc2/mingw-w64-headers/crt/math.h.orig	2016-03-30 21:27:25.375475927 +0200
++++ mingw-w64-v5.0-rc2/mingw-w64-headers/crt/math.h	2016-03-30 21:28:57.871461798 +0200
+@@ -216,6 +216,7 @@
+ #endif
+   }
+
++#if 0
+   __CRT_INLINE long double __cdecl fabsl (long double x)
+   {
+ #ifdef __arm__
+@@ -226,6 +227,7 @@
+     return res;
+ #endif
+   }
++#endif
+
+   __CRT_INLINE double __cdecl fabs (double x)
+   {
+@@ -905,7 +907,7 @@
+ /* 7.12.7.3  */
+   extern double __cdecl hypot (double, double) __MINGW_ATTRIB_DEPRECATED_MSVC2005; /* in libmoldname.a */
+   extern float __cdecl hypotf (float x, float y);
+-#ifndef __CRT__NO_INLINE
++#if 0 //ndef __CRT__NO_INLINE
+   __CRT_INLINE float __cdecl hypotf (float x, float y) { return (float) hypot ((double)x, (double)y);}
+ #endif
+   extern long double __cdecl hypotl (long double, long double);
-- 
2.7.3


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0004-gnu-cross-build-i686-w64-mingw32-new-cross-target.patch --]
[-- Type: text/x-diff, Size: 12510 bytes --]

From d81bd3a288f3298d11983da6050958af99780dfe Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Sun, 17 Apr 2016 18:42:43 +0200
Subject: [PATCH 04/10] gnu: cross-build: i686-w64-mingw32: new cross target.

* 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 | 147 +++++++++++++++++++++++++++++++++++++++-----
 guix/utils.scm              |   5 ++
 2 files changed, 137 insertions(+), 15 deletions(-)

diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 60cc1e4..9ffb4c7 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")))))
+                     (if 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.
          (list (search-patch "ath9k-htc-firmware-gcc.patch")))
+        ((mingw-target? target)
+         (list (search-patch "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,15 @@ 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 +495,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 de54179..b796bde 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -65,6 +65,7 @@
             gnu-triplet->nix-system
             %current-system
             %current-target-system
+            mingw-target?
             package-name->name+version
             version-compare
             version>?
@@ -544,6 +545,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


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0005-gnu-gmp-build-shared-library-for-mingw.patch --]
[-- Type: text/x-diff, Size: 1301 bytes --]

From 9dd4d145a978fb1e2cdd11a3493048049459ea8d Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 12 Apr 2016 15:48:28 +0200
Subject: [PATCH 05/10] gnu: gmp: build shared library for mingw.

* gnu/packages/multiprecision.scm (gmp)[MINGW]: Use --enable-shared.
---
 gnu/packages/multiprecision.scm | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm
index ad50770..7a608f9 100644
--- a/gnu/packages/multiprecision.scm
+++ b/gnu/packages/multiprecision.scm
@@ -49,7 +49,13 @@
                 '(;; Build a "fat binary", with routines for several
                   ;; sub-architectures.
                   "--enable-fat"
-                  "--enable-cxx")))
+                  "--enable-cxx"
+                  ,@(cond ((mingw-target?)
+                           ;; Static and shared cannot be built in one go:
+                           ;; they produce different headers.  We need shared.
+                           `("--disable-static"
+                             "--enable-shared"))
+                          (else '())))))
    (synopsis "Multiple-precision arithmetic library")
    (description
     "GMP is a library for arbitrary precision arithmetic, operating on
-- 
2.7.3


[-- Attachment #7: 0006-gnu-Add-libiconv.patch --]
[-- Type: text/x-diff, Size: 2825 bytes --]

From b6886ac316b5900e9dc1ba1b2904e1ccaa7fb977 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 12 Apr 2016 15:46:58 +0200
Subject: [PATCH 06/10] gnu: Add libiconv.

* gnu/packages/base.scm (libiconv): New variable.
(libiconv-if-needed): New function.
---
 gnu/packages/base.scm | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index e662827..aaccf28 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -6,6 +6,7 @@
 ;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2014, 2015 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,7 +25,7 @@
 
 (define-module (gnu packages base)
   #:use-module ((guix licenses)
-                #:select (gpl3+ lgpl2.0+ public-domain))
+                #:select (gpl3+ lgpl2.0+ lgpl3+ public-domain))
   #:use-module (gnu packages)
   #:use-module (gnu packages acl)
   #:use-module (gnu packages bash)
@@ -43,7 +44,9 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
-  #:use-module (guix build-system trivial))
+  #:use-module (guix build-system trivial)
+  #:export (glibc
+            libiconv-if-needed))
 
 ;;; Commentary:
 ;;;
@@ -940,6 +943,32 @@ reflect changes made by political bodies to time zone boundaries, UTC offsets,
 and daylight-saving rules.")
     (license public-domain)))
 
+(define-public libiconv
+  (package
+   (name "libiconv")
+   (version "1.14")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append
+                  "mirror://gnu/libiconv/libiconv-"
+                  version ".tar.gz"))
+            (sha256
+             (base32
+              "04q6lgl3kglmmhw59igq1n7v3rp1rpkypl366cy1k1yn2znlvckj"))))
+   (build-system gnu-build-system)
+   (synopsis "Character set conversion library")
+   (description
+     "libiconv provides an implementation of the iconv function for systems
+that lack it.  iconv is used to convert between character encodings in a
+program.  It supports a wide variety of different encodings.")
+   (home-page "http://www.gnu.org/software/libiconv/")
+   (license lgpl3+)))
+
+(define* (libiconv-if-needed #:optional (target (%current-target-system)))
+  (if (mingw-target? target)
+      `(("libiconv" ,libiconv))
+      '()))
+
 (define-public (canonical-package package)
   ;; Avoid circular dependency by lazily resolving 'commencement'.
   (let* ((iface (resolve-interface '(gnu packages commencement)))
-- 
2.7.3


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #8: 0007-gnu-ncurses-support-mingw.patch --]
[-- Type: text/x-diff, Size: 8900 bytes --]

From aacfb151046372046446e083bb6056e086f3cf68 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 12 Apr 2016 15:47:54 +0200
Subject: [PATCH 07/10] gnu: ncurses: support mingw.

* gnu/packages/patches/ncurses-mingw.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/ncurses.scm (ncurses): Support mingw.
---
 gnu-system.am                            |  1 +
 gnu/packages/ncurses.scm                 | 86 +++++++++++++++++++++++---------
 gnu/packages/patches/ncurses-mingw.patch | 24 +++++++++
 3 files changed, 87 insertions(+), 24 deletions(-)
 create mode 100644 gnu/packages/patches/ncurses-mingw.patch

diff --git a/gnu-system.am b/gnu-system.am
index 7ab45cd..0105265 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -619,6 +619,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/mumps-build-parallelism.patch		\
   gnu/packages/patches/mupen64plus-ui-console-notice.patch	\
   gnu/packages/patches/mutt-store-references.patch		\
+  gnu/packages/patches/ncurses-mingw.patch			\
   gnu/packages/patches/net-tools-bitrot.patch			\
   gnu/packages/patches/ngircd-handle-zombies.patch		\
   gnu/packages/patches/ngircd-no-dns-in-tests.patch		\
diff --git a/gnu/packages/ncurses.scm b/gnu/packages/ncurses.scm
index 147033a..3781b87 100644
--- a/gnu/packages/ncurses.scm
+++ b/gnu/packages/ncurses.scm
@@ -19,9 +19,11 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages ncurses)
+  #:use-module (gnu packages)
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix utils)
   #:use-module (guix build-system gnu))
 
 (define-public ncurses
@@ -36,6 +38,7 @@
                     #:allow-other-keys)
             (let ((out (assoc-ref outputs "out"))
                   (doc (assoc-ref outputs "doc")))
+              (format #t "configure flags: ~s~%" configure-flags)
               (zero? (apply system* "./configure"
                             (string-append "SHELL=" (which "sh"))
                             (string-append "--build=" build)
@@ -60,33 +63,65 @@
                "mandir=share/man"))
             #t))
         (post-install-phase
-         '(lambda* (#:key outputs #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out")))
+         `(lambda* (#:key outputs target #:allow-other-keys)
+            (let ((out (assoc-ref outputs "out"))
+                  (mingw-target? (lambda* (#:optional (target target))
+                                   (and target
+                                        (string-suffix? "-mingw32" target))))
+                  (libraries '("curses" "ncurses" "form" "panel" "menu")))
               ;; When building a wide-character (Unicode) build, create backward
               ;; compatibility links from the the "normal" libraries to the
               ;; wide-character libraries (e.g. libncurses.so to libncursesw.so).
-              (with-directory-excursion (string-append out "/lib")
-                (for-each (lambda (lib)
-                            (define libw.a
-                              (string-append "lib" lib "w.a"))
-                            (define lib.a
-                              (string-append "lib" lib ".a"))
-                            (define libw.so.x
-                              (string-append "lib" lib "w.so.6"))
-                            (define lib.so.x
-                              (string-append "lib" lib ".so.6"))
-                            (define lib.so
-                              (string-append "lib" lib ".so"))
+              (cond ((mingw-target? target)
+                  (with-directory-excursion (string-append out "/bin")
+                    (for-each
+                     (lambda (lib)
+                       (define lib.dll
+                         (string-append "lib" lib ".dll"))
+                       (define libw6.dll
+                         (string-append "lib" lib "w6.dll"))
+
+                       (when (file-exists? libw6.dll)
+                         (format #t "creating symlinks for `lib~a'~%" lib)
+                         (symlink libw6.dll lib.dll)))
+                     libraries))
+                  ;; TODO: create .la files to link to the .dll?
+                  (with-directory-excursion (string-append out "/lib")
+                    (for-each
+                     (lambda (lib)
+                       (define libw.a
+                         (string-append "lib" lib "w.a"))
+                       (define lib.a
+                         (string-append "lib" lib ".a"))
+
+                       (when (file-exists? libw.a)
+                         (format #t "creating symlinks for `lib~a'~%" lib)
+                         (symlink libw.a lib.a)))
+                     libraries)))
+                    (else
+                     (with-directory-excursion (string-append out "/lib")
+                       (for-each
+                        (lambda (lib)
+                          (define libw.a
+                            (string-append "lib" lib "w.a"))
+                          (define lib.a
+                            (string-append "lib" lib ".a"))
+                          (define libw.so.x
+                            (string-append "lib" lib "w.so.6"))
+                          (define lib.so.x
+                            (string-append "lib" lib ".so.6"))
+                          (define lib.so
+                            (string-append "lib" lib ".so"))
 
-                            (when (file-exists? libw.a)
-                              (format #t "creating symlinks for `lib~a'~%" lib)
-                              (symlink libw.a lib.a)
-                              (symlink libw.so.x lib.so.x)
-                              (false-if-exception (delete-file lib.so))
-                              (call-with-output-file lib.so
-                                (lambda (p)
-                                  (format p "INPUT (-l~aw)~%" lib)))))
-                          '("curses" "ncurses" "form" "panel" "menu")))))))
+                          (when (file-exists? libw.a)
+                            (format #t "creating symlinks for `lib~a'~%" lib)
+                            (symlink libw.a lib.a)
+                            (symlink libw.so.x lib.so.x)
+                            (false-if-exception (delete-file lib.so))
+                            (call-with-output-file lib.so
+                              (lambda (p)
+                                (format p "INPUT (-l~aw)~%" lib)))))
+                        libraries))))))))
     (package
      (name "ncurses")
      (version "6.0")
@@ -94,6 +129,7 @@
               (method url-fetch)
               (uri (string-append "mirror://gnu/ncurses/ncurses-"
                                   version ".tar.gz"))
+              (patches (list (search-patch "ncurses-mingw.patch")))
               (sha256
                (base32
                 "0q3jck7lna77z5r42f13c4xglc7azd19pxfrjrpgp2yf615w4lgm"))))
@@ -113,7 +149,9 @@
           ;; Make sure programs like 'tic', 'reset', and 'clear' have a
           ;; correct RUNPATH.
           ,(string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out")
-                          "/lib"))
+                          "/lib")
+          ;; MinGW: Provide termcap api, created for the MinGW port.
+          ,@(if ,(mingw-target?) '("--enable-term-driver") '()))
         #:tests? #f                               ; no "check" target
         #:phases (modify-phases %standard-phases
                    (replace 'configure ,configure-phase)
diff --git a/gnu/packages/patches/ncurses-mingw.patch b/gnu/packages/patches/ncurses-mingw.patch
new file mode 100644
index 0000000..0f6a313
--- /dev/null
+++ b/gnu/packages/patches/ncurses-mingw.patch
@@ -0,0 +1,24 @@
+Taken from Eli Zaretskii's gdb bug report
+
+    https://sourceware.org/ml/gdb-patches/2012-04/msg01052.html
+
+Upstream status: Not presented to upstream.
+
+--- ncurses-6.0.orig/include/curses.h.in	2014-08-09 22:39:44.000000000 +0200
++++ ncurses-6.0/include/curses.h.in	2016-04-09 20:47:14.266679000 +0200
+@@ -1420,3 +1420,15 @@
+ #define KEY_BREAK	0401		/* Break key (unreliable) */
+ #define KEY_SRESET	0530		/* Soft (partial) reset (unreliable) */
+ #define KEY_RESET	0531		/* Reset or hard reset (unreliable) */
++
++#ifdef __MINGW32__
++/* Windows API headers, included e.g. by serial.h, define MOUSE_MOVED,
++   and so does PDCurses's curses.h, but for an entirely different
++   purpose.  Since we don't use the Windows semantics of MOUSE_MOVED
++   anywhere, avoid compiler warnings by undefining MOUSE_MOVED before
++   including curses.h.  */
++#undef MOUSE_MOVED
++/* Likewise, KEY_EVENT is defined by ncurses.h, but also by Windows
++   API headers.  */
++#undef KEY_EVENT
++#endif
-- 
2.7.3


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #9: 0008-gnu-readline-support-mingw.patch --]
[-- Type: text/x-diff, Size: 7723 bytes --]

From 9e45b604993fdbb5719db5a28c82dfbd616dedba Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Tue, 12 Apr 2016 15:49:17 +0200
Subject: [PATCH 08/10] gnu: readline: support mingw.

* gnu/packages/patches/readline-6.3-mingw.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/readline.scm (readline): Support mingw.
---
 gnu-system.am                                 |   1 +
 gnu/packages/patches/readline-6.3-mingw.patch | 128 ++++++++++++++++++++++++++
 gnu/packages/readline.scm                     |  17 +++-
 3 files changed, 143 insertions(+), 3 deletions(-)
 create mode 100644 gnu/packages/patches/readline-6.3-mingw.patch

diff --git a/gnu-system.am b/gnu-system.am
index 0105265..f1502c1 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -705,6 +705,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/qt4-ldflags.patch			\
   gnu/packages/patches/ratpoison-shell.patch			\
   gnu/packages/patches/readline-link-ncurses.patch		\
+  gnu/packages/patches/readline-6.3-mingw.patch			\
   gnu/packages/patches/ripperx-missing-file.patch		\
   gnu/packages/patches/rsem-makefile.patch			\
   gnu/packages/patches/sed-hurd-path-max.patch			\
diff --git a/gnu/packages/patches/readline-6.3-mingw.patch b/gnu/packages/patches/readline-6.3-mingw.patch
new file mode 100644
index 0000000..28064bb
--- /dev/null
+++ b/gnu/packages/patches/readline-6.3-mingw.patch
@@ -0,0 +1,128 @@
+Mingw lacks some SIG*.  Taken from
+
+    wget https://raw.githubusercontent.com/Alexpux/MINGW-packages/master/mingw-w64-readline/readline-6.3-mingw.patch
+
+some updates to make it apply.
+
+Upstream status: Not presented to upstream.
+
+--- colors.c~	2013-03-20 11:19:08.000000000 -0400
++++ colors.c	2015-07-20 12:44:31.821014500 -0400
+@@ -37,6 +37,10 @@
+ #include "posixstat.h" // stat related macros (S_ISREG, ...)
+ #include <fcntl.h> // S_ISUID
+ 
++#ifndef S_ISDIR
++#define	S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)
++#endif
++
+ // strlen()
+ #if defined (HAVE_STRING_H)
+ #  include <string.h>
+@@ -151,12 +155,17 @@
+       if (S_ISREG (mode))
+         {
+           colored_filetype = C_FILE;
+-
++#ifdef S_ISUID
+           if ((mode & S_ISUID) != 0 && is_colored (C_SETUID))
+             colored_filetype = C_SETUID;
+-          else if ((mode & S_ISGID) != 0 && is_colored (C_SETGID))
++		else
++#endif
++#ifdef S_ISGID
++          if ((mode & S_ISGID) != 0 && is_colored (C_SETGID))
+             colored_filetype = C_SETGID;
+-          else if (is_colored (C_CAP) && 0) //f->has_capability)
++          else
++#endif
++		  if (is_colored (C_CAP) && 0) //f->has_capability)
+             colored_filetype = C_CAP;
+           else if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC))
+             colored_filetype = C_EXEC;
+@@ -180,15 +189,19 @@
+             colored_filetype = C_STICKY;
+ #endif
+         }
++	#ifdef S_ISLNK
+       else if (S_ISLNK (mode))
+         colored_filetype = ((linkok == 0
+                  && (!strncmp (_rl_color_indicator[C_LINK].string, "target", 6)
+                      || _rl_color_indicator[C_ORPHAN].string))
+                 ? C_ORPHAN : C_LINK);
++	#endif
+       else if (S_ISFIFO (mode))
+         colored_filetype = C_FIFO;
++	#ifdef S_ISSOCK
+       else if (S_ISSOCK (mode))
+         colored_filetype = C_SOCK;
++#endif
+       else if (S_ISBLK (mode))
+         colored_filetype = C_BLK;
+       else if (S_ISCHR (mode))
+--- signals.c~	2014-01-10 15:06:48.000000000 -0500
++++ signals.c	2015-07-20 12:33:07.437472100 -0400
+@@ -216,7 +216,9 @@
+       /* FALLTHROUGH */
+ 
+     case SIGTERM:
++#if defined (SIGHUP)
+     case SIGHUP:
++#endif
+ #if defined (SIGTSTP)
+     case SIGTSTP:
+     case SIGTTOU:
+@@ -397,7 +399,9 @@
+ 
+       sigaddset (&bset, SIGINT);
+       sigaddset (&bset, SIGTERM);
++#ifdef SIGHUP
+       sigaddset (&bset, SIGHUP);
++#endif
+ #if defined (SIGQUIT)
+       sigaddset (&bset, SIGQUIT);
+ #endif
+@@ -426,7 +430,9 @@
+ 
+       rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int);
+       rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term);
++#ifdef SIGHUP
+       rl_maybe_set_sighandler (SIGHUP, rl_signal_handler, &old_hup);
++#endif
+ #if defined (SIGQUIT)
+       rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit);
+ #endif
+@@ -491,7 +497,9 @@
+ 	 overhead */
+       rl_maybe_restore_sighandler (SIGINT, &old_int);
+       rl_maybe_restore_sighandler (SIGTERM, &old_term);
++#ifdef SIGHUP
+       rl_maybe_restore_sighandler (SIGHUP, &old_hup);
++#endif
+ #if defined (SIGQUIT)
+       rl_maybe_restore_sighandler (SIGQUIT, &old_quit);
+ #endif
+--- input.c~	1970-01-01 01:00:00.000000000 +0100
++++ input.c	2016-04-01 20:13:24.293063372 +0200
+@@ -532,11 +532,18 @@
+ 	 Otherwise (not EINTR), some error occurred, also signifying EOF. */
+       if (errno != EINTR)
+ 	return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+-      else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM)
++      else if (
++#ifdef SIGHUP
++	  _rl_caught_signal == SIGHUP ||
++#endif
++	  _rl_caught_signal == SIGTERM)
+ 	return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+-      else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT)
++      else if (_rl_caught_signal == SIGINT
++#ifdef SIGQUIT
++	  || _rl_caught_signal == SIGQUIT
++#endif
++	  )
+         RL_CHECK_SIGNALS ();
+-
+       if (rl_signal_event_hook)
+ 	(*rl_signal_event_hook) ();
+     }
diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm
index 13ce916..1fc2c34 100644
--- a/gnu/packages/readline.scm
+++ b/gnu/packages/readline.scm
@@ -22,7 +22,8 @@
   #:use-module (gnu packages ncurses)
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (guix build-system gnu))
+  #:use-module (guix build-system gnu)
+  #:use-module (guix utils))
 
 (define-public readline
   (let ((post-install-phase
@@ -46,21 +47,31 @@
                (sha256
                 (base32
                  "0hzxr9jxqqx5sxsv9vmlxdnvlr9vi4ih1avjb869hbs6p5qn1fjn"))
-               (patches (list (search-patch "readline-link-ncurses.patch")))
+               (patches (list (search-patch "readline-link-ncurses.patch")
+                              (search-patch "readline-6.3-mingw.patch")))
                (patch-flags '("-p0"))))
       (build-system gnu-build-system)
       (propagated-inputs `(("ncurses" ,ncurses)))
       (arguments `(#:configure-flags
                    (list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
                                         (assoc-ref %build-inputs "ncurses")
-                                        "/lib")
+                                        ,(if (mingw-target?) "/bin"
+                                             "/lib"))
 
                          ;; This test does an 'AC_TRY_RUN', which aborts when
                          ;; cross-compiling, so provide the correct answer.
                          ,@(if (%current-target-system)
                                '("bash_cv_wcwidth_broken=no")
+                               '())
+                         ;; MinGW: ncurses provides the termcap api.
+                         ,@(if (mingw-target?)
+                               '("bash_cv_termcap_lib=ncurses")
                                '()))
 
+                   #:make-flags (list ,@(if (mingw-target?)
+                                            ;; MinGW: termcap in ncurses
+                                            '("TERMCAP_LIB=-lncurses")
+                                            '()))
                    #:phases (alist-cons-after
                              'install 'post-install
                              ,post-install-phase
-- 
2.7.3


[-- Attachment #10: 0009-gnu-libunistring-support-mingw-propagate-libiconv-if.patch --]
[-- Type: text/x-diff, Size: 1662 bytes --]

From d409cb0b33a650344bb8c1620941feae96ee939d Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Mon, 25 Apr 2016 23:47:50 +0200
Subject: [PATCH 09/10] gnu: libunistring: support mingw: propagate libiconv if
 needed.

* gnu/packages/libunistring (libunistring): propagated-inputs: add
libiconv-if-needed.  Fixes unicode translation in mingw.
---
 gnu/packages/libunistring.scm | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/gnu/packages/libunistring.scm b/gnu/packages/libunistring.scm
index f29b742..d2feac2 100644
--- a/gnu/packages/libunistring.scm
+++ b/gnu/packages/libunistring.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,7 +22,8 @@
   #:use-module (guix licenses)
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (guix build-system gnu))
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages base))
 
 (define-public libunistring
   (package
@@ -35,7 +37,7 @@
             (sha256
              (base32
               "0ixxmgpgh2v8ifm6hbwsjxl023myk3dfnj7wnvmqjivza31fw9cn"))))
-   (propagated-inputs '())                  ; FIXME: add libiconv when !glibc
+   (propagated-inputs `(,@(libiconv-if-needed)))
    (build-system gnu-build-system)
    (arguments
     ;; Work around parallel build issue whereby C files may be compiled before
-- 
2.7.3


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #11: 0010-gnu-guile-2.0-support-mingw.patch --]
[-- Type: text/x-diff, Size: 2032 bytes --]

From 5d77ef604ba7c89cfb14275ae9dc0d9b792517ee Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Sun, 24 Apr 2016 14:06:56 +0200
Subject: [PATCH 10/10] gnu: guile-2.0: support mingw.

* gnu/packages/guile.scm (guile-2.0): Support mingw.
---
 gnu/packages/guile.scm | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index fe043cb..82e2cfc 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -134,11 +134,16 @@ without requiring the source code to be rewritten.")
               "1qh3j7308qvsjgwf7h94yqgckpbgz2k3yqdkzsyhqcafvfka9l5f"))
             (patches (list (search-patch "guile-arm-fixes.patch")))))
    (build-system gnu-build-system)
-   (native-inputs `(("pkgconfig" ,pkg-config)))
+   (native-inputs `(("pkgconfig" ,pkg-config)
+                    ,@(if (mingw-target?)
+                          `(("bash" ,bash)
+                            ("guile" ,guile-2.0))
+                          '())))
    (inputs `(("libffi" ,libffi)
              ("readline" ,readline)
-             ("bash" ,bash)))
-
+             ,@(libiconv-if-needed)
+             ,@(if (mingw-target?) '()
+                   `(("bash" ,bash)))))
    (propagated-inputs
     `( ;; These ones aren't normally needed here, but since `libguile-2.0.la'
        ;; reads `-lltdl -lunistring', adding them here will add the needed
@@ -167,7 +172,11 @@ without requiring the source code to be rewritten.")
                   (let ((bash (assoc-ref inputs "bash")))
                     (substitute* "module/ice-9/popen.scm"
                       (("/bin/sh")
-                       (string-append bash "/bin/bash")))))
+                       ,(if (mingw-target?)
+                            "cmd.exe"
+                            `(if bash
+                                 (string-append bash "/bin/bash")
+                                 "bash"))))))
                 %standard-phases)))
 
    (native-search-paths
-- 
2.7.3


[-- Attachment #12: Type: text/plain, Size: 154 bytes --]


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

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-27 19:27 [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Jan Nieuwenhuizen
@ 2016-04-28  8:18 ` Andy Wingo
  2016-04-28 20:16   ` Jan Nieuwenhuizen
  0 siblings, 1 reply; 6+ messages in thread
From: Andy Wingo @ 2016-04-28  8:18 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel

Hi :)

Mostly formatting nits, only a couple substantial comments.  Looking
great.

On Wed 27 Apr 2016 21:27, Jan Nieuwenhuizen <janneke@gnu.org> writes:

> From d81bd3a288f3298d11983da6050958af99780dfe Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Sun, 17 Apr 2016 18:42:43 +0200
> Subject: [PATCH 04/10] gnu: cross-build: i686-w64-mingw32: new cross target.
>
> +                     (if libc
> +                         (setenv "CROSS_LIBRARY_PATH"
> +                                 (string-append
> +                                  libc "/lib"
> +                                  ":" libc "/i686-w64-mingw32/lib")))

Use "when" please

> +(define (native-libc target)
> +  (if (mingw-target? target) mingw-w64
> +      glibc))

The if should be either all on one line, or on three lines

> From aacfb151046372046446e083bb6056e086f3cf68 Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Tue, 12 Apr 2016 15:47:54 +0200
> Subject: [PATCH 07/10] gnu: ncurses: support mingw.
>
> +              (cond ((mingw-target? target)
> +                  (with-directory-excursion (string-append out "/bin")
> +                    (for-each
> +                     (lambda (lib)

Because the consequent is so large, please indent the condition on the
line after "cond", i.e.

  (cond
   ((mingw-target? target)
    ...))

> +++ b/gnu/packages/patches/readline-6.3-mingw.patch
> @@ -0,0 +1,128 @@
> +Mingw lacks some SIG*.  Taken from
> +
> +    wget https://raw.githubusercontent.com/Alexpux/MINGW-packages/master/mingw-w64-readline/readline-6.3-mingw.patch
> +
> +some updates to make it apply.
> +
> +Upstream status: Not presented to upstream.

Probably needs to go upstream I think, and we should clarify the
licensing on it or rewrite it.

> +                                        ,(if (mingw-target?) "/bin"
> +                                             "/lib"))

One line or three lines please

> From 5d77ef604ba7c89cfb14275ae9dc0d9b792517ee Mon Sep 17 00:00:00 2001
> From: Jan Nieuwenhuizen <janneke@gnu.org>
> Date: Sun, 24 Apr 2016 14:06:56 +0200
> Subject: [PATCH 10/10] gnu: guile-2.0: support mingw.
>
> * gnu/packages/guile.scm (guile-2.0): Support mingw.
> ---
>  gnu/packages/guile.scm | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
> index fe043cb..82e2cfc 100644
> --- a/gnu/packages/guile.scm
> +++ b/gnu/packages/guile.scm
> @@ -134,11 +134,16 @@ without requiring the source code to be rewritten.")
>                "1qh3j7308qvsjgwf7h94yqgckpbgz2k3yqdkzsyhqcafvfka9l5f"))
>              (patches (list (search-patch "guile-arm-fixes.patch")))))
>     (build-system gnu-build-system)
> -   (native-inputs `(("pkgconfig" ,pkg-config)))
> +   (native-inputs `(("pkgconfig" ,pkg-config)
> +                    ,@(if (mingw-target?)
> +                          `(("bash" ,bash)
> +                            ("guile" ,guile-2.0))
> +                          '())))

Would we not need Guile always when cross-compiling?

>     (inputs `(("libffi" ,libffi)
>               ("readline" ,readline)
> -             ("bash" ,bash)))
> -
> +             ,@(libiconv-if-needed)
> +             ,@(if (mingw-target?) '()
> +                   `(("bash" ,bash)))))

One line please.

> @@ -167,7 +172,11 @@ without requiring the source code to be rewritten.")
>                    (let ((bash (assoc-ref inputs "bash")))
>                      (substitute* "module/ice-9/popen.scm"
>                        (("/bin/sh")
> -                       (string-append bash "/bin/bash")))))
> +                       ,(if (mingw-target?)
> +                            "cmd.exe"
> +                            `(if bash
> +                                 (string-append bash "/bin/bash")
> +                                 "bash"))))))
>                  %standard-phases)))

I guess the thing is, cmd.exe is part of the system, so it should be
linked "dynamically" (i.e. via the PATH); but is cmd.exe really a bash
replacement?  Is this the right way for open-pipe in Guile to work?

Finally at the very end of all of this I think it would be great to have
some kind of document, "how to compile software for windows using
Guix".   WDYT?  That document could include any relevant details about
the internal structure of a cross-compile -- how Guix links things
together.  I know that for me, this information is verrrry easily paged
out to long-term storage; takes a while to pull it back in :)

Andy

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-28  8:18 ` Andy Wingo
@ 2016-04-28 20:16   ` Jan Nieuwenhuizen
  2016-04-28 20:41     ` Jan Nieuwenhuizen
  2016-04-29  9:36     ` Andy Wingo
  0 siblings, 2 replies; 6+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-28 20:16 UTC (permalink / raw)
  To: Andy Wingo; +Cc: guix-devel

Andy Wingo writes:

Hi!

[Manolis: I've written a bit about the cross setup below, do you want
 to have a look?]

> Mostly formatting nits, only a couple substantial comments.  Looking
> great.

Oh that's super, thanks for all your help!

It seems I have picked-up the convention of doing

   (if condition <simple-then>
       <longer-else>))

now that I think of it, could be lispy with optionally longer else
branch.  I have wondered why scheme/guile does not have that.  Possibly
it's an artifact of more imperative days?

>> +                     (if libc
>> +                         (setenv "CROSS_LIBRARY_PATH"
>> +                                 (string-append
>> +                                  libc "/lib"
>> +                                  ":" libc "/i686-w64-mingw32/lib")))
>
> Use "when" please

Yes, done.

>> +(define (native-libc target)
>> +  (if (mingw-target? target) mingw-w64
>> +      glibc))
>
> The if should be either all on one line, or on three lines

Changed to three lines; I expect this to get longer in time.

>> Subject: [PATCH 07/10] gnu: ncurses: support mingw.
>> +              (cond ((mingw-target? target)
>> +                  (with-directory-excursion (string-append out "/bin")
>> +                    (for-each
>> +                     (lambda (lib)
>
> Because the consequent is so large, please indent the condition on the
> line after "cond", i.e.
>
>   (cond
>    ((mingw-target? target)
>     ...))

Ok.

>
>> +++ b/gnu/packages/patches/readline-6.3-mingw.patch
>> @@ -0,0 +1,128 @@
>> +Mingw lacks some SIG*.  Taken from
>> +
>> + wget
>> https://raw.githubusercontent.com/Alexpux/MINGW-packages/master/mingw-w64-readline/readline-6.3-mingw.patch
>> +
>> +some updates to make it apply.
>> +
>> +Upstream status: Not presented to upstream.
>
> Probably needs to go upstream I think, and we should clarify the
> licensing on it or rewrite it.

Yes.  I have sent the owner of the github archive a mail for
clarification.

>> +                                        ,(if (mingw-target?) "/bin"
>> +                                             "/lib"))
>
> One line or three lines please

Sure, one line.

>> Subject: [PATCH 10/10] gnu: guile-2.0: support mingw.
>> +                    ,@(if (mingw-target?)
>> +                          `(("bash" ,bash)
>> +                            ("guile" ,guile-2.0))
>> +                          '())))
>
> Would we not need Guile always when cross-compiling?

Hmm.  I'm adding bash here and removing it below for mingw; which makes
some sense.  Guile should be included via self-native-input? -- ah, I
prolly unset self-native-input? while experimenting with a cross-guile
package and /there/ I needed this.  Retried without guile, removed,
changed to one line.

>> +             ,@(if (mingw-target?) '()
>> +                   `(("bash" ,bash)))))
>
> One line please.

Ok.

>> @@ -167,7 +172,11 @@ without requiring the source code to be rewritten.")
>>                    (let ((bash (assoc-ref inputs "bash")))
>>                      (substitute* "module/ice-9/popen.scm"
>>                        (("/bin/sh")
>> -                       (string-append bash "/bin/bash")))))
>> +                       ,(if (mingw-target?)
>> +                            "cmd.exe"
>> +                            `(if bash
>> +                                 (string-append bash "/bin/bash")
>> +                                 "bash"))))))
>>                  %standard-phases)))
>
> I guess the thing is, cmd.exe is part of the system, so it should be
> linked "dynamically" (i.e. via the PATH); but is cmd.exe really a bash
> replacement?  Is this the right way for open-pipe in Guile to work?

Good question.  I don't really know.  Probably it's not; but then, even
if we have bash would't you expect some utils like cat/grep/sed?  FWIW,
I spent two nights trying to port bash before I decided to give up, err
re-prioritise.  I'd love to provide that all, and I'd also love to get
some help with that ;-)

I can imagine that if I somehow installed a version of bash.exe
(msys/cygwin) in PATH, I would expect open-pipe to use that rather than
cmd.

I'm not sure if you have a suggestion for change here, or if we should
get more input first?

> Finally at the very end of all of this I think it would be great to have
> some kind of document, "how to compile software for windows using
> Guix".   WDYT?  That document could include any relevant details about
> the internal structure of a cross-compile -- how Guix links things
> together.  I know that for me, this information is verrrry easily paged
> out to long-term storage; takes a while to pull it back in :)

I think that's a good idea.  I spent quite some time figuring-out how
things work in Guix.  Most is just great; the biggest problems I
encountered were

   * any change made to cross-gcc / cross-libc triggers a rebuild of
     both worlds

and most changes I made were small, wrong and terribly difficult to
inspect.  I tried to work around that creating separate cross-gcc and
cross-libc functions...but that caused at least as much problems as it
solved.  I have no good solution for this...and

   * native packages (headers and libraries) were added to the cross
     build environment

which turned out to be an honest bug.  It led me around hacking
guix/build-system/gnu.scm: (standard-cross-packages) until I finally
found that (standard-packages) seemed to be the culprit, to eventually
find that the use of C_INCLUDE_PATH in bootstrap.scm needed to be
CROSS_CPATH...and when that worked we decided to go the other way and
use CROSS_C_INCLUDE_PATH etc.  Phew.

So, most of the difficulties I had should be fixed now; not sure what
difficulties the next person will have.  So, what to write exactly?

Below is a first attempt that I didn't want to send as a proper patch
yet.  I could do with some input, especially from Manolis.

Greetings,
Jan


@node Creating a New Cross Target
@section Creating a New Cross Target

As a first step of making a full port, you may want to start by creating
a cross target.  A cross target in essence is a cross compiler
@code{cross-gcc-@var{<target>}}, which depends on
@code{cross-binutils-@var{<target>}} a @code{libc-@var{<target>}} and
possibly @code{kernel-headers-@var{<target>}}.  Several cross targets
are available, such as @code{i586-pc-hurd}, @code{armhf-linux},
@code{avr}, @code{i686-w64-mingw32} and @code{mips64el-linux}.

Building a full gcc cross compiler depends on a c-library for the
target.  We can build a c-library for the target once we have a cross
compiler.  To break this loop a minimal gcc compiler can be built
without a c-library; we call this
@code{gcc-cross-sans-libc-@var{<target>}}.  With this minimal gcc
compiler we cross compile the c-library and then we build the full cross
gcc.

In @code{gnu/packages/cross-base.scm} are functions to create these
cross packages.  Also, Guix needs to know the name of the dynamic
linker, see @var{glibc-dynamic-linker} in
@code{gnu/packages/bootstrap.scm}.

@menu
* Rebuilding My World::
* GCC and Cross Environment Paths::
* The MinGW Cross Target::
@end menu

@node Rebuilding My World
@subsection Rebuilding My World

Why is it that we all tend love to rebuild our world, yet like it
somewhat less when others decide do it for us?  One of the great things
of Guix is that it tracks all dependencies and will rebuild any package
that is out of date: We never have to worry that doing a fresh, clean
build does not reproduce.  However, if we make the tiniest change for
our cross build to the @var{ncurses} package (who named it so
appropriately?) and Guix will first rebuild all of our worlds before it
gives us the feedback on our modification.

What we can do is to create a temporary alternative package hierarchy.
We copy @var{ncurses} to @var{cross-ncurses}

@example
(define-public cross-ncurses
   @dots{}
   (name "cross-ncurses")
   @dots{})
@end example

and because we are really testing readline, we copy that too

@example
(define-public cross-readline
   @dots{}
   (name "cross-readline")
   @dots{}
   (propagated-inputs `(("ncurses" ,cross-ncurses)))
   @dots{})
@end example

which we then use in our copied @var{cross-guile} package.  When we are
satisfied with our change, we replace the original packages descriptions
with the @var{cross-} variants, remove the @var{cross-} prefix and
enjoy a favorite beverage while we have our worlds rebuild.

Because Guix uses pseudo cross-compilation in the bootstrap process
@ref{Bootstrapping}, changes to @var{cross-gcc} may rebuild our native
world and it could be helpful to work with copies of @var{cross-gcc} and
@var{cross-libc} too.

@node GCC and Cross Environment Paths
@subsection GCC and Cross Environment Paths

@c See <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>
@c <http://bugs.gnu.org/22186> and
@c <https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00533.html>
@c for a discussion of what follows.
Some build systems compile and run programs at build time to generate
host-specific data.  This means we usually have two compilers installed:
@code{gcc} and @code{<target>-gcc}.  Guix does not use
@file{/usr/include} and @file{/usr/lib} to install additional headers
and libraries, instead it adds to environment path variables such as
@var{C_INCLUDE_PATH} and @var{LIBRARY_PATH}.  To distinguish between
native build-time headers and libraries and cross-built target system
headers and libraries, we use a patched gcc as cross compiler.  The
cross compiler instead looks at @var{CROSS_C_INCLUDE_PATH} and
@var{CROSS_LIBRARY_PATH}.

@node The MinGW Cross Target
@subsection The MinGW Cross Target

The MinGW target is somewhat special in that it does not support
@var{glibc}.  Gcc needs to be passed the @code{--with-newlib} flag and
instead we use the combined c-library and free reïmplementation of
Windows kernel-headers and system-libraries provided by the MinGW-w64
project.  Also, it's not POSIX so it often needs explicit support,
sometimes we need to create a patch ourselves.

@example
$ guix build --target=i686-w64-mingw32 hello
@dots{}
/gnu/store/deadbeef123-hello-2.10
$ guix environment --ad-hoc wine
$ wine /gnu/store/deadbeef123-hello-2.10/bin/hello.exe
Hello, world!
@end example

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-28 20:16   ` Jan Nieuwenhuizen
@ 2016-04-28 20:41     ` Jan Nieuwenhuizen
  2016-04-29  9:36     ` Andy Wingo
  1 sibling, 0 replies; 6+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-28 20:41 UTC (permalink / raw)
  To: Andy Wingo; +Cc: guix-devel

Jan Nieuwenhuizen writes:

>    * any change made to cross-gcc / cross-libc triggers a rebuild of
>      both worlds

this is not true, as Manolis pointed out on irc; I'm probably mistaking
changes to ncurses or somesuch.

> Because Guix uses pseudo cross-compilation in the bootstrap process
> @ref{Bootstrapping}, changes to @var{cross-gcc} may rebuild our native
> world

also, not true; forget this bit.  Sorry ;-)

Greetings,
Jan.

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-28 20:16   ` Jan Nieuwenhuizen
  2016-04-28 20:41     ` Jan Nieuwenhuizen
@ 2016-04-29  9:36     ` Andy Wingo
  2016-04-29 12:54       ` Jan Nieuwenhuizen
  1 sibling, 1 reply; 6+ messages in thread
From: Andy Wingo @ 2016-04-29  9:36 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel

Hi :)

On Thu 28 Apr 2016 22:16, Jan Nieuwenhuizen <janneke@gnu.org> writes:

>>> @@ -167,7 +172,11 @@ without requiring the source code to be rewritten.")
>>>                    (let ((bash (assoc-ref inputs "bash")))
>>>                      (substitute* "module/ice-9/popen.scm"
>>>                        (("/bin/sh")
>>> -                       (string-append bash "/bin/bash")))))
>>> +                       ,(if (mingw-target?)
>>> +                            "cmd.exe"
>>> +                            `(if bash
>>> +                                 (string-append bash "/bin/bash")
>>> +                                 "bash"))))))
>>>                  %standard-phases)))

Note that this patch has an extra level of quoting for the not-mingw
case.

>>
>> I guess the thing is, cmd.exe is part of the system, so it should be
>> linked "dynamically" (i.e. via the PATH); but is cmd.exe really a bash
>> replacement?  Is this the right way for open-pipe in Guile to work?
>
> Good question.  I don't really know.  Probably it's not; but then, even
> if we have bash would't you expect some utils like cat/grep/sed?  FWIW,
> I spent two nights trying to port bash before I decided to give up, err
> re-prioritise.  I'd love to provide that all, and I'd also love to get
> some help with that ;-)
>
> I can imagine that if I somehow installed a version of bash.exe
> (msys/cygwin) in PATH, I would expect open-pipe to use that rather than
> cmd.
>
> I'm not sure if you have a suggestion for change here, or if we should
> get more input first?

3 options:

 1. Run cmd.exe from path.  Disadvantage: incompatible interface.

 2. Build bash in mingw for Guix; no special cases.  The Right Thing.
    However I'm OK with accepting a patch that doesn't do this, in the
    interests of moving things forward.

 3. Run bash from path.  Disadvantage: bash probably not in the path and
    the invocation would fail.  Arguably an early failure is the right
    thing, though!

I think I'd go with (3) rather than (1).  WDYT?  From a Guile
perspective you can always use `open-pipe*' which doesn't trampoline
through a shell at all.

> So, most of the difficulties I had should be fixed now; not sure what
> difficulties the next person will have.  So, what to write exactly?
>
> Below is a first attempt that I didn't want to send as a proper patch
> yet.  I could do with some input, especially from Manolis.

It's really helpful to me, thank you!

Andy

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-29  9:36     ` Andy Wingo
@ 2016-04-29 12:54       ` Jan Nieuwenhuizen
  0 siblings, 0 replies; 6+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-29 12:54 UTC (permalink / raw)
  To: Andy Wingo; +Cc: guix-devel

Andy Wingo writes:

>>>> +                       ,(if (mingw-target?)
>>>> +                            "cmd.exe"
>>>> +                            `(if bash
>>>> +                                 (string-append bash "/bin/bash")
>>>> +                                 "bash"))))))
>>>>                  %standard-phases)))
>
> Note that this patch has an extra level of quoting for the not-mingw
> case.

Oops, changed it to (see below)

                  (let ((bash (assoc-ref inputs "bash")))
                    (substitute* "module/ice-9/popen.scm"
                      (("/bin/sh")
                       (if bash
                           (string-append bash "/bin/bash")
                           "bash")))))
                %standard-phases)))

>> I can imagine that if I somehow installed a version of bash.exe
>> (msys/cygwin) in PATH, I would expect open-pipe to use that rather than
>> cmd.
>>
>> I'm not sure if you have a suggestion for change here, or if we should
>> get more input first?
>
> 3 options:
>
>  1. Run cmd.exe from path.  Disadvantage: incompatible interface.
>
>  2. Build bash in mingw for Guix; no special cases.  The Right Thing.
>     However I'm OK with accepting a patch that doesn't do this, in the
>     interests of moving things forward.
>
>  3. Run bash from path.  Disadvantage: bash probably not in the path and
>     the invocation would fail.  Arguably an early failure is the right
>     thing, though!
>
> I think I'd go with (3) rather than (1).  WDYT?  From a Guile
> perspective you can always use `open-pipe*' which doesn't trampoline
> through a shell at all.

Thank you, that's a helpful observation.  Seeing this, yes 3) would be
my choice too.

Thinking about it 2) The Right Thing I had another puzzle-area: why is
it that we have /bin/sh and not /bin/guile in GuixSD; and wouldn't we
want the shell to be schemy-er or, how hard would it be for guile to
parse shell?

Anyway, while testing 3) I realised that whatever we put here is moot, at
least for now, seeing that...

    #ifdef HAVE_FORK
    static void
    scm_init_popen (void)
    {
      scm_c_define_gsubr ("open-process", 2, 0, 1, scm_open_process);
    }
    #endif

Sorry for being so dull...there isn't a any of such goodness [yet] in
Windows/MinGW.

>> Below is a first attempt that I didn't want to send as a proper patch
>> yet.  I could do with some input, especially from Manolis.
>
> It's really helpful to me, thank you!

Okay, thanks.  I'll work on this a bit and present a patch later.

I'm building and will have a v7 patch set rsn.

Greetings,
Jan

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-04-29 12:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-27 19:27 [PATCH v6 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Jan Nieuwenhuizen
2016-04-28  8:18 ` Andy Wingo
2016-04-28 20:16   ` Jan Nieuwenhuizen
2016-04-28 20:41     ` Jan Nieuwenhuizen
2016-04-29  9:36     ` Andy Wingo
2016-04-29 12:54       ` Jan Nieuwenhuizen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).