projects/guix·blob java-team · refs

1196 lines · 45.7 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2015 Siniša Biđin <[email protected]>
3;;; Copyright © 2015, 2017, 2018 Ricardo Wurmus <[email protected]>
4;;; Copyright © 2016, 2017, 2018 Nikita <[email protected]>
5;;; Copyright © 2017 Danny Milosavljevic <[email protected]>
6;;; Copyright © 2017, 2018 Alex Vong <[email protected]>
7;;; Copyright © 2017–2019, 2021 Tobias Geerinckx-Rice <[email protected]>
8;;; Copyright © 2018 Timothy Sample <[email protected]>
9;;; Copyright © 2018 Arun Isaac <[email protected]>
10;;; Copyright © 2016, 2017 Leo Famulari <[email protected]>
11;;; Copyright © 2015 Paul van der Walt <[email protected]>
12;;; Copyright © 2019, 2020 Kyle Meyer <[email protected]>
13;;; Copyright © 2015 John Soo <[email protected]>
14;;; Copyright © 2019, 2020, 2022-2024 Efraim Flashner <[email protected]>
15;;; Copyright © 2019, 2020 Alex Griffin <[email protected]>
16;;; Copyright © 2020 Alexandru-Sergiu Marton <[email protected]>
17;;; Copyright © 2020 Brian Leung <[email protected]>
18;;; Copyright © 2021 EuAndreh <[email protected]>
19;;; Copyright © 2021 Stefan Reichör <[email protected]>
20;;; Copyright © 2021 Morgan Smith <[email protected]>
21;;; Copyright © 2022 David Thompson <[email protected]>
22;;; Copyright © 2024 jgart <[email protected]>
23;;; Copyright © 2026 Konstantin Suntsov <[email protected]>
24;;;
25;;; This file is part of GNU Guix.
26;;;
27;;; GNU Guix is free software; you can redistribute it and/or modify it
28;;; under the terms of the GNU General Public License as published by
29;;; the Free Software Foundation; either version 3 of the License, or (at
30;;; your option) any later version.
31;;;
32;;; GNU Guix is distributed in the hope that it will be useful, but
33;;; WITHOUT ANY WARRANTY; without even the implied warranty of
34;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35;;; GNU General Public License for more details.
36;;;
37;;; You should have received a copy of the GNU General Public License
38;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
39
40(define-module (gnu packages haskell-apps)
41 #:use-module (guix download)
42 #:use-module (guix gexp)
43 #:use-module (guix git-download)
44 #:use-module (guix packages)
45 #:use-module ((guix licenses) #:prefix license:)
46 #:use-module (guix build-system haskell)
47 #:use-module (gnu packages)
48 #:use-module (gnu packages bash)
49 #:use-module (gnu packages curl)
50 #:use-module (gnu packages freedesktop)
51 #:use-module (gnu packages gl)
52 #:use-module (gnu packages haskell)
53 #:use-module (gnu packages haskell-check)
54 #:use-module (gnu packages haskell-crypto)
55 #:use-module (gnu packages haskell-web)
56 #:use-module (gnu packages haskell-xyz)
57 #:use-module (gnu packages lsof)
58 #:use-module (gnu packages ncurses)
59 #:use-module (gnu packages perl)
60 #:use-module (gnu packages pkg-config)
61 #:use-module (gnu packages rsync)
62 #:use-module (gnu packages version-control)
63 #:use-module (gnu packages xorg))
64
65(define-public apply-refact
66 (package
67 (name "apply-refact")
68 (version "0.15.0.0")
69 (source (origin
70 (method url-fetch)
71 (uri (hackage-uri "apply-refact" version))
72 (sha256
73 (base32
74 "0iny8ynxx46afbzjp14rvpd4sqk8c1p5883mbln53gmlxcm8zq53"))))
75 (build-system haskell-build-system)
76 (properties '((upstream-name . "apply-refact")))
77 (inputs (list ghc-refact
78 ghc-data-default
79 ghc-exactprint
80 ghc-paths
81 ghc-extra
82 ghc-syb
83 ghc-filemanip
84 ghc-uniplate
85 ghc-unix-compat
86 ghc-optparse-applicative))
87 (native-inputs (list ghc-tasty ghc-tasty-golden ghc-tasty-expected-failure
88 ghc-silently))
89 (home-page "https://github.com/mpickering/apply-refact")
90 (synopsis "Perform refactorings specified by the refact library")
91 (description
92 "This package lets you perform refactorings specified by the refact
93library. It is primarily used with HLint's @code{--refactor} flag.")
94 (license license:bsd-3)))
95
96;; cabal-install depends on Cabal, which is part of GHC. You can only
97;; update this packages after updating GHC.
98(define-public cabal-install
99 (package
100 (name "cabal-install")
101 (version "3.12.1.0")
102 (source
103 (origin
104 (method url-fetch)
105 (uri (hackage-uri "cabal-install" version))
106 (sha256
107 (base32 "1cmifq189i4x0r0yha3dl8nrzzfh92bnd2saak7dqvvjkkysqj38"))))
108 (build-system haskell-build-system)
109 (properties '((upstream-name . "cabal-install")))
110 (inputs (list ghc-async
111 ghc-base16-bytestring
112 ghc-cabal-install-solver
113 ghc-cryptohash-sha256
114 ghc-echo
115 ghc-edit-distance
116 ghc-hashable
117 ghc-http
118 ghc-network-uri
119 ghc-random
120 ghc-tar
121 ghc-zlib
122 ghc-hackage-security
123 ghc-open-browser
124 ghc-regex-base
125 ghc-regex-posix
126 ghc-safe-exceptions
127 ghc-semaphore-compat
128 ghc-resolv
129 ghc-lukko))
130 (native-inputs (list ghc-tasty
131 ghc-tasty-golden
132 ghc-tasty-quickcheck
133 ghc-tasty-expected-failure
134 ghc-tasty-hunit
135 ghc-tree-diff
136 ghc-quickcheck
137 ghc-tasty
138 ghc-tasty-hunit
139 ghc-tasty
140 ghc-tasty-hunit
141 ghc-tagged
142 ghc-tagged
143 ghc-tasty
144 ghc-tasty-expected-failure
145 ghc-tasty-hunit
146 ghc-tasty-quickcheck
147 ghc-quickcheck
148 ghc-pretty-show))
149 (arguments
150 `(#:cabal-revision ("2"
151 "0fdzqdkg2vbyg0lnbk9bdskr2d23hwjpmnc7jnvpzkcmxmcvl99n")
152 ;; The tests depend on Cabal-{QuickCheck,described,tests,tree-diff},
153 ;; which are not distributed on hackage.
154 #:tests? #f))
155 (home-page "https://www.haskell.org/cabal/")
156 (synopsis "Command-line interface for Cabal and Hackage")
157 (description
158 "The cabal command-line program simplifies the process of managing
159Haskell software by automating the fetching, configuration, compilation and
160installation of Haskell libraries and programs.")
161 (license license:bsd-3)))
162
163(define-public cpphs
164 (package
165 (name "cpphs")
166 (version "1.20.9.1")
167 (source
168 (origin
169 (method url-fetch)
170 (uri (hackage-uri "cpphs" version))
171 (sha256
172 (base32
173 "17wi7fma2qaqdm1hwgaam3fd140v9bpa8ky0wg708h1pqc5v2nbz"))))
174 (build-system haskell-build-system)
175 (properties '((upstream-name . "cpphs")))
176 (inputs (list ghc-polyparse))
177 (arguments
178 `(#:cabal-revision ("2"
179 "0vxav36p0kplp4dpd17i4cfzrsl3r437d840xwv83lf1bqp7mrxc")))
180 (home-page "https://projects.haskell.org/cpphs/")
181 (synopsis "Liberalised re-implementation of cpp, the C pre-processor")
182 (description "Cpphs is a re-implementation of the C pre-processor that is
183both more compatible with Haskell, and itself written in Haskell so that it
184can be distributed with compilers. This version of the C pre-processor is
185pretty-much feature-complete and compatible with traditional (K&R)
186pre-processors. Additional features include: a plain-text mode; an option to
187unlit literate code files; and an option to turn off macro-expansion.")
188 (license (list license:lgpl2.1+ license:gpl3+))))
189
190;; Darcs has no https support:
191;; http://darcs.net/manual/Configuring_darcs.html#SECTION00440070000000000000
192;; and results of search engines will show that if the protocol is http, https
193;; is never mentioned.
194(define-public darcs
195 (package
196 (name "darcs")
197 (version "2.16.5")
198 (source
199 (origin
200 (method url-fetch)
201 (uri (hackage-uri "darcs" version))
202 (sha256
203 (base32
204 "0ar4markr71l9hzrbgcz4q37cf2rf3936i6qi8p827p36v96qg6n"))
205 (modules '((guix build utils)))
206 ;; Remove time-dependent code for reproducibility.
207 (snippet
208 '(begin
209 (substitute* "darcs/darcs.hs"
210 (("__DATE__") "\"1970-01-01\"")
211 (("__TIME__") "\"00:00:00\""))
212 #t))))
213 (build-system haskell-build-system)
214 (properties '((upstream-name . "darcs")))
215 (arguments
216 `(#:tests? #f ; TODO: Needs QuickCheck ==2.13.*, and more…
217 #:configure-flags '("-fpkgconfig" "-fcurl" "-flibiconv" "-fthreaded"
218 "-fnetwork-uri" "-fhttp" "--flag=executable"
219 "--flag=library")
220 #:haddock? #f
221 #:phases
222 (modify-phases %standard-phases
223 (add-after 'patch-source-shebangs 'patch-sh
224 (lambda _
225 (substitute* "tests/issue538.sh"
226 (("/bin/sh") (which "sh")))
227 #t))
228 (add-before 'configure 'update-constraints
229 (lambda _
230 (substitute* "darcs.cabal"
231 (("(attoparsec|base|bytestring|constraints|cryptonite|hashable|memory|regex-tdfa|time)\\s+[^,]+" all dep)
232 dep))))
233 (add-after 'register 'remove-libraries
234 (lambda* (#:key outputs #:allow-other-keys)
235 (delete-file-recursively (string-append (assoc-ref outputs "out") "/lib")))))))
236 (inputs (list ghc-regex-base
237 ghc-regex-tdfa
238 ghc-regex-applicative
239 ghc-fgl
240 ghc-html
241 ghc-memory
242 ghc-cryptonite
243 ghc-base16-bytestring
244 ghc-utf8-string
245 ghc-vector
246 ghc-tar
247 ghc-data-ordlist
248 ghc-attoparsec
249 ghc-zip-archive
250 ghc-async
251 ghc-constraints
252 ghc-unix-compat
253 ghc-old-time
254 ghc-temporary
255 ghc-hashable
256 ghc-mmap
257 ghc-zlib
258 ghc-network-uri
259 ghc-network
260 ghc-conduit
261 ghc-http-conduit
262 ghc-http-types
263 curl))
264 (native-inputs (list ghc-cmdargs
265 ghc-findbin
266 ghc-quickcheck
267 ghc-leancheck
268 ghc-hunit
269 ghc-test-framework
270 ghc-test-framework-hunit
271 ghc-test-framework-quickcheck2
272 ghc-test-framework-leancheck
273 ghc-monad-control
274 ghc-system-filepath
275 ghc-system-fileio
276 ghc-transformers-base
277 pkg-config))
278 (home-page "http://darcs.net")
279 (synopsis "Distributed Revision Control System")
280 (description
281 "Darcs is a revision control system. It is:
282
283@enumerate
284@item Distributed: Every user has access to the full command set, removing boundaries
285between server and client or committer and non-committers.
286@item Interactive: Darcs is easy to learn and efficient to use because it asks you
287questions in response to simple commands, giving you choices in your work flow.
288You can choose to record one change in a file, while ignoring another. As you update
289from upstream, you can review each patch name, even the full diff for interesting
290patches.
291@item Smart: Originally developed by physicist David Roundy, darcs is based on a
292unique algebra of patches called @url{http://darcs.net/Theory,Patchtheory}.
293@end enumerate")
294 (license license:gpl2)))
295
296(define-public ghcid
297 (package
298 (name "ghcid")
299 (version "0.8.9")
300 (source
301 (origin
302 (method url-fetch)
303 (uri (hackage-uri "ghcid" version))
304 (sha256
305 (base32 "1dq8lc0dwzib8y21279q4j54cmm7lvx64b3hw2yiym1kzi9rrhj4"))))
306 (build-system haskell-build-system)
307 (properties '((upstream-name . "ghcid")))
308 (inputs (list ghc-extra ghc-ansi-terminal ghc-cmdargs ghc-fsnotify
309 ghc-terminal-size))
310 (native-inputs (list ghc-tasty ghc-tasty-hunit))
311 (home-page "https://github.com/ndmitchell/ghcid#readme")
312 (synopsis "GHCi based bare bones IDE")
313 (description
314 "Either \"GHCi as a daemon\" or \"GHC + a bit of an IDE\". A very simple Haskell
315development tool which shows you the errors in your project and updates them whenever
316you save. Run @code{ghcid --topmost --command=ghci}, where @code{--topmost} makes the
317window on top of all others (Windows only) and @code{--command} is the command to start
318GHCi on your project (defaults to @code{ghci} if you have a @file{.ghci} file, or else
319to @code{cabal repl}).")
320 (license license:bsd-3)))
321
322(define-public git-annex
323 (package
324 (name "git-annex")
325 (version "10.20250721")
326 (source
327 (origin
328 ;; hackage release doesn't include everything needed for extra bits.
329 (method git-fetch)
330 (uri (git-reference
331 (url "https://git.joeyh.name/git/git-annex.git")
332 (commit version)))
333 (file-name (git-file-name name version))
334 (sha256
335 (base32 "1a2g4z9fl90kyl7k6clmc61ma2njnljr4na6jbf04m43qnnr9s5a"))))
336 (build-system haskell-build-system)
337 (properties '((upstream-name . "git-annex")))
338 (arguments
339 `(#:configure-flags
340 '("--flags=-Android -Webapp Servant")
341 #:haddock? #f
342 #:phases
343 (modify-phases %standard-phases
344 (add-before 'configure 'patch-shell-for-tests
345 (lambda _
346 ;; Shell.hs defines "/bin/sh" that is used in Git hooks. We
347 ;; shouldn't patch hooks with Guix's current bash because the
348 ;; hooks can exist after that bash is garbage collected, but
349 ;; let's temporarily patch it so that we can run the tests.
350 (copy-file "Utility/Shell.hs" "/tmp/Shell.hs")
351 (substitute* "Utility/Shell.hs"
352 (("/bin/sh") (which "sh")))))
353 (add-before 'configure 'patch-webapp
354 (lambda _
355 ;; Replace loose references to xdg-open so that 'git annex
356 ;; webapp' runs without making the user also install xdg-utils.
357 (substitute* '("Assistant/WebApp/DashBoard.hs"
358 "Utility/WebApp.hs")
359 (("xdg-open") (which "xdg-open")))
360 ;; Also replace loose references to lsof.
361 (substitute* "Assistant/Threads/Watcher.hs"
362 (("\"lsof\"")
363 (string-append "\"" (which "lsof") "\"")))))
364 (add-before 'configure 'factor-setup
365 (lambda _
366 ;; Factor out necessary build logic from the provided
367 ;; `Setup.hs' script. The script as-is does not work because
368 ;; it cannot find its dependencies, and there is no obvious way
369 ;; to tell it where to look.
370 (call-with-output-file "PreConf.hs"
371 (lambda (out)
372 (format out "import qualified Build.Configure as Configure~%")
373 (format out "main = Configure.run Configure.tests~%")))
374 (call-with-output-file "Setup.hs"
375 (lambda (out)
376 (format out "import Distribution.Simple~%")
377 (format out "main = defaultMain~%")))))
378 (add-before 'configure 'pre-configure
379 (lambda _
380 (invoke "runhaskell" "PreConf.hs")))
381 (add-after 'build 'build-manpages
382 (lambda _
383 (invoke "make" "mans")))
384 (replace 'check
385 (lambda* (#:key tests? #:allow-other-keys)
386 ;; We need to set the path so that Git recognizes
387 ;; `git annex' as a custom command.
388 (setenv "PATH" (string-append (getenv "PATH") ":"
389 (getcwd) "/dist/build/git-annex"))
390 (when tests?
391 (with-directory-excursion "dist/build/git-annex"
392 (symlink "git-annex" "git-annex-shell")
393 (symlink "git-annex" "git-remote-annex")
394 (symlink "git-annex" "git-remote-tor-annex"))
395 (invoke "git-annex" "test"))))
396 (add-after 'check 'unpatch-shell-and-rebuild
397 (lambda args
398 ;; Undo `patch-shell-for-tests'.
399 (copy-file "/tmp/Shell.hs" "Utility/Shell.hs")
400 (apply (assoc-ref %standard-phases 'build) args)))
401 (add-after 'install 'install-more
402 (lambda* (#:key outputs #:allow-other-keys)
403 (let* ((out (assoc-ref outputs "out"))
404 (bash (string-append out "/etc/bash_completion.d"))
405 (fish (string-append out "/share/fish/vendor_completions.d"))
406 (zsh (string-append out "/share/zsh/site-functions")))
407 (setenv "PREFIX" out)
408 (invoke "make" "install-mans")
409 (mkdir-p bash)
410 (copy-file "bash-completion.bash"
411 (string-append bash "/git-annex"))
412 (mkdir-p fish)
413 (with-output-to-file (string-append fish "/git-annex.fish")
414 (lambda _
415 (invoke (string-append out "/bin/git-annex")
416 "--fish-completion-script" "git-annex")))
417 (mkdir-p zsh)
418 (with-output-to-file (string-append zsh "/_git-annex")
419 (lambda _
420 (invoke (string-append out "/bin/git-annex")
421 "--zsh-completion-script" "git-annex"))))))
422 (add-after 'install 'install-symlinks
423 (lambda* (#:key outputs #:allow-other-keys)
424 (let* ((out (assoc-ref outputs "out"))
425 (bin (string-append out "/bin")))
426 (symlink (string-append bin "/git-annex")
427 (string-append bin "/git-annex-shell"))
428 (symlink (string-append bin "/git-annex")
429 (string-append bin "/git-remote-annex"))
430 (symlink (string-append bin "/git-annex")
431 (string-append bin "/git-remote-tor-annex"))))))))
432 (inputs (list curl
433 ghc-network-uri
434 ghc-optparse-applicative
435 ghc-uuid
436 ghc-data-default
437 ghc-case-insensitive
438 ghc-random
439 ghc-dlist
440 ghc-unix-compat
441 ghc-safesemaphore
442 ghc-async
443 ghc-disk-free-space
444 ghc-ifelse
445 ghc-monad-logger
446 ghc-free
447 ghc-utf8-string
448 ghc-sandi
449 ghc-monad-control
450 ghc-bloomfilter
451 ghc-edit-distance
452 ghc-resourcet
453 ghc-http-client
454 ghc-http-client-tls
455 ghc-http-types
456 ghc-http-conduit
457 ghc-http-client-restricted
458 ghc-conduit
459 ghc-old-locale
460 ghc-persistent-sqlite
461 ghc-persistent
462 ghc-persistent-template
463 ghc-unliftio-core
464 ghc-microlens
465 ghc-aeson
466 ghc-vector
467 ghc-tagsoup
468 ghc-unordered-containers
469 ghc-feed
470 ghc-regex-tdfa
471 ghc-socks
472 ghc-byteable
473 ghc-stm-chans
474 ghc-securemem
475 ghc-crypto-api
476 ghc-memory
477 ghc-split
478 ghc-attoparsec
479 ghc-concurrent-output
480 ghc-unbounded-delays
481 ghc-quickcheck
482 ghc-tasty
483 ghc-tasty-hunit
484 ghc-tasty-quickcheck
485 ghc-tasty-rerun
486 ghc-ansi-terminal
487 ghc-aws
488 ghc-dav
489 ghc-network
490 ghc-network-bsd
491 ghc-git-lfs
492 ghc-clock
493 ghc-crypton
494 ghc-servant
495 ghc-servant-server
496 ghc-servant-client
497 ghc-servant-client-core
498 ghc-warp
499 ghc-warp-tls
500 ghc-os-string
501 ghc-file-io
502 ghc-mountpoints
503 ghc-yesod
504 ghc-yesod-static
505 ghc-yesod-form
506 ghc-yesod-core
507 ghc-path-pieces
508 ghc-wai
509 ghc-wai-extra
510 ghc-blaze-builder
511 ghc-clientsession
512 ghc-shakespeare
513 ghc-hinotify
514 ghc-dbus
515 ghc-fdo-notify
516 ghc-network-multicast
517 ghc-network-info
518 ghc-torrent
519 ghc-magic
520 ghc-criterion
521 lsof
522 rsync
523 xdg-utils))
524 (propagated-inputs
525 (list git))
526 (native-inputs (list perl ghc-filepath-bytestring))
527 (home-page "https://git-annex.branchable.com/")
528 (synopsis "Manage files with Git, without checking in their contents")
529 (description "This package allows managing files with Git, without
530checking the file contents into Git. It can store files in many places,
531such as local hard drives and cloud storage services. It can also be
532used to keep a folder in sync between computers.")
533 ;; The main author has released all his changes under AGPLv3+ as of March
534 ;; 2019 (7.20190219-187-g40ecf58d4). These are also licensed under the
535 ;; original GPLv3+ license, but going forward new changes will be under
536 ;; only AGPLv3+. The other licenses below cover code written by others.
537 ;; See git-annex's COPYRIGHT file for details on each file.
538 (license (list license:agpl3+
539 license:gpl3+
540 license:bsd-2
541 license:expat
542 license:gpl2))))
543
544(define-public hlint
545 (package
546 (name "hlint")
547 (version "3.10")
548 (source
549 (origin
550 (method url-fetch)
551 (uri (hackage-uri "hlint" version))
552 (sha256
553 (base32 "0dzy7spc45v88yplczhd3la464bhcbaihi619a45bd06ghrp55nr"))))
554 (build-system haskell-build-system)
555 (properties '((upstream-name . "hlint")))
556 (inputs (list ghc-unordered-containers
557 ghc-vector
558 ghc-file-embed
559 ghc-utf8-string
560 ghc-data-default
561 cpphs
562 ghc-cmdargs
563 ghc-uniplate
564 ghc-ansi-terminal
565 ghc-extra
566 ghc-refact
567 ghc-aeson
568 ghc-deriving-aeson
569 ghc-filepattern
570 ghc-lib-parser
571 ghc-lib-parser-ex
572 hscolour
573 ghc-yaml))
574 (home-page "https://github.com/ndmitchell/hlint#readme")
575 (synopsis "Suggest improvements for Haskell source code")
576 (description
577 "HLint reads Haskell programs and suggests changes that
578hopefully make them easier to read. HLint also makes it easy to disable
579unwanted suggestions, and to add your own custom suggestions.")
580 (license license:bsd-3)))
581
582(define-public hoogle
583 (package
584 (name "hoogle")
585 (version "5.0.18.4")
586 (source
587 (origin
588 (method url-fetch)
589 (uri (hackage-uri "hoogle" version))
590 (sha256
591 (base32 "08z32d87vqzhapb2vw21h25jb2g74csxlpvd8f54xl91k3ijs3wx"))
592 (patches (search-patches "hoogle-crypton-connection-0.4.X.patch"))))
593 (build-system haskell-build-system)
594 (properties '((upstream-name . "hoogle")))
595 (inputs (list ghc-quickcheck
596 ghc-aeson
597 ghc-blaze-html
598 ghc-blaze-markup
599 ghc-cmdargs
600 ghc-conduit
601 ghc-conduit-extra
602 ghc-crypton-connection
603 ghc-data-default-class
604 ghc-extra
605 ghc-foundation
606 ghc-old-locale
607 ghc-hashable
608 ghc-haskell-src-exts
609 ghc-http-conduit
610 ghc-http-types
611 ghc-js-flot
612 ghc-js-jquery
613 ghc-mmap
614 ghc-process-extras
615 ghc-resourcet
616 ghc-safe
617 ghc-storable-tuple
618 ghc-tar
619 ghc-uniplate
620 ghc-utf8-string
621 ghc-vector
622 ghc-wai
623 ghc-wai-logger
624 ghc-warp
625 ghc-warp-tls
626 ghc-zlib
627 ghc-semigroups))
628 (home-page "https://hoogle.haskell.org/")
629 (synopsis "Haskell API Search")
630 (description
631 "Hoogle is a Haskell API search engine, which allows
632you to search many standard Haskell libraries by either function name,
633or by approximate type signature.")
634 (license license:bsd-3)))
635
636(define-public hscolour
637 (package
638 (name "hscolour")
639 (version "1.25")
640 (source
641 (origin
642 (method url-fetch)
643 (uri (hackage-uri "hscolour" version))
644 (sha256
645 (base32 "0z679khnmb6as1zcdb44n9qjk7in32jpm4ldscpqg7jrapd31kjl"))))
646 (build-system haskell-build-system)
647 (properties '((upstream-name . "hscolour")))
648 (home-page "https://hackage.haskell.org/package/hscolour")
649 (synopsis "Script to colourise Haskell code")
650 (description "HSColour is a small Haskell script to colourise Haskell
651code. It currently has six output formats: ANSI terminal codes (optionally
652XTerm-256colour codes), HTML 3.2 with font tags, HTML 4.01 with CSS, HTML 4.01
653with CSS and mouseover annotations, XHTML 1.0 with inline CSS styling, LaTeX,
654and mIRC chat codes.")
655 (license license:bsd-3)))
656
657(define-public lhs2tex
658 (package
659 (name "lhs2tex")
660 (version "1.25")
661 (source
662 (origin
663 (method url-fetch)
664 (uri (hackage-uri "lhs2tex" version))
665 (sha256
666 (base32 "0cf66z6mgadgqd1xs5b6gw8l9rkwgbfsc5czwdiapn7ichi26qyj"))))
667 (build-system haskell-build-system)
668 (properties '((upstream-name . "lhs2tex")))
669 (inputs (list ghc-regex-compat))
670 (home-page "https://github.com/kosmikus/lhs2tex")
671 (synopsis "Preprocessor for typesetting Haskell sources with LaTeX")
672 (description
673 "This tool is primarily intended for people who want to write articles or
674books using LaTeX that contain some Haskell code. It works on literate Haskell
675documents where the non-Haskell parts form essentially a valid LaTeX document,
676then processes the Haskell code in the document and replaces it with formatted
677LaTeX output.")
678 (license license:gpl2+)))
679
680(define-public kmonad
681 (package
682 (name "kmonad")
683 (version "0.4.5")
684 (source
685 (origin
686 (method git-fetch)
687 (uri (git-reference
688 (url "https://github.com/kmonad/kmonad")
689 (commit version)))
690 (file-name (git-file-name name version))
691 (sha256
692 (base32 "0ng07i2zb98gx7giz7cjxjx908p1v14wn913k810n550k2gfbvp9"))))
693 (build-system haskell-build-system)
694 (arguments
695 (list
696 #:haddock? #f ;Haddock fails to generate docs
697 #:phases
698 #~(modify-phases %standard-phases
699 (add-after 'unpack 'patch-git-path
700 (lambda* (#:key inputs #:allow-other-keys)
701 (substitute* "src/KMonad/Args/TH.hs"
702 (("\"git\"")
703 (string-append "\""
704 (search-input-file inputs "/bin/git") "\"")))))
705 (add-after 'install 'install-udev-rules
706 (lambda* (#:key outputs #:allow-other-keys)
707 (let* ((rules (string-append #$output "/lib/udev/rules.d")))
708 (mkdir-p rules)
709 (call-with-output-file (string-append rules "/70-kmonad.rules")
710 (lambda (port)
711 (display (string-append
712 "KERNEL==\"uinput\", MODE=\"0660\", "
713 "GROUP=\"input\", OPTIONS+=\"static_node=uinput\"")
714 port))) #t)))
715 (add-after 'install-udev-rules 'install-documentation
716 (lambda* (#:key outputs #:allow-other-keys)
717 (let* ((doc (string-append #$output "/share/doc/"
718 #$name "-"
719 #$version)))
720 (copy-recursively "doc" doc)
721 (copy-recursively "keymap"
722 (string-append doc "/keymap")) #t))))))
723 (native-inputs (list ghc-hspec
724 hspec-discover
725 git))
726 (inputs (list ghc-cereal
727 ghc-exceptions
728 ghc-hinotify
729 ghc-lens
730 ghc-megaparsec
731 ghc-optparse-applicative
732 ghc-resourcet
733 ghc-rio
734 ghc-unliftio
735 ghc-unordered-containers
736 ghc-template-haskell))
737 (home-page "https://github.com/kmonad/kmonad")
738 (synopsis "Advanced keyboard manager")
739 (description
740 "KMonad is a keyboard remapping utility that supports
741advanced functionality, such as custom keymap layers and modifiers, macros,
742and conditional mappings that send a different keycode when tapped or held.
743By operating at a lower level than most similar tools, it supports X11,
744Wayland, and Linux console environments alike.")
745 (license license:expat)))
746
747(define-public matterhorn
748 (package
749 (name "matterhorn")
750 (version "90000.1.2")
751 (source
752 (origin
753 ;; use git repo instead of hackage URL because the hackage tarball
754 ;; doesn't contain the sample config file
755 (method git-fetch)
756 (uri (git-reference
757 (url "https://github.com/matterhorn-chat/matterhorn")
758 (commit version)))
759 (file-name (git-file-name name version))
760 (sha256
761 (base32 "0i3q7896ss4dnmqs83klia4i9psv0w9ahy3k5yrm20m6qwmair5b"))
762 (snippet
763 #~(substitute* "matterhorn.cabal"
764 (("base-compat >= 0\\.9 && < 0\\.13")
765 "base-compat >= 0.9 && < 0.15")
766 (("bytestring >= 0\\.10 && < 0\\.12")
767 "bytestring >= 0.10 && < 0.13")
768 (("containers >= 0\\.5\\.7 && < 0\\.7")
769 "containers >= 0.5.7 && < 0.8")
770 (("crypton-connection >= 0\\.3\\.1 && < 0\\.4")
771 "crypton-connection >= 0.3.1 && < 0.5")
772 (("filepath >= 1\\.4 && < 1\\.5")
773 "filepath >= 1.4 && < 1.6")
774 (("hashable >= 1\\.2 && < 1\\.5")
775 "hashable >= 1.2 && < 1.6")
776 (("tasty >= 0\\.11 && < 1\\.5")
777 "tasty >= 0.11 && < 1.6")
778 (("text >= 1\\.2\\.5\\.0 && < 2\\.1")
779 "text >= 1.2.5.0 && < 2.2")))
780 (modules '((guix build utils)))))
781 (build-system haskell-build-system)
782 (properties '((upstream-name . "matterhorn")))
783 (inputs (list ghc-aeson
784 ghc-aspell-pipe
785 ghc-async
786 ghc-base-compat
787 ghc-bimap
788 ghc-brick
789 ghc-brick-skylighting
790 ghc-commonmark
791 ghc-commonmark-extensions
792 ghc-config-ini
793 ghc-crypton-connection
794 ghc-data-clist
795 ghc-gitrev
796 ghc-hashable
797 ghc-hclip
798 ghc-mattermost-api
799 ghc-microlens-platform
800 ghc-network-uri
801 ghc-random
802 ghc-semigroups
803 ghc-skylighting-core
804 ghc-split
805 ghc-stm-delay
806 ghc-strict
807 ghc-tasty
808 ghc-temporary
809 ghc-text-zipper
810 ghc-timezone-olson
811 ghc-timezone-series
812 ghc-unix-compat
813 ghc-unordered-containers
814 ghc-utf8-string
815 ghc-uuid
816 ghc-vector
817 ghc-vty
818 ghc-vty-crossplatform
819 ghc-word-wrap
820 ghc-xdg-basedir))
821 (native-inputs (list ghc-checkers
822 ghc-mattermost-api-qc
823 ghc-tasty
824 ghc-tasty-hunit
825 ghc-tasty-quickcheck
826 ghc-unique))
827 (arguments
828 (list
829 #:phases
830 #~(modify-phases %standard-phases
831 (add-after 'unpack 'fix-requirements
832 (lambda _
833 (for-each (lambda (dep)
834 (substitute* "matterhorn.cabal"
835 (((string-append "(,\\s" dep
836 "\\s*>=\\s[0-9].[0-9]).*")
837 all pat)
838 pat)))
839 (list "random"
840 "data-clist"
841 "semigroups"
842 "word-wrap"
843 "unix-compat"
844 "skylighting-core"
845 "checkers"
846 "vty"
847 "vty-crossplatform"
848 "brick"))))
849 (add-after 'install 'install-config-file
850 (lambda _
851 (install-file "./docs/sample-config.ini"
852 (string-append #$output "/share/doc/"
853 #$name "-" #$version "/etc/")))))))
854 (home-page "https://hackage.haskell.org/package/matterhorn")
855 (synopsis "Terminal client for the Mattermost chat system")
856 (description
857 "This is a terminal client for the Mattermost chat system.")
858 (license license:bsd-3)))
859
860(define-public nixfmt
861 (package
862 (name "nixfmt")
863 (version "1.1.0")
864 (source
865 (origin
866 (method git-fetch)
867 (uri
868 (git-reference
869 (url "https://github.com/NixOS/nixfmt")
870 (commit (string-append "v" version))))
871 (sha256
872 (base32 "19sydkdw1579qmvzx0zq06s23bm6m6l9wp1kvsfhxawk8pkz2pc2"))
873 (snippet
874 #~(substitute* "nixfmt.cabal"
875 (("(megaparsec|filepath) *[0-9<>=^&|. ]*" _ package)
876 package)))
877 (modules '((guix build utils)))))
878 (build-system haskell-build-system)
879 (inputs (list ghc-megaparsec
880 ghc-parser-combinators
881 ghc-scientific
882 ghc-pretty-simple
883 ghc-cmdargs
884 ghc-file-embed
885 ghc-safe-exceptions))
886 (home-page "https://github.com/NixOS/nixfmt")
887 (synopsis "Official formatter for Nix code")
888 (description
889 "Nixfmt is a formatter for Nix that ensures consistent and clear
890formatting by forgetting all existing formatting during parsing.")
891 (license license:mpl2.0)))
892
893(define-public ormolu
894 (package
895 (name "ormolu")
896 (version "0.8.0.2")
897 (source
898 (origin
899 (method url-fetch)
900 (uri (hackage-uri "ormolu" version))
901 (sha256
902 (base32 "1fh2m4sy8vzxvm1qm9413apzblqf4sla3454mx64ngkwx0pgi2ad"))
903 (patches (search-patches "ormolu-support-cabal-syntax-3.12.patch"))))
904 (build-system haskell-build-system)
905 (properties '((upstream-name . "ormolu")))
906 (inputs (list ghc-cabal-syntax
907 ghc-diff
908 ghc-lib-parser
909 ghc-memotrie
910 ghc-ansi-terminal
911 ghc-choice
912 ghc-file-embed
913 ghc-lib-parser
914 ghc-megaparsec
915 ghc-syb
916 ghc-optparse-applicative
917 ghc-th-env
918 ghc-unliftio))
919 (native-inputs (list ghc-quickcheck
920 ghc-hspec
921 ghc-hspec-megaparsec
922 ghc-path
923 ghc-path-io
924 ghc-temporary
925 hspec-discover))
926 (home-page "https://github.com/tweag/ormolu")
927 (synopsis "Formatter for Haskell source code")
928 (description "This package provides a formatter for Haskell source code.")
929 (license license:bsd-3)))
930
931(define-public greenclip
932 (package
933 (name "greenclip")
934 (version "4.2")
935 (source
936 (origin
937 (method git-fetch)
938 (uri (git-reference
939 (url "https://github.com/erebe/greenclip")
940 (commit (string-append "v" version))))
941 (file-name (git-file-name name version))
942 (sha256
943 (base32 "10r485q055ci29fmpsjy55n1yqfil53cvdxldlzw2n6mpynmckyv"))))
944 (build-system haskell-build-system)
945 (native-inputs
946 (list pkg-config))
947 (inputs
948 (list libx11
949 libxext
950 libxscrnsaver
951 ghc-x11
952 ghc-exceptions
953 ghc-hashable
954 ghc-microlens
955 ghc-microlens-mtl
956 ghc-protolude
957 ghc-tomland
958 ghc-vector
959 ghc-wordexp))
960 (home-page "https://github.com/erebe/greenclip")
961 (synopsis "Simple Clipboard manager")
962 (description "@code{greenclip} is a clipboard manager written in
963Haskell.")
964 (license license:bsd-3)))
965
966(define-public raincat
967 (package
968 (name "raincat")
969 (version "1.2.1")
970 (source
971 (origin
972 (method url-fetch)
973 (uri (hackage-uri "Raincat" version))
974 (sha256
975 (base32
976 "10y9zi22m6hf13c9h8zd9vg7mljpwbw0r3djb6r80bna701fdf6c"))))
977 (build-system haskell-build-system)
978 (properties '((upstream-name . "Raincat")))
979 (arguments
980 `(#:phases
981 (modify-phases %standard-phases
982 (add-after 'install 'wrap-executable
983 (lambda* (#:key inputs outputs #:allow-other-keys)
984 (let ((out (assoc-ref outputs "out")))
985 (wrap-program (string-append out "/bin/raincat")
986 `("LD_LIBRARY_PATH" ":" =
987 (,(string-append (assoc-ref inputs "freeglut")
988 "/lib"))))
989 #t))))))
990 (inputs
991 (list bash-minimal
992 ghc-extensible-exceptions
993 ghc-random
994 ghc-glut
995 freeglut
996 ghc-opengl
997 ghc-sdl2
998 ghc-sdl2-image
999 ghc-sdl2-mixer))
1000 (home-page "https://www.gamecreation.org/games/raincat")
1001 (synopsis "Puzzle game with a cat in lead role")
1002 (description "Project Raincat is a game developed by Carnegie Mellon
1003students through GCS during the Fall 2008 semester. Raincat features game
1004play inspired from classics Lemmings and The Incredible Machine. The project
1005proved to be an excellent learning experience for the programmers. Everything
1006is programmed in Haskell.")
1007 (license license:bsd-3)))
1008
1009(define-public scroll
1010 (package
1011 (name "scroll")
1012 (version "1.20250228.2")
1013 (source
1014 (origin
1015 (method url-fetch)
1016 (uri (hackage-uri "scroll" version))
1017 (sha256
1018 (base32
1019 "1p1741zqsxg017d08ym1clzqcdlai487wb6q12m1q7dr6i8c0gfj"))))
1020 (build-system haskell-build-system)
1021 (properties '((upstream-name . "scroll")
1022 (updater-extra-inputs "ghc-base-compat")))
1023 (inputs
1024 (list ghc-base-compat
1025 ghc-case-insensitive
1026 ghc-data-default
1027 ghc-ifelse
1028 ghc-monad-loops
1029 ghc-ncurses
1030 ghc-optparse-applicative
1031 ghc-random
1032 ghc-vector))
1033 (home-page "https://joeyh.name/code/scroll/")
1034 (synopsis "Roguelike game")
1035 (description
1036 "You're a bookworm that's stuck on a scroll. You have to dodge between
1037words and use spells to make your way down the page as the scroll is read. Go
1038too slow and you'll get wound up in the scroll and crushed.")
1039 (license license:gpl2)))
1040
1041(define-public shellcheck
1042 (package
1043 (name "shellcheck")
1044 (version "0.10.0")
1045 (source
1046 (origin
1047 (method url-fetch)
1048 (uri (hackage-uri "ShellCheck" version))
1049 (sha256
1050 (base32 "08bdjcdl457xz2vh8y2w29bcwh1k7sfzyvszln3498vm5m1xn22d"))
1051 (file-name (string-append name "-" version ".tar.gz"))))
1052 (build-system haskell-build-system)
1053 (arguments
1054 (list #:haddock? #f ; TODO: Fails to build.
1055 #:cabal-revision '("1" "1935jrzy1r3g9cc74b330fmxnz2i1j8hsdk9jnl557qgk6xjqzs7")
1056 #:phases
1057 #~(modify-phases %standard-phases
1058 (add-after 'build 'build-man-page
1059 (lambda _
1060 (chmod "manpage" #o555)
1061 (invoke "./manpage")))
1062 (add-after 'install 'install-man-page
1063 (lambda* (#:key outputs #:allow-other-keys)
1064 (install-file "shellcheck.1"
1065 (string-append #$output
1066 "/share/man/man1/"))))
1067 (add-after 'register 'remove-libraries
1068 (lambda* (#:key outputs #:allow-other-keys)
1069 (delete-file-recursively (string-append #$output "/lib")))))))
1070 (native-inputs
1071 (list pandoc))
1072 (inputs
1073 (list ghc-aeson ghc-diff ghc-fgl ghc-quickcheck ghc-regex-tdfa))
1074 (home-page "https://www.shellcheck.net/")
1075 (synopsis "Static analysis for shell scripts")
1076 (description "@code{shellcheck} provides static analysis for
1077@command{bash} and @command{sh} shell scripts.
1078It gives warnings and suggestions in order to:
1079
1080@enumerate
1081@item Point out and clarify typical beginner's syntax issues that cause
1082a shell to give cryptic error messages.
1083@item Point out and clarify typical intermediate level semantic problems
1084that cause a shell to behave strangely and counter-intuitively.
1085@item Point out subtle caveats, corner cases and pitfalls that may cause an
1086advanced user's otherwise working script to fail under future circumstances.
1087@end enumerate")
1088 ;; CVE-2021-28794 is for a completely different, unofficial add-on.
1089 (properties `((lint-hidden-cve . ("CVE-2021-28794")) (upstream-name . "ShellCheck")))
1090 (license license:gpl3+)))
1091
1092(define-public shelltestrunner
1093 (package
1094 (name "shelltestrunner")
1095 (version "1.10")
1096 (source
1097 (origin
1098 (method url-fetch)
1099 (uri (hackage-uri "shelltestrunner" version))
1100 (sha256
1101 (base32 "1c6bjyxqa4mgnh3w4pqp6sbr5cf160n7jf9i1b4b9sdxzdjk7g87"))))
1102 (build-system haskell-build-system)
1103 (properties '((upstream-name . "shelltestrunner")))
1104 (arguments
1105 '(#:phases
1106 (modify-phases %standard-phases
1107 (delete 'check)
1108 (add-after 'install 'check
1109 (lambda* (#:key outputs tests? parallel-tests? #:allow-other-keys)
1110 ;; This test is inspired by the Makefile in the upstream
1111 ;; repository, which is missing in the Hackage release tarball
1112 ;; along with some of the tests. The Makefile would not work
1113 ;; anyway as it ties into the 'stack' build tool.
1114 (let* ((out (assoc-ref outputs "out"))
1115 (shelltest (string-append out "/bin/shelltest"))
1116 (numjobs (if parallel-tests?
1117 (number->string (parallel-job-count))
1118 "1")))
1119 (if tests?
1120 (invoke shelltest (string-append "-j" numjobs)
1121 "tests/examples")
1122 (format #t "test suite not run~%"))
1123 #t))))))
1124 (inputs (list ghc-diff
1125 ghc-filemanip
1126 ghc-hunit
1127 ghc-cmdargs
1128 ghc-pretty-show
1129 ghc-regex-tdfa
1130 ghc-safe
1131 ghc-test-framework
1132 ghc-test-framework-hunit
1133 ghc-utf8-string
1134 ghc-hspec
1135 ghc-hspec-core
1136 ghc-hspec-contrib))
1137 (home-page "https://github.com/simonmichael/shelltestrunner")
1138 (synopsis "Test CLI programs")
1139 (description
1140 "shelltestrunner (executable: @command{shelltest}) is a command-line tool
1141for testing command-line programs, or general shell commands. It reads simple
1142test specifications defining a command to run, some input, and the expected
1143output, stderr, and exit status.")
1144 (license license:gpl3+)))
1145
1146(define-public stylish-haskell
1147 (package
1148 (name "stylish-haskell")
1149 (version "0.15.1.0")
1150 (source
1151 (origin
1152 (method url-fetch)
1153 (uri (hackage-uri "stylish-haskell" version))
1154 (sha256
1155 (base32 "06y6f7bv5j5k7q81194v9jqcbmmqcv7h8ii3lq1783bpfnyd6h19"))))
1156 (build-system haskell-build-system)
1157 (properties '((upstream-name . "stylish-haskell")))
1158 (inputs (list ghc-aeson
1159 ghc-file-embed
1160 ghc-regex-tdfa
1161 ghc-syb
1162 ghc-hsyaml-aeson
1163 ghc-hsyaml
1164 ghc-semigroups
1165 ghc-lib-parser
1166 ghc-lib-parser-ex
1167 ghc-strict
1168 ghc-optparse-applicative))
1169 (native-inputs (list ghc-hunit ghc-random ghc-test-framework
1170 ghc-test-framework-hunit))
1171 (home-page "https://github.com/haskell/stylish-haskell")
1172 (synopsis "Haskell code prettifier")
1173 (description
1174 "Stylish-haskell is a Haskell code prettifier. The goal is
1175not to format all of the code in a file, to avoid \"getting in the way\".
1176However, this tool can e.g. clean up import statements and help doing various
1177tasks that get tedious very quickly. It can
1178@itemize
1179@item
1180Align and sort @code{import} statements
1181@item
1182Group and wrap @code{{-# LANGUAGE #-}} pragmas, remove (some) redundant
1183pragmas
1184@item
1185Remove trailing whitespaces
1186@item
1187Align branches in @code{case} and fields in records
1188@item
1189Convert line endings (customisable)
1190@item
1191Replace tabs by four spaces (turned off by default)
1192@item
1193Replace some ASCII sequences by their Unicode equivalent (turned off by
1194default)
1195@end itemize")
1196 (license license:bsd-3)))