guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/03: website: packaging-tutorial: Fix code margin.


From: Pierre Neidhardt
Subject: 01/03: website: packaging-tutorial: Fix code margin.
Date: Thu, 11 Oct 2018 12:50:18 -0400 (EDT)

ambrevar pushed a commit to branch master
in repository guix-artwork.

commit 701595ee234951618feddaf0e5179b9eb9d51a4f
Author: Pierre Neidhardt <address@hidden>
Date:   Thu Oct 11 18:38:37 2018 +0200

    website: packaging-tutorial: Fix code margin.
    
    * website/posts/packaging-tutorial.md: Fix code margin.
---
 website/posts/packaging-tutorial.md | 710 +++++++++++++++++++-----------------
 1 file changed, 370 insertions(+), 340 deletions(-)

diff --git a/website/posts/packaging-tutorial.md 
b/website/posts/packaging-tutorial.md
index 8b9a2d4..5a1b9a6 100644
--- a/website/posts/packaging-tutorial.md
+++ b/website/posts/packaging-tutorial.md
@@ -47,25 +47,25 @@ with.  You can look up its declaration with `guix edit 
hello` from the
 command line.  Let's see how it looks:
 
 ```scheme
-    (define-public hello
-      (package
-        (name "hello")
-        (version "2.10")
-        (source (origin
-                  (method url-fetch)
-                  (uri (string-append "mirror://gnu/hello/hello-" version
-                                      ".tar.gz"))
-                  (sha256
-                   (base32
-                    "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
-        (build-system gnu-build-system)
-        (synopsis "Hello, GNU world: An example GNU package")
-        (description
-         "GNU Hello prints the message \"Hello, world!\" and then exits.  It
-    serves as an example of standard GNU coding practices.  As such, it 
supports
-    command-line arguments, multiple languages, and so on.")
-        (home-page "https://www.gnu.org/software/hello/";)
-        (license gpl3+)))
+(define-public hello
+  (package
+    (name "hello")
+    (version "2.10")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/hello/hello-" version
+                                  ".tar.gz"))
+              (sha256
+               (base32
+                "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
+    (build-system gnu-build-system)
+    (synopsis "Hello, GNU world: An example GNU package")
+    (description
+     "GNU Hello prints the message \"Hello, world!\" and then exits.  It
+serves as an example of standard GNU coding practices.  As such, it supports
+command-line arguments, multiple languages, and so on.")
+    (home-page "https://www.gnu.org/software/hello/";)
+    (license gpl3+)))
 ```
 
 As you can see, most of it is rather straightforward.  But let's review the
@@ -110,29 +110,29 @@ setup later; for now we will go the simplest route.
 Save the following to a file `my-hello.scm`.
 
 ```scheme
-    (use-modules (guix packages)
-                 (guix download)
-                 (guix build-system gnu)
-                 (guix licenses))
-
-    (package
-      (name "my-hello")
-      (version "2.10")
-      (source (origin
-                (method url-fetch)
-                (uri (string-append "mirror://gnu/hello/hello-" version
-                                    ".tar.gz"))
-                (sha256
-                 (base32
-                  "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
-      (build-system gnu-build-system)
-      (synopsis "Hello, Guix world: An example custom Guix package")
-      (description
-       "GNU Hello prints the message \"Hello, world!\" and then exits.  It
-    serves as an example of standard GNU coding practices.  As such, it 
supports
-    command-line arguments, multiple languages, and so on.")
-      (home-page "https://www.gnu.org/software/hello/";)
-      (license gpl3+))
+(use-modules (guix packages)
+             (guix download)
+             (guix build-system gnu)
+             (guix licenses))
+
+(package
+  (name "my-hello")
+  (version "2.10")
+  (source (origin
+            (method url-fetch)
+            (uri (string-append "mirror://gnu/hello/hello-" version
+                                ".tar.gz"))
+            (sha256
+             (base32
+              "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
+  (build-system gnu-build-system)
+  (synopsis "Hello, Guix world: An example custom Guix package")
+  (description
+   "GNU Hello prints the message \"Hello, world!\" and then exits.  It
+serves as an example of standard GNU coding practices.  As such, it supports
+command-line arguments, multiple languages, and so on.")
+  (home-page "https://www.gnu.org/software/hello/";)
+  (license gpl3+))
 ```
 
 We will explain the extra code in a moment.
@@ -148,14 +148,14 @@ Thankfully, Guix can automate this task for us; all we 
need is to provide the
 URI:
 
 ```sh
-    $ guix download mirror://gnu/hello/hello-2.10.tar.gz
-
-    Starting download of /tmp/guix-file.JLYgL7
-    From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz...
-    following redirection to 
`https://mirror.ibcp.fr/pub/gnu/hello/hello-2.10.tar.gz'...
-     …10.tar.gz  709KiB                                 2.5MiB/s 00:00 
[##################] 100.0%
-    /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz
-    0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
+$ guix download mirror://gnu/hello/hello-2.10.tar.gz
+
+Starting download of /tmp/guix-file.JLYgL7
+From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz...
+following redirection to 
`https://mirror.ibcp.fr/pub/gnu/hello/hello-2.10.tar.gz'...
+ …10.tar.gz  709KiB                                 2.5MiB/s 00:00 
[##################] 100.0%
+/gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz
+0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
 ```
 
 In this specific case that the output tells us which mirror was chosen.
@@ -167,36 +167,36 @@ should definitely check the signature of this tarball 
with `gpg` to
 authenticate it before going further:
 
 ```sh
-       $ guix download mirror://gnu/hello/hello-2.10.tar.gz.sig
-
-       Starting download of /tmp/guix-file.03tFfb
-       From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz.sig...
-       following redirection to 
`https://ftp.igh.cnrs.fr/pub/gnu/hello/hello-2.10.tar.gz.sig'...
-        ….tar.gz.sig  819B                                                     
                                                                  1.2MiB/s 
00:00 [##################] 100.0%
-       /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig
-       0q0v86n3y38z17rl146gdakw9xc4mcscpk8dscs412j22glrv9jf
-       $ gpg --verify 
/gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig 
/gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz
-       gpg: Signature made Sun 16 Nov 2014 01:08:37 PM CET
-       gpg:                using RSA key A9553245FDE9B739
-       gpg: Good signature from "Sami Kerola <address@hidden>" [unknown]
-       gpg:                 aka "Sami Kerola (http://www.iki.fi/kerolasa/) 
<address@hidden>" [unknown]
-       gpg: WARNING: This key is not certified with a trusted signature!
-       gpg:          There is no indication that the signature belongs to the 
owner.
-       Primary key fingerprint: 8ED3 96E3 7E38 D471 A005  30D3 A955 3245 FDE9 
B739
+$ guix download mirror://gnu/hello/hello-2.10.tar.gz.sig
+
+Starting download of /tmp/guix-file.03tFfb
+From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz.sig...
+following redirection to 
`https://ftp.igh.cnrs.fr/pub/gnu/hello/hello-2.10.tar.gz.sig'...
+ ….tar.gz.sig  819B                                                            
                                                           1.2MiB/s 00:00 
[##################] 100.0%
+/gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig
+0q0v86n3y38z17rl146gdakw9xc4mcscpk8dscs412j22glrv9jf
+$ gpg --verify 
/gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig 
/gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz
+gpg: Signature made Sun 16 Nov 2014 01:08:37 PM CET
+gpg:                using RSA key A9553245FDE9B739
+gpg: Good signature from "Sami Kerola <address@hidden>" [unknown]
+gpg:                 aka "Sami Kerola (http://www.iki.fi/kerolasa/) 
<address@hidden>" [unknown]
+gpg: WARNING: This key is not certified with a trusted signature!
+gpg:          There is no indication that the signature belongs to the owner.
+Primary key fingerprint: 8ED3 96E3 7E38 D471 A005  30D3 A955 3245 FDE9 B739
 ```
 
 Now you can happily run
 
 ```sh
-    $ guix package --install-from-file=my-hello.scm
+$ guix package --install-from-file=my-hello.scm
 ```
 
 You should now have `my-hello` in your profile!
 
 ```sh
-    $ guix package --list-installed=my-hello
-    my-hello   2.10    out
-    /gnu/store/f1db2mfm8syb8qvc357c53slbvf1g9m9-my-hello-2.10
+$ guix package --list-installed=my-hello
+my-hello       2.10    out
+/gnu/store/f1db2mfm8syb8qvc357c53slbvf1g9m9-my-hello-2.10
 ```
 
 We've gone as far as we could without any knowledge of Scheme.  Now is the 
right
@@ -231,12 +231,14 @@ the REPL.
 
     Examples of valid expressions:
 
-        > "Hello World!"
-        "Hello World!"
-        > 17
-        17
-        > (display (string-append "Hello " "Guix" "\n"))
-        "Hello Guix!"
+    ```scheme
+    > "Hello World!"
+    "Hello World!"
+    > 17
+    17
+    > (display (string-append "Hello " "Guix" "\n"))
+    "Hello Guix!"
+    ```
 
 -   This last example is a function call embedded in another function call.  
When
     a parenthesized expression is evaluated, the first term is the function and
@@ -245,70 +247,88 @@ the REPL.
 
 -   Anonymous functions are declared with the `lambda` term:
 
-        > (lambda (x) (* x x))
-        #<procedure 120e348 at <unknown port>:24:0 (x)>
+    ```scheme
+    > (lambda (x) (* x x))
+    #<procedure 120e348 at <unknown port>:24:0 (x)>
+    ```
 
     The above lambda returns the square of its argument.  Since everything is 
an
     expression, the `lambda` expression returns an anonymous function, which 
can
     in turn be applied to an argument:
 
-        > ((lambda (x) (* x x)) 3)
-        9
+    ```scheme
+    > ((lambda (x) (* x x)) 3)
+    9
+    ```
 
 -   Anything can be assigned a global name with `define`:
 
-        > (define a 3)
-        > (define square (lambda (x) (* x x)))
-        > (square a)
-        9
+    ```scheme
+    > (define a 3)
+    > (define square (lambda (x) (* x x)))
+    > (square a)
+    9
+    ```
 
 -   Procedures can be defined more concisely with the following syntax:
 
-        (define (square x) (* x x))
+    ```scheme
+    (define (square x) (* x x))
+    ```
 
 -   A list structure can be created with the `list` procedure:
 
-        > (list 2 a 5 7)
-        (2 3 5 7)
+    ```scheme
+    > (list 2 a 5 7)
+    (2 3 5 7)
+    ```
 
 -   The *quote* disables evaluation of a parenthesized expression: the first 
term
     is not called over the other terms.  Thus it effectively returns a list of
     terms.
 
-        > '(display (string-append "Hello " "Guix" "\n"))
-        (display (string-append "Hello " "Guix" "\n"))
-        > '(2 a 5 7)
-        (2 a 5 7)
+    ```scheme
+    > '(display (string-append "Hello " "Guix" "\n"))
+    (display (string-append "Hello " "Guix" "\n"))
+    > '(2 a 5 7)
+    (2 a 5 7)
+    ```
 
 -   The *quasiquote* disables evaluation of a parenthesized expression until a
     comma re-enables it.  Thus it provides us with fine-grained control over 
what
     is evaluated and what is not.
 
-        > `(2 a 5 7 (2 ,a 5 ,(+ a 4)))
-        (2 a 5 7 (2 3 5 7))
+    ```scheme
+    > `(2 a 5 7 (2 ,a 5 ,(+ a 4)))
+    (2 a 5 7 (2 3 5 7))
+    ```
 
     Note that the above result is a list of mixed elements: numbers, symbols 
(here
     `a`) and the last element is a list itself.
 
 -   Multiple variables can be named locally with `let`:
 
-        > (define x 10)
-        > (let ((x 2)
-                (y 3))
-            (list x y))
-        (2 3)
-        > x
-        10
-        > y
-        ERROR: In procedure module-lookup: Unbound variable: y
+    ```scheme
+    > (define x 10)
+    > (let ((x 2)
+            (y 3))
+        (list x y))
+    (2 3)
+    > x
+    10
+    > y
+    ERROR: In procedure module-lookup: Unbound variable: y
+    ```
 
     Use `let*` to allow later variable declarations to refer to earlier
     definitions.
 
-        > (let* ((x 2)
-                 (y (* x 3)))
-            (list x y))
-        (2 6)
+    ```scheme
+    > (let* ((x 2)
+             (y (* x 3)))
+        (list x y))
+    (2 6)
+    ```
 
 -   The keyword syntax is `#:`, it is used to create unique identifiers.  See 
also
     the [Keywords section in the Guile 
manual](https://www.gnu.org/software/guile/manual/html_node/Keywords.html).
@@ -319,10 +339,12 @@ the REPL.
 
 -   Modules are created with `define-module`.  For instance
 
-        (define-module (guix build-system ruby)
-          #:use-module (guix store)
-          #:export (ruby-build
-                    ruby-build-system))
+    ```scheme
+    (define-module (guix build-system ruby)
+      #:use-module (guix store)
+      #:export (ruby-build
+                ruby-build-system))
+    ```
 
     defines the module `ruby` which must be located in
     `guix/build-system/ruby.scm` somewhere in `GUILE_LOAD_PATH`.  It depends on
@@ -360,10 +382,10 @@ But first, let's look at other possibilities.
 This is what we previously did with `my-hello`.  Now that we know more Scheme,
 let's explain the leading chunks.  As stated in `guix package --help`:
 
-```scheme
-    -f, --install-from-file=FILE
-                           install the package that the code within FILE
-                           evaluates to
+```sh
+-f, --install-from-file=FILE
+                       install the package that the code within FILE
+                       evaluates to
 ```
 
 Thus the last expression *must* return a package, which is the case in our
@@ -390,8 +412,8 @@ Create a directory, say `~./guix-packages` and add it to 
the `GUIX_PACKAGE_PATH`
 environment variable:
 
 ```sh
-    $ mkdir ~/guix-packages
-    $ export GUIX_PACKAGE_PATH=~/guix-packages
+$ mkdir ~/guix-packages
+$ export GUIX_PACKAGE_PATH=~/guix-packages
 ```
 
 To add several directories, separate them with a colon (`:`).
@@ -399,31 +421,31 @@ To add several directories, separate them with a colon 
(`:`).
 Our previous `my-hello` needs some adjustments though:
 
 ```scheme
-    (define-module (my-hello)
-      #:use-module (guix licenses)
-      #:use-module (guix packages)
-      #:use-module (guix build-system gnu)
-      #:use-module (guix download))
-
-    (define-public my-hello
-      (package
-        (name "my-hello")
-        (version "2.10")
-        (source (origin
-                  (method url-fetch)
-                  (uri (string-append "mirror://gnu/hello/hello-" version
-                                      ".tar.gz"))
-                  (sha256
-                   (base32
-                    "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
-        (build-system gnu-build-system)
-        (synopsis "Hello, Guix world: An example custom Guix package")
-        (description
-         "GNU Hello prints the message \"Hello, world!\" and then exits.  It
-    serves as an example of standard GNU coding practices.  As such, it 
supports
-    command-line arguments, multiple languages, and so on.")
-        (home-page "https://www.gnu.org/software/hello/";)
-        (license gpl3+)))
+(define-module (my-hello)
+  #:use-module (guix licenses)
+  #:use-module (guix packages)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix download))
+
+(define-public my-hello
+  (package
+    (name "my-hello")
+    (version "2.10")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/hello/hello-" version
+                                  ".tar.gz"))
+              (sha256
+               (base32
+                "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
+    (build-system gnu-build-system)
+    (synopsis "Hello, Guix world: An example custom Guix package")
+    (description
+     "GNU Hello prints the message \"Hello, world!\" and then exits.  It
+serves as an example of standard GNU coding practices.  As such, it supports
+command-line arguments, multiple languages, and so on.")
+    (home-page "https://www.gnu.org/software/hello/";)
+    (license gpl3+)))
 ```
 
 Note that we have assigned the package value to an exported variable name with
@@ -437,12 +459,12 @@ package.  If you want to use `define-public` in this 
use-case nonetheless, make
 sure the file ends with an evaluation of `my-hello`:
 
 ```scheme
-    ; ...
-    (define-public my-hello
-      ; ...
-      )
+; ...
+(define-public my-hello
+  ; ...
+  )
 
-    my-hello
+my-hello
 ```
 
 This last example is not very typical.
@@ -451,7 +473,7 @@ Now `my-hello` should be part of the package collection 
like all other official
 packages.  You can verify this with:
 
 ```sh
-    $ guix package --show=my-hello
+$ guix package --show=my-hello
 ```
 
 
@@ -480,7 +502,7 @@ development inertia.
 Check out the official [Git](https://git-scm.com/) repository:
 
 ```sh
-    $ git clone https://git.savannah.gnu.org/git/guix.git
+$ git clone https://git.savannah.gnu.org/git/guix.git
 ```
 
 In the rest of this article, we use `$GUIX_CHECKOUT` to refer to the location 
of
@@ -499,24 +521,32 @@ collection of the repository.
 
 -   Search packages, such as Ruby:
 
-        $ cd $GUIX_CHECKOUT
-        $ ./pre-inst-env guix package --list-available=ruby
-            ruby    1.8.7-p374      out     gnu/packages/ruby.scm:119:2
-            ruby    2.1.6   out     gnu/packages/ruby.scm:91:2
-            ruby    2.2.2   out     gnu/packages/ruby.scm:39:2
+    ```sh
+    $ cd $GUIX_CHECKOUT
+    $ ./pre-inst-env guix package --list-available=ruby
+        ruby    1.8.7-p374      out     gnu/packages/ruby.scm:119:2
+        ruby    2.1.6   out     gnu/packages/ruby.scm:91:2
+        ruby    2.2.2   out     gnu/packages/ruby.scm:39:2
+    ```
 
 -   Build a package, here Ruby version 2.1:
 
-        $ ./pre-inst-env guix build --keep-failed address@hidden
-        /gnu/store/c13v73jxmj2nir2xjqaz5259zywsa9zi-ruby-2.1.6
+    ```sh
+    $ ./pre-inst-env guix build --keep-failed address@hidden
+    /gnu/store/c13v73jxmj2nir2xjqaz5259zywsa9zi-ruby-2.1.6
+    ```
 
 -   Install it to your user profile:
 
-        $ ./pre-inst-env guix package --install address@hidden
+    ```sh
+    $ ./pre-inst-env guix package --install address@hidden
+    ```
 
 -   Check for common mistakes:
 
-        $ ./pre-inst-env guix lint address@hidden
+    ```sh
+    $ ./pre-inst-env guix lint address@hidden
+    ```
 
 Guix strives at maintaining a high packaging standard; when contributing to the
 Guix project, remember to
@@ -537,78 +567,78 @@ complex than that and Guix can handle more advanced 
scenarios.  Let's look at
 another, more sophisticated package (slightly modified from the source):
 
 ```scheme
-    (define-module (gnu packages version-control)
-      #:use-module ((guix licenses) #:prefix license:)
-      #:use-module (guix utils)
-      #:use-module (guix packages)
-      #:use-module (guix git-download)
-      #:use-module (guix build-system cmake)
-      #:use-module (gnu packages ssh)
-      #:use-module (gnu packages web)
-      #:use-module (gnu packages pkg-config)
-      #:use-module (gnu packages python)
-      #:use-module (gnu packages compression)
-      #:use-module (gnu packages tls))
-
-    (define-public my-libgit2
-      (let ((commit "e98d0a37c93574d2c6107bf7f31140b548c6a7bf")
-            (revision "1"))
-        (package
-          (name "my-libgit2")
-          (version (git-version "0.26.6" revision commit))
-          (source (origin
-                    (method git-fetch)
-                    (uri (git-reference
-                          (url "https://github.com/libgit2/libgit2/";)
-                          (commit commit)))
-                    (file-name (git-file-name name version))
-                    (sha256
-                     (base32
-                      "17pjvprmdrx4h6bb1hhc98w9qi6ki7yl57f090n9kbhswxqfs7s3"))
-                    (patches (search-patches "libgit2-mtime-0.patch"))
-                    (modules '((guix build utils)))
-                    (snippet '(begin
-                                ;; Remove bundled software.
-                                (delete-file-recursively "deps")
-                                #t))))
-          (build-system cmake-build-system)
-          (outputs '("out" "debug"))
-          (arguments
-           `(#:tests? #t                            ; Run the test suite (this 
is the default)
-             #:configure-flags '("-DUSE_SHA1DC=ON") ; SHA-1 collision detection
-             #:phases
-             (modify-phases %standard-phases
-               (add-after 'unpack 'fix-hardcoded-paths
-                 (lambda _
-                   (substitute* "tests/repo/init.c"
-                     (("#!/bin/sh") (string-append "#!" (which "sh"))))
-                   (substitute* "tests/clar/fs.h"
-                     (("/bin/cp") (which "cp"))
-                     (("/bin/rm") (which "rm")))
-                   #t))
-               ;; Run checks more verbosely.
-               (replace 'check
-                 (lambda _ (invoke "./libgit2_clar" "-v" "-Q")))
-               (add-after 'unpack 'make-files-writable-for-tests
-                   (lambda _ (for-each make-file-writable (find-files "." 
".*")))))))
-          (inputs
-           `(("libssh2" ,libssh2)
-             ("http-parser" ,http-parser)
-             ("python" ,python-wrapper)))
-          (native-inputs
-           `(("pkg-config" ,pkg-config)))
-          (propagated-inputs
-           ;; These two libraries are in 'Requires.private' in libgit2.pc.
-           `(("openssl" ,openssl)
-             ("zlib" ,zlib)))
-          (home-page "https://libgit2.github.com/";)
-          (synopsis "Library providing Git core methods")
-          (description
-           "Libgit2 is a portable, pure C implementation of the Git core 
methods
-    provided as a re-entrant linkable library with a solid API, allowing you to
-    write native speed custom Git applications in any language with bindings.")
-          ;; GPLv2 with linking exception
-          (license license:gpl2))))
+(define-module (gnu packages version-control)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix utils)
+  #:use-module (guix packages)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system cmake)
+  #:use-module (gnu packages ssh)
+  #:use-module (gnu packages web)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages tls))
+
+(define-public my-libgit2
+  (let ((commit "e98d0a37c93574d2c6107bf7f31140b548c6a7bf")
+        (revision "1"))
+    (package
+      (name "my-libgit2")
+      (version (git-version "0.26.6" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/libgit2/libgit2/";)
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "17pjvprmdrx4h6bb1hhc98w9qi6ki7yl57f090n9kbhswxqfs7s3"))
+                (patches (search-patches "libgit2-mtime-0.patch"))
+                (modules '((guix build utils)))
+                (snippet '(begin
+                            ;; Remove bundled software.
+                            (delete-file-recursively "deps")
+                            #t))))
+      (build-system cmake-build-system)
+      (outputs '("out" "debug"))
+      (arguments
+       `(#:tests? #t                            ; Run the test suite (this is 
the default)
+         #:configure-flags '("-DUSE_SHA1DC=ON") ; SHA-1 collision detection
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'fix-hardcoded-paths
+             (lambda _
+               (substitute* "tests/repo/init.c"
+                 (("#!/bin/sh") (string-append "#!" (which "sh"))))
+               (substitute* "tests/clar/fs.h"
+                 (("/bin/cp") (which "cp"))
+                 (("/bin/rm") (which "rm")))
+               #t))
+           ;; Run checks more verbosely.
+           (replace 'check
+             (lambda _ (invoke "./libgit2_clar" "-v" "-Q")))
+           (add-after 'unpack 'make-files-writable-for-tests
+               (lambda _ (for-each make-file-writable (find-files "." 
".*")))))))
+      (inputs
+       `(("libssh2" ,libssh2)
+         ("http-parser" ,http-parser)
+         ("python" ,python-wrapper)))
+      (native-inputs
+       `(("pkg-config" ,pkg-config)))
+      (propagated-inputs
+       ;; These two libraries are in 'Requires.private' in libgit2.pc.
+       `(("openssl" ,openssl)
+         ("zlib" ,zlib)))
+      (home-page "https://libgit2.github.com/";)
+      (synopsis "Library providing Git core methods")
+      (description
+       "Libgit2 is a portable, pure C implementation of the Git core methods
+provided as a re-entrant linkable library with a solid API, allowing you to
+write native speed custom Git applications in any language with bindings.")
+      ;; GPLv2 with linking exception
+      (license license:gpl2))))
 ```
 
 (In those cases were you only want to tweak a few fields from a package
@@ -652,15 +682,15 @@ Snippets might need additional Guile modules which can be 
imported from the
 First, a syntactic comment: See the quasi-quote / comma syntax?
 
 ```scheme
-    (native-inputs
-     `(("pkg-config" ,pkg-config)))
+(native-inputs
+ `(("pkg-config" ,pkg-config)))
 ```
 
 is equivalent to
 
 ```scheme
-    (native-inputs
-     (list (list "pkg-config" pkg-config)))
+(native-inputs
+ (list (list "pkg-config" pkg-config)))
 ```
 
 You'll mostly see the former because it's shorter.
@@ -728,14 +758,14 @@ append when running make, as you would from the command 
line.  For instance, the
 following flags
 
 ```scheme
-    #:make-flags (list (string-append "prefix=" (assoc-ref %outputs "out"))
-                       "CC=gcc")
+#:make-flags (list (string-append "prefix=" (assoc-ref %outputs "out"))
+                   "CC=gcc")
 ```
 
 translate into
 
 ```sh
-    $ make CC=gcc prefix=/gnu/store/...-<out>
+$ make CC=gcc prefix=/gnu/store/...-<out>
 ```
 
 This sets the C compiler to `gcc` and the `prefix` variable (the installation
@@ -746,7 +776,7 @@ global variable pointing to the destination directory in 
the store (something li
 Similarly, it's possible to set the "configure" flags.
 
 ```scheme
-    #:configure-flags '("-DUSE_SHA1DC=ON")
+#:configure-flags '("-DUSE_SHA1DC=ON")
 ```
 
 The `%build-inputs` variable is also generated in scope.  It's an association
@@ -758,37 +788,37 @@ more about those phases, you need to work out the 
appropriate build system
 definition in `$GUIX_CHECKOUT/guix/build/gnu-build-system.scm`:
 
 ```scheme
-    (define %standard-phases
-      ;; Standard build phases, as a list of symbol/procedure pairs.
-      (let-syntax ((phases (syntax-rules ()
-                             ((_ p ...) `((p . ,p) ...)))))
-        (phases set-SOURCE-DATE-EPOCH set-paths install-locale unpack
-                bootstrap
-                patch-usr-bin-file
-                patch-source-shebangs configure patch-generated-file-shebangs
-                build check install
-                patch-shebangs strip
-                validate-runpath
-                validate-documentation-location
-                delete-info-dir-file
-                patch-dot-desktop-files
-                install-license-files
-                reset-gzip-timestamps
-                compress-documentation)))
+(define %standard-phases
+  ;; Standard build phases, as a list of symbol/procedure pairs.
+  (let-syntax ((phases (syntax-rules ()
+                         ((_ p ...) `((p . ,p) ...)))))
+    (phases set-SOURCE-DATE-EPOCH set-paths install-locale unpack
+            bootstrap
+            patch-usr-bin-file
+            patch-source-shebangs configure patch-generated-file-shebangs
+            build check install
+            patch-shebangs strip
+            validate-runpath
+            validate-documentation-location
+            delete-info-dir-file
+            patch-dot-desktop-files
+            install-license-files
+            reset-gzip-timestamps
+            compress-documentation)))
 ```
 
 Or from the REPL:
 
 ```scheme
-    > (add-to-load-path "/path/to/guix/checkout")
-    > ,module (guix build gnu-build-system)
-    > (map first %standard-phases)
-    (set-SOURCE-DATE-EPOCH set-paths install-locale unpack bootstrap
-       patch-usr-bin-file patch-source-shebangs configure
-       patch-generated-file-shebangs build check install patch-shebangs strip
-       validate-runpath validate-documentation-location delete-info-dir-file
-       patch-dot-desktop-files install-license-files reset-gzip-timestamps
-       compress-documentation)
+> (add-to-load-path "/path/to/guix/checkout")
+> ,module (guix build gnu-build-system)
+> (map first %standard-phases)
+(set-SOURCE-DATE-EPOCH set-paths install-locale unpack bootstrap
+patch-usr-bin-file patch-source-shebangs configure
+patch-generated-file-shebangs build check install patch-shebangs strip
+validate-runpath validate-documentation-location delete-info-dir-file
+patch-dot-desktop-files install-license-files reset-gzip-timestamps
+compress-documentation)
 ```
 
 If you want to know more about what happens during those phases, consult the
@@ -798,25 +828,25 @@ For instance, as of this writing the definition of 
`unpack` for the GNU build
 system is
 
 ```scheme
-    (define* (unpack #:key source #:allow-other-keys)
-      "Unpack SOURCE in the working directory, and change directory within the
-    source.  When SOURCE is a directory, copy it in a sub-directory of the 
current
-    working directory."
-      (if (file-is-directory? source)
-          (begin
-            (mkdir "source")
-            (chdir "source")
-
-            ;; Preserve timestamps (set to the Epoch) on the copied tree so 
that
-            ;; things work deterministically.
-            (copy-recursively source "."
-                              #:keep-mtime? #t))
-          (begin
-            (if (string-suffix? ".zip" source)
-                (invoke "unzip" source)
-                (invoke "tar" "xvf" source))
-            (chdir (first-subdirectory "."))))
-      #t)
+(define* (unpack #:key source #:allow-other-keys)
+  "Unpack SOURCE in the working directory, and change directory within the
+source.  When SOURCE is a directory, copy it in a sub-directory of the current
+working directory."
+  (if (file-is-directory? source)
+      (begin
+        (mkdir "source")
+        (chdir "source")
+
+        ;; Preserve timestamps (set to the Epoch) on the copied tree so that
+        ;; things work deterministically.
+        (copy-recursively source "."
+                          #:keep-mtime? #t))
+      (begin
+        (if (string-suffix? ".zip" source)
+            (invoke "unzip" source)
+            (invoke "tar" "xvf" source))
+        (chdir (first-subdirectory "."))))
+  #t)
 ```
 
 Note the `chdir` call: it changes the working directory to where the source was
@@ -842,12 +872,12 @@ directory of the main output of the package.  A phase 
procedure may look like
 this:
 
 ```scheme
-    (lambda* (#:key inputs outputs #:allow-other-keys)
-      (let (((bash-directory (assoc-ref inputs "bash"))
-             (output-directory (assoc-ref outputs "out"))
-             (doc-directory (assoc-ref outputs "doc"))
-      ; ...
-      #t)
+(lambda* (#:key inputs outputs #:allow-other-keys)
+  (let (((bash-directory (assoc-ref inputs "bash"))
+         (output-directory (assoc-ref outputs "out"))
+         (doc-directory (assoc-ref outputs "doc"))
+  ; ...
+  #t)
 ```
 
 The procedure must return `#t` on success.  It's brittle to rely on the return
@@ -940,42 +970,42 @@ boring tasks.  So let's tell Guix to do this for us and 
create the package
 definition of an R package from CRAN (the output is trimmed for conciseness):
 
 ```sh
-    $ guix import cran --recursive walrus
-
-    (define-public r-mc2d
-        ; ...
-        (license gpl2+)))
-
-    (define-public r-jmvcore
-        ; ...
-        (license gpl2+)))
-
-    (define-public r-wrs2
-        ; ...
-        (license gpl3)))
-
-    (define-public r-walrus
-      (package
-        (name "r-walrus")
-        (version "1.0.3")
-        (source
-          (origin
-            (method url-fetch)
-            (uri (cran-uri "walrus" version))
-            (sha256
-              (base32
-                "1nk2glcvy4hyksl5ipq2mz8jy4fss90hx6cq98m3w96kzjni6jjj"))))
-        (build-system r-build-system)
-        (propagated-inputs
-          `(("r-ggplot2" ,r-ggplot2)
-            ("r-jmvcore" ,r-jmvcore)
-            ("r-r6" ,r-r6)
-            ("r-wrs2" ,r-wrs2)))
-        (home-page "https://github.com/jamovi/walrus";)
-        (synopsis "Robust Statistical Methods")
-        (description
-          "This package provides a toolbox of common robust statistical tests, 
including robust descriptives, robust t-tests, and robust ANOVA.  It is also 
available as a module for 'jamovi' (see <https://www.jamovi.org> for more 
information).  Walrus is based on the WRS2 package by Patrick Mair, which is in 
turn based on the scripts and work of Rand Wilcox.  These analyses are 
described in depth in the book 'Introduction to Robust Estimation & Hypothesis 
Testing'.")
-        (license gpl3)))
+$ guix import cran --recursive walrus
+
+(define-public r-mc2d
+    ; ...
+    (license gpl2+)))
+
+(define-public r-jmvcore
+    ; ...
+    (license gpl2+)))
+
+(define-public r-wrs2
+    ; ...
+    (license gpl3)))
+
+(define-public r-walrus
+  (package
+    (name "r-walrus")
+    (version "1.0.3")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (cran-uri "walrus" version))
+        (sha256
+          (base32
+            "1nk2glcvy4hyksl5ipq2mz8jy4fss90hx6cq98m3w96kzjni6jjj"))))
+    (build-system r-build-system)
+    (propagated-inputs
+      `(("r-ggplot2" ,r-ggplot2)
+        ("r-jmvcore" ,r-jmvcore)
+        ("r-r6" ,r-r6)
+        ("r-wrs2" ,r-wrs2)))
+    (home-page "https://github.com/jamovi/walrus";)
+    (synopsis "Robust Statistical Methods")
+    (description
+      "This package provides a toolbox of common robust statistical tests, 
including robust descriptives, robust t-tests, and robust ANOVA.  It is also 
available as a module for 'jamovi' (see <https://www.jamovi.org> for more 
information).  Walrus is based on the WRS2 package by Patrick Mair, which is in 
turn based on the scripts and work of Rand Wilcox.  These analyses are 
described in depth in the book 'Introduction to Robust Estimation & Hypothesis 
Testing'.")
+    (license gpl3)))
 ```
 
 The recursive importer won't import packages for which Guix already has package
@@ -992,7 +1022,7 @@ Guix can be smart enough to check for updates on systems 
it knows.  It can
 report outdated package definitions with
 
 ```sh
-    $ guix refresh hello
+$ guix refresh hello
 ```
 
 In most cases, updating a package to a newer version requires little more than
@@ -1000,7 +1030,7 @@ changing the version number and the checksum.  Guix can 
do that automatically as
 well:
 
 ```sh
-    $ guix refresh hello --update
+$ guix refresh hello --update
 ```
 
 
@@ -1010,20 +1040,20 @@ If you've started browsing the existing package 
definitions, you might have
 noticed that a significant number of them have a `inherit` field:
 
 ```scheme
-    (define-public adwaita-icon-theme
-      (package (inherit gnome-icon-theme)
-        (name "adwaita-icon-theme")
-        (version "3.26.1")
-        (source (origin
-                  (method url-fetch)
-                  (uri (string-append "mirror://gnome/sources/" name "/"
-                                      (version-major+minor version) "/"
-                                      name "-" version ".tar.xz"))
-                  (sha256
-                   (base32
-                    "17fpahgh5dyckgz7rwqvzgnhx53cx9kr2xw0szprc6bnqy977fi8"))))
-        (native-inputs
-         `(("gtk-encode-symbolic-svg" ,gtk+ "bin")))))
+(define-public adwaita-icon-theme
+  (package (inherit gnome-icon-theme)
+    (name "adwaita-icon-theme")
+    (version "3.26.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnome/sources/" name "/"
+                                  (version-major+minor version) "/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "17fpahgh5dyckgz7rwqvzgnhx53cx9kr2xw0szprc6bnqy977fi8"))))
+    (native-inputs
+     `(("gtk-encode-symbolic-svg" ,gtk+ "bin")))))
 ```
 
 All unspecified fields are inherited from the parent package.  This is very



reply via email to

[Prev in Thread] Current Thread [Next in Thread]