all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
@ 2016-04-26 22:23 Jan Nieuwenhuizen
  2016-04-27  3:15 ` Eric Bavier
  2016-04-27 10:20 ` Andy Wingo
  0 siblings, 2 replies; 5+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-26 22:23 UTC (permalink / raw)
  To: guix-devel

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

Hi!

With this new patch set, mingw guile.exe runs; Yay!  I have cleaned-up
the cross-base.scm and gcc patch (thanks Andy!).  It can be built doing

    ./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: 10376 bytes --]

From af9fa5754a1c85cc22ae3056945f841acdf1d72d 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                        | 68 +++++++++++++--------
 .../patches/gcc-cross-environment-variables.patch  | 70 ++++++++++++++++------
 2 files changed, 95 insertions(+), 43 deletions(-)

diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 8bd599c..c5bf66f 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.
 ;;;
@@ -31,6 +32,7 @@
   #:use-module (guix build-system trivial)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
+  #:use-module (ice-9 and-let-star)
   #:use-module (ice-9 match)
   #:export (cross-binutils
             cross-libc
@@ -174,28 +176,32 @@ may be either a libc package or #f.)"
                       ;; 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)))))))
+                    (setenv "CPP" (string-append gcc "/bin/cpp"))
+                    (for-each (lambda (var)
+                                (and-let* ((value (getenv var))
+                                           (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"))))
+               ,phases))
+            (else phases))))))))
 
 (define (cross-gcc-patches target)
   "Return GCC patches needed for TARGET."
@@ -228,6 +234,7 @@ GCC that does not target a libc; otherwise, target that libc."
      `(#:implicit-inputs? #f
        #:modules ((guix build gnu-build-system)
                   (guix build utils)
+                  (ice-9 and-let-star)
                   (ice-9 regex)
                   (srfi srfi-1)
                   (srfi srfi-26))
@@ -261,7 +268,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 +332,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..7bf4222 100644
--- a/gnu/packages/patches/gcc-cross-environment-variables.patch
+++ b/gnu/packages/patches/gcc-cross-environment-variables.patch
@@ -1,9 +1,35 @@
-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.  See
+ the discussion at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>
 
---- 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
+and
+
+<https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00533.html>
+---
+ 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 +38,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 +62,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);
@@ -46,3 +75,6 @@ at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
      {
        const char *startp, *endp;
        char *nstore = (char *) alloca (strlen (temp) + 3);
+-- 
+2.1.4
+
-- 
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 c67ab53a34b6437da649363579079865a0b25d01 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: 8470 bytes --]

From b5cc845ff97d0dbdaa1aa1a8d601c407dd437337 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: 13688 bytes --]

From c36dc0d45b90aa5f957d79ed5cb4b2db50ec0a5e 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 | 163 +++++++++++++++++++++++++++++++++++++++-----
 guix/utils.scm              |   5 ++
 2 files changed, 151 insertions(+), 17 deletions(-)

diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index c5bf66f..5d2d0fe 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)
@@ -36,7 +41,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
@@ -122,20 +128,34 @@ may be either a libc package or #f.)"
                                "--disable-libquadmath"
                                "--disable-decimal-float" ;would need libc
                                "--disable-libcilkrts"
-                               )))
+                                ))
+
+                        ,@(if (cross-newlib? target)
+                              '("--with-newlib"
+                                "--without-threads"
+                                "--without-headers")
+                              '()))
 
                  ,(if libc
                       flags
                       `(remove (cut string-match "--enable-languages.*" <>)
                                ,flags))))
        ((#:make-flags flags)
-        (if libc
+         (cond
+          ((mingw-target? target)
+           `(append (let ((runtime (assoc-ref %build-inputs "mingw-w64")))
+                      (if runtime
+                          (list
+                           (string-append "FLAGS_FOR_TARGET=-B" runtime "/lib"))
+                          '("all-gcc" "all-target-libgcc")))
+                    ,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
@@ -164,7 +184,70 @@ 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 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)
+                       (format (current-error-port) "cross? remove ~a => ~a\n" x (and libc (string-prefix? libc 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-let* ((value (getenv var))
+                                            (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")))))
+                ,@(if libc '()
+                      '((replace 'install
+                                 (lambda _
+                                   (zero? (system* "make" "install-gcc" "install-target-libgcc"))))))))
+            (libc
               `(alist-cons-before
                 'configure 'set-cross-path
                 (lambda* (#:key inputs #:allow-other-keys)
@@ -208,10 +291,19 @@ may be either a libc package or #f.)"
   (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."
@@ -224,7 +316,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.
@@ -247,6 +342,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.
@@ -255,13 +351,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
+                 `(("mingw-w64" ,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 '())
 
@@ -290,7 +393,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))
@@ -310,8 +417,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
@@ -353,7 +459,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
 ;;;
@@ -395,3 +509,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 147ee4a7096ffdd402d1cebcf634df62953dba91 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: 2827 bytes --]

From c5cc85c519df65596eb668b3f849b0548d3baf9a 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: 8928 bytes --]

From b84f3b072e0b86a6d48dc1cbefa624871ad41fa2 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/packages/ncurses.scm (ncurses): Support mingw.
---
 gnu-system.am                            |  1 +
 gnu/packages/ncurses.scm                 | 88 +++++++++++++++++++++++---------
 gnu/packages/patches/ncurses-mingw.patch | 24 +++++++++
 3 files changed, 88 insertions(+), 25 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..74f588c 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"))
-
-                            (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")))))))
+              (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)))))
+                        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: 7705 bytes --]

From 139ca3f9acd5699ecc7ae0932c1d58b8816cc566 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: 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                     |  18 +++-
 3 files changed, 143 insertions(+), 4 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..905f710 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,30 @@
                (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: 1664 bytes --]

From 3cc425eec0bfc445e39a01a52795b5b0164be725 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: 2036 bytes --]

From 9eddd73fd94311c7705887380d348739d7f57e6b 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] 5+ messages in thread

* Re: [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-26 22:23 [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Jan Nieuwenhuizen
@ 2016-04-27  3:15 ` Eric Bavier
  2016-04-27  6:57   ` Jan Nieuwenhuizen
  2016-04-27 10:20 ` Andy Wingo
  1 sibling, 1 reply; 5+ messages in thread
From: Eric Bavier @ 2016-04-27  3:15 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel

On Wed, 27 Apr 2016 00:23:29 +0200
Jan Nieuwenhuizen <janneke@gnu.org> wrote:

> Hi!
> 
> With this new patch set, mingw guile.exe runs; Yay!  I have cleaned-up
> the cross-base.scm and gcc patch (thanks Andy!).  It can be built doing
> 
>     ./pre-inst-env guix build --target=i686-w64-mingw32 guile

That exciting.

Just a few comments:

> From af9fa5754a1c85cc22ae3056945f841acdf1d72d 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).

We've started following the Changelog conventions more closely lately,
notably the lack of indentation spacing on newlines.

> ---
>  gnu/packages/cross-base.scm                        | 68 +++++++++++++--------
>  .../patches/gcc-cross-environment-variables.patch  | 70 ++++++++++++++++------
>  2 files changed, 95 insertions(+), 43 deletions(-)
> 
> diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
> index 8bd599c..c5bf66f 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.
>  ;;;
> @@ -31,6 +32,7 @@
>    #:use-module (guix build-system trivial)
>    #:use-module (srfi srfi-1)
>    #:use-module (srfi srfi-26)
> +  #:use-module (ice-9 and-let-star)
>    #:use-module (ice-9 match)
>    #:export (cross-binutils
>              cross-libc
> @@ -174,28 +176,32 @@ may be either a libc package or #f.)"
>                        ;; 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")))

I prefer the old alignment of the string-append (nitpick).

> +                      (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)))))))
> +                    (setenv "CPP" (string-append gcc "/bin/cpp"))
> +                    (for-each (lambda (var)
> +                                (and-let* ((value (getenv var))
> +                                           (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"))))
> +               ,phases))
> +            (else phases))))))))

The phase overall should result in a boolean, but the for-each here
returns undefined.  There has been sentiment around here to avoid
and-let* where possibly; 'and=>' should work nicely in this case, since
there's only a single application that could return #f.

>  
>  (define (cross-gcc-patches target)
>    "Return GCC patches needed for TARGET."
> @@ -228,6 +234,7 @@ GCC that does not target a libc; otherwise, target that libc."
>       `(#:implicit-inputs? #f
>         #:modules ((guix build gnu-build-system)
>                    (guix build utils)
> +                  (ice-9 and-let-star)
>                    (ice-9 regex)
>                    (srfi srfi-1)
>                    (srfi srfi-26))
> @@ -261,7 +268,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 +332,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")))

Based on the module added above, did you mean to use and-let* here?

`~Eric

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

* Re: [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-27  3:15 ` Eric Bavier
@ 2016-04-27  6:57   ` Jan Nieuwenhuizen
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-27  6:57 UTC (permalink / raw)
  To: Eric Bavier; +Cc: guix-devel

Eric Bavier writes:

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

> We've started following the Changelog conventions more closely lately,
> notably the lack of indentation spacing on newlines.

Ah that's good; I've been hand-editing this

>> -                    (setenv "CROSS_CPATH"
>> -                            (string-append libc "/include:"
>> -                                           linux "/include"))
>> +                    (let ((cpath (string-append
>> +                                  libc "/include"
>> +                                  ":" linux "/include")))
>
> I prefer the old alignment of the string-append (nitpick).

You cannot mean like this

                         (let ((cpath (string-append libc "/include"
                                                     ":" libc "/i686-w64-mingw32/include")))

...that's 92 characters, how would you do it?

>> +                                (and-let* ((value (getenv var))
>> +                                           (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"))))
>> +               ,phases))
>> +            (else phases))))))))
>
> The phase overall should result in a boolean, but the for-each here
> returns undefined.  There has been sentiment around here to avoid
> and-let* where possibly; 'and=>' should work nicely in this case, since
> there's only a single application that could return #f.

Ok; changed to

(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"))

and added a #t

>>  (define (cross-gcc-patches target)
>>    "Return GCC patches needed for TARGET."
>> @@ -228,6 +234,7 @@ GCC that does not target a libc; otherwise, target that libc."
>>       `(#:implicit-inputs? #f
>>         #:modules ((guix build gnu-build-system)
>>                    (guix build utils)
>> +                  (ice-9 and-let-star)
>
> Based on the module added above, did you mean to use and-let* here?

Ah, yes I'm using that in
0004-gnu-cross-build-i686-w64-mingw32-new-cross-target.patch;
removed.  I'll have a look at removing and-let* there too.

Thanks!
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] 5+ messages in thread

* Re: [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-26 22:23 [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Jan Nieuwenhuizen
  2016-04-27  3:15 ` Eric Bavier
@ 2016-04-27 10:20 ` Andy Wingo
  2016-04-27 15:25   ` Jan Nieuwenhuizen
  1 sibling, 1 reply; 5+ messages in thread
From: Andy Wingo @ 2016-04-27 10:20 UTC (permalink / raw)
  To: Jan Nieuwenhuizen; +Cc: guix-devel

Hi :)

Great news!

Since it seems you have one more round, a couple of nits :)

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

> +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);
> + 

I think this needs a comment somewhere -- you mean to completely replace
C_INCLUDE_PATH et al with CROSS_C_INCLUDE_PATH et al?  If you could add
a short rationale somewhere, either in a comment or in the patch
summary, future hackers would really appreciate it :-)  I get a bit lost
in these patches-to-patches.

> ---- 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 +62,11 @@ at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
>   
>     while ((f = file_pop ()) != NULL)
>       {
> -

No change?

> ---- 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);
> @@ -46,3 +75,6 @@ at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
>       {
>         const char *startp, *endp;
>         char *nstore = (char *) alloca (strlen (temp) + 3);
> +-- 
> +2.1.4
> +
> -- 
> 2.7.3

Likewise?  In any case you don't need two footers AFAIU.

> diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
> index c5bf66f..5d2d0fe 100644
> --- a/gnu/packages/cross-base.scm
> +++ b/gnu/packages/cross-base.scm
> @@ -122,20 +128,34 @@ may be either a libc package or #f.)"
>                                 "--disable-libquadmath"
>                                 "--disable-decimal-float" ;would need libc
>                                 "--disable-libcilkrts"
> -                               )))
> +                                ))
> +
> +                        ,@(if (cross-newlib? target)
> +                              '("--with-newlib"
> +                                "--without-threads"
> +                                "--without-headers")
> +                              '()))
>  
>                   ,(if libc
>                        flags
>                        `(remove (cut string-match "--enable-languages.*" <>)
>                                 ,flags))))
>         ((#:make-flags flags)
> -        (if libc
> +         (cond
> +          ((mingw-target? target)

One or two lines of rationale would be appreciated here :)

Had to stop reviewing due to time.  Looking v good tho!

A

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

* Re: [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers.
  2016-04-27 10:20 ` Andy Wingo
@ 2016-04-27 15:25   ` Jan Nieuwenhuizen
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Nieuwenhuizen @ 2016-04-27 15:25 UTC (permalink / raw)
  To: Andy Wingo; +Cc: guix-devel

Andy Wingo writes:

> Since it seems you have one more round, a couple of nits :)

Thanks!

>> +   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);
>> + 
>
> I think this needs a comment somewhere -- you mean to completely replace
> C_INCLUDE_PATH et al with CROSS_C_INCLUDE_PATH et al?  If you could add
> a short rationale somewhere, either in a comment or in the patch
> summary, future hackers would really appreciate it :-)  I get a bit lost
> in these patches-to-patches.

Yes.  This is analogous to what the current patch does with CPATH, only
for C_*INCLUDE_PATH.  CROSS_CPATH, CROSS_C*_INCLUDE_PATH is to be used
for cross compilers, native compilers are unchanged, of course.  There
were two urls at the top of the patch, I changed that to

    Subject: [PATCH] Search path environment variables for cross-compilers.

    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-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 +62,11 @@ at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
>>   
>>     while ((f = file_pop ()) != NULL)
>>       {
>> -
>
> No change?

No; only a regenerated patch.  The only change is, as discussed in

    <https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00533.html>

is adding CROSS_ variants of the C*_INCLUDE_PATH variables.

>> +-- 
>> +2.1.4
>> +
>> -- 
>> 2.7.3
>
> Likewise?  In any case you don't need two footers AFAIU.

The first footer is of the gcc-patch, the second is the one in the guix
patch.  To avoid confusion, I have stripped the footer away from the
gcc-patch.

>> diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
>> index c5bf66f..5d2d0fe 100644
>> --- a/gnu/packages/cross-base.scm
>> +++ b/gnu/packages/cross-base.scm
>> @@ -122,20 +128,34 @@ may be either a libc package or #f.)"
>>                                 "--disable-libquadmath"
>>                                 "--disable-decimal-float" ;would need libc
>>                                 "--disable-libcilkrts"
>> -                               )))
>> +                                ))
>> +
>> +                        ,@(if (cross-newlib? target)
>> +                              '("--with-newlib"
>> +                                "--without-threads"
>> +                                "--without-headers")
>> +                              '()))
>>  
>>                   ,(if libc
>>                        flags
>>                        `(remove (cut string-match "--enable-languages.*" <>)
>>                                 ,flags))))
>>         ((#:make-flags flags)
>> -        (if libc
>> +         (cond
>> +          ((mingw-target? target)
>
> One or two lines of rationale would be appreciated here :)

I have added, lik so
                       ;; For a newlib (non-glibc) target
                       ,@(if (cross-newlib? target)
                             '("--with-newlib"

the only thing I could explain about this snippet, and hardly needs any
explanation: the newlib flag.  I could not think of a good explanation
for the other changes, except maybe that my first attempt did not work
and I just pun in all flags that I new to work from the GUB cross build.

Removed all other changes above.

> Had to stop reviewing due to time.  Looking v good tho!

Thanks a lot again for your help.  Good questions!

Rebuilding, rebuilding etc; a v6 series will follow later.

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] 5+ messages in thread

end of thread, other threads:[~2016-04-27 15:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-26 22:23 [PATCH v5 01/10] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers Jan Nieuwenhuizen
2016-04-27  3:15 ` Eric Bavier
2016-04-27  6:57   ` Jan Nieuwenhuizen
2016-04-27 10:20 ` Andy Wingo
2016-04-27 15:25   ` Jan Nieuwenhuizen

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.