diff mbox

[07/12] gnu: ncurses: support mingw.

Message ID 20160818060851.2853-8-janneke@gnu.org
State New
Headers show

Commit Message

Jan Nieuwenhuizen Aug. 18, 2016, 6:08 a.m. UTC
From: Mark H Weaver <mhw@netris.org>

* gnu/packages/patches/ncurses-mingw.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/ncurses.scm (ncurses): Support MinGW.

Co-Authored-By: Jan Nieuwenhuizen <janneke@gnu.org>
---
 gnu/packages/ncurses.scm | 234 ++++++++++++++++++++++++++---------------------
 1 file changed, 132 insertions(+), 102 deletions(-)
diff mbox

Patch

diff --git a/gnu/packages/ncurses.scm b/gnu/packages/ncurses.scm
index 147033a..4d26fde 100644
--- a/gnu/packages/ncurses.scm
+++ b/gnu/packages/ncurses.scm
@@ -1,7 +1,8 @@ 
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014, 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,124 +20,153 @@ 
 ;;; 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
-  (let ((patch-makefile-phase
-         '(lambda _
-            (for-each patch-makefile-SHELL
-                      (find-files "." "Makefile.in"))))
-        (configure-phase
-         ;; The 'configure' script does not understand '--docdir', so we must
-         ;; override that and use '--mandir' instead.
-         '(lambda* (#:key build target outputs configure-flags
-                    #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out"))
-                  (doc (assoc-ref outputs "doc")))
-              (zero? (apply system* "./configure"
-                            (string-append "SHELL=" (which "sh"))
-                            (string-append "--build=" build)
-                            (string-append "--prefix=" out)
-                            (string-append "--mandir=" doc "/share/man")
-                            (if target
-                                (cons (string-append "--host=" target)
-                                      configure-flags)
-                                configure-flags))))))
-        (remove-shebang-phase
-         '(lambda _
-            ;; To avoid retaining a reference to the bootstrap Bash via the
-            ;; shebang of the 'ncursesw6-config' script, simply remove that
-            ;; shebang: it'll work just as well without it.  Likewise, do not
-            ;; retain a reference to the "doc" output.
-            (substitute* "misc/ncurses-config.in"
-              (("#!@SHELL@")
-               "# No shebang here, use /bin/sh!\n")
-              (("@SHELL@ \\$0")
-               "$0")
-              (("mandir=.*$")
-               "mandir=share/man"))
-            #t))
-        (post-install-phase
-         '(lambda* (#:key outputs #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out")))
-              ;; 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")))))))
-    (package
-     (name "ncurses")
-     (version "6.0")
-     (source (origin
+  (package
+    (name "ncurses")
+    (version "6.0")
+    (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/ncurses/ncurses-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0q3jck7lna77z5r42f13c4xglc7azd19pxfrjrpgp2yf615w4lgm"))))
-     (build-system gnu-build-system)
-     (outputs '("out"
-                "doc"))                          ;1 MiB of man pages
-     (arguments
-      `(#:configure-flags
-        `("--with-shared" "--without-debug" "--enable-widec"
+                "0q3jck7lna77z5r42f13c4xglc7azd19pxfrjrpgp2yf615w4lgm"))
+              (patches (if (target-mingw?)
+                           (search-patches "ncurses-mingw.patch")
+                           '()))))
+    (build-system gnu-build-system)
+    (outputs '("out"
+               "doc"))                ;1 MiB of man pages
+    (arguments
+     (let ((patch-makefile-phase
+            '(lambda _
+               (for-each patch-makefile-SHELL
+                         (find-files "." "Makefile.in"))))
+           (configure-phase
+            ;; The 'configure' script does not understand '--docdir', so we must
+            ;; override that and use '--mandir' instead.
+            '(lambda* (#:key build target outputs configure-flags
+                       #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out"))
+                     (doc (assoc-ref outputs "doc")))
+                 (zero? (apply system* "./configure"
+                               (string-append "SHELL=" (which "sh"))
+                               (string-append "--build=" build)
+                               (string-append "--prefix=" out)
+                               (string-append "--mandir=" doc "/share/man")
+                               (if target
+                                   (cons (string-append "--host=" target)
+                                         configure-flags)
+                                   configure-flags))))))
+           (remove-shebang-phase
+            '(lambda _
+               ;; To avoid retaining a reference to the bootstrap Bash via the
+               ;; shebang of the 'ncursesw6-config' script, simply remove that
+               ;; shebang: it'll work just as well without it.  Likewise, do not
+               ;; retain a reference to the "doc" output.
+               (substitute* "misc/ncurses-config.in"
+                 (("#!@SHELL@")
+                  "# No shebang here, use /bin/sh!\n")
+                 (("@SHELL@ \\$0")
+                  "$0")
+                 (("mandir=.*$")
+                  "mandir=share/man"))
+               #t))
+           (post-install-phase
+            `(lambda* (#:key outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 ;; 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).
+                 ,@(if (target-mingw?)
+                       '( ;; TODO: create .la files to link to the .dll?
+                         (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)))
+                            '("curses" "ncurses" "form" "panel" "menu"))))
+                       '())
+                 (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"))
+
+                               ,@(if (not (target-mingw?))
+                                     '((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")))
+                                     '())
 
-          ;; By default headers land in an `ncursesw' subdir, which is not
-          ;; what users expect.
-          ,(string-append "--includedir=" (assoc-ref %outputs "out")
-                          "/include")
-          "--enable-overwrite"                    ;really honor --includedir
+                               (when (file-exists? libw.a)
+                                 (format #t "creating symlinks for `lib~a'~%" lib)
+                                 (symlink libw.a lib.a)
+                                 ,@(if (not (target-mingw?))
+                                       '((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")))))))
+       `(#:configure-flags
+         ,(cons*
+           'quasiquote
+           `(("--with-shared" "--without-debug" "--enable-widec"
+              
+              ;; By default headers land in an `ncursesw' subdir, which is not
+              ;; what users expect.
+              ,(list 'unquote '(string-append "--includedir=" (assoc-ref %outputs "out")
+                                              "/include"))
+              "--enable-overwrite"      ;really honor --includedir
 
-          ;; Make sure programs like 'tic', 'reset', and 'clear' have a
-          ;; correct RUNPATH.
-          ,(string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out")
-                          "/lib"))
-        #:tests? #f                               ; no "check" target
-        #:phases (modify-phases %standard-phases
-                   (replace 'configure ,configure-phase)
-                   (add-after 'install 'post-install
-                     ,post-install-phase)
-                   (add-before 'configure 'patch-makefile-SHELL
-                     ,patch-makefile-phase)
-                   (add-after 'unpack 'remove-unneeded-shebang
-                     ,remove-shebang-phase))))
-     (self-native-input? #t)                      ; for `tic'
-     (native-search-paths
-      (list (search-path-specification
-             (variable "TERMINFO_DIRS")
-             (files '("share/terminfo")))))
-     (synopsis "Terminal emulation (termcap, terminfo) library")
-     (description
-      "GNU Ncurses is a library which provides capabilities to write text to
+              ;; Make sure programs like 'tic', 'reset', and 'clear' have a
+              ;; correct RUNPATH.
+              ,(list 'unquote '(string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out")
+                                              "/lib"))
+              ;; MinGW: Use term-driver created for the MinGW port.
+              ,@(if (target-mingw?) '("--enable-term-driver") '()))))
+         #:tests? #f                  ; no "check" target
+         #:phases (modify-phases %standard-phases
+                    (replace 'configure ,configure-phase)
+                    (add-after 'install 'post-install
+                      ,post-install-phase)
+                    (add-before 'configure 'patch-makefile-SHELL
+                      ,patch-makefile-phase)
+                    (add-after 'unpack 'remove-unneeded-shebang
+                      ,remove-shebang-phase)))))
+    (self-native-input? #t)           ; for `tic'
+    (native-search-paths
+     (list (search-path-specification
+            (variable "TERMINFO_DIRS")
+            (files '("share/terminfo")))))
+    (synopsis "Terminal emulation (termcap, terminfo) library")
+    (description
+     "GNU Ncurses is a library which provides capabilities to write text to
 a terminal in a terminal-independent manner.  It supports pads and color as
 well as multiple highlights and forms characters.  It is typically used to
 implement user interfaces for command-line applications.  The accompanying
 ncursesw library provides wide character support.")
-     (license x11)
-     (home-page "http://www.gnu.org/software/ncurses/"))))
+    (license x11)
+    (home-page "http://www.gnu.org/software/ncurses/")))
 
 (define-public dialog
   (package