aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/netpbm.scm
blob: 489a3c7a43c9df945821e52919e90e6093f2e7f3 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2015 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2015, 2016, 2021 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
;;;
;;; 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 netpbm)
  #:use-module (gnu packages)
  #:use-module (gnu packages compression)
  #:use-module (gnu packages flex)
  #:use-module (gnu packages ghostscript)
  #:use-module (gnu packages image)
  #:use-module (gnu packages perl)
  #:use-module (gnu packages pkg-config)
  #:use-module (gnu packages python)
  #:use-module (gnu packages xml)
  #:use-module (gnu packages xorg)
  #:use-module (guix build-system gnu)
  #:use-module ((guix licenses) #:select (gpl2))
  #:use-module (guix packages)
  #:use-module (guix svn-download))

(define-public netpbm
  (package
   (name "netpbm")
   (version "10.78.3")
   (source (origin
            (method svn-fetch)
            ;; At the time of first packaging, the "super-stable" and
            ;; "stable" versions did not compile with newer libpng;
            ;; we needed the "advanced" version.
            ;; The currently highest stable version is 10.47.53,
            ;; the currently highest advanced version is 10.69.4,
            ;; svn release 2397.
            ;; To determine the correct release: "svn log version.mk".
            (uri (svn-reference
                   (url "http://svn.code.sf.net/p/netpbm/code/advanced")
                   (revision 2965)))
            (sha256
              (base32
               "1k7as9qi1942wyjxpvbf02wg0h4braw44m3m3vvi8sm9y5z1m967"))
            (patches (search-patches "netpbm-CVE-2017-2586.patch"
                                     "netpbm-CVE-2017-2587.patch"))
            (file-name (string-append name "-" version "-checkout"))
            (modules '((guix build utils)))
            (snippet
             '(begin
                ;; Remove non-FSDG-compliant code.

                (define-syntax drop
                  (syntax-rules (in)
                    ;; Remove PROGRAM from DIRECTORY/Makefile, and remove
                    ;; DIRECTORY/PROGRAM and DIRECTORY/PROGRAM.c.
                    ((_ program ... in directory)
                     (begin
                       (substitute* (string-append directory "/Makefile")
                         ((program) "") ...)

                       (let* ((subdir (string-append directory "/" program))
                              (dot-c  (string-append subdir ".c")))
                         (when (file-exists? subdir)
                           (delete-file-recursively subdir))
                         (when (file-exists? dot-c)
                           (delete-file dot-c)))

                       ...))))

                ;; Drop advertisement for non-free program.
                (drop "hpcdtoppm" in "converter/ppm")

                ;; Drop programs without a license, see
                ;; <http://packages.debian.org/changelogs/pool/main/n/netpbm-free/netpbm-free_10.0-12.2/libnetpbm10.copyright>.
                (drop "pbmto4425" "pbmtoln03" "pbmtolps" "pbmtopk" "pktopbm"
                      in "converter/pbm")
                (drop "spottopgm" in "converter/pgm")
                (drop "ppmtopjxl" in "converter/ppm")

                ;; Remove timestamps from the generated code.
                (substitute* "buildtools/makepointerman"
                  (("gmctime[(][)]")
                   "\"Thu Jan 1 00:00:00 1970\""))
                (substitute* "buildtools/stamp-date"
                  (("^DATE=.*")
                   "DATE=\"Thu Jan 01 00:00:00+0000 1970\"\n")
                  (("^USER=.*")
                   "USER=Guix\n"))
                #t))))

   (build-system gnu-build-system)
   (inputs `(("ghostscript" ,ghostscript)
             ("libjpeg" ,libjpeg-turbo)
             ("libpng" ,libpng)
             ("libtiff" ,libtiff)
             ("libxml2" ,libxml2)
             ("xorg-rgb" ,xorg-rgb)
             ("zlib" ,zlib)))
   (native-inputs
     `(("flex" ,flex)
       ("perl" ,perl)
       ("pkg-config" ,pkg-config)
       ("python" ,python-wrapper)))
   (arguments
    `(#:modules ((guix build gnu-build-system)
                 (guix build utils)
                 (ice-9 match))
      #:phases
      (modify-phases %standard-phases
       (replace 'configure
         (lambda* (#:key inputs outputs #:allow-other-keys)
           (copy-file "config.mk.in" "config.mk")
           (chmod "config.mk" #o664)
           (let ((f (open-file "config.mk" "a")))
             (display "CC=gcc\n" f)
             (display "CFLAGS_SHLIB += -fPIC\n" f)
             (display "TIFFLIB = libtiff.so\n" f)
             (display "JPEGLIB = libjpeg.so\n" f)
             (display "ZLIB = libz.so\n" f)
             (display (string-append "LDFLAGS += -Wl,-rpath=" %output "/lib") f)
             (close-port f))

           (let ((rgb (search-input-file inputs "/share/X11/rgb.txt")))
             (substitute* "config.mk"
               (("/usr/share/netpbm/rgb.txt") rgb))

             ;; Our Ghostscript no longer provides the 'gs' command, only
             ;; 'gsc', so look for that instead.
             (substitute* "converter/other/pstopnm.c"
               (("\"%s/gs\"")
                "\"%s/gsc\"")
               (("/usr/bin/gs")
                (search-input-file inputs "/bin/gsc"))))))
       (add-before 'check 'setup-check
         (lambda _
           ;; install temporarily into /tmp/netpbm
           (invoke "make" "package")
           ;; remove test requiring X
           (substitute* "test/all-in-place.test" (("pamx") ""))
           ;; do not worry about non-existing file
           (substitute* "test/all-in-place.test" (("^rm ") "rm -f "))
           ;; remove four tests that fail for unknown reasons
           (substitute* "test/Test-Order"
             (("all-in-place.test") "")
             (("pnmpsnr.test") "")
             (("pnmremap1.test") "")
             (("gif-roundtrip.test") "")

             ;; These two tests started failing in netpbm-10.78.3.
             (("jpeg-roundtrip.test") "")
             (("pbmtext.test") "")

             ;; Skip tests that use nonfree programs that we don't build.
             (("ps-alt-roundtrip.test") "" )
             (("pbm-misc-converters.test") ""))
           #t))
       (replace 'install
         (lambda* (#:key outputs make-flags #:allow-other-keys)
           (let ((out (assoc-ref outputs "out")))
             (apply invoke "make" "package"
                    (string-append "pkgdir=" out) make-flags)
             ;; Remove superfluous files.
             (with-directory-excursion out
               (for-each delete-file-recursively
                         '("config_template" "pkginfo" "README" "VERSION"
                           "link/" "misc/"))
               ;; Install the required ‘libnetpbm.so’ link.
               ;; See <https://issues.guix.gnu.org/issue/40376>.
               (with-directory-excursion "lib"
                 (symlink
                  (match (find-files "." "^libnetpbm\\.so\\.[^.]*\\.[^.]*$")
                         ((head _ ...) head))
                  "libnetpbm.so"))
               #t)))))))
   (synopsis "Toolkit for manipulation of images")
   (description
    "Netpbm is a toolkit for the manipulation of graphic images, including
the conversion of images between a variety of different formats.
There are over 300 separate tools in the package including converters for
about 100 graphics formats.")
   (license gpl2)
   (home-page "https://netpbm.sourceforge.net/")))
tomake-" version ".tar.xz")) (sha256 (base32 "0sdl32qxdy7m06iggmkkvf7j520rmmgbsjzbm7fgnxwxdp6mh7gh")) (patches (search-patches "automake-skip-amhello-tests.patch")))) (build-system gnu-build-system) (inputs (list autoconf-wrapper bash-minimal perl)) (native-inputs (list autoconf-wrapper perl)) (native-search-paths (list (search-path-specification (variable "ACLOCAL_PATH") (files '("share/aclocal"))))) (arguments (list #:modules '((guix build gnu-build-system) (guix build utils) (srfi srfi-1) (srfi srfi-26) (rnrs io ports)) #:phases #~(modify-phases %standard-phases (add-before 'patch-source-shebangs 'patch-tests-shebangs (lambda* (#:key native-inputs inputs #:allow-other-keys) (let ((sh (search-input-file (or native-inputs inputs) "bin/sh"))) (substitute* (find-files "t" "\\.(sh|tap)$") (("#![[:blank:]]?/bin/sh") (string-append "#!" sh))) ;; Set these variables for all the `configure' runs ;; that occur during the test suite. (setenv "SHELL" sh) (setenv "CONFIG_SHELL" sh)))) (add-before 'check 'skip-test (lambda _ ;; This test requires 'etags' and fails if it's missing. ;; Skip it. (substitute* "t/tags-lisp-space.sh" (("^required.*" all) (string-append "exit 77\n" all "\n"))))) #$@(if (%current-target-system) #~((add-after 'install 'patch-non-shebang-references (lambda* (#:key inputs #:allow-other-keys) ;; `patch-shebangs' patches shebangs only, and the Perl ;; scripts use a re-exec feature that references the ;; build hosts' perl. Also, AUTOCONF and BASH store ;; references hide in the scripts. (let ((autoconf (dirname (dirname (search-input-file inputs "bin/autoconf")))) (bash (dirname (dirname (search-input-file inputs "bin/bash")))) (perl (dirname (dirname (search-input-file inputs "bin/perl")))) (store-directory (%store-directory))) (substitute* (find-files (string-append #$output "/bin")) (((string-append store-directory "/[^/]*-autoconf-[^/]*")) autoconf) (((string-append store-directory "/[^/]*-bash-[^/]*")) bash) (((string-append store-directory "/[^/]*-perl-[^/]*")) perl)))))) '()) ;; Files like `install-sh', `mdate.sh', etc. must use ;; #!/bin/sh, otherwise users could leak erroneous shebangs ;; in the wild. See <http://bugs.gnu.org/14201> for an ;; example. (add-after 'install 'unpatch-shebangs (lambda _ (let ((dir (string-append #$output "/share"))) (define (starts-with-shebang? file) (equal? (call-with-input-file file (lambda (p) (list (get-u8 p) (get-u8 p)))) (map char->integer '(#\# #\!)))) (for-each (lambda (file) (when (and (starts-with-shebang? file) (executable-file? file)) (format #t "restoring shebang on `~a'~%" file) (substitute* file (("^#!.*/bin/sh") "#!/bin/sh") (("^#!.*/bin/env(.*)$" _ args) (string-append "#!/usr/bin/env" args))))) (find-files dir ".*")))))))) (home-page "https://www.gnu.org/software/automake/") (synopsis "Making GNU standards-compliant Makefiles") (description "Automake the part of the GNU build system for producing standards-compliant Makefiles. Build requirements are entered in an intuitive format and then Automake works with Autoconf to produce a robust Makefile, simplifying the entire process for the developer.") (license gpl2+))) ; some files are under GPLv3+ (define-public libtool (package (name "libtool") (version "2.4.7") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/libtool/libtool-" version ".tar.xz")) (sha256 (base32 "0pb3l4x37k6fj1lwnpzws55gi3pxl0hx56jm4bzmbrkw0mzj2zsg")) (patches (search-patches "libtool-skip-tests2.patch" "libtool-grep-compat.patch")))) (build-system gnu-build-system) (propagated-inputs (list m4)) (native-inputs (list m4 perl ;; XXX: this shouldn't be necessary, but without it test ;; 102 fails because it cannot find ltdl/libltdl.la. libltdl help2man ; because we modify ltmain.sh automake ; some tests rely on 'aclocal' autoconf-wrapper)) ; others on 'autom4te' (arguments `(;; Libltdl is provided as a separate package, so don't install it here. #:configure-flags '("--disable-ltdl-install") ;; XXX: There are test failures on mips64el-linux starting from 2.4.4: ;; <http://hydra.gnu.org/build/181662>. ;; Also, do not run tests when cross compiling #:tests? ,(not (or (%current-target-system) (string-prefix? "mips64" (%current-system)))) #:phases (modify-phases %standard-phases (add-before 'check 'pre-check (lambda* (#:key inputs native-inputs parallel-tests? #:allow-other-keys) ;; Run the test suite in parallel, if possible. (setenv "TESTSUITEFLAGS" (string-append "-j" (if parallel-tests? (number->string (parallel-job-count)) "1"))) ;; Patch references to /bin/sh. (let ((/bin/sh (search-input-file (or native-inputs inputs) "bin/sh"))) (substitute* "tests/testsuite" (("/bin/sh") /bin/sh))))) ;; These files may be copied into source trees by libtoolize, ;; therefore they must not point to store file names that would be ;; leaked with tarballs generated by make dist. (add-after 'install 'restore-build-aux-shebang (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (dir (string-append out "/share/libtool/build-aux"))) (for-each (lambda (file) (format #t "restoring shebang on `~a'~%" file) (substitute* file (("^#!.*/bin/sh") "#!/bin/sh"))) (find-files dir)))))))) (synopsis "Generic shared library support tools") (description "GNU Libtool helps in the creation and use of shared libraries, by presenting a single consistent, portable interface that hides the usual complexity of working with shared libraries across platforms.") (license gpl3+) (home-page "https://www.gnu.org/software/libtool/"))) (define-public config (let ((revision "1") (commit "c8ddc8472f8efcadafc1ef53ca1d863415fddd5f")) (package (name "config") (version (git-version "0.0.0" revision commit)) ;no release tag (source (origin (method git-fetch) (uri (git-reference (url "https://git.savannah.gnu.org/git/config.git/") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "0x6ycvkmmhhhag97wsf0pw8n5fvh12rjvrck90rz17my4ys16qwv")))) (build-system gnu-build-system) (arguments `(#:phases (modify-phases %standard-phases (add-after 'unpack 'patch-/bin/sh (lambda _ (substitute* "testsuite/config-guess.sh" (("#!/bin/sh") (string-append "#!" (which "sh")))) #t)) (replace 'build (lambda _ (invoke "make" "manpages"))) (delete 'configure) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (bin (string-append out "/bin")) (man1 (string-append out "/share/man/man1"))) (install-file "config.guess" bin) (install-file "config.sub" bin) (install-file "doc/config.guess.1" man1) (install-file "doc/config.sub.1" man1) #t)))))) (native-inputs (list help2man)) (home-page "https://savannah.gnu.org/projects/config") (synopsis "Ubiquitous config.guess and config.sub scripts") (description "The `config.guess' script tries to guess a canonical system triple, and `config.sub' validates and canonicalizes. These are used as part of configuration in nearly all GNU packages (and many others).") (license gpl2+)))) (define-public libltdl ;; This is a libltdl package separate from the libtool package. This is ;; useful because, unlike libtool, it has zero extra dependencies (making it ;; readily usable during bootstrap), and it builds very quickly since ;; Libtool's extensive test suite isn't run. (package (name "libltdl") (version "2.4.7") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/libtool/libtool-" version ".tar.xz")) (sha256 (base32 "0pb3l4x37k6fj1lwnpzws55gi3pxl0hx56jm4bzmbrkw0mzj2zsg")))) (build-system gnu-build-system) (arguments '(#:configure-flags '("--enable-ltdl-install") ;really install it #:phases (modify-phases %standard-phases (add-before 'configure 'change-directory (lambda _ (chdir "libltdl")))))) (synopsis "System-independent dlopen wrapper of GNU libtool") (description (package-description libtool)) (home-page (package-home-page libtool)) (license lgpl2.1+))) (define-public pyconfigure (package (name "pyconfigure") (version "0.2.3") (source (origin (method url-fetch) (uri (string-append "mirror://gnu/pyconfigure/pyconfigure-" version ".tar.gz")) (sha256 (base32 "0kxi9bg7l6ric39vbz9ykz4a21xlihhh2zcc3297db8amvhqwhrp")))) (build-system gnu-build-system) (arguments `(#:phases (modify-phases %standard-phases (add-before 'configure 'patch-python (lambda _ (substitute* "pyconf.in" (("/usr/bin/env python") (which "python3"))) #t))))) (inputs (list python-3)) (synopsis "@command{configure} interface for Python-based packages") (description "GNU pyconfigure provides template files for easily implementing standards-compliant configure scripts and Makefiles for Python-based packages. It is designed to work alongside existing Python setup scripts, making it easy to integrate into existing projects. Powerful and flexible Autoconf macros are available, allowing you to easily make adjustments to the installation procedure based on the capabilities of the target computer.") (home-page "https://www.gnu.org/software/pyconfigure/manual/") (license (fsf-free "https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html"))))