diff --git a/nongnu/packages/ncurses.scm b/nongnu/packages/ncurses.scm new file mode 100644 index 0000000..5c27ae9 --- /dev/null +++ b/nongnu/packages/ncurses.scm @@ -0,0 +1,249 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2012, 2013, 2014, 2015, 2017, 2018, 2019 Ludovic Courtès +;;; Copyright © 2014, 2016 Mark H Weaver +;;; Copyright © 2015, 2017 Leo Famulari +;;; Copyright © 2016 Nikita +;;; Copyright © 2016 Efraim Flashner +;;; Copyright © 2016 Jan Nieuwenhuizen +;;; Copyright © 2017, 2019, 2020, 2021 Marius Bakke +;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice +;;; Copyright © 2020 Michael Rohleder +;;; Copyright © 2022 B. Wilson +;;; +;;; 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 (nongnu packages ncurses) + #:use-module (gnu packages) + #:use-module (guix licenses) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix build-system gnu) + #:use-module (guix build-system perl) + #:use-module (gnu packages) + #:use-module (gnu packages perl) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages swig) + #:use-module (gnu packages linux) + #:use-module (guix utils) + #:use-module (ice-9 match)) + +(define-public ncurses-5 + (package + (name "ncurses") + (version "5.9.20141206") + (source (origin + (method url-fetch) + (uri (string-append "mirror://gnu/ncurses/ncurses-" + (version-major+minor version) + ".tar.gz")) + (sha256 + (base32 + "0fsn7xis81za62afan0vvm38bvgzg5wfmv1m86flqcj0nj7jjilh")))) + (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"))) + (apply invoke "./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))))) + (apply-rollup-patch-phase + ;; Ncurses distributes "stable" patchsets to be applied on top + ;; of the release tarball. These are only available as shell + ;; scripts(!) so we decompress and apply them in a phase. + ;; See . + '(lambda* (#:key inputs native-inputs #:allow-other-keys) + (let ((rollup-patch (assoc-ref (or native-inputs inputs) + "rollup-patch"))) + (when rollup-patch + (copy-file rollup-patch + (string-append (getcwd) "/rollup-patch.sh.bz2")) + (invoke "bzip2" "-d" "rollup-patch.sh.bz2") + (invoke "sh" "rollup-patch.sh"))))) + (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")))) + (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 ones (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." + ,(version-major version))) + (define lib.so.x + (string-append "lib" lib ".so." + ,(version-major version))) + (define lib.so + (string-append "lib" lib ".so")) + (define packagew.pc + (string-append lib "w.pc")) + (define package.pc + (string-append lib ".pc"))) + '()) + + (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))) + (with-directory-excursion "pkgconfig" + (format #t "creating symlink for `~a'~%" + package.pc) + (when (file-exists? packagew.pc) + (symlink packagew.pc package.pc)))) + '()))) + '("curses" "ncurses" "form" "panel" "menu"))))))) + `(#:configure-flags + ,(cons* + 'quasiquote + `(("--with-shared" "--without-debug" "--enable-widec" + + "--enable-pc-files" "--with-versioned-syms=yes" + ,(list 'unquote '(string-append "--with-pkg-config-libdir=" + (assoc-ref %outputs "out") + "/lib/pkgconfig")) + + ;; 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")) + + ;; Starting from ncurses 6.1, "make install" runs "install -s" + ;; by default, which doesn't work for cross-compiled binaries + ;; because it invokes 'strip' instead of 'TRIPLET-strip'. Work + ;; around this. + ,@(if (%current-target-system) '("--disable-stripping") '()) + + ;; Do not assume a default search path in ld, even if it is only to + ;; filter it out in ncurses-config. Mainly because otherwise it ends + ;; up using the libdir from binutils, which makes little sense and + ;; causes an unnecessary runtime dependency. + "cf_cv_ld_searchpath=/no-ld-searchpath" + + ;; 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 + (add-after 'unpack 'apply-rollup-patch + ,apply-rollup-patch-phase) + (replace 'configure ,configure-phase) + (add-after 'install 'post-install + ,post-install-phase) + (add-before 'configure 'patch-makefile-SHELL + ,patch-makefile-phase) + (add-before 'patch-source-shebangs 'remove-unneeded-shebang + ,remove-shebang-phase))))) + (native-inputs + `(,@(if (%current-target-system) + `(("self" ,this-package)) ;for `tic' + '()) + ("rollup-patch" + ,(origin + (method url-fetch) + (uri (match (string-split (version-major+minor+point version) #\.) + ((major minor point) + (string-append "https://invisible-mirror.net/archives" + "/ncurses/" major "." minor "/ncurses-" + major "." minor "-" point "-patch.sh.bz2")))) + (sha256 + (base32 + "16ny892yhimy6r4mmsgw3rcl0i15570ifn9c54g1ndyrk7kpmlgs")))) + ("pkg-config" ,pkg-config))) + (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 "https://www.gnu.org/software/ncurses/"))) + +;; Needed by u-boot 2022.04+ +;; Consider merging into ncurses for next core-updates cycle. +(define-public ncurses/tinfo-5 + (package/inherit ncurses-5 + (name "ncurses-with-tinfo") + (arguments + (substitute-keyword-arguments (package-arguments ncurses-5) + ((#:configure-flags cf) + `(cons "--with-termlib=tinfo" + ,cf))))))