From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Nieuwenhuizen Subject: [PATCH v4 1/9] gnu: cross: Use CROSS_*_INCLUDE_PATH for system headers. Date: Sun, 24 Apr 2016 23:40:03 +0200 Message-ID: <87bn4yhurl.fsf_-_@drakenvlieg.flower> References: <87vb492l7s.fsf@drakenvlieg.flower> <877fgio11v.fsf@elephly.net> <87r3eq2y2s.fsf@drakenvlieg.flower> <8760w2nzl4.fsf@elephly.net> <87d1q8lb7j.fsf@drakenvlieg.flower> <87k2k99l7w.fsf@gnu.org> <87d1pssnwl.fsf@drakenvlieg.flower> <871t614pk6.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:43219) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1audLX-0003OH-JP for guix-devel@gnu.org; Mon, 25 Apr 2016 06:02:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1audLO-0004ow-Ms for guix-devel@gnu.org; Mon, 25 Apr 2016 06:02:27 -0400 In-Reply-To: <871t614pk6.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Tue, 19 Apr 2016 16:54:17 +0200") List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Ludovic =?utf-8?Q?Court=C3=A8s?= Cc: guix-devel@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ludovic Court=C3=A8s writes: Hi! Find attached v4 of my mingw cross build patches. I'm also working with Manolis and using this patch set rebased on wip-hurd have managed to produce the hurd boostrap binaries. > I think it=E2=80=99s always possible to create variants of the core packa= ges > while testing a new feature, such that you don=E2=80=99t end up rebuildin= g the > world. Hmm...I have been using cross-* versions. I'll probably have to learn to be more careful when moving changes from say, cross-ncurses to the real ncurses, and more trusting that my mingw cross changes don't affect the native builds. I have been avoiding to create cross-guile to depend on cross-readline, depending on cross-ncurses; possibly that's the way to go though. > Here what I would recommend is to temporary switch to your own GCC > variant in cross-base.scm, for the purposes for accelerating testing. Ah, I think this is what I eventually did with cross-gcc-core and then forgot that choice. > In some cases, one could use =E2=80=98replacement=E2=80=99 fields, which = in effect is > equivalent, AIUI, to --no-dependencies. That sounds interesting, esp. if I want to attempt another cross build. Do you have an example of this? > I understand, but =E2=80=98cross-gcc=E2=80=99 already handles that: it ca= n be called > with or without a libc. In the latter case, it produces a =E2=80=9Csans-= libc=E2=80=9D > GCC that is then used to build the C library. > > So I=E2=80=99m under the impression that =E2=80=98core-gcc=E2=80=99 dupli= cates this logic. Or > am I missing something? You're right; merged it into cross-gcc[-sans-libc]. > I think we should have a procedure like this in (guix utils), below > =E2=80=98%current-target-system=E2=80=99: > > (define* (mingw-target? #:optional (target (%current-target-system))) > (and target > (string-suffix? "-mingw32" target))) Thanks, added and > and use that in all such cases. done everywhere...except in the ncurses package. I don't know how to access (guix utils) mingw-target? there, for now I'm using (post-install-phase `(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))= )) any help much appreciated. >> + `("--enable-shared" >> + "--disable-static")) > > In general, I think it=E2=80=99s important to add a comment to justify su= ch > changes, because ideally MinGW wouldn=E2=80=99t diverge from other system= s, and > because we want to be able to maintain such workarounds in the future. I added ;; Static and shared cannot be built in one go: ;; they produce different headers. We need shared. `("--disable-static" "--enable-shared")) >> * gnu/packages/libiconv.scm: New file. >> gnu-system.am: Add it. > > Could you please add it to base.scm? Make sure to run =E2=80=98guix lint= =E2=80=99, > which will suggest a synopsis and description, among other things. Thanks, done. >> + (with-directory-excursion (string-append out "/bin") >> + (for-each (lambda (lib) >> + (define lib.dll >> + (string-append "lib" lib ".dll")) > Obviously this would need to be made conditional. :-) Ah, yes! Thanks, this removes the need for disabling validate-runpath. >> - `("--with-shared" "--without-debug" "--enable-widec" >> + (append >> + `("--with-shared" "--without-debug" "--enable-widec" > > It seems there are no functional changes above. Right, only to enable the (append of: >> + (cond ((equal? ,(%current-target-system) "i686-w64-mingw32") >> + '("--enable-term-driver" >> + "--without-cxx" >> + "--without-cxx-binding")) > > This would need to be justified. Removed append, now changed using splicing to ;; MinGW: Use terminal driver, created for the MinGW port. ,@(if ,(mingw-target?) '("--enable-term-driver") '())) the --without-cxx, --without-cxx-binding were probably to help me bootstrapping. >> + ,@(cond ((equal? (%current-target-system) "i686-w64-mingw32") >> + `((delete 'validate-runpath))) >> + (else '())) > > Use #:validate-runpath? #f instead. I have worked on this all morning. It is no longer necessary to disable runpath, it appeared to be collateral damage. > If the reason is that RUNPATH does not exist on Windows, then we should > instead do something like: > > diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm > index a7d1952..8a817a5 100644 > --- a/guix/build-system/gnu.scm > +++ b/guix/build-system/gnu.scm > @@ -430,7 +430,7 @@ is one of `host' or `target'." > "--enable-deterministic-archiv= es")) > (strip-directories ''("lib" "lib64" "libexec" > "bin" "sbin")) > - (validate-runpath? #t) > + (validate-runpath? (not (mingw-target? target)= )) > (phases '%standard-phases) > (locale "en_US.utf8") > (system (%current-system)) Not sure. There are no elf files produced on MinGW, so validate-runpath is a no-op anyway. WDYT? >> --- /dev/null >> +++ b/gnu/packages/patches/ncurses-mingw.patch > > Please add a note on the origin and upstream status. Added Taken from Eli Zaretskii's gdb bug report https://sourceware.org/ml/gdb-patches/2012-04/msg01052.html Upstream status: Not presented to upstream. >> +++ b/gnu/packages/patches/readline-6.3-mingw.patch >> @@ -0,0 +1,126 @@ >> +Mingw lacks some SIG*. Taken from >> + >> + wget >> https://raw.githubusercontent.com/Alexpux/MINGW-packages/master/mingw-w6= 4-readline/readline-6.3-mingw.patch >> + >> +some updates to make it apply. > > Upstream status? Added Upstream status: Not presented to upstream. >> ;; This test does an 'AC_TRY_RUN', which abort= s when >> ;; cross-compiling, so provide the correct ans= wer. >> ,@(if (%current-target-system) >> - '("bash_cv_wcwidth_broken=3Dno") >> + '("bash_cv_wcwidth_broken=3Dno" >> + "bash_cv_termcap_lib=3Dncurses") >> '())) >> - >> + #:make-flags (list ,@(if (%current-target-system) >> + '("TERMCAP_LIB=3D-lncurses") >> + '())) > These would need to be justified. This was a bit crude, changed back to ,@(if (%current-target-system) '("bash_cv_wcwidth_broken=3Dno") '()) and added ;; MinGW: ncurses provides the termcap api. ,@(if (mingw-target?) '("bash_cv_termcap_lib=3Dncurses") '())) #:make-flags (list ,@(if (mingw-target?) ;; MinGW: termcap in ncurses '("TERMCAP_LIB=3D-lncurses") '())) >> + ,@(if (equal? (%current-target-system) "i686-w64-mingw32") >> + `(("libiconv" ,libiconv)) >> + `(("bash" ,bash))))) > > I think we=E2=80=99d need something like: > > (define* (libiconv-if-needed #:optional (target (%current-target-system= ))) > (if (mingw-target? target) > `(("libiconv" ,libiconv)) > '())) Thanks! Added to base.scm, changed guile's inputs to (inputs `(("libffi" ,libffi) ("readline" ,readline) ,@(libiconv-if-needed) ,@(if (mingw-target?) '() `(("bash" ,bash))))) >> +(define-public cross-guile >> + (package >> + (inherit guile-2.0) >> + (name "cross-guile") >> + (version "2.0.11") > > I don=E2=80=99t think it=E2=80=99s needed, is it? :-) Well, it can come-in handy ;-) Sorry, removed. >> +++ b/gnu/packages/patches/guile-remove-utf8.patch >> +-# included in error.c (=E2=80=98errno=E2=80=99 values: E*) and posix.c= (signal names: SIG*), >> ++# included in error.c (`errno' values: E*) and posix.c (signal names: = SIG*), > > Why is this needed? Removed. This fixed substitute* failing when cross compiling and I figured that using utf8 quotes here was probabl unintentional; I cannot reproduce t= he problem anymore, possibly an artifact of cross-gcc-core. > In summary, as a maintainer, I want to minimize maintenance work. :-) > So I think we must pay a lot of attention to how we integrate support > for alternate platforms. Sure, I can appreciate that. > Most likely, cross-compilation support for MinGW will remain seldom > used, and thus subject to bitrot. Thus, we must make sure that > adjustments made to packages for MinGW support are as little intrusive > as possible, and well documented so people know why they are there and > what to do about them. > > WDYT? I agree. GUB's approach of target-specialisations has the nice feature of separating out weird ports such as MinGW instead of touching most every package definition, which I'm a stil bit uncomfortable with in Guix. However, that approach is even more susceptible to bitrot. > I guess it=E2=80=99s disappointing because you bring a whole lot of patch= es and > I respond on a lot of minor points to address, but I just want to make > sure we don=E2=80=99t overcommit! Well, I am aware that adding a new port might take some time to land and your comments are helpful, thanks a lot for taking this time! What's disappointing is having to wait to see result of rebuild world when I move my changes from cross-ncurses to ncurses [too early], my lack of iron to make that fast, my lack of knowledge of Guix to possibly use the repl more :-) Greetings, Jan --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: inline; filename=0001-gnu-cross-Use-CROSS_-_INCLUDE_PATH-for-system-header.patch Content-Transfer-Encoding: quoted-printable >From 360f2e8ed82368857f208d155a1c462570eb7447 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 17 Apr 2016 18:20:05 +0200 Subject: [PATCH 1/9] gnu: cross: Use CROSS_*_INCLUDE_PATH for system header= s. * gnu/packages/patches/gcc-cross-environment-variables.patch: Also use CROS= S_ 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 | 76 ++++++++++++------- .../patches/gcc-cross-environment-variables.patch | 86 +++++++++++++++---= ---- 2 files changed, 110 insertions(+), 52 deletions(-) diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm index 8bd599c..b440750 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 =C2=A9 2013, 2014, 2015, 2016 Ludovic Court=C3=A8s ;;; Copyright =C2=A9 2014, 2015 Mark H Weaver +;;; Copyright =C2=A9 2016 Jan Nieuwenhuizen ;;; ;;; 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 @@ -168,34 +170,44 @@ may be either a libc package or #f.)" (lambda* (#:key inputs #:allow-other-keys) ;; Add the cross Linux headers to CROSS_CPATH, and remov= e them ;; from CPATH. - (let ((libc (assoc-ref inputs "libc")) + (let ((libc (assoc-ref inputs libc)) (linux (assoc-ref inputs "xlinux-headers"))) (define (cross? x) ;; Return #t if X is a cross-libc or cross Linux. (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->l= ist + value)) + (native-path + (list->search-path-as-string + (remove cross? path) ":")))) + (let* ((path (search-path-as-string->list + (getenv var))) + (native-path + (and path + (list->search-path-as-string + (remove cross? path) ":")))) + (if native-path (setenv var native-path)= ))) + '("C_INCLUDE_PATH" + "CPLUS_INCLUDE_PATH" + "OBJC_INCLUDE_PATH" + "OBJCPLUS_INCLUDE_PATH" + "LIBRARY_PATH")))) + ,phases)) + (else phases)))))))) =20 (define (cross-gcc-patches target) "Return GCC patches needed for TARGET." @@ -228,6 +240,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 +274,16 @@ GCC that does not target a libc; otherwise, target tha= t 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 +338,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"))=20=20=20=20=20= =20=20=20=20=20=20=20=20=20 #t)) ,phases)))) =20 diff --git a/gnu/packages/patches/gcc-cross-environment-variables.patch b/g= nu/packages/patches/gcc-cross-environment-variables.patch index 0bd0be5..a2b94cb 100644 --- a/gnu/packages/patches/gcc-cross-environment-variables.patch +++ b/gnu/packages/patches/gcc-cross-environment-variables.patch @@ -1,9 +1,48 @@ -Search path environment variables for cross-compilers. See the discussion -at . +From a1d8c3d926cb43e51a2b4838ad5cca9c2510fbbb Mon Sep 17 00:00:00 2001 +From: Jan Nieuwenhuizen +Date: Sat, 16 Apr 2016 10:08:16 +0200 +Subject: [PATCH] Search path environment variables for cross-compilers. S= ee + the discussion at =20 ---- 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 + + +--- + 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/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, + } +=20 + temp =3D getenv (LIBRARY_PATH_ENV); +- if (temp && *cross_compile =3D=3D '0') ++ if (temp) + { + const char *startp, *endp; + char *nstore =3D (char *) alloca (strlen (temp) + 3); +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[] =3D +- { "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 =3D cpp_get_options (pfile); + size_t idx =3D (cpp_opts->objc ? 2: 0); +=20 +@@ -473,7 +473,7 @@ register_include_chains (cpp_reader *pfile, const char= *sysroot, =20=20 /* CPATH and language-dependent environment variables may add to the include chain. */ @@ -12,37 +51,30 @@ at . add_env_var_paths (lang_env_vars[idx], SYSTEM); =20=20 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" =20=20 +#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; =20=20 putenv (xstrdup ("COMPILER_PATH=3D")); - putenv (xstrdup ("LIBRARY_PATH=3D")); -+ putenv (xstrdup (LIBRARY_PATH_ENV "=3D")); ++ putenv (xstrdup ("LIBRARY_PATH_ENV=3D")); =20=20 while ((f =3D file_pop ()) !=3D NULL) { +--=20 +2.1.4 =20 ---- 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 - } -=20 - temp =3D getenv (LIBRARY_PATH_ENV); -- if (temp && *cross_compile =3D=3D '0') -+ if (temp) - { - const char *startp, *endp; - char *nstore =3D (char *) alloca (strlen (temp) + 3); --=20 2.7.3 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0002-gnu-bootstrap-Add-i686-mingw.patch >From af07226044b6fcf77d863b42e7d25433dd56052d Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Thu, 14 Apr 2016 07:31:35 +0200 Subject: [PATCH 2/9] 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 --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: inline; filename=0003-gnu-Add-mingw-w64.patch Content-Transfer-Encoding: quoted-printable >From 80a791a193e921a92fef37429f46ebdce85f7bee Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Thu, 14 Apr 2016 07:35:40 +0200 Subject: [PATCH 3/9] 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 | 109 +++++++++++++++++= ++++ .../patches/gcc-4.9.3-mingw-gthr-default.patch | 11 +++ .../patches/mingw-w64-5.0rc2-gcc-4.9.3.patch | 38 +++++++ 4 files changed, 161 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 =3D \ 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 =3D \ 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 =3D \ 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..7d9276a --- /dev/null +++ b/gnu/packages/mingw.scm @@ -0,0 +1,109 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2016 Jan Nieuwenhuizen +;;; +;;; 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 . + +(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/" + name "/" name "-release/" name "-v" version ".tar.bz2"= )) + (sha256 + (base32 "0imdary8j07if8ih73pfgxiclpf2ax8h3mz8mxln07i8sbbd30= c9")) + (patches (list + (search-patch "mingw-w64-5.0rc2-gcc-4.9.3.patch"))= ))) + (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/lib6= 4"))))) + (native-inputs `(("xgcc-core" ,xgcc-sans-libc-i686-w64-mingw32) + ("xbinutils" ,xbinutils-i686-w64-mingw32) + ;; FIXME: these do not propagate along + ("gmp" ,gmp) + ("mpfr" ,mpfr) + ("mpc" ,mpc) + ("zlib" ,zlib))) + (arguments + `(#:configure-flags + '("--host=3Di686-w64-mingw32" + "--target=3Di686-w64-mingw32" + "--with-as=3Di686-w64-mingw32-as" + "--with-ld=3Di686-w64-mingw32-ld" + "--with-nm=3Di686-w64-mingw32-nm") + #:make-flags (list "DEFS=3D-DHAVE_CONFIG_H -D__MINGW_HAS_DXSDK=3D1") + #:tests? #f ;; FIXME: compiles and includes glibc headers + #:phases + (modify-phases %standard-phases + (add-before + 'configure 'setenv + (lambda _ + (let (;; FIXME: these do not propagate along + (xgcc-core (assoc-ref %build-inputs "xgcc-core")) + (xbinutils (assoc-ref %build-inputs "xbinutils")) + (gmp (assoc-ref %build-inputs "gmp")) + (mpfr (assoc-ref %build-inputs "mpfr")) + (mpc (assoc-ref %build-inputs "mpc")) + (zlib (assoc-ref %build-inputs "zlib")) + (mingw-headers (string-append (getcwd) "/mingw-w64-head= ers"))) + ;; FIXME: LD_LIBRARY_PATH does not propagate along + (setenv "LD_LIBRARY_PATH" + (string-append + gmp "/lib" + ":" mpfr "/lib" + ":" mpc "/lib" + ":" zlib "/lib")) + (format (current-error-port) "LD_LIBRARY_PATH:~a\n" (getenv= "LD_LIBRARY_PATH")) + (setenv "PATH" + (string-append xbinutils "/" "i686-w64-mingw32" "/b= in" + ":" (getenv "PATH"))) + (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")))))))) + (home-page "http://mingw.org") + (synopsis "Minimalist GNU for Windows") + (description "MinGW provides a complete Open Source programming tool s= et +which is suitable for the development of native MS-Windows applications, a= nd +which do 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/pa= ckages/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 2= 1: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.87= 1461798 +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) h= ypot ((double)x, (double)y);} + #endif + extern long double __cdecl hypotl (long double, long double); --=20 2.7.3 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0004-gnu-cross-build-i686-w64-mingw32-new-cross-target.patch >From 0f9dd17a6d2223ebe059b566d49130ad8369387f Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 17 Apr 2016 18:42:43 +0200 Subject: [PATCH 4/9] 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 b440750..9abfdb9 100644 --- a/gnu/packages/cross-base.scm +++ b/gnu/packages/cross-base.scm @@ -19,12 +19,17 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu packages cross-base) - #:use-module (guix licenses) + #:use-module ((guix licenses) #:prefix license:) #:use-module (gnu packages) - #:use-module (gnu packages gcc) #:use-module (gnu packages base) + #:use-module (gnu packages bash) + #:use-module (gnu packages gawk) + #:use-module (gnu packages gcc) #:use-module (gnu packages commencement) + #:use-module (gnu packages compression) #:use-module (gnu packages linux) + #:use-module (gnu packages 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) @@ -214,10 +297,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." @@ -230,7 +322,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. @@ -253,6 +348,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. @@ -261,13 +357,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 '()) @@ -296,7 +399,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)) @@ -316,8 +423,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 @@ -359,7 +465,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))) ;;; @@ -401,3 +515,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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0005-gnu-gmp-build-shared-library-for-mingw.patch >From 9631611d35b7cafdc518076fb841420e23fd8d12 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 12 Apr 2016 15:48:28 +0200 Subject: [PATCH 5/9] 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 --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: inline; filename=0006-gnu-Add-libiconv.patch Content-Transfer-Encoding: quoted-printable >From 6e87f80249f6383899911e0f4a28a05d0fbb1449 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 12 Apr 2016 15:46:58 +0200 Subject: [PATCH 6/9] 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 =C2=A9 2014 Alex Kost ;;; Copyright =C2=A9 2014, 2015 Manolis Fragkiskos Ragkousis ;;; Copyright =C2=A9 2016 Efraim Flashner +;;; Copyright =C2=A9 2016 Jan Nieuwenhuizen ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,7 +25,7 @@ =20 (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)) =20 ;;; Commentary: ;;; @@ -940,6 +943,32 @@ reflect changes made by political bodies to time zone = boundaries, UTC offsets, and daylight-saving rules.") (license public-domain))) =20 +(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))) --=20 2.7.3 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0007-gnu-ncurses-support-mingw.patch >From 16fb64fafa8843ffde937f144a73b1fadcefed3e Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 12 Apr 2016 15:47:54 +0200 Subject: [PATCH 7/9] 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 . (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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0008-gnu-readline-support-mingw.patch >From c5ab72c87c4d46b2356ed50dbb14e115f4013265 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 12 Apr 2016 15:49:17 +0200 Subject: [PATCH 8/9] 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 // S_ISUID + ++#ifndef S_ISDIR ++#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) ++#endif ++ + // strlen() + #if defined (HAVE_STRING_H) + # include +@@ -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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0009-gnu-guile-2.0-support-mingw.-WIP-builds-links-segfau.patch >From 08215e8579745a5cb1516e26ab9d80b5eb226dbd Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 24 Apr 2016 14:06:56 +0200 Subject: [PATCH 9/9] gnu: guile-2.0: support mingw. WIP: builds, links, segfaults. * 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..d0697f6 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 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Jan Nieuwenhuizen | GNU LilyPond http://lilypond.org Freelance IT http://JoyofSource.com | Avatar=C2=AE http://AvatarAcademy.nl= =20=20 --=-=-=--