;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2013 Cyril Roelandt ;;; Copyright © 2015 Amirouche Boubekki ;;; Copyright © 2016 Al McElrath ;;; Copyright © 2016, 2017 Nikita ;;; Copyright © 2015 Dmitry Bogatov ;;; Copyright © 2015, 2023 Leo Famulari ;;; Copyright © 2016 Eric Bavier ;;; Copyright © 2017 Alex Griffin ;;; Copyright © 2018–2021 Tobias Geerinckx-Rice ;;; Copyright © 2021 Raghav Gururajan ;;; Copyright © 2021 Alexandru-Sergiu Marton ;;; Copyright © 2021 Nikolay Korotkiy ;;; Copyright © 2022 Jai Vetrivelan ;;; Copyright © 2022 jgart ;;; Copyright © 2022 Antero Mejr ;;; ;;; 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
aboutsummaryrefslogtreecommitdiff
blob: f821374cb7898af533b05e7cd7da4e03cfbe96bc (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
195
196
197
198
199
200
201
202
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2020, 2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2022 Florian Pelz <pelzflorian@pelzflorian.de>
;;;
;;; 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
;;;
;;; 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 installer newt welcome)
  #:use-module ((gnu build linux-modules)
                #:select (modules-loaded
                          pci-devices))
  #:use-module (gnu installer dump)
  #:use-module (gnu installer hardware)
  #:use-module (gnu installer steps)
  #:use-module (gnu installer utils)
  #:use-module (gnu installer newt page)
  #:use-module (gnu installer newt utils)
  #:use-module (guix build syscalls)
  #:use-module (guix i18n)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module (srfi srfi-71)
  #:use-module (ice-9 format)
  #:use-module (ice-9 match)
  #:use-module (ice-9 receive)
  #:use-module (newt)
  #:export (run-welcome-page))

;; Expected width and height for the logo.
(define logo-width (make-parameter 43))
(define logo-height (make-parameter 19))

(define info-textbox-width (make-parameter 70))
(define options-listbox-height (make-parameter 5))

(define (display-logo?)
  (> (screen-rows) 35))

(define* (run-menu-page title info-text logo
                        #:key
                        listbox-items
                        listbox-item->text)
  "Run a page with the given TITLE, to ask the user to choose between
LISTBOX-ITEMS displayed in a listbox. The listbox items are converted to text
using LISTBOX-ITEM->TEXT procedure. Display the textual LOGO in the center of
the page. Contrary to other pages, we cannot resort to grid layouts, because
we want this page to occupy all the screen space available."
  (define (fill-listbox listbox items)
    (map (lambda (item)
           (let* ((text (listbox-item->text item))
                  (key (append-entry-to-listbox listbox text)))
             (cons key item)))
         items))

  (let* ((logo-textbox
          (make-textbox -1 -1
                        (if (display-logo?) (logo-width) 0)
                        (if (display-logo?) (logo-height) 0)
                        0))
         (info-textbox
          (make-reflowed-textbox -1 -1
                                 info-text
                                 (info-textbox-width)))
         (options-listbox
          (make-listbox -1 -1
                        (options-listbox-height)
                        (logior FLAG-BORDER FLAG-RETURNEXIT)))
         (keys (fill-listbox options-listbox listbox-items))
         (grid (vertically-stacked-grid
                GRID-ELEMENT-COMPONENT logo-textbox
                GRID-ELEMENT-COMPONENT info-textbox
                GRID-ELEMENT-COMPONENT options-listbox))
         (form (make-form)))

    (define (choice->item str)
      ;; Return the item that corresponds to STR.
      (match (find (match-lambda
                     ((key . item)
                      (string=? str (listbox-item->text item))))
                   keys)
        ((key . item) item)
        (#f (abort-to-prompt 'installer-step 'abort))))

    (set-textbox-text logo-textbox (read-all logo))

    (add-form-to-grid grid form #t)
    (make-wrapped-grid-window grid title)

    (receive (exit-reason argument)
        (run-form-with-clients form
                               `(menu (title ,title)
                                      (text ,info-text)
                                      (items
                                       ,(map listbox-item->text
                                             listbox-items))))
      (dynamic-wind
        (const #t)
        (lambda ()
          (match exit-reason
            ('exit-component
             (let* ((entry (current-listbox-entry options-listbox))
                    (item (assoc-ref keys entry)))
               (match item
                 ((text . proc)
                  (proc)))))
            ('exit-fd-ready
             (let* ((choice argument)
                    (item   (choice->item choice)))
               (match item
                 ((text . proc)
                  (proc)))))))
        (lambda ()
          (destroy-form-and-pop form))))))

(define (check-hardware-support pci-database)
  "Warn about unsupported devices."
  (when (member "uvesafb" (modules-loaded))
    (run-error-page (G_ "\
This may be a false alarm, but possibly your graphics hardware does not
work well with only free software.  Expect trouble.  If after installation,
the system does not boot, perhaps you will need to add nomodeset to the
kernel arguments and need to configure the uvesafb kernel module.")
                    (G_ "Pre-install warning")))

  (let ((devices (pci-devices)))
    (match (filter unsupported-pci-device? devices)
      (()                                         ;no unsupported device
       #t)
      (unsupported
       (run-error-page (format #f (G_ "\
Devices not supported by free software were found on your computer:

~{  - ~a~%~}
Unfortunately, it means those devices will not be usable.

To address it, we recommend choosing hardware that respects your freedom as a \
user--hardware for which free drivers and firmware exist.  See \"Hardware \
Considerations\" in the manual for more information.")
                               (map (pci-device-description pci-database)
                                    unsupported))
                       (G_ "Hardware support warning")
                       #:width 76)))))

(define* (run-welcome-page logo #:key pci-database)
  "Run a welcome page with the given textual LOGO displayed at the center of
the page. Ask the user to choose between manual installation, graphical
installation and reboot."
  (when (file-exists? %core-dump)
    (match (choice-window
            (G_ "Previous installation failed")
            (G_ "Continue")
            (G_ "Report the failure")
            (G_ "It seems that the previous installation exited unexpectedly \
and generated a core dump.  Do you want to continue or to report the failure \
first?"))
      (1 #t)
      (2 (raise
          (condition
           (&user-abort-error))))))

  (run-menu-page
   (G_ "GNU Guix install")
   (G_ "Welcome to GNU Guix system installer!

You will be guided through a graphical installation program.

If you are familiar with GNU/Linux and you want tight control over \
the installation process, you can instead choose manual installation.  \
Documentation is accessible at any time by pressing Ctrl-Alt-F2.")
   logo
   #:listbox-items
   `((,(G_ "Graphical install using a terminal based interface")
      .
      ,(lambda ()
         (check-hardware-support pci-database)))
     (,(G_ "Install using the shell based process")
      .
      ,(lambda ()
         (check-hardware-support pci-database)
         ;; Switch to TTY3, where a root shell is available for shell based
         ;; install. The other root TTY's would have been ok too.
         (system* "chvt" "3")
         (run-welcome-page logo #:pci-database pci-database)))
     (,(G_ "Reboot")
      .
      ,(lambda ()
         (newt-finish)
         (reboot))))
   #:listbox-item->text car))
m9d0giiy1p3lrhr9agw0fkyba2vzbbafa")))) (home-page "https://git.sr.ht/~mil/sxmo-st") (synopsis "St terminal emulator for the Simple X Mobile PinePhone environment") (license license:expat))) (define-public surf (package (name "surf") (version "2.1") (source (origin (method url-fetch) (uri (string-append "https://dl.suckless.org/surf/surf-" version ".tar.gz")) (sha256 (base32 "0mrj0kp01bwrgrn4v298g81h6zyq64ijsg790di68nm21f985rbj")))) (build-system glib-or-gtk-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure) ;; Use the right file name for dmenu and xprop. (add-before 'build 'set-dmenu-and-xprop-file-name (lambda* (#:key inputs #:allow-other-keys) (substitute* "config.def.h" (("dmenu") (search-input-file inputs "/bin/dmenu")) (("xprop") (search-input-file inputs "/bin/xprop"))) #t))))) (inputs `(("dmenu" ,dmenu) ("gcr" ,gcr) ("glib-networking" ,glib-networking) ("gsettings-desktop-schemas" ,gsettings-desktop-schemas) ("webkitgtk" ,webkitgtk-with-libsoup2) ("xprop" ,xprop))) (native-inputs (list pkg-config)) (home-page "https://surf.suckless.org/") (synopsis "Simple web browser") (description "Surf is a simple web browser based on WebKit/GTK+. It is able to display websites and follow links. It supports the XEmbed protocol which makes it possible to embed it in another application. Furthermore, one can point surf to another URI by setting its XProperties.") (license license:x11))) (define-public sent (package (name "sent") (version "1") (source (origin (method url-fetch/tarbomb) (uri (string-append "https://dl.suckless.org/tools/sent-" version ".tar.gz")) (sha256 (base32 "0cxysz5lp25mgww73jl0mgip68x7iyvialyzdbriyaff269xxwvv")))) (build-system gnu-build-system) (arguments `(#:phases (modify-phases %standard-phases (delete 'configure) ;no configuration (add-before 'build 'patch-farbfeld (lambda* (#:key inputs #:allow-other-keys) (substitute* "config.def.h" (("2ff") (search-input-file inputs "/bin/2ff"))))) (add-after 'install 'install-doc (lambda* (#:key outputs #:allow-other-keys) (let* ((out (assoc-ref outputs "out")) (doc (string-append out "/share/doc/" ,name "-" ,(package-version this-package)))) (install-file "README.md" doc))))) #:tests? #f ;no test suite #:make-flags (let ((pkg-config (lambda (flag) (string-append "$(shell pkg-config " flag " " "xft fontconfig x11 libpng)")))) (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output) (string-append "INCS=-I. " (pkg-config "--cflags")) (string-append "LIBS=" (pkg-config "--libs") " -lm"))))) (native-inputs (list pkg-config)) (inputs (list farbfeld libpng libx11 libxft fontconfig)) (synopsis "Plain-text presentation tool") (description "Sent uses plain-text files and PNG images to create slideshow presentations. Each paragraph represents a slide in the presentation. Especially for presentations using the Takahashi method this is very nice and allows you to write down the presentation for a quick lightning talk within a few minutes.") (home-page "https://tools.suckless.org/sent/") (license license:x11))) (define-public wmname (package (name "wmname") (version "0.1") (source (origin (method url-fetch) (uri (string-append "https://dl.suckless.org/tools/wmname-" version ".tar.gz")) (sha256 (base32 "1i82ilhbk36hspc2j0fbpg27wjj7xnvzpv1ppgf6fccina4d36jm")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases ; no tests (modify-phases %standard-phases (delete 'configure)))) ; no configure script (inputs (list libx11)) (home-page "https://tools.suckless.org/x/wmname/") (synopsis "Print or set the window manager name") (description "@command{wmname} prints/sets the window manager name property of the root window similar to how @command{hostname} behaves. It is useful for fixing problems with JDK versions and other broken programs assuming a reparenting window manager for instance.") (license license:expat))) (define-public xbattmon (package (name "xbattmon") (version "1.1") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "xbattmon-" version ".tar.gz")) (sha256 (base32 "1zr6y8lml9xkx0a3dbbsds2qz1bjxvskp7wsckkf8mlsqrbb3xsg")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)))) (inputs (list libx11)) (home-page "https://git.2f30.org/xbattmon/") (synopsis "Simple battery monitor for X") (description "Xbattmon is a simple battery monitor for X.") (license license:isc))) (define-public wificurse (package (name "wificurse") (version "0.3.9") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "wificurse-" version ".tar.gz")) (sha256 (base32 "067ghr1xly5ca41kc83xila1p5hpq0bxfcmc8jvxi2ggm6wrhavn")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; No tests #:make-flags (list (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; No configure script (home-page "https://git.2f30.org/wificurse/") (synopsis "Wifi DoS attack tool") (description "Wificurses listens for beacons sent from wireless access points in the range of your wireless station. Once received the program extracts the BSSID of the AP and transmits deauthentication packets using the broadcast MAC address. This results to the disconnection of all clients connected to the AP at the time of the attack. This is essencially a WiFi DoS attack tool created for educational purposes only. It works only in Linux and requires wireless card drivers capable of injecting packets in wireless networks.") (license license:gpl3+))) (define-public skroll (package (name "skroll") (version "0.6") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "skroll-" version ".tar.gz")) (sha256 (base32 "0km6bjfz4ssb1z0xwld6iiixnn7d255ax8yjs3zkdm42z8q9yl0f")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (home-page "https://2f30.org/") (synopsis "Commandline utility which scrolls text") (description "Skroll is a small utility that you can use to make a text scroll. Pipe text to it, and it will scroll a given number of letters from right to left.") (license license:wtfpl2))) (define-public sbm (package (name "sbm") (version "0.9") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "sbm-" version ".tar.gz")) (sha256 (base32 "1nks5mkh5wn30kyjzlkjlgi31bv1wq52kbp0r6nzbyfnvfdlywik")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (home-page "https://git.2f30.org/sbm/") (synopsis "Simple bandwidth monitor") (description "Sbm is a simple bandwidth monitor.") (license license:isc))) (define-public prout (package (name "prout") (version "0.2") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "prout-" version ".tar.gz")) (sha256 (base32 "1s6c3ygg1h1fyxkh8gd7nzjk6qhnwsb4535d2k780kxnwns5fzas")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (inputs (list cups-minimal zlib)) (home-page "https://git.2f30.org/prout/") (synopsis "Smaller lp command") (description "Prout (PRint OUT) is a small utility one can use to send documents to a printer. It has no feature, and does nothing else. Just set your default printer in client.conf(5) and start printing. No need for a local cups server to be installed.") (license license:wtfpl2))) (define-public noice (package (name "noice") (version "0.8") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "noice-" version ".tar.gz")) (sha256 (base32 "0g01iwzscdv27c1idv93gd74kjzy3n9kazgm6qz08rygp96qx4xw")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure) ; no configure script (add-before 'build 'curses (lambda _ (substitute* "Makefile" (("lcurses") "lncurses"))))))) (inputs (list ncurses)) (home-page "https://git.2f30.org/noice/") (synopsis "Small file browser") (description "Noice is a small curses-based file browser.") (license license:bsd-2))) (define-public human (package (name "human") (version "0.3") (source (origin (method git-fetch) (uri (git-reference (url "git://git.2f30.org/human.git") (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "0y0bsmvpwfwb2lwspi6a799y34h1faxc6yfanyw6hygxc8661mga")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (home-page "https://git.2f30.org/human/") (synopsis "Convert bytes to human readable formats") (description "Human is a small program which translate numbers into a human readable format. By default, it tries to detect the best factorisation, but you can force its output. You can adjust the number of decimals with the @code{SCALE} environment variable.") (license license:wtfpl2))) (define-public fortify-headers (package (name "fortify-headers") (version "1.1") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "fortify-headers-" version ".tar.gz")) (sha256 (base32 "1dhz41jq1azcf7rbvga8w6pnx19l1j9r6jwj8qrlrfnjl9hdi9bb")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (home-page "https://git.2f30.org/fortify-headers/") (synopsis "Standalone fortify-source implementation") (description "This is a standalone implementation of fortify source. It provides compile time buffer checks. It is libc-agnostic and simply overlays the system headers by using the @code{#include_next} extension found in GCC. It was initially intended to be used on musl-based Linux distributions. @itemize @item It is portable, works on *BSD, Linux, Solaris and possibly others. @item It will only trap non-conformant programs. This means that fortify level 2 is treated in the same way as level 1. @item Avoids making function calls when undefined behaviour has already been invoked. This is handled by using @code{__builtin_trap()}. @item Support for out-of-bounds read interfaces, such as @code{send()}, @code{write()}, @code{fwrite()}, etc. @item No ABI is enforced. All of the fortify check functions are inlined into the resulting binary. @end itemize\n") (license license:isc))) (define-public colors (package (name "colors") (version "0.3") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "colors-" version ".tar.gz")) (sha256 (base32 "1lckmqpgj89841splng0sszbls2ag71ggkgr1wsv9y3v6y87589z")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (inputs (list libpng)) (home-page "https://git.2f30.org/colors/") (synopsis "Extract colors from pictures") (description "Extract colors from PNG files. It is similar to strings(1) but for pictures. For a given input file it outputs a colormap to stdout.") (license license:isc))) ;; No new releases were made at github, this repository is more active than ;; the one at http://git.suckless.org/libutf/ and it is ;; done by the same developer. (define-public libutf (let ((revision "1") (commit "ff4c60635e1f455b0a0b4200f8183fbd5a88225b")) (package (name "libutf") (version (git-version "0.0.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/cls/libutf") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1ih5vjavilzggyr1j1z6w1z12c2fs5fg77cfnv7ami5ivsy3kg3d")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (inputs (list gawk)) (home-page "https://github.com/cls/libutf") (synopsis "Plan 9 compatible UTF-8 library") (description "This is a C89 UTF-8 library, with an API compatible with that of Plan 9's libutf, but with a number of improvements: @itemize @item Support for runes beyond the Basic Multilingual Plane. @item utflen and utfnlen cannot overflow on 32- or 64-bit machines. @item chartorune treats all invalid codepoints as though Runeerror. @item fullrune, utfecpy, and utfnlen do not overestimate the length of malformed runes. @item An extra function, charntorune(p,s,n), equivalent to fullrune(s,n) ? chartorune(p,s): 0. @item Runeerror may be set to an alternative replacement value, such as -1, to be used instead of U+FFFD. @end itemize\n") (license license:expat)))) ;; No release tarballs so far. (define-public lchat (let ((revision "4") (commit "e3b64e67b9b9d832462382246474ce1e7d92217c")) (package (name "lchat") (version (git-version "0.0.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/younix/lchat") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1qcjqbgmsskc04j2r6xl3amkwj05n520sq1wv2mqyqncz42qrxm0")))) (build-system gnu-build-system) (arguments `(#:test-target "test" #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure) ; no configure script (add-before 'build 'libbsd (lambda _ (substitute* "Makefile" (("-lutf") "-lutf -lbsd")))) (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 "lchat" bin) (install-file "lchat.1" man1) #t)))))) (inputs (list grep ncurses libutf libbsd)) (home-page "https://github.com/younix/lchat") (synopsis "Line chat is a frontend for the irc client ii from suckless") (description "Lchat (line chat) is the little and small brother of cii. It is a front end for ii-like chat programs. It uses @code{tail -f} to get the chat output in the background.") (license license:isc)))) (define-public snooze (package (name "snooze") (version "0.5") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/leahneukirchen/snooze") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "02ng3r1gzgpyjia4b60i11dj5bhn3xjsdcbwmxaam6dzb33dmgib")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; There are no tests. #:make-flags (list (string-append "CC=" ,(cc-for-target)) ;; Set prefix path to root of package path in store instead ;; of /usr/local. (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) (home-page "https://github.com/leahneukirchen/snooze") (synopsis "Run a command at a particular time") (description "@command{snooze} is a tool for waiting until a particular time and then running a command.") (license license:cc0))) (define-public sbase ;; There are no tagged releases. (let ((commit "2c2a7f54ab55a022a617e510b6e00c3e2736fabd") (revision "0")) (package (name "sbase") (version (git-version "0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://git.suckless.org/sbase/") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "119v1lpgsx8bx9h57wg454ddhzz2awqavl3wrn35a704vifg28g0")))) (build-system gnu-build-system) (arguments (list #:tests? #f ;no test suite #:make-flags #~(list (string-append "CC=" #$(cc-for-target)) (string-append "PREFIX=" #$output)) #:phases #~(modify-phases %standard-phases (delete 'configure)))) (home-page "https://core.suckless.org/sbase/") (synopsis "Collection of UNIX tools") (description "@command{sbase} is a collection of UNIX tools similar to those of GNU Coreutils, containing utilities commands such as @command{grep}, @command{cp}, @command{rm}, etc.") (license license:expat)))) (define-public scron (package (name "scron") (version "0.4") (source (origin (method url-fetch) (uri (string-append "https://dl.2f30.org/releases/" "scron-" version ".tar.gz")) (sha256 (base32 "066fwa55kqcgfrsqgxh94sqbkxfsr691360xg4ljxr4i75d25s2a")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ; no configure script (home-page "https://git.2f30.org/scron/") (synopsis "Simple cron daemon") (description "Schedule commands to be run at specified dates and times. Single daemon and configuration file. Log to stdout or syslog. No mail support.") (license license:expat))) (define-public sfm (package (name "sfm") (version "0.4") (source (origin (method git-fetch) (uri (git-reference (url "git://git.afify.dev/sfm.git") (commit (string-append "v" version)))) (file-name (git-file-name name version)) (sha256 (base32 "0g6k884mggryld0k054sjcj6kpkbca9cvr50w98klszym73yw0sp")))) (build-system gnu-build-system) (arguments `(#:tests? #f ;no check target #:make-flags (list (string-append "CC=" ,(cc-for-target)) (string-append "PREFIX=" %output)) #:phases (modify-phases %standard-phases (delete 'configure)))) ;no configure script (home-page "https://github.com/afify/sfm") (synopsis "Simple file manager") (description "sfm is a simple file manager.") (license license:isc))) (define-public sfeed (package (name "sfeed") (version "1.6") (source (origin (method git-fetch) (uri (git-reference (url "git://git.codemadness.org/sfeed") (commit version))) (file-name (git-file-name name version)) (sha256 (base32 "1ax603xxcwvmgizf6ia820fc7fliinx86zv6ggiqj5p59kz75x0r")))) (build-system gnu-build-system) (arguments (list #:tests? #f ;no check target #:make-flags #~(list (string-append "CC=" #$(cc-for-target)) (string-append "PREFIX=" #$output)) #:phases '(modify-phases %standard-phases (add-after 'unpack 'fix-ncurses (lambda _ (substitute* "Makefile" (("-lcurses") "-lncurses")))) (delete 'configure)))) ;no configure script (inputs (list ncurses)) (home-page "https://git.codemadness.org/sfeed") (synopsis "RSS and Atom parser") (description "@code{sfeed} converts RSS or Atom feeds from XML to a TAB-separated file. There are formatting programs included to convert this TAB-separated format to various other formats. There are also some programs and scripts included to import and export OPML and to fetch, filter, merge and order feed items.") (license license:isc))) (define-public farbfeld (let ((commit "ab5e3dfc9cdb476218538c6687df9f44826d8f11") (revision "0")) (package (name "farbfeld") (version (git-version "4" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "git://git.suckless.org/farbfeld") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "0pkmkvv5ggpzqwqdchd19442x8gh152xy5z1z13ipfznhspsf870")))) (build-system gnu-build-system) (inputs (list libpng libjpeg-turbo imagemagick)) (arguments (list #:tests? #f ;no check target #:make-flags #~(list (string-append "PREFIX=" #$output) (string-append "CC=" #$(cc-for-target))) #:phases #~(modify-phases %standard-phases (add-before 'configure 'patch-2ff (lambda* (#:key inputs outputs #:allow-other-keys) (substitute* "2ff" (("png2ff") (string-append #$output "/bin/png2ff")) (("jpg2ff") (string-append #$output "/bin/jpg2ff")) (("convert") (search-input-file inputs "/bin/convert"))))) (delete 'configure)))) (synopsis "Image format and conversion tools") (description "farbfeld is a lossless image format which is easy to parse, pipe and compress.") (home-page "https://git.suckless.org/farbfeld/") (license license:isc)))) (define-public snafu (let ((commit "e436fb4f61ca93a4ec85122506b2c2d4fec30eb6") (revision "0")) (package (name "snafu") (version (git-version "0.0.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/jsbmg/snafu") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1c6ahxw0qz0703my28k2z0kgi0am5bp5d02l4rgyphgvjk1jfv8h")))) (arguments `(#:cargo-inputs (("rust-chrono" ,rust-chrono-0.4)) #:tests? #f)) ; There are no tests. (build-system cargo-build-system) (home-page "https://github.com/jsbmg/snafu") (synopsis "Status text for DWM window manager") (description "@code{snafu} provides status text for DWM's builtin bar. It shows battery status, battery capacity, current WiFi connection, and the time in a nice format.") (license license:isc)))) (define-public svkbd (package (name "svkbd") (version "0.4.1") (source (origin (method url-fetch) (uri (string-append "https://dl.suckless.org/tools/svkbd-" version ".tar.gz")) (sha256 (base32 "0nhgmr38pk1a8zrcrxd1ygh0m843a3bdchkv8phl508x7vy63hpv")))) (build-system gnu-build-system) (arguments (list #:tests? #f #:make-flags #~(list (string-append "CC=" #$(cc-for-target)) (string-append "PREFIX=" #$output)) #:phases #~(modify-phases %standard-phases (add-after 'unpack 'patch (lambda* (#:key inputs outputs #:allow-other-keys) (substitute* "config.mk" (("/usr/local") #$output) (("/usr/X11R6") #$libx11) (("/usr/include/freetype2") (string-append #$freetype "/include/freetype2"))))) (delete 'configure)))) ;no configure script (native-inputs (list pkg-config)) (inputs (list freetype libx11 libxft libxtst libxinerama)) (propagated-inputs (list glibc-utf8-locales)) (home-page "https://tools.suckless.org/x/svkbd/") (synopsis "Virtual on-screen keyboard") (description "svkbd is a simple virtual keyboard, intended to be used in environments, where no keyboard is available.") (license license:expat))) (define-public lib9 ;; no release since 2010 (let ((commit "63916da7bd6d73d9a405ce83fc4ca34845667cce") (revision "0")) (package (name "lib9") (version (git-version "7" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://git.suckless.org/9base/") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "04j8js4s3jmlzi3m46q81bq76rn41an58ffhkbj9p5wwr5hvplh8")))) (build-system gnu-build-system) (arguments (list #:tests? #f ;no tests #:phases #~(modify-phases %standard-phases (add-after 'unpack 'patch (lambda _ (substitute* "config.mk" (("^PREFIX.*=.*$") (string-append "PREFIX=\"" #$output "\"\n")) (("^OBJTYPE.*=.*$") #$@(cond ((target-x86-64?) #~(string-append "OBJTYPE=x86_64\n")) ((target-x86?) #~(string-append "OBJTYPE=386\n")) ((target-powerpc?) #~(string-append "OBJTYPE=power\n")) ((target-arm32?) #~(string-append "OBJTYPE=arm\n")))) (("^CFLAGS.*+=.*$") (string-append "CFLAGS+=-O2 -g -I. -fPIC -c -DPLAN9PORT " "-DPREFIX=\\\"" #$output "\\\"\n")) (("^LDFLAGS.*+=.*$") "LDFLAGS+=\n") (("^CC.*=.*$") (string-append "CC=" #$(cc-for-target) "\n"))) (substitute* "lib9/libc.h" (("#define main.*p9main") "")) (substitute* "lib9/main.c" (("p9main\\(argc, argv\\);") "") (("extern void p9main\\(int, char\\*\\*\\);") "")) (substitute* "lib9/Makefile" (("lib9.a") "lib9.so") (("LIB9OFILES=\\\\") "LIB9OFILES=convM2D.o \\") (("@\\$\\{AR\\} \\$\\{LIB\\} \\$\\{OFILES\\}") "gcc -shared ${OFILES} -o lib9.so")))) (add-after 'patch 'chdir (lambda _ (chdir "lib9"))) (delete 'configure)))) ;no configure script (home-page "https://tools.suckless.org/9base/") (supported-systems '("x86_64-linux" "i686-linux" "armhf-linux" "powerpc-linux")) (synopsis "Unix port of Plan 9's formatted I/O C library") (description "This package provides a ported version of the Plan 9 lib9 C library. It also contains the Plan 9 libbio, libregexp, libfmt and libutf libraries.") (license (list license:expat ;modifications license:lpl1.02))))) ;original plan9 code (define-public 9yacc (package (inherit lib9) (name "9yacc") (arguments (substitute-keyword-arguments (package-arguments lib9) ((#:phases phases) #~(modify-phases #$phases (add-after 'patch 'patch-for-9yacc (lambda _ (substitute* "yacc/yacc.c" (("#9/yacc") (string-append #$output "/lib"))) (substitute* "config.mk" (("^CFLAGS.*+=.*$") (string-append "CFLAGS+=-O2 -g -c -DPLAN9PORT " "-DPREFIX=\\\"" #$output "\\\"\n"))))) (replace 'chdir (lambda _ (chdir "yacc"))) (delete 'install-include) (add-after 'install 'install-yaccpar (lambda _ (install-file "yaccpar" (string-append #$output "/lib")) (install-file "yaccpars" (string-append #$output "/lib")))))))) (inputs (list lib9)) (synopsis "Port of Plan 9's yacc parser generator for Unix") (description "This package provides a ported version of the Plan 9 yacc parser generator."))) (define-public 9base (package (inherit 9yacc) (name "9base") (arguments (substitute-keyword-arguments (package-arguments 9yacc) ((#:phases phases) #~(modify-phases #$phases (add-after 'patch-for-9yacc 'patch-for-9base (lambda _ (substitute* "Makefile" (("SUBDIRS = lib9\\\\") "SUBDIRS = \\") (("@chmod 755 yacc/9yacc") "")) (for-each (lambda (x) (substitute* "Makefile" (((string-append x "\\\\")) "\\"))) '("yacc" "diff" "hoc" "rc")) (substitute* "sam/Makefile" (("\\$\\{CFLAGS\\}") "${CFLAGS} -I.")) (substitute* "config.mk" (("^YACC.*=.*$") (string-append "YACC=" #$(this-package-native-input "9yacc") "/bin/yacc\n"))))) (delete 'chdir) (delete 'install-yaccpar))))) (native-inputs (list 9yacc)) (inputs (list lib9)) (propagated-inputs (list rc)) (synopsis "Port of various Plan 9 tools for Unix") (description "This package provides ported versions of various Plan 9 userland tools for Unix.")))