Subject: [PATCH] gnu: Add book-sparc.

From: "Artyom V. Poptsov" <[email-masked]>
Date: Fri, 01 Sep 2023 06:44:34 +0300

Hello,

this patch adds my CreativeCommons-licensed book "Science, Programming,
Art and Radioelectronics Club (SPARC)"[1] that covers such topics as
basic electronics, programming, music and game development on Arduino
controllers.
From 8bae40efa9dbb151a68e4c22698bc635cdf2e5ba Mon Sep 17 00:00:00 2001
Message-Id: <8bae40[email-masked]>
From: "Artyom V. Poptsov" <[email-masked]>
Date: Thu, 31 Aug 2023 20:11:29 +0300
Subject: [PATCH] gnu: books: Add book-sparc.

* gnu/packages/books.scm: New module.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add 'books.scm'.
---
 gnu/local.mk           |   1 +
 gnu/packages/books.scm | 119 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 120 insertions(+)
 create mode 100644 gnu/packages/books.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 9b493df8d5..034a666074 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -153,6 +153,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/bioinformatics.scm		\
   %D%/packages/bittorrent.scm			\
   %D%/packages/bison.scm			\
+  %D%/packages/books.scm			\
   %D%/packages/boost.scm			\
   %D%/packages/bootloaders.scm			\
   %D%/packages/bootstrap.scm			\
diff --git a/gnu/packages/books.scm b/gnu/packages/books.scm
new file mode 100644
index 0000000000..7e0e2e069b
--- /dev/null
+++ b/gnu/packages/books.scm
@@ -0,0 +1,119 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2023 Artyom V. Poptsov <[email-masked]>
+;;;
+;;; 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 books)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module (guix build-system copy)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages bash)
+  #:use-module (gnu packages music)
+  #:use-module (gnu packages inkscape)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages tex)
+  #:use-module (gnu packages texlive)
+  #:use-module (gnu packages version-control)
+  #:use-module (gnu packages fonts)
+  #:use-module (gnu packages fontutils))
+
+(define-public book-sparc
+  (package
+    (name "book-sparc")
+    (version "1.0.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/artyom-poptsov/SPARC")
+                    (commit (string-append "v" version))))
+              (sha256
+               (base32
+                "0dswwwkb3h88cl3mhiy79s8i7sa9lmw6fxaj782vxgif795lcpxs"))
+              (file-name (git-file-name name version))))
+    (build-system copy-build-system)
+    (native-inputs (list python-pygments bash-minimal perl which fontconfig))
+    (inputs (list font-liberation
+                  git
+                  gnu-make
+                  inkscape
+                  lilypond
+                  texlive
+                  texlive-fontspec
+                  texlive-koma-script
+                  texlive-trimspaces
+                  texlive-acronym
+                  texlive-adjustbox
+                  texlive-bibtex
+                  texlive-bibtexperllibs
+                  texlive-bigfoot
+                  texlive-circuitikz
+                  texlive-collection-langcyrillic
+                  texlive-glossaries
+                  texlive-glossaries-extra
+                  texlive-lilyglyphs
+                  texlive-minted
+                  texlive-multirow
+                  texlive-pgf
+                  texlive-pgfplots
+                  texlive-subfiles
+                  texlive-svg
+                  texlive-t1utils
+                  texlive-textpos
+                  texlive-transparent
+                  texlive-xetex))
+    (arguments
+     (list #:install-plan #~'(("sparc.pdf" "share/doc/sparc/"))
+           #:phases #~(modify-phases %standard-phases
+                        (delete 'check)
+                        (delete 'configure)
+                        (add-before 'install 'build
+                          (lambda* (#:key inputs parallel-build?
+                                    #:allow-other-keys)
+                            (use-modules (ice-9 regex)
+                                         (srfi srfi-1))
+                            (let* ((src (assoc-ref inputs "source"))
+                                   (rx (make-regexp
+                                        "/gnu/store/(.*)-book-sparc.*"))
+                                   (src-hash (match:substring (regexp-exec rx
+                                                               src) 1))
+                                   (random-seed (fold (lambda (ch prev)
+                                                        (+ (char->integer ch)
+                                                           prev)) 0
+                                                      (string->list src-hash))))
+                              (setenv "RANDOMSEED"
+                                      (number->string random-seed))
+                              (setenv "REPRODUCIBILITY" "yes"))
+                            (invoke "make" "-j"
+                                    (if parallel-build?
+                                        (number->string (parallel-job-count))
+                                        "1")))))))
+    (home-page "https://github.com/artyom-poptsov/SPARC")
+    (synopsis "Book on combining art and technology")
+    (description
+     "Science, Programming, Art and Radioelectronics Club (SPARC) is a book that
+explains how to combine the topics mentined in the title to build projects.  The
+book can be used to teach programming classes in colleges and to organize
+workshops in hackerspaces or other community-driven spaces.  Currently the book
+is available only in Russian.")
+    (license license:cc-by-sa4.0)))

base-commit: e5ce59e2120d186730727b8fe5a8a4aeb276a82e
prerequisite-patch-id: 74efcf51192ed8535c1b2d06b98acc271719facc
-- 
2.34.1

The book is available only in Russian for now.

I thought that it is a neat idea to make a reproducible version of the
book in Guix, so I did.

Not sure if there's any book packaging policy here, but at least a saw
"Free as in Freedom" packaged in Guix, so I decided to package mine book
as well.

I created a separate module named "books.scm" as I couldn't figure out a
better place for the new package (and maybe there will be other books in
Guix as well in the future.)

And yes, the repository contains a PDF version of the book, but that's
not the vibe of reproducibility, right?  Maybe I'll remove the PDF
version from the repository in the future.

Many thanks to Nicolas Goaziou who helped[2] me with figuring out how to
make to work the LaTeX black magic in GNU Guix, and for packaging so
many LaTeX packages for GNU Guix.

- avp

References:
1. https://github.com/artyom-poptsov/SPARC
2. https://mail.gnu.org/archive/html/help-guix/2023-08/msg00075.html

-- 
Artyom "avp" Poptsov <[email-masked]>
Home page: https://memory-heap.org/~avp/
CADR Hackerspace co-founder: https://cadrspace.ru/
GPG: D0C2 EAC1 3310 822D 98DE  B57C E9C5 A2D9 0898 A02F