gnu: ncurses: support mingw.

* gnu/packages/ncurses.scm (ncurses): Support MinGW.

Co-Authored-By: Jan Nieuwenhuizen <janneke@gnu.org>
master
Mark H Weaver 2016-08-14 03:46:48 -04:00 committed by Ludovic Courtès
parent 7f1c32f0e6
commit d230cf61f6
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 129 additions and 102 deletions

View File

@ -1,9 +1,10 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org> ;;; 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 © 2015 Leo Famulari <leo@famulari.name>
;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is> ;;; Copyright © 2016 ng0 <ng0@we.make.ritual.n0.is>
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -21,6 +22,7 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu packages ncurses) (define-module (gnu packages ncurses)
#:use-module (gnu packages)
#:use-module (guix licenses) #:use-module (guix licenses)
#:use-module (guix packages) #:use-module (guix packages)
#:use-module (guix download) #:use-module (guix download)
@ -28,121 +30,146 @@
#:use-module (guix build-system perl) #:use-module (guix build-system perl)
#:use-module (gnu packages) #:use-module (gnu packages)
#:use-module (gnu packages perl) #:use-module (gnu packages perl)
#:use-module (gnu packages swig)) #:use-module (gnu packages swig)
#:use-module (guix utils))
(define-public ncurses (define-public ncurses
(let ((patch-makefile-phase (package
'(lambda _ (name "ncurses")
(for-each patch-makefile-SHELL (version "6.0")
(find-files "." "Makefile.in")))) (source (origin
(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
(method url-fetch) (method url-fetch)
(uri (string-append "mirror://gnu/ncurses/ncurses-" (uri (string-append "mirror://gnu/ncurses/ncurses-"
version ".tar.gz")) version ".tar.gz"))
(sha256 (sha256
(base32 (base32
"0q3jck7lna77z5r42f13c4xglc7azd19pxfrjrpgp2yf615w4lgm")))) "0q3jck7lna77z5r42f13c4xglc7azd19pxfrjrpgp2yf615w4lgm"))))
(build-system gnu-build-system) (build-system gnu-build-system)
(outputs '("out" (outputs '("out"
"doc")) ;1 MiB of man pages "doc")) ;1 MiB of man pages
(arguments (arguments
`(#:configure-flags (let ((patch-makefile-phase
`("--with-shared" "--without-debug" "--enable-widec" '(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"))
;; By default headers land in an `ncursesw' subdir, which is not (when (file-exists? libw6.dll)
;; what users expect. (format #t "creating symlinks for `lib~a'~%" lib)
,(string-append "--includedir=" (assoc-ref %outputs "out") (symlink libw6.dll lib.dll)))
"/include") '("curses" "ncurses" "form" "panel" "menu"))))
"--enable-overwrite" ;really honor --includedir '())
(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"))
;; Make sure programs like 'tic', 'reset', and 'clear' have a ,@(if (not (target-mingw?))
;; correct RUNPATH. '((define libw.so.x
,(string-append "LDFLAGS=-Wl,-rpath=" (assoc-ref %outputs "out") (string-append "lib" lib "w.so.6"))
"/lib")) (define lib.so.x
#:tests? #f ; no "check" target (string-append "lib" lib ".so.6"))
#:phases (modify-phases %standard-phases (define lib.so
(replace 'configure ,configure-phase) (string-append "lib" lib ".so")))
(add-after 'install 'post-install '())
,post-install-phase)
(add-before 'configure 'patch-makefile-SHELL (when (file-exists? libw.a)
,patch-makefile-phase) (format #t "creating symlinks for `lib~a'~%" lib)
(add-after 'unpack 'remove-unneeded-shebang (symlink libw.a lib.a)
,remove-shebang-phase)))) ,@(if (not (target-mingw?))
(self-native-input? #t) ; for `tic' '((symlink libw.so.x lib.so.x)
(native-search-paths (false-if-exception (delete-file lib.so))
(list (search-path-specification (call-with-output-file lib.so
(variable "TERMINFO_DIRS") (lambda (p)
(files '("share/terminfo"))))) (format p "INPUT (-l~aw)~%" lib))))
(synopsis "Terminal emulation (termcap, terminfo) library") '())))
(description '("curses" "ncurses" "form" "panel" "menu")))))))
"GNU Ncurses is a library which provides capabilities to write text to `(#: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.
,(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 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 well as multiple highlights and forms characters. It is typically used to
implement user interfaces for command-line applications. The accompanying implement user interfaces for command-line applications. The accompanying
ncursesw library provides wide character support.") ncursesw library provides wide character support.")
(license x11) (license x11)
(home-page "http://www.gnu.org/software/ncurses/")))) (home-page "http://www.gnu.org/software/ncurses/")))
(define-public dialog (define-public dialog
(package (package