1
0
mirror of https://git.savannah.gnu.org/git/guix.git synced 2026-07-07 22:14:07 +02:00

Compare commits

..

41 Commits

Author SHA1 Message Date
Maxim Cournoyer 5a5d55b7cd Add baleine's PGP key.
Change-Id: I4fd2d3ba3e340718e38d213da44364e7c178881f
2026-04-27 09:16:44 +09:00
Tobias Geerinckx-Rice 0f4c1ed1a7 Add key for Nguyễn Gia Phong.
* cnx-F3F6B767.key: New file.

Voucher: Andreas Enge <andreas@enge.fr>
Voucher: Liliana Marie Prikler <liliana.prikler@gmail.com>
Voucher: Sharlatan (Oleg) Hellseher <sharlatanus@gmail.com>
Change-Id: Ib0ca113e5f7be924d94ca71910354f00bd436b0f
2026-03-29 01:00:00 +01:00
Tobias Geerinckx-Rice cd60cd5bb9 Add key for Sören Tempel.
* nmeum-9C05755D.key: New file.

Voucher: Ludovic Courtès <ludo@gnu.org>
Voucher: Sharlatan Hellseher <sharlatanus@gmail.com>
Voucher: jgart <jgart@dismail.de>
Change-Id: I4e0ec08ec4ecce091aee5b5759943e02ae4d444d
2026-03-22 01:00:00 +01:00
Maxim Cournoyer f8be2117b1 Add fishinthecalculator's PGP key.
Change-Id: Ie410e8ea9ebfbb03675d231d118724ea98f04f21
2026-01-23 11:30:34 +09:00
Hartmut Goebel 6550a260db Add htgoebel's new key.
* htgoebel-D3F631DF.key: Rename to ...
* htgoebel (old)-D3F631DF.key: ... this.
* htgoebel-3A1F9D20.key: New file.

Change-Id: I9c25a42f8cef0fbfa623536b4bd24d52305aa12c
2026-01-02 15:24:10 +01:00
Andreas Enge 5c72b7cc0a Rename key file.
The .gpg suffix is not recognized by the authentication code.

* Rutherther-69E471C3.gpg: Rename to...
* Rutherther-69E471C3.key: ...this.

Change-Id: I529c0c07398d410261bcc9fd3059f5b8fbbc88c4
2025-12-11 12:07:07 +01:00
Tobias Geerinckx-Rice b6472ce4ed Add key for Rutherther.
* Rutherther-69E471C3.gpg: New file.

Voucher: Ludovic Courtès <ludo@gnu.org>
Voucher: Efraim Flashner <efraim@flashner.co.il>
Voucher: John Kehayias <john@guixotic.coop>
Change-Id: I99f8f93190c26d891ceb1b9b6c6ab6e6012f0263
2025-12-07 01:00:00 +01:00
Maxim Cournoyer 12db45a481 Add csantosb's PGP key.
Change-Id: I9778c865be1e90e741da6c4210602cb0b55580b2
2025-11-26 10:15:15 +09:00
Maxim Cournoyer 4c11a3e33a Add Sugosha (SameExpert)'s PGP key.
Voucher: Z572 <z572@z572.online>
Voucher: Ludovic Courtès <ludo@gnu.org>
Voucher: Gabriel Wicki <gabriel@erlikon.ch>
Change-Id: I3b491b5a7193603f720552e0f76d014d19ad0058
2025-09-23 22:34:30 +09:00
Maxim Cournoyer 41a4b1e49a Add key for Gabriel Wicki.
* gabber-4330FD7F.key: New key.

Change-Id: I20bb31cce0d6a87162babf76e40aabfa88db03fd
Voucher: Andreas Enge <andreas@enge.fr>
Voucher: Steve George <steve@futurile.net>
Voucher: Leo Famulari <leo@famulari.name>
2025-07-20 10:37:20 +09:00
Maxim Cournoyer 0869e2220d Add key for Steve George.
* futurile-89CA9B07.key: New key.

Change-Id: I69d2fe98756335b27f3d3502b1eaf69ab746d178
2025-02-12 20:54:58 +09:00
Tobias Geerinckx-Rice 21173006e4 Add key for Greg Hogan.
* oom-13CFEEF3.key: New file.

Change-Id: I1a17f155a6d307542212ef606771363bf1e6f9ca
2024-12-22 01:00:00 +01:00
Tobias Geerinckx-Rice 358d959e84 Add key for Ian Eure.
* ieure-F1A71CF2.key: New file.

Change-Id: I5940be870eed715723ec2efd20091548cce7dc47
2024-12-22 01:00:00 +01:00
Efraim Flashner f8868dd56b Add key for Ekaitz Zarraga.
* ekaitz-3F7356D6.key: New file.

Change-Id: I303afcdb49003698daa7e15642b3af617a998e9e
2024-11-26 13:52:07 +02:00
Sharlatan Hellseher 1d5caad391 Rename key for Artyom V. Poptsov.
* avp-0898A02F.gpg: Rename to avp-0898A02F.key.

Change-Id: Idbf6963befc7a02088280597b12a60fc8b01c9de
2024-10-12 21:35:40 +01:00
Tobias Geerinckx-Rice 15d0fd16f3 Add key for Artyom V. Poptsov.
* avp-0898A02F.gpg: New file.

Change-Id: Ie366a45b4d3986e8402222c0e20e5051e819f5ed
2024-09-08 02:00:00 +02:00
Maxim Cournoyer fbccd14b5b Add the key of Zheng Junjie (z572).
Change-Id: If25b3c572fefd93fb9020fc587683cc0a62fd585
2024-04-20 12:58:08 -04:00
Maxim Cournoyer 1b6a6d6b24 Add the key of Oleg (sharlatanus).
Change-Id: Id34e1680c3c23fa42e11c95c0f919707003992d2
2024-01-09 23:03:18 -05:00
Leo Famulari 935e3c9e93 Add lfam's new key.
* lfam-BACA7F08.key: Rename to ...
* lfam (old)-BACA7F08.key: ... this
* lfam-757F47FF.key: New file.

Change-Id: If11df36d868cdc77830041ddcc7b9570e02db237
2023-07-23 22:26:01 -04:00
Tobias Geerinckx-Rice c3db650680 Add key for Hilton Chain. 2023-08-13 02:00:00 +02:00
Maxim Cournoyer c2b8584ac5 Add key for Jorge Gomez. 2023-05-15 21:26:15 -04:00
Maxim Cournoyer 6540a2551e Add key for Josselin Poiret. 2023-05-11 11:15:56 -04:00
Maxim Cournoyer 7206ab15bd Add key for Simon Tournier. 2023-05-11 10:24:45 -04:00
Tobias Geerinckx-Rice a6f53ad63a Add key for John Kehayias.
* podiki-5A7554F1.key: New file.
2022-12-04 01:00:00 +01:00
Efraim Flashner 2417be6861 Add key for Andrew Tropin.
* abcdw-6C328EC2.key: New file.
2022-08-05 18:26:45 +03:00
Maxim Cournoyer 3b84ecee59 Add key for Vinicius Monego.
* monego-8065B68A.key: New file.
2022-01-25 21:28:24 -05:00
Liliana Marie Prikler 702f4c7942 Remove leoprikler's redundant key.
This is a follow-up to 1802c75a3e.

* leoprikler-C70E2F87.key: Remove, since it's redundant with
'lilyp-C70E2F87.key'.
2021-09-06 11:32:40 +02:00
Liliana Marie Prikler 1802c75a3e Add key for lilyp.
* lilyp-C70E2F87.key: New file.
2021-09-06 11:29:13 +02:00
Ludovic Courtès 359ca34027 Remove bavier's redundant former key.
This is a followup to d1d2bf3eb6.

* bavier (old)-19D32566.key: Remove, since it's redundant with
'bavier-AFCA8B8E.key'.
2021-06-29 16:23:17 +02:00
Ludovic Courtès d1d2bf3eb6 Add bavier's new key.
* bavier-19D32566.key: Rename to...
* bavier (old)-19D32566.key: ... this.
* bavier-AFCA8B8E.key: New file.
2021-06-23 15:33:15 +02:00
Tobias Geerinckx-Rice 5838f4e354 Add key for raghavgururajan.
* raghavgururajan-7F8BE551.key: New file.
2021-04-11 16:02:27 +02:00
Leo Famulari 3da8e4a658 Add keys for lbraun.
* lbraun-08D8092A.key, lbraun (work)-1A378446.key: New files.
2021-03-08 13:05:30 -05:00
Tobias Geerinckx-Rice dcae73e0d4 Add key for lle_bout.
* lle_bout-6BCD10A6.key: New file.
2021-02-18 12:21:27 +01:00
Ludovic Courtès 65a3e80efc Add key for leoprikler.
* leoprikler-C70E2F87.key: New file.
2020-12-28 10:43:41 +01:00
Ludovic Courtès 62aebd90ca Add public key for magali.
* magali-6E2DFC90.key: New file.
2020-12-15 12:00:17 +01:00
Marius Bakke 93085078ad Add public key for jonsger.
* jonsger-8B4E4B9F.key: New file.
2020-11-15 23:02:50 +01:00
Ludovic Courtès 5530030442 Add public key for m1gu3l.
* m1gu3l-79FABEC2.key: New file.
2020-10-16 12:05:26 +02:00
Ludovic Courtès 3b73512763 Add public key for planglois.
* planglois-E00B77FD.key: New file.
2020-09-04 11:13:42 +02:00
Tobias Geerinckx-Rice ec32c8591e Add public key of brettgilio.
* brettgilio-BA27CB87.key: New file.
2020-07-18 20:55:05 +02:00
Ludovic Courtès edb380b705 Add public key of bricewge.
* bricewge-66A18FAE.key: New file.
2020-05-04 11:05:10 +02:00
Ludovic Courtès 1edfe6dd7b Add keyring. 2020-05-01 18:41:28 +02:00
1335 changed files with 26231 additions and 416347 deletions
-77
View File
@@ -1,77 +0,0 @@
;; Per-directory local variables for GNU Emacs 23 and later.
((nil
. ((fill-column . 78)
(tab-width . 8)
;; For use with 'bug-reference-prog-mode'.
(bug-reference-url-format . "http://bugs.gnu.org/%s")
(bug-reference-bug-regexp
. "<https?://\\(debbugs\\|bugs\\)\\.gnu\\.org/\\([0-9]+\\)>")))
(c-mode . ((c-file-style . "gnu")))
(scheme-mode
.
((indent-tabs-mode . nil)
(eval . (put 'eval-when 'scheme-indent-function 1))
(eval . (put 'call-with-prompt 'scheme-indent-function 1))
(eval . (put 'test-assert 'scheme-indent-function 1))
(eval . (put 'test-assertm 'scheme-indent-function 1))
(eval . (put 'test-equal 'scheme-indent-function 1))
(eval . (put 'test-eq 'scheme-indent-function 1))
(eval . (put 'call-with-input-string 'scheme-indent-function 1))
(eval . (put 'guard 'scheme-indent-function 1))
(eval . (put 'lambda* 'scheme-indent-function 1))
(eval . (put 'substitute* 'scheme-indent-function 1))
(eval . (put 'modify-phases 'scheme-indent-function 1))
(eval . (put 'modify-services 'scheme-indent-function 1))
(eval . (put 'with-directory-excursion 'scheme-indent-function 1))
(eval . (put 'package 'scheme-indent-function 0))
(eval . (put 'origin 'scheme-indent-function 0))
(eval . (put 'build-system 'scheme-indent-function 0))
(eval . (put 'bag 'scheme-indent-function 0))
(eval . (put 'graft 'scheme-indent-function 0))
(eval . (put 'operating-system 'scheme-indent-function 0))
(eval . (put 'file-system 'scheme-indent-function 0))
(eval . (put 'manifest-entry 'scheme-indent-function 0))
(eval . (put 'manifest-pattern 'scheme-indent-function 0))
(eval . (put 'substitute-keyword-arguments 'scheme-indent-function 1))
(eval . (put 'with-store 'scheme-indent-function 1))
(eval . (put 'with-error-handling 'scheme-indent-function 0))
(eval . (put 'with-mutex 'scheme-indent-function 1))
(eval . (put 'with-atomic-file-output 'scheme-indent-function 1))
(eval . (put 'call-with-compressed-output-port 'scheme-indent-function 2))
(eval . (put 'call-with-decompressed-port 'scheme-indent-function 2))
(eval . (put 'call-with-gzip-input-port 'scheme-indent-function 1))
(eval . (put 'call-with-gzip-output-port 'scheme-indent-function 1))
(eval . (put 'signature-case 'scheme-indent-function 1))
(eval . (put 'emacs-batch-eval 'scheme-indent-function 0))
(eval . (put 'emacs-batch-edit-file 'scheme-indent-function 1))
(eval . (put 'emacs-substitute-sexps 'scheme-indent-function 1))
(eval . (put 'emacs-substitute-variables 'scheme-indent-function 1))
(eval . (put 'with-derivation-narinfo 'scheme-indent-function 1))
(eval . (put 'with-derivation-substitute 'scheme-indent-function 2))
(eval . (put 'syntax-parameterize 'scheme-indent-function 1))
(eval . (put 'with-monad 'scheme-indent-function 1))
(eval . (put 'mbegin 'scheme-indent-function 1))
(eval . (put 'mwhen 'scheme-indent-function 1))
(eval . (put 'munless 'scheme-indent-function 1))
(eval . (put 'mlet* 'scheme-indent-function 2))
(eval . (put 'mlet 'scheme-indent-function 2))
(eval . (put 'run-with-store 'scheme-indent-function 1))
(eval . (put 'run-with-state 'scheme-indent-function 1))
(eval . (put 'wrap-program 'scheme-indent-function 1))
(eval . (put 'with-imported-modules 'scheme-indent-function 1))
(eval . (put 'call-with-container 'scheme-indent-function 1))
(eval . (put 'container-excursion 'scheme-indent-function 1))
;; Recognize '~', '+', and '$', as used for gexps, as quotation symbols.
;; This notably allows '(' in Paredit to not insert a space when the
;; preceding symbol is one of these.
(eval . (modify-syntax-entry ?~ "'"))
(eval . (modify-syntax-entry ?$ "'"))
(eval . (modify-syntax-entry ?+ "'"))))
(emacs-lisp-mode . ((indent-tabs-mode . nil)))
(texinfo-mode . ((indent-tabs-mode . nil)
(fill-column . 72))))
-127
View File
@@ -1,127 +0,0 @@
*.eps
*.go
*.log
*.pdf
*.png
*.tar.xz
*.tmp
*~
,*
/ABOUT-NLS
/INSTALL
/aclocal.m4
/autom4te.cache
/build-aux/compile
/build-aux/config.guess
/build-aux/config.rpath
/build-aux/config.sub
/build-aux/depcomp
/build-aux/install-sh
/build-aux/mdate-sh
/build-aux/missing
/build-aux/test-driver
/build-aux/texinfo.tex
/config.status
/configure
/doc/*.1
/doc/.dirstamp
/doc/guix.aux
/doc/guix.cp
/doc/guix.cps
/doc/guix.fn
/doc/guix.fns
/doc/guix.info
/doc/guix.info-[0-9]
/doc/guix.ky
/doc/guix.pg
/doc/guix.toc
/doc/guix.t2p
/doc/guix.tp
/doc/guix.vr
/doc/guix.vrs
/doc/os-config-bare-bones.texi
/doc/os-config-desktop.texi
/doc/stamp-vti
/doc/version.texi
/emacs/Makefile
/emacs/Makefile.in
/emacs/guix-autoloads.el
/emacs/guix-config.el
/emacs/guix-helper.scm
/etc/guix-daemon.conf
/etc/guix-daemon.service
/guix-daemon
/guix-register
/guix/config.scm
/libformat.a
/libstore.a
/libutil.a
/m4/*
/m4/ChangeLog
/m4/gettext.m4
/m4/iconv.m4
/m4/lib-ld.m4
/m4/lib-link.m4
/m4/lib-prefix.m4
/m4/nls.m4
/m4/po.m4
/m4/progtest.m4
/nix-setuid-helper
/nix/AUTHORS
/nix/COPYING
/nix/config.h
/nix/config.h.in
/nix/nix-daemon/nix-daemon.cc
/nix/nix-setuid-helper/nix-setuid-helper.cc
/nix/scripts/guix-authenticate
/nix/scripts/list-runtime-roots
/nix/scripts/offload
/nix/scripts/substitute
/po/guix/*.gmo
/po/guix/*.insert-header
/po/guix/*.mo
/po/guix/ChangeLog
/po/guix/Makefile.in.in
/po/guix/Makevars.template
/po/guix/POTFILES
/po/guix/Rules-quot
/po/guix/boldquot.sed
/po/guix/en@boldquot.*
/po/guix/en@quot.*
/po/guix/guix.pot
/po/guix/insert-header.sin
/po/guix/quot.sed
/po/guix/remove-potcdate.sed
/po/guix/remove-potcdate.sin
/po/guix/stamp-po
/po/packages/*.gmo
/po/packages/*.insert-header
/po/packages/*.mo
/po/packages/ChangeLog
/po/packages/Makefile.in.in
/po/packages/Makevars.template
/po/packages/POTFILES
/po/packages/Rules-quot
/po/packages/boldquot.sed
/po/packages/en@boldquot.*
/po/packages/en@quot.*
/po/packages/guix-packages.pot
/po/packages/insert-header.sin
/po/packages/quot.sed
/po/packages/remove-potcdate.sed
/po/packages/remove-potcdate.sin
/po/packages/stamp-po
/pre-inst-env
/scripts/guix
/test-env
/test-tmp
/tests/*.trs
GPATH
GRTAGS
GTAGS
Makefile
Makefile.in
config.cache
stamp-h[0-9]
tmp
/doc/os-config-lightweight-desktop.texi
-45
View File
@@ -1,45 +0,0 @@
# This list is used to avoid multiple name/email instances of the same
# contributors reported by "git log" and "git shortlog" commands.
Al McElrath <hello@yrns.org> <hello@atonesir.com>
Alexander I. Grafov <grafov@gmail.com>
Alírio Eyng <alirioeyng@gmail.com>
Amirouche Boubekki <amirouche@hypermove.net>
Andreas Enge <andreas@enge.fr> <andreas.enge@inria.fr>
Andreas Enge <andreas@enge.fr> <privat@xobs-novena>
Andy Wingo <wingo@igalia.com> <wingo@pobox.com>
Ben Woodcroft <donttrustben@gmail.com> <b.woodcroft@uq.edu.au>
Ben Woodcroft <donttrustben@gmail.com> <donttrustben near gmail.com>
Claes Wallin (韋嘉誠) <claes.wallin@greatsinodevelopment.com>
Cyprien Nicolas <cyprien@nicolas.tf> <c.nicolas+gitorious@gmail.com>
Danny Milosavljevic <dannym@scratchpost.org> <dannym+a@scratchpost.org>
David Thompson <davet@gnu.org> <dthompson2@worcester.edu>
David Thompson <davet@gnu.org> <dthompson@member.fsf.org>
David Thompson <davet@gnu.org> <dthompson@vistahigherlearning.com>
Deck Pickard <deck.r.pickard@gmail.com> <nebu@kipple>
Eric Bavier <bavier@member.fsf.org> <ericbavier@gmail.com>
Eric Dvorsak <eric@dvorsak.fr> <yenda1@gmail.com>
John Darrington <jmd@gnu.org> <john@darrington.wattle.id.au>
Joshua Grant <tadni@riseup.net> <gzg@riseup.net>
Joshua Grant <tadni@riseup.net> <jgrant@parenthetical.io>
Joshua Grant <tadni@riseup.net> <tadnimi@gmail.com>
Joshua Grant <tadni@riseup.net> <youlysses@riseup.net>
Kei Kebreau <kei@openmailbox.org>
Leo Famulari <leo@famulari.name> <lfamular@gmail.com>
Ludovic Courtès <ludo@gnu.org> <ludovic.courtes@inria.fr>
Mathieu Lirzin <mthl@gnu.org> <mthl@openmailbox.org>
Mathieu Lirzin <mthl@gnu.org> <mathieu.lirzin@openmailbox.org>
Nikita Karetnikov <nikita@karetnikov.org> <nikita.karetnikov@gmail.com>
ng0 <ng0@we.make.ritual.n0.is> <niasterisk@grrlz.net>
ng0 <ng0@we.make.ritual.n0.is> <ng@niasterisk.space>
ng0 <ng0@we.make.ritual.n0.is> <ng0@libertad.pw>
Pjotr Prins <pjotr.public01@thebird.nl>
Pjotr Prins <pjotr.public01@thebird.nl> <pjotr.public12@thebird.nl>
Raimon Grau <raimonster@gmail.com> <raimon@3scale.net>
Raymond Nicholson <rain1@openmailbox.org>
Ricardo Wurmus <rekado@elephly.net>
Ricardo Wurmus <rekado@elephly.net> <ricardo.wurmus@mdc-berlin.de>
Sou Bunnbu (宋文武) <iyzsong@gmail.com>
Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
Tomáš Čech <sleep_walker@gnu.org> <sleep_walker@suse.cz>
Tobias Geerinckx-Rice <me@tobias.gr> <tobias.geerinckx.rice@gmail.com>
-9
View File
@@ -1,9 +0,0 @@
GNU Guix consists of Scheme code that implements the deployment model
of the Nix package management tool. In fact, it currently talks to a
build daemon whose code comes from Nix (see the manual for details.)
Nix was initially written by Eelco Dolstra; other people have been
contributing to it. See `nix/AUTHORS' for details.
The list of GNU Guix contributors is now generated from the output of
'git log' and written to this file, as can be seen in release tarballs.
-51
View File
@@ -1,51 +0,0 @@
Contributor Code of Conduct
Note: In the sequel, "project" refers to GNU Guix, and "project
maintainer(s)" refers to maintainer(s) of GNU Guix.
As contributors and maintainers of this project, and in the interest of
fostering an open and welcoming community, we pledge to respect all
people who contribute through reporting issues, posting feature
requests, updating documentation, submitting pull requests or patches,
and other activities.
We are committed to making participation in this project a
harassment-free experience for everyone, regardless of level of
experience, gender, gender identity and expression, sexual orientation,
disability, personal appearance, body size, race, ethnicity, age,
religion, or nationality.
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery
* Personal attacks
* Trolling or insulting/derogatory comments
* Public or private harassment
* Publishing other's private information, such as physical or electronic
addresses, without explicit permission
* Other unethical or unprofessional conduct
Project maintainers have the right and responsibility to remove, edit,
or reject comments, commits, code, wiki edits, issues, and other
contributions that are not aligned to this Code of Conduct, or to ban
temporarily or permanently any contributor for other behaviors that they
deem inappropriate, threatening, offensive, or harmful.
By adopting this Code of Conduct, project maintainers commit themselves
to fairly and consistently applying these principles to every aspect of
managing this project. Project maintainers who do not follow or enforce
the Code of Conduct may be permanently removed from the project team.
This Code of Conduct applies both within project spaces and in public
spaces when an individual is representing the project or its community.
Instances of abusive, harassing, or otherwise unacceptable behavior may
be reported by contacting a project maintainer at guix-maintainers@gnu.org.
All complaints will be reviewed and investigated and will
result in a response that is deemed necessary and appropriate to the
circumstances. Maintainers are obligated to maintain confidentiality
with regard to the reporter of an incident.
This Code of Conduct is adapted from the Contributor Covenant
(http://contributor-covenant.org), version 1.3.0, available at
http://contributor-covenant.org/version/1/3/0/
-674
View File
@@ -1,674 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program 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.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-4
View File
@@ -1,4 +0,0 @@
Normally a ChangeLog is generated at "make dist" time and available in
source tarballs.
If not, see the Git commit log at <http://git.sv.gnu.org/cgit/guix.git/>.
-51
View File
@@ -1,51 +0,0 @@
-*- mode: org; coding: utf-8; -*-
#+TITLE: Hacking GNU Guix and Its Incredible Distro
Copyright © 2012, 2013, 2014, 2016 Ludovic Courtès <ludo@gnu.org>
Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
* Contributing
See the manual for useful hacking informations, either by running
info -f doc/guix.info "(guix) Contributing"
or by checking the [[http://www.gnu.org/software/guix/manual/guix.html#Contributing][web copy of the manual]].
* Commit Access
For frequent contributors, having write access to the repository is
convenient. When you deem it necessary, feel free to ask for it on the
mailing list. When you get commit access, please make sure to follow the
policy below (discussions of the policy can take place on guix-devel@gnu.org.)
Non-trivial patches should always be posted to guix-devel@gnu.org (trivial
patches include fixing typos, etc.)
For patches that just add a new package, and a simple one, its OK to commit,
if youre confident (which means you successfully built it in a chroot setup,
and have done a reasonable copyright and license auditing.) Likewise for
package upgrades, except upgrades that trigger a lot of rebuilds (for example,
upgrading GnuTLS or GLib.) We have a mailing list for commit notifications
(guix-commits@gnu.org), so people can notice. Before pushing your changes,
make sure to run git pull --rebase.
All commits that are pushed to the central repository on Savannah must be
signed with an OpenPGP key, and the public key should be uploaded to your user
account on Savannah and to public key servers, such as pgp.mit.edu. To
configure Git to automatically sign commits, run:
git config commit.gpgsign true
git config user.signingkey CABBA6EA1DC0FF33
For anything else, please post to guix-devel@gnu.org and leave time for a
review, without committing anything. If you didnt receive any reply
after two weeks, and if youre confident, its OK to commit.
That last part is subject to being adjusted, allowing individuals to commit
directly on non-controversial changes on parts theyre familiar with.
-529
View File
@@ -1,529 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2013 Andreas Enge <andreas@enge.fr>
# Copyright © 2015 Alex Kost <alezost@gmail.com>
# Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
# Copyright © 2016 Mark H Weaver <mhw@netris.org>
#
# 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/>.
bin_SCRIPTS = \
scripts/guix
nodist_noinst_SCRIPTS = \
pre-inst-env \
test-env
include gnu/local.mk
MODULES = \
guix/base32.scm \
guix/base64.scm \
guix/cpio.scm \
guix/records.scm \
guix/gcrypt.scm \
guix/hash.scm \
guix/pk-crypto.scm \
guix/pki.scm \
guix/combinators.scm \
guix/utils.scm \
guix/sets.scm \
guix/download.scm \
guix/git-download.scm \
guix/hg-download.scm \
guix/monads.scm \
guix/monad-repl.scm \
guix/gexp.scm \
guix/profiles.scm \
guix/serialization.scm \
guix/nar.scm \
guix/derivations.scm \
guix/grafts.scm \
guix/gnu-maintenance.scm \
guix/upstream.scm \
guix/licenses.scm \
guix/graph.scm \
guix/cve.scm \
guix/zlib.scm \
guix/build-system.scm \
guix/build-system/ant.scm \
guix/build-system/cmake.scm \
guix/build-system/emacs.scm \
guix/build-system/glib-or-gtk.scm \
guix/build-system/gnu.scm \
guix/build-system/haskell.scm \
guix/build-system/perl.scm \
guix/build-system/python.scm \
guix/build-system/waf.scm \
guix/build-system/r.scm \
guix/build-system/ruby.scm \
guix/build-system/trivial.scm \
guix/ftp-client.scm \
guix/http-client.scm \
guix/gnupg.scm \
guix/elf.scm \
guix/store.scm \
guix/cvs-download.scm \
guix/svn-download.scm \
guix/ui.scm \
guix/build/ant-build-system.scm \
guix/build/download.scm \
guix/build/cmake-build-system.scm \
guix/build/emacs-build-system.scm \
guix/build/git.scm \
guix/build/hg.scm \
guix/build/glib-or-gtk-build-system.scm \
guix/build/gnu-build-system.scm \
guix/build/gnu-dist.scm \
guix/build/perl-build-system.scm \
guix/build/python-build-system.scm \
guix/build/r-build-system.scm \
guix/build/ruby-build-system.scm \
guix/build/waf-build-system.scm \
guix/build/haskell-build-system.scm \
guix/build/store-copy.scm \
guix/build/utils.scm \
guix/build/union.scm \
guix/build/profiles.scm \
guix/build/pull.scm \
guix/build/rpath.scm \
guix/build/cvs.scm \
guix/build/svn.scm \
guix/build/syscalls.scm \
guix/build/gremlin.scm \
guix/build/emacs-utils.scm \
guix/build/graft.scm \
guix/build/bournish.scm \
guix/search-paths.scm \
guix/packages.scm \
guix/import/utils.scm \
guix/import/gnu.scm \
guix/import/snix.scm \
guix/import/cabal.scm \
guix/import/cran.scm \
guix/import/hackage.scm \
guix/import/elpa.scm \
guix/scripts.scm \
guix/scripts/download.scm \
guix/scripts/build.scm \
guix/scripts/archive.scm \
guix/scripts/import.scm \
guix/scripts/package.scm \
guix/scripts/gc.scm \
guix/scripts/hash.scm \
guix/scripts/pull.scm \
guix/scripts/substitute.scm \
guix/scripts/authenticate.scm \
guix/scripts/refresh.scm \
guix/scripts/system.scm \
guix/scripts/lint.scm \
guix/scripts/challenge.scm \
guix/scripts/import/cran.scm \
guix/scripts/import/gnu.scm \
guix/scripts/import/nix.scm \
guix/scripts/import/hackage.scm \
guix/scripts/import/elpa.scm \
guix/scripts/environment.scm \
guix/scripts/publish.scm \
guix/scripts/edit.scm \
guix/scripts/size.scm \
guix/scripts/graph.scm \
guix/scripts/container.scm \
guix/scripts/container/exec.scm \
guix.scm \
$(GNU_SYSTEM_MODULES)
if HAVE_GUILE_JSON
MODULES += \
guix/import/github.scm \
guix/import/json.scm \
guix/import/pypi.scm \
guix/scripts/import/pypi.scm \
guix/import/cpan.scm \
guix/scripts/import/gem.scm \
guix/import/gem.scm
endif
if BUILD_DAEMON_OFFLOAD
MODULES += \
guix/scripts/offload.scm
endif BUILD_DAEMON_OFFLOAD
# Internal module with test suite support.
dist_noinst_DATA = guix/tests.scm
# Linux-Libre configurations.
KCONFIGS = \
gnu/packages/linux-libre-4.7-i686.conf \
gnu/packages/linux-libre-4.7-x86_64.conf \
gnu/packages/linux-libre-4.4-i686.conf \
gnu/packages/linux-libre-4.4-x86_64.conf \
gnu/packages/linux-libre-4.1-i686.conf \
gnu/packages/linux-libre-4.1-x86_64.conf
# Templates, examples.
EXAMPLES = \
gnu/system/examples/bare-bones.tmpl \
gnu/system/examples/desktop.tmpl \
gnu/system/examples/lightweight-desktop.tmpl
GOBJECTS = $(MODULES:%.scm=%.go) guix/config.go guix/tests.go
nobase_dist_guilemodule_DATA = \
$(MODULES) $(KCONFIGS) $(EXAMPLES) \
$(MISC_DISTRO_FILES)
nobase_nodist_guilemodule_DATA = $(GOBJECTS) guix/config.scm
# Do we need to provide our own non-broken (srfi srfi-37) module?
if INSTALL_SRFI_37
nobase_nodist_guilemodule_DATA += srfi/srfi-37.scm
GOBJECTS += srfi/srfi-37.go
srfi/srfi-37.scm: srfi/srfi-37.scm.in
$(MKDIR_P) srfi
cp "$<" "$@"
endif INSTALL_SRFI_37
# Handy way to remove the .go files without removing all the rest.
clean-go:
-$(RM) -f $(GOBJECTS)
# Test extensions; has to be unconditional.
TEST_EXTENSIONS = .scm .sh
if CAN_RUN_TESTS
SCM_TESTS = \
tests/base32.scm \
tests/base64.scm \
tests/cpio.scm \
tests/hash.scm \
tests/pk-crypto.scm \
tests/pki.scm \
tests/sets.scm \
tests/gnu-maintenance.scm \
tests/substitute.scm \
tests/builders.scm \
tests/derivations.scm \
tests/grafts.scm \
tests/ui.scm \
tests/records.scm \
tests/upstream.scm \
tests/combinators.scm \
tests/utils.scm \
tests/build-utils.scm \
tests/packages.scm \
tests/snix.scm \
tests/hackage.scm \
tests/cran.scm \
tests/elpa.scm \
tests/store.scm \
tests/monads.scm \
tests/gexp.scm \
tests/nar.scm \
tests/union.scm \
tests/profiles.scm \
tests/syscalls.scm \
tests/gremlin.scm \
tests/bournish.scm \
tests/lint.scm \
tests/publish.scm \
tests/scripts.scm \
tests/size.scm \
tests/graph.scm \
tests/challenge.scm \
tests/cve.scm \
tests/zlib.scm \
tests/file-systems.scm \
tests/system.scm \
tests/services.scm \
tests/scripts-build.scm \
tests/containers.scm \
tests/import-utils.scm
if HAVE_GUILE_JSON
SCM_TESTS += \
tests/pypi.scm \
tests/cpan.scm \
tests/gem.scm
endif
SH_TESTS = \
tests/guix-build.sh \
tests/guix-download.sh \
tests/guix-gc.sh \
tests/guix-hash.sh \
tests/guix-package.sh \
tests/guix-package-net.sh \
tests/guix-system.sh \
tests/guix-archive.sh \
tests/guix-authenticate.sh \
tests/guix-environment.sh \
tests/guix-environment-container.sh \
tests/guix-graph.sh \
tests/guix-lint.sh
if BUILD_DAEMON
SH_TESTS += tests/guix-register.sh
endif BUILD_DAEMON
TESTS = $(SCM_TESTS) $(SH_TESTS)
AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" GUILE_AUTO_COMPILE=0
SCM_LOG_DRIVER = \
$(top_builddir)/test-env --quiet-stderr \
$(GUILE) --no-auto-compile -e main \
$(top_srcdir)/build-aux/test-driver.scm
AM_SCM_LOG_DRIVER_FLAGS = --brief=yes
SH_LOG_COMPILER = $(top_builddir)/test-env $(SHELL)
AM_SH_LOG_FLAGS = -x -e
# Make sure `tests/guix-gc.sh' runs last, after all the others. Otherwise it
# could end up removing files from the store while they are being used by
# other instances of the daemon.
tests/guix-gc.log: \
$(patsubst %.sh,%.log,$(filter-out tests/guix-gc.sh,$(SH_TESTS))) \
$(SCM_TESTS:%.scm=%.log)
else !CAN_RUN_TESTS
TESTS =
SH_TESTS =
SCM_TESTS =
# Automake always generates a 'check' target, so better not override it.
check-local:
@echo
@echo "Cannot run tests because file name limits would be exceeded." >&2
@echo "Look for 'length' in the 'config.log' file for details." >&2
@echo
@exit 1
endif !CAN_RUN_TESTS
check-system: $(GOBJECTS)
$(AM_V_at)$(top_builddir)/pre-inst-env \
$(GUILE) --no-auto-compile \
-e '(@@ (run-system-tests) run-system-tests)' \
$(top_srcdir)/build-aux/run-system-tests.scm
# Public key used to sign substitutes from hydra.gnu.org.
dist_pkgdata_DATA = hydra.gnu.org.pub
# Bash completion file.
dist_bashcompletion_DATA = etc/completion/bash/guix
EXTRA_DIST = \
HACKING \
ROADMAP \
TODO \
CODE-OF-CONDUCT \
.dir-locals.el \
build-aux/build-self.scm \
build-aux/compile-all.scm \
build-aux/hydra/evaluate.scm \
build-aux/hydra/gnu-system.scm \
build-aux/hydra/demo-os.scm \
build-aux/hydra/guix.scm \
build-aux/check-available-binaries.scm \
build-aux/check-final-inputs-self-contained.scm \
build-aux/download.scm \
build-aux/make-binary-tarball.scm \
build-aux/generate-authors.scm \
build-aux/test-driver.scm \
build-aux/run-system-tests.scm \
srfi/srfi-37.scm.in \
srfi/srfi-64.scm \
srfi/srfi-64.upstream.scm \
tests/test.drv \
tests/signing-key.pub \
tests/signing-key.sec \
tests/cve-sample.xml \
build-aux/config.rpath \
bootstrap \
release.nix \
$(TESTS)
if !BUILD_DAEMON_OFFLOAD
EXTRA_DIST += \
guix/scripts/offload.scm
endif !BUILD_DAEMON_OFFLOAD
CLEANFILES = \
$(GOBJECTS) \
$(SCM_TESTS:tests/%.scm=%.log)
# Unset 'GUILE_LOAD_COMPILED_PATH' altogether while compiling. Otherwise, if
# $GUILE_LOAD_COMPILED_PATH contains $(moduledir), we may find .go files in
# there that are newer than the local .scm files (for instance because the
# user ran 'make install' recently). When that happens, we end up loading
# those previously-installed .go files, which may be stale, thereby breaking
# the whole thing. Likewise, set 'XDG_CACHE_HOME' to avoid loading possibly
# stale files from ~/.cache/guile/ccache.
%.go: make-go ; @:
make-go: $(MODULES) guix/config.scm guix/tests.scm
$(AM_V_at)echo "Compiling Scheme modules..." ; \
unset GUILE_LOAD_COMPILED_PATH ; \
XDG_CACHE_HOME=/nowhere \
host=$(host) srcdir="$(top_srcdir)" \
$(top_builddir)/pre-inst-env \
$(GUILE) -L "$(top_builddir)" -L "$(top_srcdir)" \
--no-auto-compile \
-s "$(top_srcdir)"/build-aux/compile-all.scm $^
SUFFIXES = .go
# Make sure source files are installed first, so that the mtime of
# installed compiled files is greater than that of installed source
# files. See
# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
# for details.
guix_install_go_files = install-nobase_nodist_guilemoduleDATA
$(guix_install_go_files): install-nobase_dist_guilemoduleDATA
# The above trick doesn't work for 'config.go' because both 'config.scm' and
# 'config.go' are listed in $(nobase_nodist_guilemodule_DATA). Thus, give it
# special treatment.
install-data-hook: set-bootstrap-executable-permissions
touch "$(DESTDIR)$(guilemoduledir)/guix/config.go"
SUBDIRS = po/guix po/packages
BUILT_SOURCES =
include doc/local.mk
if BUILD_DAEMON
include nix/local.mk
endif BUILD_DAEMON
ACLOCAL_AMFLAGS = -I m4
# Pass an explicit '--localstatedir' so that configure does not error out if
# it finds an existing installation with a different localstatedir.
AM_DISTCHECK_CONFIGURE_FLAGS = \
--localstatedir="$$dc_install_base/var" \
--with-libgcrypt-prefix="$(LIBGCRYPT_PREFIX)" \
--with-libgcrypt-libdir="$(LIBGCRYPT_LIBDIR)" \
--with-nix-prefix="$(NIX_PREFIX)" \
--enable-daemon
dist_emacsui_DATA = emacs/guix-main.scm
nodist_emacsui_DATA = emacs/guix-helper.scm
include emacs/local.mk
# The self-contained tarball.
guix-binary.%.tar.xz:
$(AM_V_GEN)GUIX_PACKAGE_PATH= \
$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/make-binary-tarball.scm" "$*" "$@"
dist-hook: sync-descriptions gen-ChangeLog gen-AUTHORS
dist-hook: assert-no-store-file-names
distcheck-hook: assert-binaries-available assert-final-inputs-self-contained
sync-descriptions:
$(AM_V_at)GUIX_PACKAGE_PATH= \
$(top_builddir)/pre-inst-env guix lint --checkers=gnu-description
gen-ChangeLog:
$(AM_V_GEN)if test -d .git; then \
$(top_srcdir)/build-aux/gitlog-to-changelog \
> $(distdir)/cl-t; \
rm -f $(distdir)/ChangeLog; \
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
fi
gen-AUTHORS:
$(AM_V_GEN)if test -d .git; then \
rm -f "$(distdir)/AUTHORS"; \
$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/generate-authors.scm" \
"$(top_srcdir)" "$(distdir)/AUTHORS"; \
fi
# Make sure we're not shipping a file that embeds a local /gnu/store file name.
assert-no-store-file-names:
$(AM_V_at)if grep -r --exclude=*.texi --exclude=*.info \
"$(storedir)/[a-z0-9]{32}-" $(distdir) ; \
then \
echo "error: store file names embedded in the distribution" >&2 ; \
exit 1 ; \
fi
# Make sure hydra.gnu.org has the important binaries.
assert-binaries-available: $(GOBJECTS)
$(AM_V_at)$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/check-available-binaries.scm"
# Make sure the final inputs don't refer to bootstrap tools.
assert-final-inputs-self-contained: $(GOBJECTS)
$(AM_V_at)$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/check-final-inputs-self-contained.scm"
# Compute the Hydra jobs and write them in the target file.
hydra-jobs.scm: $(GOBJECTS)
$(AM_V_at)$(MKDIR_P) "`dirname "$@"`"
$(AM_V_GEN)$(top_builddir)/pre-inst-env "$(GUILE)" \
"$(top_srcdir)/build-aux/hydra/evaluate.scm" \
"$(top_srcdir)/build-aux/hydra/gnu-system.scm" > "$@.tmp"
$(AM_V_at)mv "$@.tmp" "$@"
.PHONY: sync-descriptions gen-ChangeLog gen-AUTHORS clean-go make-go
.PHONY: assert-no-store-file-names assert-binaries-available
.PHONY: assert-final-inputs-self-contained
## -------------- ##
## Silent rules. ##
## -------------- ##
AM_V_DL = $(AM_V_DL_$(V))
AM_V_DL_ = $(AM_V_DL_$(AM_DEFAULT_VERBOSITY))
AM_V_DL_0 = @echo " DL " $@;
AM_V_DOT = $(AM_V_DOT_$(V))
AM_V_DOT_ = $(AM_V_DOT_$(AM_DEFAULT_VERBOSITY))
AM_V_DOT_0 = @echo " DOT " $@;
AM_V_EMACS = $(AM_V_EMACS_$(V))
AM_V_EMACS_ = $(AM_V_EMACS_$(AM_DEFAULT_VERBOSITY))
AM_V_EMACS_0 = @echo " EMACS " $@;
AM_V_HELP2MAN = $(AM_V_HELP2MAN_$(V))
AM_V_HELP2MAN_ = $(AM_V_HELP2MAN_$(AM_DEFAULT_VERBOSITY))
AM_V_HELP2MAN_0 = @echo " HELP2MAN" $@;
-2753
View File
File diff suppressed because it is too large Load Diff
+3 -153
View File
@@ -1,153 +1,3 @@
-*- mode: org -*-
[[http://www.gnu.org/software/guix/][GNU Guix]] (IPA: /ɡiːks/) is a purely functional package manager, and
associated free software distribution, for the [[http://www.gnu.org/gnu/gnu.html][GNU system]]. In addition
to standard package management features, Guix supports transactional
upgrades and roll-backs, unprivileged package management, per-user
profiles, and garbage collection.
It provides [[http://www.gnu.org/software/guile/][Guile]] Scheme APIs, including a high-level embedded
domain-specific languages (EDSLs) to describe how packages are to be
built and composed.
A user-land free software distribution for GNU/Linux comes as part of
Guix.
Guix is based on the [[http://nixos.org/nix/][Nix]] package manager.
* Requirements
GNU Guix currently depends on the following packages:
- [[http://gnu.org/software/guile/][GNU Guile 2.0.x]], version 2.0.7 or later
- [[http://gnupg.org/][GNU libgcrypt]]
- [[http://www.gnu.org/software/make/][GNU Make]]
- optionally [[http://savannah.nongnu.org/projects/guile-json/][Guile-JSON]], for the 'guix import pypi' command
- optionally [[http://www.gnutls.org][GnuTLS]] compiled with guile support enabled, for HTTPS support
in the 'guix download' command. Note that 'guix import pypi' requires
this functionality.
Unless `--disable-daemon' was passed, the following packages are needed:
- [[http://sqlite.org/][SQLite 3]]
- [[http://www.bzip.org][libbz2]]
- [[http://gcc.gnu.org][GCC's g++]]
When `--disable-daemon' was passed, you instead need the following:
- [[http://nixos.org/nix/][Nix]]
* Installation
See the manual for the installation instructions, either by running
info -f doc/guix.info "(guix) Installation"
or by checking the [[http://www.gnu.org/software/guix/manual/guix.html#Installation][web copy of the manual]].
For information on installation from a Git checkout, please see the section
"Building from Git" in the manual.
* Installing Guix from Guix
You can re-build and re-install Guix using a system that already runs Guix.
To do so:
- Start a shell with the development environment for Guix:
guix environment guix
- Re-run the 'configure' script passing it the option
'--localstatedir=/somewhere', where '/somewhere' is the 'localstatedir'
value of the currently installed Guix (failing to do that would lead the
new Guix to consider the store to be empty!).
- Run "make", "make check", and "make install".
* How It Works
Guix does the high-level preparation of a /derivation/. A derivation is
the promise of a build; it is stored as a text file under
=/gnu/store/xxx.drv=. The (guix derivations) module provides the
`derivation' primitive, as well as higher-level wrappers such as
`build-expression->derivation'.
Guix does remote procedure calls (RPCs) to the Guix or Nix daemon (the
=guix-daemon= or =nix-daemon= command), which in turn performs builds
and accesses to the Nix store on its behalf. The RPCs are implemented
in the (guix store) module.
* Installing Guix as non-root
The Guix daemon allows software builds to be performed under alternate
user accounts, which are normally created specifically for this
purpose. For instance, you may have a pool of accounts in the
=guixbuild= group, and then you can instruct =guix-daemon= to use them
like this:
$ guix-daemon --build-users-group=guixbuild
However, unless it is run as root, =guix-daemon= cannot switch users.
In that case, it falls back to using a setuid-root helper program call
=nix-setuid-helper=. That program is not setuid-root by default when
you install it; instead you should run a command along these lines
(assuming Guix is installed under /usr/local):
# chown root.root /usr/local/libexec/nix-setuid-helper
# chmod 4755 /usr/local/libexec/nix-setuid-helper
* Contact
GNU Guix is hosted at https://savannah.gnu.org/projects/guix/.
Please email <bug-guix@gnu.org> for bug reports or questions regarding
Guix and its distribution; email <gnu-system-discuss@gnu.org> for
general issues regarding the GNU system.
Join #guix on irc.freenode.net.
* Guix & Nix
GNU Guix is based on [[http://nixos.org/nix/][the Nix package manager]]. It implements the same
package deployment paradigm, and in fact it reuses some of its code.
Yet, different engineering decisions were made for Guix, as described
below.
Nix is really two things: a package build tool, implemented by a library
and daemon, and a special-purpose programming language. GNU Guix relies
on the former, but uses Scheme as a replacement for the latter.
Using Scheme instead of a specific language allows us to get all the
features and tooling that come with Guile (compiler, debugger, REPL,
Unicode, libraries, etc.) And it means that we have a general-purpose
language, on top of which we can have embedded domain-specific languages
(EDSLs), such as the one used to define packages. This broadens what
can be done in package recipes themselves, and what can be done around them.
Technically, Guix makes remote procedure calls to the nix-worker
daemon to perform operations on the store. At the lowest level, Nix
“derivations” represent promises of a build, stored in .drv files in
the store. Guix produces such derivations, which are then interpreted
by the daemon to perform the build. Thus, Guix derivations can use
derivations produced by Nix (and vice versa).
With Nix and the [[http://nixos.org/nixpkgs][Nixpkgs]] distribution, package composition happens at
the Nix language level, but builders are usually written in Bash.
Conversely, Guix encourages the use of Scheme for both package
composition and builders. Likewise, the core functionality of Nix is
written in C++ and Perl; Guix relies on some of the original C++ code,
but exposes all the API as Scheme.
* Related software
- [[http://nixos.org][Nix, Nixpkgs, and NixOS]], functional package manager and associated
software distribution, are the inspiration of Guix
- [[http://www.gnu.org/software/stow/][GNU Stow]] builds around the idea of one directory per prefix, and a
symlink tree to create user environments
- [[http://www.pvv.ntnu.no/~arnej/store/storedoc_6.html][STORE]] shares the same idea
- [[https://live.gnome.org/OSTree/][GNOME's OSTree]] allows bootable system images to be built from a
specified set of packages
- The [[http://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
distribution; unlike Guix, it relies on core tools available on the
host system
This “orphan” branch contains the keyring of the Guix project: the OpenPGP
public keys of all the Guix committers ever. It is used to verify signatures
on Guix commits. We only ever add new keys here.
-82
View File
@@ -1,82 +0,0 @@
-*- mode: org; coding: utf-8; -*-
#+TITLE: Tentative GNU Guix Road Map
Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
The goals of the GNU Guix project are two-fold:
- to build a purely functional package manager, based on Nix and
Guile;
- to use it to build a practical 100% free software distribution of
GNU/Linux and possibly other GNU variants, with a focus on the
promotion and tight integration of GNU componentsthe GNU system.
Since its inception, the project has gone a long way towards that goal. Below
is a list of items we want for version "1.0" of the Guix System Distribution.
There will be a few 0.x releases by then to give the new features more
exposure and testing.
You're welcome to discuss this road map on guix-devel@gnu.org or #guix on
Freenode!
* Features scheduled for 1.0
- larger & more robust build farm
+ we need a powerful, dedicated front-end
+ armhf-linux build machine
+ leave Hydra in favor of 'guix publish' + custom code?
- more OS features
+ LVM support
+ encrypted root
+ configurable name service switch
+ whole-system unit tests, using VMs
- more service definitions
+ mcron, postfix(?), wicd(?), etc.
- better 'guix system'
+ 'reconfigure' should be able to restart non-essential services
+ support for '--list-generations' and '--delete-generations'
- better 'guix pull'
+ using Git to fetch the source instead of re-downloading everything
+ build more quickly
+ install new .mo files and new manual
+ authentication of the Guix source: use signed commits?
- simplified, purely declarative service list in 'operating-system'
+ it should be possible to inspect the service instance declarations and
settings
- GUIs
+ integrate guix-web?
+ guile-ncurses installer?
- 'guix publish'?
* Features for later
- complete GNU/Hurd port
- use content-based addressing when downloading substitutes to reduce
bandwidth requirements
+ design nar v2 format where file contents are replaced by their hashes
+ leverage /gnu/store/.links
- binary origin tracking
+ keep signatures in sqlite.db
+ preserve signatures upon import/export
- peer-to-peer distribution of updates (GNUnet?)
- more deterministic builds
+ identify & fix sources of non-determinism in builds
+ strengthen guix-daemon containers to further increase reproducibility
+ trusting-trust: bootstrap with different tool chains
+ fixed-point: re-bootstrap until fixed point is reached
+ distributed validation: compare contents of store items with others
* resist a hydra.gnu.org compromise
- reproducible containers: mix of 'guix environment' and 'guix system vm'
- execute code with least privilege
+ build containers like guix-daemon does
+ provide a Plash-like interface in Bash
- daemon rewritten in Guile
- more shepherd integration
+ monitor network interfaces and start/stop events based on that
+ include a DHCP client written in Scheme
+170
View File
@@ -0,0 +1,170 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ZPFE
=c1wa
-----END PGP PUBLIC KEY BLOCK-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
fCnIDNs57Q==
=JaPp
-----END PGP PUBLIC KEY BLOCK-----
-53
View File
@@ -1,53 +0,0 @@
A big thanks to Eelco Dolstra, who designed and implemented Nix.
Transposing functional programming discipline to package management
proved to be inspiring and fruitful.
Thanks to the following people who contributed to GNU Guix through
suggestions, bug reports, patches, internationalization, or general
infrastructure help:
Lluís Batlle i Rossell <viric@viric.name>
Sylvain Beucler <beuc@beuc.net>
Carlos Carleos <carleos@uniovi.es>
Felipe Castro <fefcas@gmail.com>
Daniel Clark <dclark@pobox.com>
Alexandru Cojocaru <xojoc@gmx.com>
Aleix Conchillo Flaqué <aconchillo@gmail.com>
Malcolm Cook <MEC@stowers.org>
Thomas Danckaert <thomas.danckaert@gmail.com>
Rafael Ferreira <rafael.f.f1@gmail.com>
Christian Grothoff <christian@grothoff.org>
Eric Hanchrow <eric.hanchrow@gmail.com>
Konrad Hinsen <konrad.hinsen@fastmail.net>
Brandon Invergo <brandon@gnu.org>
Anders Jonsson <anders.jonsson@norsjovallen.se>
Jeffrin Jose <ahiliation@yahoo.co.in>
Kete <kete@ninthfloor.org>
Daniel Kochmański <dkochmanski@hellsgate.pl>
Matthew Lien <bluet@bluet.org>
Dave Love <fx@gnu.org>
Chris Marusich <cmmarusich@gmail.com>
Niels Möller <nisse@lysator.liu.se>
Cyprien Nicolas <cyprien@nicolas.tf>
Yutaka Niibe <gniibe@fsij.org>
Andrei Osipov <andrspv@gmail.com>
Petter <petter@mykolab.ch>
Adam Pribyl <pribyl@lowlevel.cz>
Pjotr Prins <pjotr.public12@thebird.nl>
Yakkala Yagnesh Raghava <hi@yagnesh.org>
Joshua Randall <jcrandall@alum.mit.edu>
Bruno Félix Rezende Ribeiro <oitofelix@gnu.org>
Benno Schulenberg <coordinator@translationproject.org>
Thomas Schwinge <thomas@codesourcery.com>
Alexander Shendi <Alexander.Shendi@web.de>
Alen Skondro <askondro@gmail.com>
Jan Synáček <jan.synacek@gmail.com>
Matthias Wachs <wachs@net.in.tum.de>
Christopher Allan Webber <cwebber@dustycloud.org>
Philip Woods <elzairthesorcerer@gmail.com>
GNU Guix also includes non-software works. Thanks to the following
people who contributed the logo and general artwork and themes:
Nikita Karetnikov <nikita@karetnikov.org>
Felipe López <felipe.lopez@openmailbox.org>
-97
View File
@@ -1,97 +0,0 @@
-*- mode: org; coding: utf-8; -*-
#+TITLE: What's left to do?
#+STARTUP: content hidestars
Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
* Add `guix publish' to publish the store using Guile's web server
Generate narinfos and nars on the fly, upon HTTP GET requests.
Ideally, extend .nix-cache-info to include the server's public key, and also
reply to requests for .narinfo.sig.
Optionally, use Guile-Avahi to publish the service.
* MAYBE Add a substituter that uses the GNUnet DHT or [[http://libswift.org][libswift]]
Would be neat if binaries could be pushed to and pulled from the GNUnet DHT or
rather libswift (since DHTs arent suited for large payloads). Guix users
would sign their binaries, and define which binaries they trust.
Use UPnP and similar to traverse NAT, like filegive does.
* user interface
** add guile-ncurses interface
* extend <package>
** add recommends field
For instance, glibc, binutils, gcc, and ld-wrapper would recommend each other.
guix package -i could ask interactively (?), or allow users to follow all or
none of the recommendations.
** add a user-environment-hook
This should specify builder code to be run when building a user
environment with guix-package. For instance, Texinfos hook would
create a new dir.
** extend propagated-build-inputs with support for multiple outputs
#+BEGIN_SRC scheme
(outputs '("out" "include"))
(propagated-build-inputs
`(((("i1" ,p1 "o1")
("i2" ,p2))
=> "include")
("i3" ,p3)))
#+END_SRC
* synchronize non-GNU package descriptions with the [[http://directory.fsf.org][FSD]]
Meta-data for GNU packages, including descriptions and synopses, can be
dumped from the FSD:
http://directory.fsf.org/wiki?title=GNU/Export&action=purge .
We could periodically synchronize with that.
* add a guildhall build system
The Guildhall is Guiles packaging system. It should be easy to add a
guildhall-build-system that does the right thing based on guildhall
recipes.
* union
Support sophisticated collision handling when building a union: honor
per-package priorities, etc.
* add GUIX_ALLOW_EXPENSIVE_TESTS
Tests that need to download stuff or otherwise take a long time would only be
run when that is defined.
* add "guix challenge"
Would download a substitute, and compare its contents against a (hopefully
locally-built) copy.
* guix build utils
** MAYBE Change ld-wrapper to add RPATH for libs passed by file name
** MAYBE Add equivalent to chrpath that uses [[https://gitorious.org/guile-dlhacks/guile-dlhacks/][guile-dlhacks]]
** MAYBE Add a hash-rewriting thing for deep dependency replacement without rebuild
See [[https://github.com/NixOS/nixpkgs/commit/d1662d715514e6ef9d3dc29f132f1b3d8e608a18][Shea Levy's `replace-dependency' in Nixpkgs]].
* distro
** port to GNU/Hurd, aka. i686-gnu
Problems include that current glibc releases do not build on GNU/Hurd.
In addition, there havent been stable releases of GNU Mach, MiG, and
Hurd, which would be a pre-condition.
+110
View File
@@ -0,0 +1,110 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=EyBc
-----END PGP PUBLIC KEY BLOCK-----
+112
View File
@@ -0,0 +1,112 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
aqt8u5BPGC7qb6oikKM=
=X0wP
-----END PGP PUBLIC KEY BLOCK-----
+22
View File
@@ -0,0 +1,22 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEW9wl+BYJKwYBBAHaRw8BAQdAurhrcJpShB9c6LjA10W25nH06B7+rC7Nha1V
ba9Jo3G0IkFsZXggVm9uZyA8YWxleHZvbmcxOTk1QGdtYWlsLmNvbT6IlgQTFggA
PgIbAQULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBOx5gmSisiCOEHk4nl/xWAk6
4/s4BQJb3CnABQkCL/NKAAoJEF/xWAk64/s4bHEA/RYaH1dxst2MIVuHZQg0VWuj
m7cWKTqzUasHhAkEi83eAQDq3b0LI5bPo5H2eYmeoULDUTJpuihi692H0luJRi6O
B4h1BBAWCAAdFiEEqH9mXV5BNBTOWlOF865L2yPs2hsFAlvcUbYACgkQ865L2yPs
2hsKdAD/XSsEETKmG5H597axepu6zUi8VnzEXRgUGMz4Gh1S9PkBALnlSMINOACE
2nMLnJnPrn3mebMZPLCvFJ/OMW1ugvUFuDMEW9wm0RYJKwYBBAHaRw8BAQdAk2ez
QR8X4VTHUVUiUDCeiBqnQaQWT5hq0Uj+p3VxaC6I9QQYFggAJgIbAhYhBOx5gmSi
siCOEHk4nl/xWAk64/s4BQJb3CnTBQkCL/JwAIF2IAQZFggAHRYhBDBvy48sAcJd
KdMFVmHvUC72AlLyBQJb3CbRAAoJEGHvUC72AlLyAtwA/j8hOb1n52PJ+ql+vYfN
E7dG7KAnN3yUW2NOAMkiN/qzAP4/QTDzBX1l0V6EUo8m6ozQFRLsDTYbEmb9OXrX
vCrpCAkQX/FYCTrj+zhWcAD/XFQnM1bdBKGnMxxI8fQRteaRS4WGt4qhW+CrJ6Jp
DIQBAKtU4vXg9hWlgHgvKXqSEEFm8HyGh/9jx/OoJSfKiLUHuDgEW9wm8BIKKwYB
BAGXVQEFAQEHQHWQ4hmlimFlV1kHTzNeEZ7OH1YxL8GtF5fSNeC2iAB+AwEIB4h+
BBgWCAAmAhsMFiEE7HmCZKKyII4QeTieX/FYCTrj+zgFAlvcKeoFCQIv8lAACgkQ
X/FYCTrj+zhYEgEAqflYQ6CHMbxZfiG1shTFx6rj7RjD9FqzN2bgefw4dDIA/20a
jPZhWiOxJFj8dk+LST8x8vTktqIJwnsNy0rxeugN
=bApJ
-----END PGP PUBLIC KEY BLOCK-----
+44
View File
@@ -0,0 +1,44 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=E8mu
-----END PGP PUBLIC KEY BLOCK-----
+81
View File
@@ -0,0 +1,81 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFYG7jABCACxDWl6Beu+9QEDyJ+8975UhGxXyTzoE9JZ8u+Vglvx2TxTwKWg
Q9vFAPpiPRW6h8Gc4aMJ/mAUp7Gj7yroe6FKzsTUktaNxWaEw4PhE7a8L/G84x6l
lLuE8k2daf1grw2WBNM71mETi7AXb3xnImQpnOVQyXNvmcPFf4kpABT95gWBUVqA
pGqOiftFEl9W1RDMBGno3OXKoT/QvUVOEijcRbRsqj2LVYy/DUiMI0IoQ7nFAb1E
6AthAlEpSfzgLpaS5m50dtkMPGbH0D1dmvZCdAVUQOgD9X8N+gx/QSD5SajbzFFK
DCRIOaX9CBsyoOAH3G8FmUYTtQDWLaHtA8zpABEBAAG0HUFtYnJldmFyIDxhbWJy
ZXZhckBnbWFpbC5jb20+iQFUBBMBCAA+AhsDBQsJCAcCBhUICQoLAgQWAgMBAh4B
AheAFiEEUPM+LlsMPZAEJKvom9z0l6S7zH8FAl2hjkQFCQl705QACgkQm9z0l6S7
zH+5Rgf/a1TRPz5dRGTTDERaryqPbLENiko86rHx9XzwQdI8e4tP0v5R0MYjY1nj
yPdr/xSI4htkkVUucrHL5DLjsbYJCPtn3tH1g0ZenzCdp4g/4zHrrhpqchMqHLCn
FawYlCBETLzcA3I72ewmJgcpsgyjw7p1JUXmucJ/KovMiCcYt2dRAipwKL41uQM8
PPCbjlBklV31+0kXP2l6kq/dgz5UqzZ67yJDVWX73qNLhcRGXxw3M/bhwtlGS8V2
DCraiFzNi1bRkfX6nMJfPO73IY1Ude4GjLw8dKmjxyDXZZrmv/CwPj6BvyIEQerk
52l3BlONKuVlZNVZzKjnZjn2aV6vKYkBVAQTAQgAPgIbAwULCQgHAgYVCAkKCwIE
FgIDAQIeAQIXgBYhBFDzPi5bDD2QBCSr6Jvc9Jeku8x/BQJZ6PBZBQkFwzWpAAoJ
EJvc9Jeku8x/DBcH/2NJM3UQ3vpCRhauksNpo0n8qmO0vG8j+D/PzVs1CMFnrzuP
giMsiyYin4mIRMCAJoq+lBS2HRdlc926SA8ls3UAkt3YTJ8/yqkHiKI5NnTLV9eM
tyAuxVlUal3J8wF0xzYNOKNdiNQ40ls4dch6Ia057HfvNGIbvz0o3z0B/AQcOh5e
2Yb/3aeQg8FXb8jRNcKzop/+co+5ACIBTzUXrLJccsqCe1JhpqZCkSuLpDxvN1cn
uJPaTjr9DDt0Rm0If0FvnfwLR7PwLVsmOPpVEd91CgGN+B021X4rQnTR6Q4xFRv2
s1rCAKjtYzVF2le7NBd222KmavGy0O1yoJca59S0JFBpZXJyZSBOZWlkaGFyZHQg
PG1haWxAYW1icmV2YXIueHl6PokBVwQTAQgAQQIbAwULCQgHAwUVCgkICwUWAgMB
AAIeAQIXgAIZARYhBFDzPi5bDD2QBCSr6Jvc9Jeku8x/BQJdoY5EBQkJe9OUAAoJ
EJvc9Jeku8x/v6QIAKQRAn6RB9DdjuA6Wv5OYvShC2zwNr/JBZoLEtgRuk4sujDH
IX2bBLYvHEzLfe6IlD4xi9bm9r15SnaNUPi5rFn3y6TUi+6AWNL+C6tmHFsf9Eyp
6f5QGsfGPwhSmI4q7R053oaTsP1VLFS+eGasbODzldc/5mNSW55t7HgzW7wKIjCk
s1dr+FJvW63anQ5qwjhGV26FIoNjAvQC75ys5q1HuqFB2sr1zYTm1A9FBPxp+5J0
1UknsG55RFIcKJfmLZ7Th8C04Hras0u1RYVDtVFNAWlxDEVkDIp/TrSxlzR/dKmt
gei6yCPjvmtvBwzjAQTibdkKdAe96ZblPZcJBAi0KFBpZXJyZSBOZWlkaGFyZHQg
PHBpZXJyZUBhdGxhcy5lbmdpbmVlcj6JAVQEEwEIAD4CGwMFCwkIBwMFFQoJCAsF
FgIDAQACHgECF4AWIQRQ8z4uWww9kAQkq+ib3PSXpLvMfwUCXaGORAUJCXvTlAAK
CRCb3PSXpLvMfwDzB/9uBB1EI6ZmLYgnTcq17y1tYfdb/8lzdTNLm1bb9ABIqKKJ
v0/ApZ01sVlCKTF/IEu0M0pLG14tYgwsyb7yiiXsld9o3I5flubuheE80twbgNL8
K90zqiANje4xGW7DCyN3MLGibd8zmgYlnQHQSebVwA70SKHirtYvYfhaTYQ6iPaZ
/+VyiBXjZd+p5pKPaq/r3uxuR59E/Q0scLgoEbVo8fuaAZdRNlx8F0FqiqlHl/EA
x1ifjp7sh/kQavcgQBNH/ed7kLD4ThYXMceivQWmuWcKrufqhzUPkVy5Q8f9qkcv
GRDi4A0N24tbPoHb9kXr5casNd6YV7sNtoC29JpStClQaWVycmUgTmVpZGhhcmR0
IDxwZS5uZWlkaGFyZHRAZ21haWwuY29tPokBVAQTAQgAPgIbAwULCQgHAwUVCgkI
CwUWAgMBAAIeAQIXgBYhBFDzPi5bDD2QBCSr6Jvc9Jeku8x/BQJdoY5EBQkJe9OU
AAoJEJvc9Jeku8x/UeoH/2vduULZlrUwrny5jP98ek4p0ZIhwDWF+OSwMabcV2Wl
u70t9O34d4/roYpSk1FjqVdMEY+LGp1ecfbVgal5fFdf6VmA30+E8dLFyPF7ak/0
lisU3Z1LLDtFoEoJ6wZ0jL1Vl8esUjbDs7/Ea/9gxvblMe2fGuP72tPnESR5vfWd
cuBy0Sw3KaUOTYybdiptMrBEHmYWycEhBr1ujmVjE7ggVJZpRBgaGnBrnh8AX7WQ
EkwJItr0MbWl9C+QbifqlL+OeBAvs515levmetmzrFKQiGghEIypFzk3SjC86sZa
u8IkfugZ7Tx1p91TqUJ2O0EcneWqy4fFMMWaH4/wY2a0LlBpZXJyZSBOZWlkaGFy
ZHQgPHBlLm5laWRoYXJkdEBnb29nbGVtYWlsLmNvbT6JAVQEEwEIAD4CGwMFCwkI
BwMFFQoJCAsFFgIDAQACHgECF4AWIQRQ8z4uWww9kAQkq+ib3PSXpLvMfwUCXaGO
RAUJCXvTlAAKCRCb3PSXpLvMf4lAB/9FQSA70k06v6AsuECRM4edBKv5pIZwU8rC
4gVAmS/myRJb2NYHTdbm+/VIjKhScwGar9KmhXCewNZOPvNKYbolCeQoPTk2l2Hn
B2nKGsE3AsNYghHW/jezhwe7rQvI+0MyOgMr1yls8g24MnjL1GLE7E55GlfRY2T9
NKR+U3waRw3/TMFOtn6mIzuFnFN+zsYc78msI5IfiwaAhDpPbyUlAziKQcCZNJBC
V+G7X0IJlVJPsMaiJCDfYeC6K5KOwngH/5oZ7TJaeIw9jYCa/crNVNL77AjYxk6S
H5o7IVL0V2o5Uk18N1W+rEFBDIYbazzKg8+g5SVEn6USzG81Z0K8uQENBFYG7jAB
CADnPPBP1f1C96exoC4N8lo7f1WMSWJ/l2LnCb72sv1x2Jp/f4M4BC9wHApIYGYF
GXbJwOAcZQAJpYl4IEY2hYGCzntHdHBGM51BEV2o7CLcaNkPKvCX2Yz3hmkvSaVP
+N3vKQ2ob2uUAAR9ZgbQwiH6FmFyqxu1xMtKsa6TEOcGVKv7wJ14XlsH3SxN8Q3K
m9YiUW0iMla1RovBJTXAaTiRRpcrKVEkIQIa1hVO0jtIxpdLjIIM1PUCA5p23oU9
6fv/pCFCzheD/7kvZEmtracvRSDhtShQxwv7w/JxrESx3MRvEcXI+GP5cPjtg5/P
tT2y7AGkcxoggYaz1gbVZOynABEBAAGJAR8EGAEIAAkFAlYG7jACGwwACgkQm9z0
l6S7zH/G1QgAhvnz+BSHHM3GhsWZjM9kIqViF8hswOVSFqaLaJAfAR7TNtfxP3PM
i+t5GnHrN2ItRmZzmdv6vnPYpXkj6Y9WvcA+S3V3dj8PoEud0yreK0ql9wskug+F
HsezbEz83l5RJVBlENex2H5txHH1S1pzEIkMT0FMI+lfzXdCf508obVAV1S6LE0T
YS6t+wkb0yptyXPBnlq1nG65rXvCs2EynN3Q7q+PLn3Zll+er/1LLww3KDIPFv7c
ULEGO7vv8woMvaw0Mz6CSVfRf5a3ClpeHn2/x5QTNDILJissp6HiOjxHgq2irxdY
k0VYy+XuHm/ER1T39188Lacx3xXnaKRsp7kBDQRadzQeAQgA54QSKLx4RsQUVpHg
NLwMzGbh/FiULhhnhItx57dr8fcBqPJu6Km7x6G0YMugN21tL/162I2eg6Y742Sz
E6EPclAgsFNqkCQ7i9pj1V4aFYIfSnD64RDUNcOTRft+Mj9GMWTyLG5maDjFUMk0
+DLiokF6cdxY2+HCbF0hoeDsN9ZxqaRz5LXqGGVfeqX/IRhNGnMEtJyJtp6fsYL8
cVZm9cwm6WNcVEkGJjGwOZ9hbr8nXYd4I7ZaELyHuYX8Je908PCnZjvdEWSE9NTS
NKGQ9Ic59f4QcCS5PY3svzcKZKnSQo/i29eLs+2cZQvjLrInlbzd0Nw7/hKjsYmS
a40kzQARAQABiQE2BBgBCAAgFiEEUPM+LlsMPZAEJKvom9z0l6S7zH8FAlp3NB4C
GyAACgkQm9z0l6S7zH8vxQf+L+G+HsqWKofn3faCHsd3YQlqmgMiTC+emy0yu2OO
4dfsU3S9Y8pzJIMsQC6KzdSaxWZ6dIExn7wUJYpa4jL16UfQ19nXSA6LqeRTcnTR
bR1omCZLlwiD3NHg3vqDHeLzsKFT/SMCV2vk+v9kq70nbU0RVHUkegX7F/+vyVD4
dIHl897t5PKO61vhK5Cyjbuy+B2TyBue6s2NvMKe4ftKX4phxBVPT78Sjwk9+Wv0
xOgcoKrbNCDGN4SqHkYw23CSlDHPauxD8O3q+tuj1PP4SGAWx6LrDTuU+8B35gsW
LJY864wSfsYH4bEpPL3EVtEV48rB6bRMvwaGTDegLiBXLw==
=SWD4
-----END PGP PUBLIC KEY BLOCK-----
+43
View File
@@ -0,0 +1,43 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
y63vnx/jt5aE6zbSm/QZPTxn3hSVmA7zdw==
=IApS
-----END PGP PUBLIC KEY BLOCK-----
+122
View File
@@ -0,0 +1,122 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
CitZrazL0TshmAveJ+txLlujAB+TQb4=
=tjy+
-----END PGP PUBLIC KEY BLOCK-----
+60
View File
@@ -0,0 +1,60 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFIrWlgBCADL9VFDowZ3tM5Ogb38eC3I9PWhXpEVV6DB7AKJlOdpdc5caBng
CUu6UfnVwtNXT3eTr+vG5u3tANnaVbL6tq+8o7V1gWhpAlQ62OfgolxExpHOjHII
xUrPyi4JdNnVyYp/GfEb7hHz4zN0nY6CyVn8DFXOCmJzQvnAWFHEKjtCLFWguxO9
e/nElbBUo+CNa7eUurKW/cCym0/bkLZBMTXlwoy6ZAik5w92gNUyQ7x8ICKTzmPF
HQVZ+gN7fNWh2KjP3DFU1KV909xKnaQz2FZcmU7ywNud2gjwTjwo+LlzEo+B3eKD
z8eeHcujbFBZciWd0R+PlGLKMr6gHoBP4nAvABEBAAG0I0FydW4gSSA8YXJ1bmlz
YWFjQHN5c3RlbXJlYm9vdC5uZXQ+iQFXBBMBCABBAhsDBQsJCAcCBhUICQoLAgQW
AgMBAh4BAheAAhkBFiEEf3MDQ/Lwnzx3v3nTLiXui2GAK7MFAlyQwrYFCQxGm94A
CgkQLiXui2GAK7NHyAf/S+VQCI32Sl1ed8hPIB1VqeAjfTR9H/UpPtdEdUKq2Uhz
dDeQH8jsE/61Ilwnp6ymQkEjhxerNc2F+Gti9RQHEZIYOCjUT8rdjFL4M+d13oEh
qtaYFAYxepq+Kdtxw6hCCAZ5G/K43/5pbNM1n9h31ZIic7PM+9vUWtIdLwzHt95P
Fp+WRA37Zk34f7cPeGlTjR7ZnMhQBxQAseG24lJyeFS+VYT17MVHP3JDyB8I9LnF
O5pNrReQbSRvQ4dw3Omngc09vcStd/Ihj/Wj9G87Y0ZamsKxdvQJb53rWRktsjfv
EMqVgM4TbRJM7RMyhRsUMPny946VX0cmrDPsAn8i9IkBTgQTAQgAOAIbAwULCQgH
AgYVCAkKCwIEFgIDAQIeAQIXgBYhBH9zA0Py8J88d7950y4l7othgCuzBQJYz13r
AAoJEC4l7othgCuzR0oIAMmboj+22WMtEGfeQm2N71IGS6WiX/aPFHxvhEf7rz43
Bw/cLpz5f2wgYy6D3+KSNioF8Ky5ef5iG5seNAk0SwcVuQhoCDR2wykcH0B9V1Fk
OBGo6Hm5CtstTLct9cJlhNP+zzjO+5lgv7OndZdPYgQ2BqFk1hJy+WvT6Dh5ksxV
42uWQrju6qpo78WTrXNHaW9dxiL+YHdY/JxhnESQ515Lt/JQ78oHenQKmNYdIYoQ
NUIMAvETAkvNIGnho39OvqeY3gaH7M7LO1YMoQ4MbXupDERyWwaSvaAo3s+xIZz4
lNNvpyAUL6fkrQvsjKJSOQo3Iu5IBP3xzoo6+TulwpSJATcEEwEIACEFAlYtMAoC
GwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQLiXui2GAK7P+5wgAn4jyliNY
ea6FI1tZnxdzl15uz+Lp/8BTSwuZqtv876x5iE1iWRumzxyQ6IQnsfkyVGguYprW
wWVd+znw2r4BV8I3fs3McUQODs2q/KrrZqojqG/B+kr98A35S8Jm6jtU8SEtuazH
DiR51f8njDn8eeJIZ2ApoE17SLRNusERE4sEjai0ajvaROK3oFFI/dctH2tjuuhj
+wT2Bb7rA3JWMLUEz+NOpuGqiwr+Dv0J+5/eFrQbSJEQJf2q5NffLmWWuSCHzYsK
5Pa0o1wEKe/+RNua0EVE2cCt1AxwfZVyY/uyYeRXLqUE/S6NdSyI9qLhQ039OCN9
3mUYSWmM6w+JrbQ3QXJ1biBJIChNeSBwZXJzb25hbCBrZXkpIDx0aGVyb2Fyb2Z0
aGVkcmFnb25AZ21haWwuY29tPokBMQQwAQgAGwUCV+WePBQdIEknbSBsZWF2aW5n
IGdtYWlsLgAKCRAuJe6LYYArsz+kCACBqOLxPomISOQLGD7G7jacWd3BV6C6Tp/x
TlmWQs0zRe5iz/wRZPd5kzksVUWMBhewcrQx0B1ARh58xsXlkrMq0Rdy7Ps8Cblk
G7arx8qjW4OMvJAMjExEUGVLKzpGjfHHr9tm1huXUf8P3a0wgQgrE9FzVMQLYIpy
W7/flGaACxy0cdwSfnDw2P69Jq+VWyPL/jVmyfkwajOhNeOZ5+ly6dLY3wWaJR+W
JFzDyvfebGXQeVmB3m8a5hyOY3n08uxEznWHsB9p7J7I2+hahcsnLsm2AIzrl8Bc
xWZcTQHWEtLFlUJp5RMBvHyf0G4EcD5wz7BzACbM/S7qDQ9fud/biQE5BBMBAgAj
BQJSK1pYAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQLiXui2GAK7NU
eAf+MDLLud8UN8Son3t/HMOP0N2tI9NMRybj3iI2rRV+Jfpa1r2gjMF8aTuqlTcW
TBFCdjOyPnRcecZhtifdtnbnht21MoLvQ399cBOZZpKUitMgGqWuoCYZXWBIJmYf
58yxyBK9M18pwE81JO+dDA90+qOuVS082pUwLjmWoZAusu59kJqAnXKJa6KBwc/3
cFEnZFDCzdg60ny008qF2IG2xUZh2fplomH+hOPd5bJS3xxFLa0cwvGpCAazwFMg
zlrMAQ0MQqRCKgP4E5ZsxDvRl2EwaQarwb5EuDeFpIvbLd5ZrAFkEjT7vHh0f+pe
XCWayfW40owDNGbWHv15BhudnoheBBARCAAGBQJVBwGJAAoJENzZKGRffEkmTKAB
AIu2TkRZbxL/3XqUOE2L5HU4TxLoj+1N2NzOphMhrsTfAQD0vpFMQJWxD0n5268u
i6QYiCo0d1GKeiF4G4hUAgdMh7kBDQRSK1pYAQgAmFlXEkYhNOBgbUR6B+t8XxkA
5e7jrxVaWPCbOAICs3+4w70OWJpytxDeaPOhyf4WtKj5F/nNM6faohDnNChO7F8H
FIYHpHdijC8EVDnw9il9mhFJyeRO6ooLGq8ofcDPIRZlK7Fk7pXj84CftAIgKNAw
ICVY5y+Z8GwEjEYe60IC/knetrH+mrabAbH0uS9Q+6IUWQyJ3CyDE0u8FDIkjKiI
3Sfiyk4aIlWfQtnPUL61gSbAHvG061jo51M7qrvgnJ9qcDeuylxc/61ChHKfB0JO
geRTuBwk/UdDz/sSe2T2LpFsIhNDAyuLP14wv5XrNujFhHQ2bKOxlMBH5dOOXQAR
AQABiQE8BBgBAgAmAhsMFiEEf3MDQ/Lwnzx3v3nTLiXui2GAK7MFAlyQwswFCQxG
m/QACgkQLiXui2GAK7Mfcgf+MbOZcOEHC6y6+IJvXRyDR/jx7kG5Q6AcTYcxHyAK
3qdph2DrexZLfBalKCZg83ZKi6JiRXuLap36g/nW29gOM7vKYtTWzMXpfcqWZ5PA
hDJMyL1cKcVevenScmZgcL3uV6MYhvyJZfrZ2i/fFR+RfbtFMHRHEpdgweniQ/3+
ZzUy0om7/OzewOgdw2Eal5+gjXTmYljr5Ne1e2V9Nw0aBWQCpo+KeGaLPJ/S1nVW
PG9M3aFvewA3tyR1J8yeUFq1LAKRkKFt4jzNFwadBs3GPQS+UV0nnjC6w0dtgJUQ
P2UHzLrfe7FiSkxavm+p+hGGf4PXrB6xe2a4s4AuYNLLSw==
=OQSj
-----END PGP PUBLIC KEY BLOCK-----
+157
View File
@@ -0,0 +1,157 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
9REKVGCYlTkgaMg=
=Y6Uz
-----END PGP PUBLIC KEY BLOCK-----
+174
View File
@@ -0,0 +1,174 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=4xbz
-----END PGP PUBLIC KEY BLOCK-----
+62
View File
@@ -0,0 +1,62 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
I2E7RxUJVs3RxJoJtA==
=7Bob
-----END PGP PUBLIC KEY BLOCK-----
+451
View File
@@ -0,0 +1,451 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
Oc/V3vQolFE5pC2nGyryCb7aTemCGYZ3euQbAHpSKC7IDSVs7VI+eYVTPT+spJeY
xf7ZeGDiHApCqnL/z2lNX45CKPgHaV137QgLWLLwWGxkIf8xAK2ags0n5Q73LPT2
dyPzcnhAN6sipjDEwamgr4lbZAkzQoIYKo9d4ao26g9jF8SeFH0PPPJyYGNKxSGV
abKZYTTpPI6UgtZaKpmRlshYmwGWLokCMwQQAQgAHRYhBHoYgH8QCkVwxZaEIH5O
ZchyC3BrBQJebYIoAAoJEH5OZchyC3BrtqYQAJfwdA9el3n6wNC/q4GfRFD/tg43
Qnh5PBAyL7LJ8L47ffAQ+MQgL2anGHbKIAXpUd+8j9/Wuxpf1Catp5ZqHv/PCTwT
yb2Xbb5INTHSrRH3FZaUOQ2+krnoQs0iBXHYZ9tluFu0QGR3j/byW0MY87nF5Dvy
3rEXBiZXA8K7VmXdqH1ergGtQJuR8aHX52P7s8kXI/60AcKtTjApKkvKvRbv2WJF
AszEx8LO06cWJk7V4RsQyw+b9fW2nesD1fSjTCsVDXQNujW/G4twqL6Nwgk0qpj/
diZwuVnPt0i47Ma0i71nXwdCWBEX3p0TfbgR7wI6XX+sEHpTQkWxs6085jhwIrwX
sde5vu7wOMgNDN/mmt4Cp6yQkqDmefJWt8wSFk3XAZDJFd8PMqjL+pOAwWKBfpYY
euKGy5+du7IL1btXlY/leWLIuemHGdOlXQX/7qvWbfp0zYqO2IEsR86vlL/UbRzB
de6lamiJzpxmzJ9zPxq6Ez4KDuxvk2T147Z7HwNzK+7ooh2u4t913DOToOnGleUM
Xz6VhAIpzYJPH8O+wXnWonPMNjq4FJAQ2KuGBdPnwPR9FhQtoPMbR+52hspxsZRP
BZkF9oFKBp22fCUAmqFAE7ss96AAykFU09IFoRrLd3qVWrWaTYkl38cZXlgQ+kL2
lWrwur3iEVDC01++tCtBbWluIEJhbmRhbGkgPGFiYW5kYWxpQGNzY2x1Yi51d2F0
ZXJsb28uY2E+iQJVBBMBCAA/AhsBBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgBYh
BL5ic3OOYW1tGzoI6KIaAgJIgWEDBQJecqebBQkHhWfIAAoJEKIaAgJIgWEDHDYQ
AJ66mn59KBnTcCYO3YaQ4YYggRIfTVPYvW7xsnTTn64Hiu+xwaUz9rQRFJCocf61
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
=T+4B
-----END PGP PUBLIC KEY BLOCK-----
+125
View File
@@ -0,0 +1,125 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
gec=
=fLn6
-----END PGP PUBLIC KEY BLOCK-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFgAga0BCADIY78eSt/I4vGPo/UMBMQhcM8O2tptvlN0B2F6Z8sDAOwgWnQp
d0x2AVM8I39VymnmbEQfWf/Y0U9XJqrmOz91NreTsZUsR9BSZy1fVIUbdoQTI8m8
CGpjDBnloX+cQwwDPDS2RL2/a0rZciXUMunVvM/o2zLHUIyO/GeoqKN5mU4d4nZY
PHtBOBpmzfvfyZLM1uyu/flbKGFqW0uKmS8MQWhyUdvIsiAU/Aofuf0dVp2C/Z5w
01Vyw38fReZ20onxbabSjLrOT+K6vzrV/9P+6435Ptoek+5BoQX50f+cMYq4d2rE
2PBenDy4xAloL/qOUj6XqwW9ZWAkLLiqYiJdABEBAAG0LkZlZGVyaWNvIEJlZmZh
IChOb25lKSA8YmVmZmFAZmJlbmdpbmVlcmluZy5jaD6JATgEEwECACIFAlgAga0C
GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEFiTbg4vG1pMn44IAMKLId+i
81Qp15Tn+VQQqxp5hI5IK2UpkzD4TnjAfX2AO9ao5fyCGKU0tWopUY4xjtU/YH9C
A9eqfmo46PTU5AFssfTly9sxtNGKhWhViBlfNHH19W3I4eF7OwN1tRon/QacCDkj
iUwElyE03/H/IPk5TB25tRmqpcoM4VrHjLIkVvmQOFOeItFKWg6jARY0x09KcHKp
P+Q3SVdS+3JTrO97xhMjAaPByiRgrjGCYTnh9MIPl/ANJFIlJVx8R1ZqeGUJBd2E
Or6RkG34WpSC/tdfI9vxajlAHAUAIoUNq6Jn7LvVLGcnZXcoE4gU8oBtXkr79SUd
42S6HC+S/XeRHfy5AQ0EWACBrQEIAMsqA2oLmPYfdE1uhsOfDDrt72Lx7BADKqhz
k8Nqny45ISPe03MjOkVUwuClceuZDGByZ/u7fslcWvAzcjcLDO4thWj1a9s1PUmH
5evVBfFQNaHaZ5gdRdIuE+O/Vkv+pbbcR1zckBSj4PCZCBF2rQgukxNaeRB4rTAC
0VgozLRK/OgDV8nyCA/0Lx1GAFoUj+KgIIUI0mPQzPuCMJHBoOVoWQit9qANTQN0
89P/6r8dj/3AVPnUmnpENul1gtxa2k7ck9F9hH7ePD3djL2tYtQcH720eqrV70Kd
gSp7Q/N4Kujw7b9RgNmo2cUuTkRfiqR+grp7XR9BD552haU8a5EAEQEAAYkBHwQY
AQIACQUCWACBrQIbDAAKCRBYk24OLxtaTBr5B/4vmneqSuuMYmWcurgk2sv+WKky
81Q0z4OkXfwBVz+H6wdpmij0de6ZMbFqD6GjtsAMmEXKdQtbElcryibSXJSCcF6z
d534yOdkC0ptOH09thCE8SoZQ6QLQ+wkcqqCBQSNujN+TNG3L7a50p91wLg1AXYX
F+cOJ2bND8p3g5RjxGk4EEjTHycc9BMA1SRvAZsJG7WB63q1oKPwdVPy7FnNvV6H
OR1DJeh4Fkmq0cJCoQ6AOQ4AhVBRXv74XT+rnjVblT3ISSEyneF4IfsztGboIzac
7M/2czPyFWuID9mjiEcRbormFsV0Pz3huJ4AMlmCb/96ZKPAWQYVa7EmPy5Q
=SMJ5
-----END PGP PUBLIC KEY BLOCK-----
+29
View File
@@ -0,0 +1,29 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFhmClEBCACWlMzAd3Nm5WD8wwVcZB4mMGJNK41tOKvFxLTpQBuVLSU8Oebv
zzJx6cWTAylqMOEtI1K4q3BtxvQ9L7ofkY/N8tVRO0zSTjFhYaFYrpNAF4TY5pSa
RTjeCp1FOU+2dR50LC7ev3p8TWSDPITdzXAhTBPRNIy1zBRNo/2FkwHktSov3W51
Ej9f/g5iIuy2yVSwPzqxynXErgmwILXa3j40ZYXj1jEFeBoeLGzSPVbeFLknvS8B
4yMx6JLVvvK+IilKzFZ97kFcnYVVx8HvyyZZLYwGapI0BSWSK4GWt1SBt4KVEREZ
38SVtyGsCSX5PBBzv/zy+gO3HOsrXGzz0RbdABEBAAG0JkJlbiBXb29kY3JvZnQg
PGRvbnR0cnVzdGJlbkBnbWFpbC5jb20+iQE3BBMBCAAhBQJYZgpRAhsDBQsJCAcC
BhUICQoLAgQWAgMBAh4BAheAAAoJECpq2fSqwg32OuEH/iMyKHsHrS4upCAl+JBy
Bq4H7MWnZQYC/f4hc1RX1WKnVYZRYuX4GTZYR+sE3J60kpdhv3ZPby5Q8mNyZXkH
wf3sF8oNpqWK5LVdM32UChMQK7L7VTkMNG7lPAq1hfS0iLiaaDN366iQNv62u4eB
8dw933877jkeobr8hnTaBNmUf2s9eJm23Cmk81DNaEFLsIvVMEcmuiz4x8rLYG+7
o8usK7n684OI2DV0k90Xn876VZtFUg9PDxnHixlvzETo2D+C6HIIx8660YJHnogr
jNEP6Wj0CT1MoiZ/dMZepY1k+uNeyreSuXv2w/Y2qzbRM34ccXArYNyFV/a5KyAJ
i9e5AQ0EWGYKUQEIAMAnzONTpBbvK9KZ2cHh+zwAF83VDl3V6EVANbQWBV39V7Rh
+Dmpuro9RqZ5VyGD94nFyeUUIFUO8Uy8wT9CW9A7FD1zFe38bhb7oC0K1XeGYm/0
WMadUb3Zp42T2KCbWN4agH9B3CwhJ/WJEM5fRpTfGq2HMq5LGlLs0AlPCli582MJ
81tmoSzdnauVdtm+4llWCk/trpCag5TUed1pHFooOKIqSDmCnLei2cuXODj5Bdt1
O3yTErBRLZcHc/Ep32DYNDqlbyeWL1KDHj4Ckc4ietX/jqpExko/RuCIhBR1niKA
AYT3P31p82oPvX9Mz4Ro5nbdzeYfjODCljp3+AMAEQEAAYkBHwQYAQgACQUCWGYK
UQIbDAAKCRAqatn0qsIN9mn0B/48T6WI2PDGn79woGBoG6VWvV3JWrXW+tA45Zy/
XVEdSuDvFhMHZYwlFMr3ckhaX5Zi7NuHATIwONekIjtLusf8ievFbR4Ez4DzoN8h
FSe00vh0C0xaOzEkufPjanbtyVCfJgGPdHJ8alB4Wxq6INvg/UBrRW4sqEikaogk
52VCdLtLp5MnhJkmMIn0BvHkOyFs2DdKa/uld85cBwLiwSQpi4nj8EVIG77gYR5S
lSmS9m65DZYp2/r2x9b8uqkc40a/USdpP/M41Kj67iHnYcQrl6/9O2i1dYMONBql
60488V4ArDgWSZn3X5jO45flYE2S1mUc3vzfRl02Ms/JV+u5
=mgGB
-----END PGP PUBLIC KEY BLOCK-----
+185
View File
@@ -0,0 +1,185 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ugGwG9zObyWr6mj4fFA8ureXYA==
=1FKf
-----END PGP PUBLIC KEY BLOCK-----
-5
View File
@@ -1,5 +0,0 @@
#!/bin/sh
# Create the build system.
set -e -x
exec autoreconf -vfi
+51
View File
@@ -0,0 +1,51 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
S96bMw==
=UgjY
-----END PGP PUBLIC KEY BLOCK-----
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ihtSniwGIQ==
=75zi
-----END PGP PUBLIC KEY BLOCK-----
+31
View File
@@ -0,0 +1,31 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBF8JTDABCADIOK7ciRg/PGLYj8MRQa5SLuAgrcrJITXUI9cKOfJGtTJPGzLL
LrDD8RmkOU82GY3lFjkQ+MzQApT1NtBJe700G+kPhBGoSiDZCsEMJp0EepA+RhOH
EOybYHT5b83o3Yh1hfKnhJLhMfUmexuvwhxZs7baHSKnUAq0pJzv/YtyGYX7uqiM
50JmEoLazXrRyl61clofOfGgFid4BQssV+IeTb0v5r7l4Qv5PU1XQqvO30Hk8+2x
y/pBv0uJuNJUqtiaORm0caJjLp0rc76/E945Jh8n6e/NEOnmWDcgMf6RnkSTmE7I
LvjrlOzGSGFD9I5WyGQD8NvpXlNP3wNFnV07ABEBAAG0LkJyZXR0IEdpbGlvIChQ
cml2YXRlIEdQRyBLZXkpIDxicmV0dGdAZ251Lm9yZz6JAVQEEwEIAD4WIQToKsAm
ldb/AkPKHlz2xS3RuifLhwUCXwlMMAIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgID
AQIeAQIXgAAKCRD2xS3RuifLh75SB/9JZa+c7SWBk1GHIfIjBPJEKhX6fIjDvaH+
dQQY0BWnE79mFrZCbPBtnRKohnGvAwWbYR5xsJrJimsme+PmDoqRCWtbeFS6QIJx
Ig6iPBA/E7sSfbs6zaFz8E09AZt6xUWhFLMZNkuLU8JWFz8I/8jL32C3hRW/MKGe
h4BypjUzVBVsKDwWOAoYsKZHuhQF5gzQrh96AqTgMh/gzCR5Q78fxF335arht9c2
5WoXiYJn/NHeSNi12vQ2DtqhrkUWmN+dMbOGddaEk7JFbpmZhCUQFeK0LHyMnXCt
nyKVWcC0br/LtvyXr+W7dyA6SJ6xpEb72jqIi9GAw5pA1fTxapTruQENBF8JTDAB
CADBF+D4xd81wkxcyQlP8dhE+0NW269Y31pNx/qAZKVEzBbTqmrXWHSGf8CVZLJT
5oVOmC3nMIwRo/GuK7VTjRj7PruBcXpbqzuvMAk44SGtQIk81xca1+xrQT8xAs/+
fimxSgYeG5AoB6e+5KxHv7SjqwXjU3WE7gqz5lcUk5kBPfjo0UtzhReK3FePxcjF
NFNr3CCnNST6g6y70Nno89bKd0XcgwYtuwapVBxo9FSZza826+rj0UMsg+XCcerI
Yz6KREFb8hkkHi9zGSLgP26ONyFmYxM8qvfoDnHAjmuqlGFE00WTAh+qIIEFOzd+
GPgbM7xYHCbdXPOQZ+z2ZK9LABEBAAGJATwEGAEIACYWIQToKsAmldb/AkPKHlz2
xS3RuifLhwUCXwlMMAIbDAUJA8JnAAAKCRD2xS3RuifLh5LYB/9BArNzn//eTeDr
HyOBYpaoo8uF6k5k9Bsm4A8shr8uSagaj7JvOKiQM7Xp+loIVwJ2kUbM6dzY0Opn
SNlcr7cmP/a4LpRqDbdJVQidL+YeYuhjSdk49zmtA6fJ4KzMUZvc9wLQCRy6LHm7
zgc0Z3kYfuIY4tLIjkesuz3CzCS2sCYyHZWkuIDk2Y0S/unH16EsoFWzbl+hUL7C
kL8wTjBe6Ha1gcThdY0UaiSZBqLsRXHZWy9imOYyKZ6SO0K331MEyaOjS+/PAwbI
hE5/QrslksZwfdvMuL5mhI/RqEW/Ngzxg2LHjqdoUq0rk4aEiQ3zoeQSY4xY5rTe
o+dOFmwC
=xoG7
-----END PGP PUBLIC KEY BLOCK-----
+347
View File
@@ -0,0 +1,347 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ifj+ccdGYpikfv7KOzn2dvte
=lIl+
-----END PGP PUBLIC KEY BLOCK-----
-149
View File
@@ -1,149 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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 (build-self)
#:use-module (gnu)
#:use-module (guix)
#:use-module (guix config)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-19)
#:export (build))
;;; Commentary:
;;;
;;; When loaded, this module returns a monadic procedure of at least one
;;; argument: the source tree to build. It returns a derivation that
;;; builds it.
;;;
;;; This file uses modules provided by the already-installed Guix. Those
;;; modules may be arbitrarily old compared to the version we want to
;;; build. Because of that, it must rely on the smallest set of features
;;; that are likely to be provided by the (guix) and (gnu) modules, and by
;;; Guile itself, forever and ever.
;;;
;;; Code:
;; The dependencies. Don't refer explicitly to the variables because they
;; could be renamed or shuffled around in modules over time. Conversely,
;; 'find-best-packages-by-name' is expected to always have the same semantics.
(define libgcrypt
(first (find-best-packages-by-name "libgcrypt" #f)))
(define zlib
(first (find-best-packages-by-name "zlib" #f)))
(define gzip
(first (find-best-packages-by-name "gzip" #f)))
(define bzip2
(first (find-best-packages-by-name "bzip2" #f)))
(define xz
(first (find-best-packages-by-name "xz" #f)))
(define guile-json
(first (find-best-packages-by-name "guile-json" #f)))
;; The actual build procedure.
(define (top-source-directory)
"Return the name of the top-level directory of this source tree."
(and=> (assoc-ref (current-source-location) 'filename)
(lambda (file)
(string-append (dirname file) "/.."))))
(define (date-version-string)
"Return the current date and hour in UTC timezone, for use as a poor
person's version identifier."
;; XXX: Replace with a Git commit id.
(date->string (current-date 0) "~Y~m~d.~H"))
;; The procedure below is our return value.
(define* (build source
#:key verbose? (version (date-version-string))
#:allow-other-keys
#:rest rest)
"Return a derivation that unpacks SOURCE into STORE and compiles Scheme
files."
;; The '%xxxdir' variables were added to (guix config) in July 2016 so we
;; cannot assume that they are defined. Try to guess their value when
;; they're undefined (XXX: we get an incorrect guess when environment
;; variables such as 'NIX_STATE_DIR' are defined!).
(define storedir
(if (defined? '%storedir) %storedir %store-directory))
(define localstatedir
(if (defined? '%localstatedir) %localstatedir (dirname %state-directory)))
(define sysconfdir
(if (defined? '%sysconfdir) %sysconfdir (dirname %config-directory)))
(define sbindir
(if (defined? '%sbindir) %sbindir (dirname %guix-register-program)))
(define builder
#~(begin
(use-modules (guix build pull))
(let ((json (string-append #$guile-json "/share/guile/site/2.0")))
(set! %load-path (cons json %load-path))
(set! %load-compiled-path (cons json %load-compiled-path)))
(build-guix #$output #$source
#:system #$%system
#:storedir #$storedir
#:localstatedir #$localstatedir
#:sysconfdir #$sysconfdir
#:sbindir #$sbindir
#:package-name #$%guix-package-name
#:package-version #$version
#:bug-report-address #$%guix-bug-report-address
#:home-page-url #$%guix-home-page-url
#:libgcrypt #$libgcrypt
#:zlib #$zlib
#:gzip #$gzip
#:bzip2 #$bzip2
#:xz #$xz
;; XXX: This is not perfect, enabling VERBOSE? means
;; building a different derivation.
#:debug-port (if #$verbose?
(current-error-port)
(%make-void-port "w")))))
(gexp->derivation "guix-latest" builder
#:modules '((guix build pull)
(guix build utils))
;; Arrange so that our own (guix build …) modules are
;; used.
#:module-path (list (top-source-directory))))
;; This file is loaded by 'guix pull'; return it the build procedure.
build
;; Local Variables:
;; eval: (put 'with-load-path 'scheme-indent-function 1)
;; End:
;;; build-self.scm ends here
-55
View File
@@ -1,55 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;;
;;; Check whether important binaries are available at hydra.gnu.org.
;;;
(use-modules (guix store)
(guix grafts)
(guix packages)
(guix derivations)
(gnu packages emacs)
(gnu packages make-bootstrap)
(srfi srfi-1)
(srfi srfi-26)
(ice-9 format))
(with-store store
(parameterize ((%graft? #f))
(let* ((native (append-map (lambda (system)
(map (cut package-derivation store <> system)
(list %bootstrap-tarballs emacs)))
%hydra-supported-systems))
(cross (map (cut package-cross-derivation store
%bootstrap-tarballs <>)
'("mips64el-linux-gnuabi64")))
(total (append native cross)))
(set-build-options store #:use-substitutes? #t)
(let* ((total (map derivation->output-path total))
(available (substitutable-paths store total))
(missing (lset-difference string=? total available)))
(if (null? missing)
(format (current-error-port)
"~a packages found substitutable on~{ ~a~}~%"
(length total) %hydra-supported-systems)
(format (current-error-port)
"~a packages are not substitutable:~%~{ ~a~%~}~%"
(length missing) missing))
(exit (null? missing))))))
@@ -1,82 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;;
;;; Check whether important binaries are available at hydra.gnu.org.
;;;
(use-modules (guix store)
(guix grafts)
(guix packages)
(guix derivations)
(guix ui)
(gnu packages commencement)
(ice-9 match)
(srfi srfi-1)
(srfi srfi-26))
(define (final-inputs store system)
"Return the list of outputs directories of the final inputs for SYSTEM."
(append-map (match-lambda
((name package)
(let ((drv (package-derivation store package system)))
;; Libc's 'debug' output refers to gcc-cross-boot0, but it's
;; hard to avoid, so we tolerate it. This should be the
;; only exception.
(filter-map (match-lambda
(("debug" . directory)
(if (string=? "glibc" (package-name package))
#f
directory))
((_ . directory) directory))
(derivation->output-paths drv)))))
%final-inputs))
(define (assert-valid-substitute substitute)
"Make sure SUBSTITUTE does not refer to any bootstrap inputs, and bail out
if it does."
(let ((references (substitutable-references substitute)))
(when (any (cut string-contains <> "boot") references)
(leave (_ "'~a' refers to bootstrap inputs: ~s~%")
(substitutable-path substitute) references))))
(define (test-final-inputs store system)
"Check whether the final inputs for SYSTEM are clean---i.e., they don't
refer to the bootstrap tools."
(format #t "checking final inputs for '~a'...~%" system)
(let* ((inputs (final-inputs store system))
(available (substitutable-path-info store inputs)))
(for-each (lambda (dir)
(unless (find (lambda (substitute)
(string=? (substitutable-path substitute)
dir))
available)
(leave (_ "~a (system: ~a) has no substitute~%")
dir system)))
inputs)
(for-each assert-valid-substitute available)))
;; Entry point.
(with-store store
(parameterize ((%graft? #f))
(set-build-options store #:use-substitutes? #t)
(for-each (cut test-final-inputs store <>)
%hydra-supported-systems)))
-90
View File
@@ -1,90 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
(use-modules (system base target)
(system base message)
(ice-9 match)
(ice-9 threads)
(guix build utils))
(define warnings
'(unsupported-warning format unbound-variable arity-mismatch))
(define host (getenv "host"))
(define srcdir (getenv "srcdir"))
(define (relative-file file)
(if (string-prefix? (string-append srcdir "/") file)
(string-drop file (+ 1 (string-length srcdir)))
file))
(define (file-mtime<? f1 f2)
(< (stat:mtime (stat f1))
(stat:mtime (stat f2))))
(define (scm->go file)
(let* ((relative (relative-file file))
(without-extension (string-drop-right relative 4)))
(string-append without-extension ".go")))
(define (file-needs-compilation? file)
(let ((go (scm->go file)))
(or (not (file-exists? go))
(file-mtime<? go file))))
(define (file->module file)
(let* ((relative (relative-file file))
(module-path (string-drop-right relative 4)))
(map string->symbol
(string-split module-path #\/))))
;;; To work around <http://bugs.gnu.org/15602> (FIXME), we want to load all
;;; files to be compiled first. We do this via resolve-interface so that the
;;; top-level of each file (module) is only executed once.
(define (load-module-file file)
(let ((module (file->module file)))
(format #t " LOAD ~a~%" module)
(resolve-interface module)))
(define (compile-file* file output-mutex)
(let ((go (scm->go file)))
(with-mutex output-mutex
(format #t " GUILEC ~a~%" go)
(force-output))
(mkdir-p (dirname go))
(with-fluids ((*current-warning-prefix* ""))
(with-target host
(lambda ()
(compile-file file
#:output-file go
#:opts `(#:warnings ,warnings)))))))
(match (command-line)
((_ . files)
(let ((files (filter file-needs-compilation? files)))
(for-each load-module-file files)
(let ((mutex (make-mutex)))
(par-for-each (lambda (file)
(compile-file* file mutex))
files)))))
;;; Local Variables:
;;; eval: (put 'with-target 'scheme-indent-function 1)
;;; End:
-74
View File
@@ -1,74 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
;;;
;;; 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/>.
;;;
;;; Download a binary file from an external source.
;;;
(use-modules (ice-9 match)
(web uri)
(web client)
(rnrs io ports)
(srfi srfi-11)
(guix utils)
(guix hash))
(define %url-base
"http://alpha.gnu.org/gnu/guix/bootstrap"
;; Alternately:
;;"http://www.fdn.fr/~lcourtes/software/guix/packages"
)
;; XXX: Work around <http://bugs.gnu.org/13095>, present in Guile
;; up to 2.0.7.
(module-define! (resolve-module '(web client))
'shutdown (const #f))
(define (file-name->uri file)
"Return the URI for FILE."
(match (string-tokenize file (char-set-complement (char-set #\/)))
((_ ... system basename)
(string->uri (string-append %url-base "/" system
(match system
("armhf-linux"
"/20150101/")
(_
"/20131110/"))
basename)))))
(match (command-line)
((_ file expected-hash)
(let ((uri (file-name->uri file)))
(format #t "downloading file `~a'~%from `~a'...~%"
file (uri->string uri))
(let*-values (((resp data) (http-get uri #:decode-body? #f))
((hash) (bytevector->base16-string (sha256 data)))
((part) (string-append file ".part")))
(if (string=? expected-hash hash)
(begin
(call-with-output-file part
(lambda (port)
(put-bytevector port data)))
(rename-file part file))
(begin
(format (current-error-port)
"file at `~a' has SHA256 ~a; expected ~a~%"
(uri->string uri) hash expected-hash)
(exit 1)))))))
-120
View File
@@ -1,120 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;;;
;;; 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/>.
;;;
;;; Generate AUTHORS file for directory with the Guix git repository.
;;;
(use-modules
(ice-9 popen)
(ice-9 rdelim)
(ice-9 match)
(srfi srfi-1)
(guix config)
(guix utils)
(guix build utils))
(define %guix-dir
(make-parameter #f))
(define-syntax-rule (append-maybe init-lst (test add-lst) ...)
(let* ((lst init-lst)
(lst (if test
(append lst add-lst)
lst))
...)
lst))
(define (command-output cmd . args)
"Execute CMD with ARGS and return its output without trailing newspace."
(let* ((port (apply open-pipe* OPEN_READ cmd args))
(output (read-string port)))
(close-port port)
(string-trim-right output #\newline)))
(define (git-output . args)
"Execute git command with ARGS and return its output without trailing
newspace."
(with-directory-excursion (%guix-dir)
(apply command-output "git" args)))
(define* (contributors-string #:optional (range "HEAD"))
"Return a string with names of people contributed to commit RANGE."
(git-output "shortlog" "--numbered" "--summary" "--email" range))
(define* (tags #:key pattern sort)
"Return a list of the git repository tags.
PATTERN is passed to '--list' and SORT is passed to '--sort' options of
'git tag' command."
(let* ((args (append-maybe
'("tag")
(pattern (list "--list" pattern))
(sort (list "--sort" sort))))
(output (apply git-output args)))
(string-split output #\newline)))
(define (version-tags)
"Return only version tags (v0.8, etc.) sorted from the biggest version
to the smallest one."
(tags #:pattern "v*"
#:sort "-version:refname"))
(define (generate-authors-file file)
"Generate authors FILE."
(define previous-release-tag
(find (lambda (tag)
(version>? %guix-version
(substring tag 1))) ; remove leading 'v'
(version-tags)))
(define release-range
(string-append previous-release-tag "..HEAD"))
(with-output-to-file file
(lambda ()
(display "\
GNU Guix consists of Scheme code that implements the deployment model
of the Nix package management tool. In fact, it currently talks to a
build daemon whose code comes from Nix (see the manual for details.)
Nix was initially written by Eelco Dolstra; other people have been
contributing to it. See `nix/AUTHORS' for details.\n\n")
(format #t "Contributors to GNU Guix ~a:\n\n"
%guix-version)
(display (contributors-string release-range))
(newline) (newline)
(display "Overall contributors:\n\n")
(display (contributors-string))
(newline))))
(define (show-help)
(match (command-line)
((me _ ...)
(format #t "Usage: guile ~a DIRECTORY AUTHORS
Generate AUTHORS file for DIRECTORY with the Guix git repository.\n"
me))))
(match (command-line)
((_ guix-dir authors-file)
(parameterize ((%guix-dir guix-dir))
(generate-authors-file authors-file)))
(_
(show-help)
(exit 1)))
;;; generate-authors.scm ends here
-432
View File
@@ -1,432 +0,0 @@
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
& eval 'exec perl -wS "$0" $argv:q'
if 0;
# Convert git log output to ChangeLog format.
my $VERSION = '2012-07-29 06:11'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
# do its job. Otherwise, update this string manually.
# Copyright (C) 2008-2013 Free Software Foundation, Inc.
# This program 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.
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
# Written by Jim Meyering
use strict;
use warnings;
use Getopt::Long;
use POSIX qw(strftime);
(my $ME = $0) =~ s|.*/||;
# use File::Coda; # http://meyering.net/code/Coda/
END {
defined fileno STDOUT or return;
close STDOUT and return;
warn "$ME: failed to close standard output: $!\n";
$? ||= 1;
}
sub usage ($)
{
my ($exit_code) = @_;
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
if ($exit_code != 0)
{
print $STREAM "Try '$ME --help' for more information.\n";
}
else
{
print $STREAM <<EOF;
Usage: $ME [OPTIONS] [ARGS]
Convert git log output to ChangeLog format. If present, any ARGS
are passed to "git log". To avoid ARGS being parsed as options to
$ME, they may be preceded by '--'.
OPTIONS:
--amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
makes a change to SHA1's commit log text or metadata.
--append-dot append a dot to the first line of each commit message if
there is no other punctuation or blank at the end.
--no-cluster never cluster commit messages under the same date/author
header; the default is to cluster adjacent commit messages
if their headers are the same and neither commit message
contains multiple paragraphs.
--srcdir=DIR the root of the source tree, from which the .git/
directory can be derived.
--since=DATE convert only the logs since DATE;
the default is to convert all log entries.
--format=FMT set format string for commit subject and body;
see 'man git-log' for the list of format metacharacters;
the default is '%s%n%b%n'
--strip-tab remove one additional leading TAB from commit message lines.
--strip-cherry-pick remove data inserted by "git cherry-pick";
this includes the "cherry picked from commit ..." line,
and the possible final "Conflicts:" paragraph.
--help display this help and exit
--version output version information and exit
EXAMPLE:
$ME --since=2008-01-01 > ChangeLog
$ME -- -n 5 foo > last-5-commits-to-branch-foo
SPECIAL SYNTAX:
The following types of strings are interpreted specially when they appear
at the beginning of a log message line. They are not copied to the output.
Copyright-paperwork-exempt: Yes
Append the "(tiny change)" notation to the usual "date name email"
ChangeLog header to mark a change that does not require a copyright
assignment.
Co-authored-by: Joe User <user\@example.com>
List the specified name and email address on a second
ChangeLog header, denoting a co-author.
Signed-off-by: Joe User <user\@example.com>
These lines are simply elided.
In a FILE specified via --amend, comment lines (starting with "#") are ignored.
FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
a line) referring to a commit in the current project, and CODE refers to one
or more consecutive lines of Perl code. Pairs must be separated by one or
more blank line.
Here is sample input for use with --amend=FILE, from coreutils:
3a169f4c5d9159283548178668d2fae6fced3030
# fix typo in title:
s/all tile types/all file types/
1379ed974f1fa39b12e2ffab18b3f7a607082202
# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
# Change the author to be Paul. Note the escaped "@":
s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
EOF
}
exit $exit_code;
}
# If the string $S is a well-behaved file name, simply return it.
# If it contains white space, quotes, etc., quote it, and return the new string.
sub shell_quote($)
{
my ($s) = @_;
if ($s =~ m![^\w+/.,-]!)
{
# Convert each single quote to '\''
$s =~ s/\'/\'\\\'\'/g;
# Then single quote the string.
$s = "'$s'";
}
return $s;
}
sub quoted_cmd(@)
{
return join (' ', map {shell_quote $_} @_);
}
# Parse file F.
# Comment lines (starting with "#") are ignored.
# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
# (alone on a line) referring to a commit in the current project, and
# CODE refers to one or more consecutive lines of Perl code.
# Pairs must be separated by one or more blank line.
sub parse_amend_file($)
{
my ($f) = @_;
open F, '<', $f
or die "$ME: $f: failed to open for reading: $!\n";
my $fail;
my $h = {};
my $in_code = 0;
my $sha;
while (defined (my $line = <F>))
{
$line =~ /^\#/
and next;
chomp $line;
$line eq ''
and $in_code = 0, next;
if (!$in_code)
{
$line =~ /^([0-9a-fA-F]{40})$/
or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
$fail = 1, next;
$sha = lc $1;
$in_code = 1;
exists $h->{$sha}
and (warn "$ME: $f:$.: duplicate SHA1\n"),
$fail = 1, next;
}
else
{
$h->{$sha} ||= '';
$h->{$sha} .= "$line\n";
}
}
close F;
$fail
and exit 1;
return $h;
}
# git_dir_option $SRCDIR
#
# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
# is undef). Return as a list (0 or 1 element).
sub git_dir_option($)
{
my ($srcdir) = @_;
my @res = ();
if (defined $srcdir)
{
my $qdir = shell_quote $srcdir;
my $cmd = "cd $qdir && git rev-parse --show-toplevel";
my $qcmd = shell_quote $cmd;
my $git_dir = qx($cmd);
defined $git_dir
or die "$ME: cannot run $qcmd: $!\n";
$? == 0
or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
chomp $git_dir;
push @res, "--git-dir=$git_dir/.git";
}
@res;
}
{
my $since_date;
my $format_string = '%s%n%b%n';
my $amend_file;
my $append_dot = 0;
my $cluster = 1;
my $strip_tab = 0;
my $strip_cherry_pick = 0;
my $srcdir;
GetOptions
(
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
'since=s' => \$since_date,
'format=s' => \$format_string,
'amend=s' => \$amend_file,
'append-dot' => \$append_dot,
'cluster!' => \$cluster,
'strip-tab' => \$strip_tab,
'strip-cherry-pick' => \$strip_cherry_pick,
'srcdir=s' => \$srcdir,
) or usage 1;
defined $since_date
and unshift @ARGV, "--since=$since_date";
# This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
# that makes a correction in the log or attribution of that commit.
my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
my @cmd = ('git',
git_dir_option $srcdir,
qw(log --log-size),
'--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV);
open PIPE, '-|', @cmd
or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
. "(Is your Git too old? Version 1.5.1 or later is required.)\n");
my $prev_multi_paragraph;
my $prev_date_line = '';
my @prev_coauthors = ();
while (1)
{
defined (my $in = <PIPE>)
or last;
$in =~ /^log size (\d+)$/
or die "$ME:$.: Invalid line (expected log size):\n$in";
my $log_nbytes = $1;
my $log;
my $n_read = read PIPE, $log, $log_nbytes;
$n_read == $log_nbytes
or die "$ME:$.: unexpected EOF\n";
# Extract leading hash.
my ($sha, $rest) = split ':', $log, 2;
defined $sha
or die "$ME:$.: malformed log entry\n";
$sha =~ /^[0-9a-fA-F]{40}$/
or die "$ME:$.: invalid SHA1: $sha\n";
# If this commit's log requires any transformation, do it now.
my $code = $amend_code->{$sha};
if (defined $code)
{
eval 'use Safe';
my $s = new Safe;
# Put the unpreprocessed entry into "$_".
$_ = $rest;
# Let $code operate on it, safely.
my $r = $s->reval("$code")
or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
# Note that we've used this entry.
delete $amend_code->{$sha};
# Update $rest upon success.
$rest = $_;
}
# Remove lines inserted by "git cherry-pick".
if ($strip_cherry_pick)
{
$rest =~ s/^\s*Conflicts:\n.*//sm;
$rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
}
my @line = split "\n", $rest;
my $author_line = shift @line;
defined $author_line
or die "$ME:$.: unexpected EOF\n";
$author_line =~ /^(\d+) (.*>)$/
or die "$ME:$.: Invalid line "
. "(expected date/author/email):\n$author_line\n";
# Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
# `(tiny change)' annotation.
my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
? ' (tiny change)' : '');
my $date_line = sprintf "%s %s$tiny\n",
strftime ("%F", localtime ($1)), $2;
my @coauthors = grep /^Co-authored-by:.*$/, @line;
# Omit meta-data lines we've already interpreted.
@line = grep !/^(?:Signed-off-by:[ ].*>$
|Co-authored-by:[ ]
|Copyright-paperwork-exempt:[ ]
)/x, @line;
# Remove leading and trailing blank lines.
if (@line)
{
while ($line[0] =~ /^\s*$/) { shift @line; }
while ($line[$#line] =~ /^\s*$/) { pop @line; }
}
# Record whether there are two or more paragraphs.
my $multi_paragraph = grep /^\s*$/, @line;
# Format 'Co-authored-by: A U Thor <email@example.com>' lines in
# standard multi-author ChangeLog format.
for (@coauthors)
{
s/^Co-authored-by:\s*/\t /;
s/\s*</ </;
/<.*?@.*\..*>/
or warn "$ME: warning: missing email address for "
. substr ($_, 5) . "\n";
}
# If clustering of commit messages has been disabled, if this header
# would be different from the previous date/name/email/coauthors header,
# or if this or the previous entry consists of two or more paragraphs,
# then print the header.
if ( ! $cluster
|| $date_line ne $prev_date_line
|| "@coauthors" ne "@prev_coauthors"
|| $multi_paragraph
|| $prev_multi_paragraph)
{
$prev_date_line eq ''
or print "\n";
print $date_line;
@coauthors
and print join ("\n", @coauthors), "\n";
}
$prev_date_line = $date_line;
@prev_coauthors = @coauthors;
$prev_multi_paragraph = $multi_paragraph;
# If there were any lines
if (@line == 0)
{
warn "$ME: warning: empty commit message:\n $date_line\n";
}
else
{
if ($append_dot)
{
# If the first line of the message has enough room, then
if (length $line[0] < 72)
{
# append a dot if there is no other punctuation or blank
# at the end.
$line[0] =~ /[[:punct:]\s]$/
or $line[0] .= '.';
}
}
# Remove one additional leading TAB from each line.
$strip_tab
and map { s/^\t// } @line;
# Prefix each non-empty line with a TAB.
@line = map { length $_ ? "\t$_" : '' } @line;
print "\n", join ("\n", @line), "\n";
}
defined ($in = <PIPE>)
or last;
$in ne "\n"
and die "$ME:$.: unexpected line:\n$in";
}
close PIPE
or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
# FIXME-someday: include $PROCESS_STATUS in the diagnostic
# Complain about any unused entry in the --amend=F specified file.
my $fail = 0;
foreach my $sha (keys %$amend_code)
{
warn "$ME:$amend_file: unused entry: $sha\n";
$fail = 1;
}
exit $fail;
}
# Local Variables:
# mode: perl
# indent-tabs-mode: nil
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "my $VERSION = '"
# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "'; # UTC"
# End:
-84
View File
@@ -1,84 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;;
;;; This file defines an operating system configuration for the demo virtual
;;; machine images that we build.
;;;
(use-modules (gnu))
(use-service-modules desktop xorg networking avahi dbus)
(use-package-modules linux xorg tor avahi)
(operating-system
(host-name "gnu")
(timezone "Europe/Paris")
(locale "en_US.utf8")
(bootloader (grub-configuration
(device "/dev/sda")))
(file-systems
;; We provide a dummy file system for /, but that's OK because the VM build
;; code will automatically declare the / file system for us.
(cons* (file-system
(mount-point "/")
(device "dummy")
(type "dummy"))
;; %fuse-control-file-system ; needs fuse.ko
;; %binary-format-file-system ; needs binfmt.ko
%base-file-systems))
(users (list (user-account
(name "guest")
(group "users")
(supplementary-groups '("wheel")) ; allow use of sudo
(password "")
(comment "Guest of GNU")
(home-directory "/home/guest"))))
(issue "
This is an alpha preview of the GNU system. Welcome.
This image features the GNU Guix package manager, which was used to
build it (http://www.gnu.org/software/guix/). The init system is
the GNU Shepherd (http://www.gnu.org/software/shepherd/).
You can log in as 'guest' or 'root' with no password.
")
(services (cons* (slim-service #:auto-login? #t
#:default-user "guest")
;; QEMU networking settings.
(static-networking-service "eth0" "10.0.2.10"
#:name-servers '("10.0.2.3")
#:gateway "10.0.2.2")
(avahi-service)
(dbus-service)
(tor-service)
%base-services))
(pam-services
;; Explicitly allow for empty passwords.
(base-pam-services #:allow-empty-passwords? #t))
(packages (cons* strace
tor torsocks
xterm avahi %base-packages)))
-111
View File
@@ -1,111 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;; This program replicates the behavior of Hydra's 'hydra-eval-guile-job'.
;;; It evaluates the Hydra job defined by the program passed as its first
;;; arguments and outputs an sexp of the jobs on standard output.
(use-modules (guix store)
(srfi srfi-19)
(ice-9 match)
(ice-9 pretty-print)
(ice-9 format))
(define %user-module
;; Hydra user module.
(let ((m (make-module)))
(beautify-user-module! m)
m))
(define (call-with-time thunk kont)
"Call THUNK and pass KONT the elapsed time followed by THUNK's return
values."
(let* ((start (current-time time-monotonic))
(result (call-with-values thunk list))
(end (current-time time-monotonic)))
(apply kont (time-difference end start) result)))
(define (call-with-time-display thunk)
"Call THUNK and write to the current output port its duration."
(call-with-time thunk
(lambda (time . results)
(format #t "~,3f seconds~%"
(+ (time-second time)
(/ (time-nanosecond time) 1e9)))
(apply values results))))
(define (assert-valid-job job thing)
"Raise an error if THING is not an alist with a valid 'derivation' entry.
Otherwise return THING."
(unless (and (list? thing)
(and=> (assoc-ref thing 'derivation)
(lambda (value)
(and (string? value)
(string-suffix? ".drv" value)))))
(error "job did not produce a valid alist" job thing))
thing)
;; Without further ado...
(match (command-line)
((command file)
;; Load FILE, a Scheme file that defines Hydra jobs.
(let ((port (current-output-port)))
(save-module-excursion
(lambda ()
(set-current-module %user-module)
(primitive-load file)))
(with-store store
;; Make sure we don't resort to substitutes.
(set-build-options store
#:use-substitutes? #f
#:substitute-urls '())
;; Grafts can trigger early builds. We do not want that to happen
;; during evaluation, so use a sledgehammer to catch such problems.
(set! build-things
(lambda (store . args)
(format (current-error-port)
"error: trying to build things during evaluation!~%")
(format (current-error-port)
"'build-things' arguments: ~s~%" args)
(exit 1)))
;; Call the entry point of FILE and print the resulting job sexp.
(pretty-print
(match ((module-ref %user-module 'hydra-jobs) store '())
(((names . thunks) ...)
(map (lambda (job thunk)
(format (current-error-port) "evaluating '~a'... " job)
(force-output (current-error-port))
(cons job
(assert-valid-job job
(call-with-time-display thunk))))
names thunks)))
port))))
((command _ ...)
(format (current-error-port) "Usage: ~a FILE
Evaluate the Hydra jobs defined in FILE.~%"
command)
(exit 1)))
;;; Local Variables:
;;; eval: (put 'call-with-time 'scheme-indent-function 1)
;;; End:
-323
View File
@@ -1,323 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;;
;;; This file defines build jobs for the Hydra continuation integration
;;; tool.
;;;
;; Attempt to use our very own Guix modules.
(eval-when (compile load eval)
;; Ignore any available .go, and force recompilation. This is because our
;; checkout in the store has mtime set to the epoch, and thus .go files look
;; newer, even though they may not correspond.
(set! %fresh-auto-compile #t)
(and=> (assoc-ref (current-source-location) 'filename)
(lambda (file)
(let ((dir (string-append (dirname file) "/../..")))
(format (current-error-port) "prepending ~s to the load path~%"
dir)
(set! %load-path (cons dir %load-path))))))
(use-modules (guix config)
(guix store)
(guix grafts)
(guix packages)
(guix derivations)
(guix monads)
((guix licenses) #:select (gpl3+))
((guix utils) #:select (%current-system))
((guix scripts system) #:select (read-operating-system))
(gnu packages)
(gnu packages gcc)
(gnu packages base)
(gnu packages gawk)
(gnu packages guile)
(gnu packages gettext)
(gnu packages compression)
(gnu packages multiprecision)
(gnu packages make-bootstrap)
(gnu packages commencement)
(gnu packages package-management)
(gnu system)
(gnu system vm)
(gnu system install)
(gnu tests)
(srfi srfi-1)
(srfi srfi-26)
(ice-9 match))
;; XXX: Debugging hack: since `hydra-eval-guile-jobs' redirects the output
;; port to the bit bucket, let us write to the error port instead.
(setvbuf (current-error-port) _IOLBF)
(set-current-output-port (current-error-port))
(define* (package->alist store package system
#:optional (package-derivation package-derivation))
"Convert PACKAGE to an alist suitable for Hydra."
(parameterize ((%graft? #f))
`((derivation . ,(derivation-file-name
(package-derivation store package system
#:graft? #f)))
(description . ,(package-synopsis package))
(long-description . ,(package-description package))
(license . ,(package-license package))
(home-page . ,(package-home-page package))
(maintainers . ("bug-guix@gnu.org"))
(max-silent-time . ,(or (assoc-ref (package-properties package)
'max-silent-time)
3600)) ;1 hour by default
(timeout . ,(or (assoc-ref (package-properties package) 'timeout)
72000))))) ;20 hours by default
(define (package-job store job-name package system)
"Return a job called JOB-NAME that builds PACKAGE on SYSTEM."
(let ((job-name (symbol-append job-name (string->symbol ".")
(string->symbol system))))
`(,job-name . ,(cut package->alist store package system))))
(define (package-cross-job store job-name package target system)
"Return a job called TARGET.JOB-NAME that cross-builds PACKAGE for TARGET on
SYSTEM."
`(,(symbol-append (string->symbol target) (string->symbol ".") job-name
(string->symbol ".") (string->symbol system)) .
,(cute package->alist store package system
(lambda* (store package system #:key graft?)
(package-cross-derivation store package target system
#:graft? graft?)))))
(define %core-packages
;; Note: Don't put the '-final' package variants because (1) that's
;; implicit, and (2) they cannot be cross-built (due to the explicit input
;; chain.)
(list gcc-4.8 gcc-4.9 gcc-5 glibc binutils
gmp mpfr mpc coreutils findutils diffutils patch sed grep
gawk gnu-gettext hello guile-2.0 zlib gzip xz
%bootstrap-binaries-tarball
%binutils-bootstrap-tarball
%glibc-bootstrap-tarball
%gcc-bootstrap-tarball
%guile-bootstrap-tarball
%bootstrap-tarballs))
(define %packages-to-cross-build
%core-packages)
(define %cross-targets
'("mips64el-linux-gnu"
"mips64el-linux-gnuabi64"))
(define (demo-os)
"Return the \"demo\" 'operating-system' structure."
(let* ((dir (dirname (assoc-ref (current-source-location) 'filename)))
(file (string-append dir "/demo-os.scm")))
(read-operating-system file)))
(define %guixsd-supported-systems
'("x86_64-linux" "i686-linux"))
(define (qemu-jobs store system)
"Return a list of jobs that build QEMU images for SYSTEM."
(define (->alist drv)
`((derivation . ,(derivation-file-name drv))
(description . "Stand-alone QEMU image of the GNU system")
(long-description . "This is a demo stand-alone QEMU image of the GNU
system.")
(license . ,gpl3+)
(home-page . ,%guix-home-page-url)
(maintainers . ("bug-guix@gnu.org"))))
(define (->job name drv)
(let ((name (symbol-append name (string->symbol ".")
(string->symbol system))))
`(,name . ,(lambda ()
(parameterize ((%graft? #f))
(->alist drv))))))
(define MiB
(expt 2 20))
(if (member system %guixsd-supported-systems)
(list (->job 'qemu-image
(run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(system-qemu-image (demo-os)
#:disk-image-size
(* 1400 MiB))))) ; 1.4 GiB
(->job 'usb-image
(run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(system-disk-image installation-os
#:disk-image-size
(* 1024 MiB))))))
'()))
(define (system-test-jobs store system)
"Return a list of jobs for the system tests."
(define (test->thunk test)
(lambda ()
(define drv
(run-with-store store
(mbegin %store-monad
(set-current-system system)
(set-grafting #f)
(set-guile-for-build (default-guile))
(system-test-value test))))
`((derivation . ,(derivation-file-name drv))
(description . ,(format #f "GuixSD '~a' system test"
(system-test-name test)))
(long-description . ,(system-test-description test))
(license . ,gpl3+)
(home-page . ,%guix-home-page-url)
(maintainers . ("bug-guix@gnu.org")))))
(define (->job test)
(let ((name (string->symbol
(string-append "test." (system-test-name test)
"." system))))
(cons name (test->thunk test))))
(if (member system %guixsd-supported-systems)
(map ->job (all-system-tests))
'()))
(define (tarball-jobs store system)
"Return Hydra jobs to build the self-contained Guix binary tarball."
(define (->alist drv)
`((derivation . ,(derivation-file-name drv))
(description . "Stand-alone binary Guix tarball")
(long-description . "This is a tarball containing binaries of Guix and
all its dependencies, and ready to be installed on non-GuixSD distributions.")
(license . ,gpl3+)
(home-page . ,%guix-home-page-url)
(maintainers . ("bug-guix@gnu.org"))))
(define (->job name drv)
(let ((name (symbol-append name (string->symbol ".")
(string->symbol system))))
`(,name . ,(lambda ()
(parameterize ((%graft? #f))
(->alist drv))))))
;; XXX: Add a job for the stable Guix?
(list (->job 'binary-tarball
(run-with-store store
(mbegin %store-monad
(set-guile-for-build (default-guile))
(self-contained-tarball))
#:system system))))
(define job-name
;; Return the name of a package's job.
(compose string->symbol package-full-name))
(define package->job
(let ((base-packages
(delete-duplicates
(append-map (match-lambda
((_ package _ ...)
(match (package-transitive-inputs package)
(((_ inputs _ ...) ...)
inputs))))
%final-inputs))))
(lambda (store package system)
"Return a job for PACKAGE on SYSTEM, or #f if this combination is not
valid."
(cond ((member package base-packages)
#f)
((supported-package? package system)
(package-job store (job-name package) package system))
(else
#f)))))
;;;
;;; Hydra entry point.
;;;
(define (hydra-jobs store arguments)
"Return Hydra jobs."
(define subset
(match (assoc-ref arguments 'subset)
("core" 'core) ; only build core packages
(_ 'all))) ; build everything
(define (cross-jobs system)
(define (from-32-to-64? target)
;; Return true if SYSTEM is 32-bit and TARGET is 64-bit. This hack
;; prevents known-to-fail cross-builds from i686-linux or armhf-linux to
;; mips64el-linux-gnuabi64.
(and (or (string-prefix? "i686-" system)
(string-prefix? "armhf-" system))
(string-suffix? "64" target)))
(define (same? target)
;; Return true if SYSTEM and TARGET are the same thing. This is so we
;; don't try to cross-compile to 'mips64el-linux-gnu' from
;; 'mips64el-linux'.
(string-contains target system))
(define (either proc1 proc2)
(lambda (x)
(or (proc1 x) (proc2 x))))
(append-map (lambda (target)
(map (lambda (package)
(package-cross-job store (job-name package)
package target system))
%packages-to-cross-build))
(remove (either from-32-to-64? same?) %cross-targets)))
;; Turn off grafts. Grafting is meant to happen on the user's machines.
(parameterize ((%graft? #f))
;; Return one job for each package, except bootstrap packages.
(append-map (lambda (system)
(case subset
((all)
;; Build everything, including replacements.
(let ((all (fold-packages
(lambda (package result)
(if (package-replacement package)
(cons* package
(package-replacement package)
result)
(cons package result)))
'()))
(job (lambda (package)
(package->job store package
system))))
(append (filter-map job all)
(qemu-jobs store system)
(system-test-jobs store system)
(tarball-jobs store system)
(cross-jobs system))))
((core)
;; Build core packages only.
(append (map (lambda (package)
(package-job store (job-name package)
package system))
%core-packages)
(cross-jobs system)))
(else
(error "unknown subset" subset))))
%hydra-supported-systems)))
-117
View File
@@ -1,117 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;;
;;; This file defines build jobs of Guix itself for the Hydra continuation
;;; integration tool.
;;;
;; Attempt to use our very own Guix modules.
(eval-when (compile load eval)
;; Ignore any available .go, and force recompilation. This is because our
;; checkout in the store has mtime set to the epoch, and thus .go files look
;; newer, even though they may not correspond.
(set! %fresh-auto-compile #t)
;; Display which files are loaded.
(set! %load-verbosely #t)
(and=> (assoc-ref (current-source-location) 'filename)
(lambda (file)
(let ((dir (string-append (dirname file) "/../..")))
(format (current-error-port) "prepending ~s to the load path~%"
dir)
(set! %load-path (cons dir %load-path))))))
(use-modules (guix store)
(guix packages)
(guix utils)
(guix derivations)
(guix build-system gnu)
(gnu packages version-control)
(gnu packages package-management)
(gnu packages imagemagick)
(gnu packages graphviz)
(gnu packages man)
(srfi srfi-1)
(srfi srfi-26)
(ice-9 match))
;; XXX: Debugging hack: since `hydra-eval-guile-jobs' redirects the output
;; port to the bit bucket, let us write to the error port instead.
(setvbuf (current-error-port) _IOLBF)
(set-current-output-port (current-error-port))
(define* (package->alist store package system
#:optional (package-derivation package-derivation))
"Convert PACKAGE to an alist suitable for Hydra."
`((derivation . ,(derivation-file-name
(package-derivation store package system)))
(description . ,(package-synopsis package))
(long-description . ,(package-description package))
(license . ,(package-license package))
(home-page . ,(package-home-page package))
(maintainers . ("bug-guix@gnu.org"))))
(define (tarball-package checkout)
"Return a package that does `make distcheck' from CHECKOUT, a directory
containing a Git checkout of Guix."
(let ((guix (@@ (gnu packages package-management) guix)))
(dist-package (package
(inherit guix)
(arguments (package-arguments guix))
(native-inputs `(("imagemagick" ,imagemagick)
,@(package-native-inputs guix))))
checkout
#:phases
'(modify-phases %dist-phases
(add-before 'build 'build-daemon
;; Build 'guix-daemon' first so that help2man
;; successfully creates 'guix-daemon.1'.
(lambda _
(let ((n (number->string
(parallel-job-count))))
(zero? (system* "make"
"nix/libstore/schema.sql.hh"
"guix-daemon" "-j" n)))))))))
(define (hydra-jobs store arguments)
"Return Hydra jobs."
(define systems
(match (filter-map (match-lambda
(('system . value)
value)
(_ #f))
arguments)
((lst ..1)
lst)
(_
(list (%current-system)))))
(define guix-checkout
(assq-ref arguments 'guix))
(let ((guix (assq-ref guix-checkout 'file-name)))
(format (current-error-port) "using checkout ~s (~s)~%"
guix-checkout guix)
`((tarball . ,(cute package->alist store
(tarball-package guix)
(%current-system))))))
-47
View File
@@ -1,47 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.
;;;
;;; Build a self-contained tarball containing binaries for Guix and its
;;; dependencies.
;;;
(use-modules (guix)
(guix ui)
(gnu system install)
(ice-9 match))
(define copy-file*
(lift2 copy-file %store-monad))
(define rename-file*
(lift2 rename-file %store-monad))
(match (command-line)
((_ system file)
(with-store store
(run-with-store store
(mlet %store-monad ((tarball (self-contained-tarball)))
(mbegin %store-monad
(show-what-to-build* (list tarball))
(built-derivations (list tarball))
(copy-file* (derivation->output-path tarball)
(string-append file ".part"))
(rename-file* (string-append file ".part") file)))
#:system system))))
-71
View File
@@ -1,71 +0,0 @@
#!/bin/sh
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
#
# 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/>.
# Usage: ./pre-inst-env COMMAND ARG...
#
# Run COMMAND in a pre-installation environment. Typical use is
# "./pre-inst-env guix build hello".
# By default we may end up with absolute directory names that contain '..',
# which get into $GUILE_LOAD_PATH, leading to '..' in the module file names
# recorded by Guile. To avoid that, make sure we get a real absolute
# directory name. Additionally, use '-P' to get the canonical directory name
# so that Guile's 'relative' %file-port-name-canonicalization can actually
# work (see <http://bugs.gnu.org/17935>.)
abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd -P`"
abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd -P`"
GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"
GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH"
export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
# Define $PATH so that `guix' and friends are easily found.
PATH="$abs_top_builddir/scripts:$abs_top_builddir:$PATH"
export PATH
# Daemon helpers.
NIX_ROOT_FINDER="$abs_top_builddir/nix/scripts/list-runtime-roots"
NIX_SUBSTITUTERS="$abs_top_builddir/nix/scripts/substitute"
NIX_BUILD_HOOK="$abs_top_builddir/nix/scripts/offload"
NIX_LIBEXEC_DIR="@abs_top_builddir@/nix/scripts" # for 'guix-authenticate'
export NIX_ROOT_FINDER NIX_SUBSTITUTERS \
NIX_BUILD_HOOK NIX_LIBEXEC_DIR
# The 'guix-register' program.
GUIX_REGISTER="$abs_top_builddir/guix-register"
export GUIX_REGISTER
# The following variables need only be defined when compiling Guix
# modules, but we define them to be on the safe side in case of
# auto-compilation.
NIX_HASH="@NIX_HASH@"
export NIX_HASH
# Define $GUIX_UNINSTALLED to prevent `guix' from
# prepending @guilemoduledir@ to the Guile load paths.
GUIX_UNINSTALLED=1
export GUIX_UNINSTALLED
exec "$@"
-85
View File
@@ -1,85 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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 (run-system-tests)
#:use-module (gnu tests)
#:use-module (guix store)
#:use-module (guix monads)
#:use-module (guix derivations)
#:use-module (guix ui)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-34)
#:use-module (ice-9 match)
#:export (run-system-tests))
(define (built-derivations* drv)
(lambda (store)
(guard (c ((nix-protocol-error? c)
(values #f store)))
(values (build-derivations store drv) store))))
(define (filterm mproc lst) ;XXX: move to (guix monads)
(with-monad %store-monad
(>>= (foldm %store-monad
(lambda (item result)
(mlet %store-monad ((keep? (mproc item)))
(return (if keep?
(cons item result)
result))))
'()
lst)
(lift1 reverse %store-monad))))
(define (run-system-tests . args)
(define tests
;; Honor the 'TESTS' environment variable so that one can select a subset
;; of tests to run in the usual way:
;;
;; make check-system TESTS=installed-os
(match (getenv "TESTS")
(#f
(all-system-tests))
((= string-tokenize (tests ...))
(filter (lambda (test)
(member (system-test-name test) tests))
(all-system-tests)))))
(format (current-error-port) "Running ~a system tests...~%"
(length tests))
(with-store store
(run-with-store store
(mlet* %store-monad ((drv (mapm %store-monad system-test-value tests))
(out -> (map derivation->output-path drv)))
(mbegin %store-monad
(show-what-to-build* drv)
(set-build-options* #:keep-going? #t #:keep-failed? #t)
(built-derivations* drv)
(mlet %store-monad ((valid (filterm (store-lift valid-path?)
out))
(failed (filterm (store-lift
(negate valid-path?))
out)))
(format #t "TOTAL: ~a\n" (length drv))
(for-each (lambda (item)
(format #t "PASS: ~a~%" item))
valid)
(for-each (lambda (item)
(format #t "FAIL: ~a~%" item))
failed)
(exit (null? failed))))))))
-189
View File
@@ -1,189 +0,0 @@
;;;; test-driver.scm - Guile test driver for Automake testsuite harness
(define script-version "2016-04-03.12") ;UTC
;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
;;;
;;; This program 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.
;;;
;;; This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;;; Commentary:
;;;
;;; This script provides a Guile test driver using the SRFI-64 Scheme API for
;;; test suites. SRFI-64 is distributed with Guile since version 2.0.9.
;;;
;;;; Code:
(use-modules (ice-9 getopt-long)
(ice-9 pretty-print)
(srfi srfi-26)
(srfi srfi-64))
(define (show-help)
(display "Usage:
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
[--expect-failure={yes|no}] [--color-tests={yes|no}]
[--enable-hard-errors={yes|no}] [--brief={yes|no}}] [--]
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
The '--test-name', '--log-file' and '--trs-file' options are mandatory.\n"))
(define %options
'((test-name (value #t))
(log-file (value #t))
(trs-file (value #t))
(color-tests (value #t))
(expect-failure (value #t)) ;XXX: not implemented yet
(enable-hard-errors (value #t)) ;not implemented in SRFI-64
(brief (value #t))
(help (single-char #\h) (value #f))
(version (single-char #\V) (value #f))))
(define (option->boolean options key)
"Return #t if the value associated with KEY in OPTIONS is \"yes\"."
(and=> (option-ref options key #f) (cut string=? <> "yes")))
(define* (test-display field value #:optional (port (current-output-port))
#:key pretty?)
"Display \"FIELD: VALUE\\n\" on PORT."
(if pretty?
(begin
(format port "~A:~%" field)
(pretty-print value port #:per-line-prefix "+ "))
(format port "~A: ~A~%" field value)))
(define* (result->string symbol #:key colorize?)
"Return SYMBOL as an upper case string. Use colors when COLORIZE is #t."
(let ((result (string-upcase (symbol->string symbol))))
(if colorize?
(string-append (case symbol
((pass) "") ;green
((xfail) "") ;light green
((skip) "") ;blue
((fail xpass) "") ;red
((error) "")) ;magenta
result
"") ;no color
result)))
(define* (test-runner-gnu test-name #:key color? brief? out-port trs-port)
"Return an custom SRFI-64 test runner. TEST-NAME is a string specifying the
file name of the current the test. COLOR? specifies whether to use colors,
and BRIEF?, well, you know. OUT-PORT and TRS-PORT must be output ports. The
current output port is supposed to be redirected to a '.log' file."
(define (test-on-test-begin-gnu runner)
;; Procedure called at the start of an individual test case, before the
;; test expression (and expected value) are evaluated.
(let ((result (cute assq-ref (test-result-alist runner) <>)))
(test-display "test-name" (result 'test-name))
(test-display "location"
(string-append (result 'source-file) ":"
(number->string (result 'source-line))))
(test-display "source" (result 'source-form) #:pretty? #t)))
(define (test-on-test-end-gnu runner)
;; Procedure called at the end of an individual test case, when the result
;; of the test is available.
(let* ((results (test-result-alist runner))
(result? (cut assq <> results))
(result (cut assq-ref results <>)))
(unless brief?
;; Display the result of each test case on the console.
(test-display
(result->string (test-result-kind runner) #:colorize? color?)
(string-append test-name " - " (test-runner-test-name runner))
out-port))
(when (result? 'expected-value)
(test-display "expected-value" (result 'expected-value)))
(when (result? 'expected-error)
(test-display "expected-error" (result 'expected-error) #:pretty? #t))
(when (result? 'actual-value)
(test-display "actual-value" (result 'actual-value)))
(when (result? 'actual-error)
(test-display "actual-error" (result 'actual-error) #:pretty? #t))
(test-display "result" (result->string (result 'result-kind)))
(newline)
(test-display ":test-result"
(string-append (result->string (test-result-kind runner))
" " (test-runner-test-name runner))
trs-port)))
(define (test-on-group-end-gnu runner)
;; Procedure called by a 'test-end', including at the end of a test-group.
(let ((fail (or (positive? (test-runner-fail-count runner))
(positive? (test-runner-xpass-count runner))))
(skip (or (positive? (test-runner-skip-count runner))
(positive? (test-runner-xfail-count runner)))))
;; XXX: The global results need some refinements for XPASS.
(test-display ":global-test-result"
(if fail "FAIL" (if skip "SKIP" "PASS"))
trs-port)
(test-display ":recheck"
(if fail "yes" "no")
trs-port)
(test-display ":copy-in-global-log"
(if (or fail skip) "yes" "no")
trs-port)
(when brief?
;; Display the global test group result on the console.
(test-display (result->string (if fail 'fail (if skip 'skip 'pass))
#:colorize? color?)
test-name
out-port))
#f))
(let ((runner (test-runner-null)))
(test-runner-on-test-begin! runner test-on-test-begin-gnu)
(test-runner-on-test-end! runner test-on-test-end-gnu)
(test-runner-on-group-end! runner test-on-group-end-gnu)
(test-runner-on-bad-end-name! runner test-on-bad-end-name-simple)
runner))
;;;
;;; Entry point.
;;;
(define (main . args)
(let* ((opts (getopt-long (command-line) %options))
(option (cut option-ref opts <> <>)))
(cond
((option 'help #f) (show-help))
((option 'version #f) (format #t "test-driver.scm ~A" script-version))
(else
(let ((log (open-file (option 'log-file "") "w0"))
(trs (open-file (option 'trs-file "") "wl"))
(out (duplicate-port (current-output-port) "wl")))
(redirect-port log (current-output-port))
(redirect-port log (current-warning-port))
(redirect-port log (current-error-port))
(test-with-runner
(test-runner-gnu (option 'test-name #f)
#:color? (option->boolean opts 'color-tests)
#:brief? (option->boolean opts 'brief)
#:out-port out #:trs-port trs)
(load-from-path (option 'test-name #f)))
(close-port log)
(close-port trs)
(close-port out))))
(exit 0)))
;;; Local Variables:
;;; eval: (add-hook 'write-file-functions 'time-stamp)
;;; time-stamp-start: "(define script-version \""
;;; time-stamp-format: "%:y-%02m-%02d.%02H"
;;; time-stamp-time-zone: "UTC"
;;; time-stamp-end: "\") ;UTC"
;;; End:
;;;; test-driver.scm ends here.
-137
View File
@@ -1,137 +0,0 @@
#!/bin/sh
# GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
#
# 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/>.
# Usage: ./test-env COMMAND ARG...
#
# Run the daemon in the build directory, and run COMMAND within
# `pre-inst-env'. This is used to run unit tests with the just-built
# daemon, unless `--disable-daemon' was passed at configure time.
# Make sure 'cd' behaves deterministically and doesn't write anything to
# stdout.
unset CDPATH
case "$1" in
--quiet-stderr)
# Silence the daemon's output, which is often useless, as well as that
# of Bash (such as "Terminated" messages when 'guix-daemon' is
# killed.)
exec 2> /dev/null
shift
;;
esac
if [ -x "@abs_top_builddir@/guix-daemon" ]
then
NIX_STORE_DIR="@GUIX_TEST_ROOT@/store"
# Do that because store.scm calls `canonicalize-path' on it.
mkdir -p "$NIX_STORE_DIR"
# Canonicalize the store directory name in an attempt to avoid symlinks in
# it or its parent directories. See <http://bugs.gnu.org/17935>.
NIX_STORE_DIR="`cd "@GUIX_TEST_ROOT@/store"; pwd -P`"
NIX_LOCALSTATE_DIR="@GUIX_TEST_ROOT@/var"
NIX_LOG_DIR="@GUIX_TEST_ROOT@/var/log/guix"
NIX_DB_DIR="@GUIX_TEST_ROOT@/db"
NIX_ROOT_FINDER="@abs_top_builddir@/nix/scripts/list-runtime-roots"
# Choose a PID-dependent name to allow for parallel builds. Note
# that the directory name must be chosen so that the socket's file
# name is less than 108-char long (the size of `sun_path' in glibc).
# Currently, in Nix builds, we're at ~106 chars...
NIX_STATE_DIR="@GUIX_TEST_ROOT@/var/$$"
# We can't exit when we reach the limit, because perhaps the test doesn't
# actually rely on the daemon, but at least warn.
if test "`echo -n "$NIX_STATE_DIR/daemon-socket/socket" | wc -c`" -ge 108
then
echo "warning: exceeding socket file name limit; test may fail!" >&2
fi
# The configuration directory, for import/export signing keys.
GUIX_CONFIGURATION_DIRECTORY="@GUIX_TEST_ROOT@/etc"
if [ ! -d "$GUIX_CONFIGURATION_DIRECTORY" ]
then
# Copy the keys so that the secret key has the right permissions (the
# daemon errors out when this is not the case.)
mkdir -p "$GUIX_CONFIGURATION_DIRECTORY"
cp "@abs_top_srcdir@/tests/signing-key.sec" \
"@abs_top_srcdir@/tests/signing-key.pub" \
"$GUIX_CONFIGURATION_DIRECTORY"
chmod 400 "$GUIX_CONFIGURATION_DIRECTORY/signing-key.sec"
fi
# A place to store data of the substituter.
GUIX_BINARY_SUBSTITUTE_URL="file://$NIX_STATE_DIR/substituter-data"
rm -rf "$NIX_STATE_DIR/substituter-data"
mkdir -p "$NIX_STATE_DIR/substituter-data"
# For a number of tests, we want to allow unsigned narinfos, for
# simplicity.
GUIX_ALLOW_UNAUTHENTICATED_SUBSTITUTES=yes
# Place for the substituter's cache.
XDG_CACHE_HOME="$NIX_STATE_DIR/cache-$$"
# For the (guix import snix) tests.
NIXPKGS="@NIXPKGS@"
export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR \
NIX_LOCALSTATE_DIR NIX_LOG_DIR NIX_STATE_DIR NIX_DB_DIR \
NIX_ROOT_FINDER GUIX_BINARY_SUBSTITUTE_URL \
GUIX_ALLOW_UNAUTHENTICATED_SUBSTITUTES \
GUIX_CONFIGURATION_DIRECTORY XDG_CACHE_HOME NIXPKGS
# Launch the daemon without chroot support because is may be
# unavailable, for instance if we're not running as root.
"@abs_top_builddir@/pre-inst-env" \
"@abs_top_builddir@/guix-daemon" --disable-chroot \
--substitute-urls="$GUIX_BINARY_SUBSTITUTE_URL" &
daemon_pid=$!
trap "kill $daemon_pid ; rm -rf $NIX_STATE_DIR" EXIT
fi
# Avoid issues that could stem from l10n, such as language/encoding
# mismatches.
unset LANGUAGE
LC_MESSAGES=C
export LC_MESSAGES
# Disable grafts by default because they can cause things to be built
# regardless of '--dry-run'.
GUIX_BUILD_OPTIONS="--no-grafts"
export GUIX_BUILD_OPTIONS
# Ignore user settings.
unset GUIX_PACKAGE_PATH
storedir="@storedir@"
prefix="@prefix@"
datarootdir="@datarootdir@"
datadir="@datadir@"
localstatedir="@localstatedir@"
export storedir prefix datarootdir datadir localstatedir
"@abs_top_builddir@/pre-inst-env" "$@"
exit $?
+62
View File
@@ -0,0 +1,62 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
hOlob5tziejTU0hW0XIRXlXKukgc+7F4b/bIGgI=
=Y7wf
-----END PGP PUBLIC KEY BLOCK-----
+3843
View File
File diff suppressed because it is too large Load Diff
+1497
View File
File diff suppressed because it is too large Load Diff
+50
View File
@@ -0,0 +1,50 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
YF3ov6wO
=3+Zu
-----END PGP PUBLIC KEY BLOCK-----
-158
View File
@@ -1,158 +0,0 @@
dnl -*- Autoconf -*- fragment for the C++ daemon.
AC_MSG_CHECKING([whether to build daemon])
AC_MSG_RESULT([$guix_build_daemon])
dnl C++ environment. This macro must be used unconditionnaly.
AC_PROG_CXX
AC_LANG([C++])
if test "x$guix_build_daemon" = "xyes"; then
GUIX_ASSERT_CXX11
AC_PROG_RANLIB
AC_CONFIG_HEADER([nix/config.h])
dnl Use 64-bit file system calls so that we can support files > 2 GiB.
AC_SYS_LARGEFILE
dnl Look for libbz2, a required dependency.
AC_CHECK_LIB([bz2], [BZ2_bzWriteOpen], [true],
[AC_MSG_ERROR([Guix requires libbz2, which is part of bzip2. See http://www.bzip.org/.])])
AC_CHECK_HEADERS([bzlib.h], [true],
[AC_MSG_ERROR([Guix requires libbz2, which is part of bzip2. See http://www.bzip.org/.])])
dnl Look for SQLite, a required dependency.
PKG_CHECK_MODULES([SQLITE3], [sqlite3 >= 3.6.19])
AC_DEFINE([NIX_VERSION], ["0.0.0"], [Fake Nix version number.])
AC_DEFINE_UNQUOTED([SYSTEM], ["$guix_system"],
[Guix host system type--i.e., platform and OS kernel tuple.])
case "$LIBGCRYPT_PREFIX" in
no)
LIBGCRYPT_CFLAGS=""
;;
*)
LIBGCRYPT_CFLAGS="-I$LIBGCRYPT_PREFIX/include"
;;
esac
case "$LIBGCRYPT_LIBDIR" in
no)
LIBGCRYPT_LIBS="-lgcrypt"
;;
*)
LIBGCRYPT_LIBS="-L$LIBGCRYPT_LIBDIR -lgcrypt"
;;
esac
AC_SUBST([LIBGCRYPT_CFLAGS])
AC_SUBST([LIBGCRYPT_LIBS])
save_CFLAGS="$CFLAGS"
save_LDFLAGS="$LDFLAGS"
CFLAGS="$CFLAGS $LIBGCRYPT_CFLAGS"
LDFLAGS="$LDFLAGS $LIBGCRYPT_LDFLAGS"
have_gcrypt=yes
AC_CHECK_LIB([gcrypt], [gcry_md_open], [:], [have_gcrypt=no])
AC_CHECK_HEADER([gcrypt.h], [:], [have_gcrypt=no])
if test "x$have_gcrypt" != "xyes"; then
AC_MSG_ERROR([GNU libgcrypt not found; please install it.])
fi
CFLAGS="$save_CFLAGS"
LDFLAGS="$save_LDFLAGS"
dnl Chroot support.
AC_CHECK_FUNCS([chroot unshare])
AC_CHECK_HEADERS([sched.h sys/param.h sys/mount.h sys/syscall.h])
if test "x$ac_cv_func_chroot" != "xyes"; then
AC_MSG_ERROR(['chroot' function missing, bailing out])
fi
dnl lutimes and lchown: used when canonicalizing store items.
dnl posix_fallocate: used when extracting archives.
dnl vfork: to speed up spawning of helper programs.
dnl `--> now disabled because of unpredictable behavior:
dnl see <http://lists.gnu.org/archive/html/guix-devel/2014-05/msg00036.html>
dnl and Nix commit f794465c (Nov. 2012).
dnl sched_setaffinity: to improve RPC locality.
dnl statvfs: to detect disk-full conditions.
dnl strsignal: for error reporting.
AC_CHECK_FUNCS([lutimes lchown posix_fallocate sched_setaffinity \
statvfs nanosleep strsignal])
dnl Check whether the store optimiser can optimise symlinks.
AC_MSG_CHECKING([whether it is possible to create a link to a symlink])
ln -s bla tmp_link
if ln tmp_link tmp_link2 2> /dev/null; then
AC_MSG_RESULT(yes)
AC_DEFINE(CAN_LINK_SYMLINK, 1, [Whether link() works on symlinks.])
else
AC_MSG_RESULT(no)
fi
rm -f tmp_link tmp_link2
dnl Check for <locale>.
AC_LANG_PUSH(C++)
AC_CHECK_HEADERS([locale])
AC_LANG_POP(C++)
dnl Check whether we have the `personality' syscall, which allows us
dnl to do i686-linux builds on x86_64-linux machines.
AC_CHECK_HEADERS([sys/personality.h])
dnl Check for <linux/fs.h> (for immutable file support).
AC_CHECK_HEADERS([linux/fs.h])
dnl Determine the appropriate default list of substitute URLs.
GUILE_MODULE_AVAILABLE([have_gnutls], [(gnutls)])
if test "x$have_gnutls" = "xyes"; then
guix_substitute_urls="https://mirror.hydra.gnu.org"
else
AC_MSG_WARN([GnuTLS is missing, substitutes will be downloaded in the clear])
guix_substitute_urls="http://mirror.hydra.gnu.org"
fi
AC_MSG_CHECKING([for default substitute URLs])
AC_MSG_RESULT([$guix_substitute_urls])
AC_DEFINE_UNQUOTED([GUIX_SUBSTITUTE_URLS], ["$guix_substitute_urls"],
[Default list of substitute URLs used by 'guix-daemon'.])
dnl Check whether the 'offload' build hook can be built (uses
dnl 'restore-file-set', which requires unbuffered custom binary input
dnl ports from Guile >= 2.0.10.)
GUIX_CHECK_UNBUFFERED_CBIP
guix_build_daemon_offload="$ac_cv_guix_cbips_support_setvbuf"
if test "x$guix_build_daemon_offload" = "xyes"; then
AC_DEFINE([HAVE_DAEMON_OFFLOAD_HOOK], [1],
[Define if the daemon's 'offload' build hook is being built.])
fi
dnl Temporary directory used to store the daemon's data.
GUIX_TEST_ROOT_DIRECTORY
GUIX_TEST_ROOT="$ac_cv_guix_test_root"
AC_SUBST([GUIX_TEST_ROOT])
GUIX_CHECK_LOCALSTATEDIR
AC_CONFIG_FILES([nix/scripts/list-runtime-roots],
[chmod +x nix/scripts/list-runtime-roots])
AC_CONFIG_FILES([nix/scripts/substitute],
[chmod +x nix/scripts/substitute])
AC_CONFIG_FILES([nix/scripts/guix-authenticate],
[chmod +x nix/scripts/guix-authenticate])
AC_CONFIG_FILES([nix/scripts/offload],
[chmod +x nix/scripts/offload])
fi
AM_CONDITIONAL([BUILD_DAEMON], [test "x$guix_build_daemon" = "xyes"])
AM_CONDITIONAL([BUILD_DAEMON_OFFLOAD], \
[test "x$guix_build_daemon" = "xyes" \
&& test "x$guix_build_daemon_offload" = "xyes"])
-234
View File
@@ -1,234 +0,0 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.68)
AC_INIT([GNU Guix], [0.11.0], [bug-guix@gnu.org], [guix],
[http://www.gnu.org/software/guix/])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects \
color-tests parallel-tests -Woverride -Wno-portability])
# Enable silent rules by default.
AM_SILENT_RULES([yes])
AC_CONFIG_SRCDIR([guix.scm])
AC_CONFIG_MACRO_DIR([m4])
dnl For the C++ code. This must be used early.
AC_USE_SYSTEM_EXTENSIONS
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.18.1])
guilemoduledir="${datarootdir}/guile/site/2.0"
AC_SUBST([guilemoduledir])
GUIX_SYSTEM_TYPE
GUIX_ASSERT_SUPPORTED_SYSTEM
AC_ARG_WITH(store-dir,
AC_HELP_STRING([--with-store-dir=PATH],
[file name of the store (defaults to /gnu/store)]),
[storedir="$withval"],
[storedir="/gnu/store"])
AC_SUBST(storedir)
AC_ARG_WITH([bash-completion-dir],
AC_HELP_STRING([--with-bash-completion-dir=DIR],
[name of the Bash completion directory]),
[bashcompletiondir="$withval"],
[bashcompletiondir='${sysconfdir}/bash_completion.d'])
AC_SUBST([bashcompletiondir])
dnl Better be verbose.
AC_MSG_CHECKING([for the store directory])
AC_MSG_RESULT([$storedir])
AC_ARG_ENABLE([daemon],
[AS_HELP_STRING([--disable-daemon], [build the Nix daemon (C++)])],
[guix_build_daemon="$enableval"],
[guix_build_daemon="yes"])
# Prepare a version of $localstatedir & co. that does not contain references
# to shell variables.
guix_prefix="`eval echo $prefix | sed -e"s|NONE|/usr/local|g"`"
guix_localstatedir="`eval echo $localstatedir | sed -e "s|NONE|$guix_prefix|g"`"
guix_sysconfdir="`eval echo $sysconfdir | sed -e "s|NONE|$guix_prefix|g"`"
guix_sbindir="`eval echo $sbindir | sed -e "s|NONE|$guix_prefix|g"`"
AC_SUBST([guix_localstatedir])
AC_SUBST([guix_sysconfdir])
AC_SUBST([guix_sbindir])
GUIX_CHECK_FILE_NAME_LIMITS([can_run_tests])
AM_CONDITIONAL([CAN_RUN_TESTS], [test "x$can_run_tests" = "xyes"])
dnl We require pkg.m4 (from pkg-config) and guile.m4 (from Guile.)
dnl Make sure they are available.
m4_pattern_forbid([PKG_CHECK_MODULES])
m4_pattern_forbid([GUILE_MODULE_AVAILABLE])
PKG_CHECK_MODULES([GUILE], [guile-2.0 >= 2.0.7])
AC_PATH_PROG([GUILE], [guile])
AC_PATH_PROG([GUILD], [guild])
if test "x$GUILD" = "x"; then
AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.])
fi
dnl guile-json is used for the PyPI package importer
GUILE_MODULE_AVAILABLE([have_guile_json], [(json)])
AM_CONDITIONAL([HAVE_GUILE_JSON], [test "x$have_guile_json" = "xyes"])
dnl Make sure we have a full-fledged Guile.
GUIX_ASSERT_GUILE_FEATURES([regex posix socket net-db threads])
dnl Check whether (srfi srfi-37) works, and provide our own if it doesn't.
GUIX_CHECK_SRFI_37
AM_CONDITIONAL([INSTALL_SRFI_37], [test "x$ac_cv_guix_srfi_37_broken" = xyes])
dnl Decompressors, for use by the substituter and other modules.
AC_PATH_PROG([GZIP], [gzip])
AC_PATH_PROG([BZIP2], [bzip2])
AC_PATH_PROG([XZ], [xz])
AC_SUBST([GZIP])
AC_SUBST([BZIP2])
AC_SUBST([XZ])
AC_ARG_WITH([nix-prefix],
[AS_HELP_STRING([--with-nix-prefix=DIR],
[search for Nix in DIR (for testing purposes and '--disable-daemon' builds)])],
[case "$withval" in
yes|no) ;;
*)
NIX_PREFIX="$withval"
PATH="$NIX_PREFIX/bin:$PATH"; export PATH
AC_SUBST([NIX_PREFIX])
;;
esac],
[])
AC_PATH_PROG([NIX_INSTANTIATE], [nix-instantiate])
AC_PATH_PROG([NIX_HASH], [nix-hash])
if test "x$guix_build_daemon$NIX_INSTANTIATE$NIX_HASH" = "xno"; then
AC_MSG_ERROR([Nix programs not found; please install Nix or use `--with-nix-prefix'.])
fi
if test "x$NIX_INSTANTIATE" = "x"; then
# This program is an optional dependency, so we just want it to be
# taken from $PATH if it's not available right now.
NIX_INSTANTIATE="nix-instantiate"
fi
AC_ARG_WITH([nixpkgs],
[AS_HELP_STRING([--with-nixpkgs=DIR],
[search for Nixpkgs in DIR (for testing purposes only)])],
[case "$withval" in
yes|no) AC_MSG_ERROR([Please use `--with-nixpkgs=DIR'.]);;
*) NIXPKGS="$withval";;
esac],
[])
AC_MSG_CHECKING([for Nixpkgs source tree])
if test -f "$NIXPKGS/default.nix"; then
AC_MSG_RESULT([$NIXPKGS])
AC_SUBST([NIXPKGS])
else
AC_MSG_RESULT([not found])
fi
LIBGCRYPT="libgcrypt"
LIBGCRYPT_LIBDIR="no"
LIBGCRYPT_PREFIX="no"
AC_ARG_WITH([libgcrypt-prefix],
[AS_HELP_STRING([--with-libgcrypt-prefix=DIR], [search for GNU libgcrypt in DIR])],
[case "$withval" in
yes|no)
;;
*)
LIBGCRYPT="$withval/lib/libgcrypt"
LIBGCRYPT_PREFIX="$withval"
LIBGCRYPT_LIBDIR="$withval/lib"
;;
esac])
AC_ARG_WITH([libgcrypt-libdir],
[AS_HELP_STRING([--with-libgcrypt-libdir=DIR],
[search for GNU libgcrypt's shared library in DIR])],
[case "$withval" in
yes|no)
LIBGCRYPT="libgcrypt"
LIBGCRYPT_LIBDIR="no"
;;
*)
LIBGCRYPT="$withval/libgcrypt"
LIBGCRYPT_LIBDIR="$withval"
;;
esac])
dnl If none of the --with-libgcrypt-* options was used, try to determine the
dnl absolute file name of libgcrypt.so.
case "x$LIBGCRYPT_PREFIX$LIBGCRYPT_LIBDIR" in
xnono)
GUIX_LIBGCRYPT_LIBDIR([LIBGCRYPT_LIBDIR])
if test "x$LIBGCRYPT_LIBDIR" != x; then
LIBGCRYPT="$LIBGCRYPT_LIBDIR/libgcrypt"
else
dnl 'config-daemon.ac' expects "no" in this case.
LIBGCRYPT_LIBDIR="no"
fi
;;
esac
dnl Library name suitable for `dynamic-link'.
AC_MSG_CHECKING([for libgcrypt shared library name])
AC_MSG_RESULT([$LIBGCRYPT])
AC_SUBST([LIBGCRYPT])
AC_SUBST([LIBGCRYPT_PREFIX])
AC_SUBST([LIBGCRYPT_LIBDIR])
GUIX_ASSERT_LIBGCRYPT_USABLE
dnl Library name of zlib suitable for 'dynamic-link'.
GUIX_LIBZ_LIBDIR([libz_libdir])
if test "x$libz_libdir" = "x"; then
LIBZ="libz"
else
LIBZ="$libz_libdir/libz"
fi
AC_MSG_CHECKING([for zlib's shared library name])
AC_MSG_RESULT([$LIBZ])
AC_SUBST([LIBZ])
AC_CACHE_SAVE
m4_include([config-daemon.ac])
dnl `dot' (from the Graphviz package) is only needed for maintainers.
dnl See `Building from Git' in the manual for more info.
AM_MISSING_PROG([DOT], [dot])
dnl Manual pages.
AM_MISSING_PROG([HELP2MAN], [help2man])
AC_CONFIG_FILES([Makefile
po/guix/Makefile.in
po/packages/Makefile.in
guix/config.scm])
AC_CONFIG_FILES([scripts/guix], [chmod +x scripts/guix])
AC_CONFIG_FILES([test-env:build-aux/test-env.in], [chmod +x test-env])
AC_CONFIG_FILES([pre-inst-env:build-aux/pre-inst-env.in],
[chmod +x pre-inst-env])
dnl Emacs interface.
AC_PATH_PROG([DOT_USER_PROGRAM], [dot], [dot])
AM_PATH_LISPDIR
AM_CONDITIONAL([HAVE_EMACS], [test "x$EMACS" != "xno"])
emacsuidir="${guilemoduledir}/guix/emacs"
AC_SUBST([emacsuidir])
AC_CONFIG_FILES([emacs/guix-config.el
emacs/guix-helper.scm])
AC_OUTPUT
+18
View File
@@ -0,0 +1,18 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
xjMEZ0yjARYJKwYBBAHaRw8BAQdASb8faq1fGlD3J0HchEAWmPqxndmew1tN+Ajr
bSU0Q77NKENheWV0YW5vIFNhbnRvcyA8Y3NhbnRvc2JAaW52ZW50YXRpLm9yZz7C
mAQTFgoAQQIbAwUJBaOagAULCQgHAwUVCgkICwUWAgMBAAIeBQIXgBYhBMy4GEL5
1wWOzWc3er9c3032v2aCBQJnTLA+AhkBAAoJEL9c3032v2aCVAEA+L3wQPom76o/
jlydTly+r0X5WLWHoeRdUMMGx02PGrAA/2FwlT662UR4nZOZEpdhHTX0ZGmECjZH
p1uczk+/LmIGzTBDYXlldGFubyBTYW50b3MgKENOUlMpIDxjYXlldGFuby5zYW50
b3NAY25ycy5mcj7ClgQTFgoAPhYhBMy4GEL51wWOzWc3er9c3032v2aCBQJnTKNQ
AhsDBQkFo5qABQsJCAcDBRUKCQgLBRYCAwEAAh4FAheAAAoJEL9c3032v2aCrjsA
/0pNCd77Sp7GplttQch/moMqrbFs4+tMzpH1ngdQuD5kAPwO+/fyfFikd2B9EsIB
kGRLXDma5yWva/Fo5XTwDh3pC844BGdMowESCisGAQQBl1UBBQEBB0DPAWdwxi64
FdJfNmqisLmZRuoPABUOP5Y+OeNpK68SDgMBCAfCfgQYFgoAJhYhBMy4GEL51wWO
zWc3er9c3032v2aCBQJnTKMBAhsMBQkFo5qAAAoJEL9c3032v2aCMQUBAMMuMNqW
9097k+E3t2YRjzCUGkC2C9K/YEfkyDKEC+LXAQCfUXE40rKiGht30uThgc8S26NU
RgxOMjDlmYbHyOaCAw==
=1inp
-----END PGP PUBLIC KEY BLOCK-----
+87
View File
@@ -0,0 +1,87 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
zFSe3XJZdVySGA/VQBO4ghC+7ZCXT/BlpjZ/lw74SVik/DMADD4H60HlBLWC15SO
EE1IYCA5QGbP3KE9+zp4jf5XoAHiRLwepiFoJb6x2BqmbWV5ShAvtT/nZ4R1YDoy
9432Unb9lSDWk0pVaIG/ZGKIt3Liql5ZDyoAb1TEx3xeK8yXaYeMtoREGFIuBsvN
8W5CYtmvd1FmuQQmNJbKRMjWWoH8mNmsf+UlOMgTcBb1O0WgdiJmj6M45mm8eU1c
4L/c0S26Tu+BOgkIUSOfAFViUG/8RciYH2kCd2QH7gg9h94UH7bBc5AqEZiTf1OA
XI7VkWtMdjDVxU5sj8bDUqSGP8nFAuNJLt5Zv0ub+1BLJpmOMCwDZornVumVsssq
QKJ/3yE/xcboNoVYlCIxPIK2uI3FIOhGdM9eNlCo9mGnqlKjXyY0G1T1hKx4Jqao
s9SQOSPJHRse2lN9gX7mBWa9/uXilztenEGTAe8ZyimW1VhTNqZLZCpbP4TLJPx1
dnsDrAPr6afSMaS2uCl7zLq3KT3132PfCn9u3rQyQ2hyaXN0b3BoZXIgTGVtbWVy
IFdlYmJlciA8Y3dlYmJlckBkdXN0eWNsb3VkLm9yZz6JAk4EEwEIADgWIQRRCoYo
4qd2eI+McJxLwCWSX/j00wUCWiXx2QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIX
gAAKCRBLwCWSX/j008nJD/4rWJrf6jEd2OXAIvDlGere1lVS+bXWIyBNPaKCu8rF
tlnJ83Tik3ejguPPQD6bFnmY/sZiuUoKKR+KQD2Q3mmB1lT8pmvFca3jpM69aeFv
/66JNs14h9JWgikwJSJansnAQjIhgAvfXPQpdrLs2YMSuEtDjWe/uTZtU3Czvmv7
QialMH55RCy94jO5xxYaVdMoVX43mf3oMMXyyOfc5BrYN4JDroW2g53Fq6d04Bf0
Ce0De2ltaCEOVYbGyiNlfTrmkCIySkuCFsSCQeU6od1HjVr/IvkaBYuh4kBiki6v
21BXNOpQ6ymD/4JT5iPGh6Omi0bJkLrWykPAICyDjpOZ56ZNxnD2gDN86ylzmNDE
/64E33jNtf0cCUg0I8z8XdLZwj75FkdnfBEQ+Mj6y+U2tb+pdQkxdCqP+HpQ+rUP
BoynrO1i0/Cxpejk4L0y39kKM/ROYWhCnqiMzzif6xyfbnmsyVjqW/rrK2o7uqZa
fk7yrvRhi89WuV3y/i2KZONsp21bCl0ivMS0wYeHK4pNNJSovseidL1S5m8HHw+g
ELPSGuqREyxTi+AjnUyAx51fygRtOf3x1OsrSED5dQZie4qyZ5eJfRxo4cx17bVA
Hs/HbIJcWrSYCM0yQ5LPk3mRzuHHIPgt5/3OlF8s1hH9ao2veHkO3XstMKd45NqD
h7kCDQRRL/HPARAA3QJXDGWWHdGT4eL6bU81IkbnkuxP4kBNklto5xKNpDvhv5CG
s/1TzcOKfNdr49SUXYK0HfexfEzW7soIf0E8RqGhs3vPj0Qjn37lbdPMAnZkLTIB
s+M3JSZUPJcIl3kMpgu5SK5X5w8UY/vSwhGWqoLV0Jx1jtPCuUkvbn8YkSOS73bu
GORR2B9HV+PlRJE3hffuDVe84/T3DGTrR+ZAPxjrCDr3LOZ9rK9o1TzHN/xf/VO5
egYctXcQuRfGsED7ifE50w6Kn/5zYj6uqYcPRObRfbao1Itmy259OEWSW7iXnKGr
lA0lPWY3U5gAW40CoP0tvducE5iUK23WvsWms4nfzaOWSII62y8X4axvz4cVPkaJ
j+LVmR40r3vscH5IGMYrAwGKxIATQfrSbnqii7LJxeQfsp1ea9tbVbxp6hAsBzuU
I69EttHesrydAuYpiaCSavl90MhpSvbgg8CXK6ZM2aaXnRWXngkNLUkHdRBzV5CO
v9z46wzffJTG+sjWSUv7nYDxio6o+SmzhICr49j9glyTs7zp1fCnLtzApm9Cm4ZN
nK4HA/WoZhP2RJj11u4ehYV+dc43+UYX6Dk7kjeLzK4tWylXa+nsXKuLLP6V7NrN
LcYxeJ3Hi36OjcIbv0ZyDwaLMe+0fL/Cr68VsO1zN7d6okYg6bELmQMNh7cAEQEA
AYkCHwQYAQIACQUCUS/xzwIbDAAKCRBLwCWSX/j002GAEAC/+qV0fRL3UimD+5AK
RJgBwTCLKU46LxvIh//Pf20n8O6TaHbloaUPCN1Eel4114UQgwOMNPTfmE4vdreg
ZgQgMqHXCOjMhHNPwVseuB7wV+XMTmIwN+woBapLQm+i5gMdfpA7G6cAoBVAcjad
Na2qshdtATsrzDFByN9jKbyjW/EhrCbmaoKMzN7HaWs6/kGNWlrp6vrZ7Hhm6trP
u+aD++vopHXm7JhVR5ViQjYopin3Z/oyRW43gDl6rapqETu1sbhawdijDjv3ncWA
caj04RRzvAxSAHltlrmufXW+1kqndIT96kLUTP/dQZgfg2Qk/gZDVOWvWksT3tdd
zM1HhM7P4PvIXC2eudSeqa+w5zuDTktG861uNJaMAAJ+t7Hvij97U/5H16zag1Ee
Wkoh8Y8tSSZO2jr8ZZ6S/4Wl9yHLoEFU9qIXMzr1mo1yrGGnP+l4H1U2gG/OqgS7
/+I9qKyRJ8bCcnep6k3qYsiZSc6F3ONeldnD42GYnj2Si0pJbAqrdCXFZh2qBuKM
uBg+F4ZBhAeDDch5fjCVK31kaG9E0iXyrNNPx0vcx4lauqrBLsOGix6jZxwsTOPE
UST7LwWsSdwXI61YClCYV0Ry1qR55q119MVcoWrF0Kho17vNkzC5hg0dQ40V9l/Y
kLEjOoXNOJGMcTcKP6qdP2Aohg==
=vgxe
-----END PGP PUBLIC KEY BLOCK-----
+80
View File
@@ -0,0 +1,80 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=RVmq
-----END PGP PUBLIC KEY BLOCK-----
+76
View File
@@ -0,0 +1,76 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
V2kKr54SWWZdTdeWM62qgpYeXrbDRg==
=2JFc
-----END PGP PUBLIC KEY BLOCK-----
+36
View File
@@ -0,0 +1,36 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
o5EIudGx
=r3t+
-----END PGP PUBLIC KEY BLOCK-----
+109
View File
@@ -0,0 +1,109 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
C0kDyI03GVXxDo+5JO4vUnLiVQ==
=FZnZ
-----END PGP PUBLIC KEY BLOCK-----
-371
View File
@@ -1,371 +0,0 @@
@node Contributing
@chapter Contributing
This project is a cooperative effort, and we need your help to make it
grow! Please get in touch with us on @email{guix-devel@@gnu.org} and
@code{#guix} on the Freenode IRC network. We welcome ideas, bug
reports, patches, and anything that may be helpful to the project. We
particularly welcome help on packaging (@pxref{Packaging Guidelines}).
@cindex code of conduct, of contributors
@cindex contributor covenant
We want to provide a warm, friendly, and harassment-free environment, so
that anyone can contribute to the best of their abilities. To this end
our project uses a ``Contributor Covenant'', which was adapted from
@url{http://contributor-covenant.org/}. You can find a local version in
the @file{CODE-OF-CONDUCT} file in the source tree.
Contributors are not required to use their legal name in patches and
on-line communication; they can use any name or pseudonym of their
choice.
@menu
* Building from Git:: The latest and greatest.
* Running Guix Before It Is Installed:: Hacker tricks.
* The Perfect Setup:: The right tools.
* Coding Style:: Hygiene of the contributor.
* Submitting Patches:: Share your work.
@end menu
@node Building from Git
@section Building from Git
If you want to hack Guix itself, it is recommended to use the latest
version from the Git repository. When building Guix from a checkout,
the following packages are required in addition to those mentioned in
the installation instructions (@pxref{Requirements}).
@itemize
@item @url{http://gnu.org/software/autoconf/, GNU Autoconf};
@item @url{http://gnu.org/software/automake/, GNU Automake};
@item @url{http://gnu.org/software/gettext/, GNU Gettext};
@item @url{http://gnu.org/software/texinfo/, GNU Texinfo};
@item @url{http://www.graphviz.org/, Graphviz};
@item @url{http://www.gnu.org/software/help2man/, GNU Help2man (optional)}.
@end itemize
The easiest way to set up a development environment for Guix is, of
course, by using Guix! The following command starts a new shell where
all the dependencies and appropriate environment variables are set up to
hack on Guix:
@example
guix environment guix
@end example
@xref{Invoking guix environment}, for more information on that command.
Extra dependencies can be added with @option{--ad-hoc}:
@example
guix environment guix --ad-hoc help2man git strace
@end example
Run @command{./bootstrap} to generate the build system infrastructure
using Autoconf and Automake. If you get an error like this one:
@example
configure.ac:46: error: possibly undefined macro: PKG_CHECK_MODULES
@end example
@noindent
it probably means that Autoconf couldnt find @file{pkg.m4}, which is
provided by pkg-config. Make sure that @file{pkg.m4} is available. The
same holds for the @file{guile.m4} set of macros provided by Guile. For
instance, if you installed Automake in @file{/usr/local}, it wouldnt
look for @file{.m4} files in @file{/usr/share}. In that case, you have
to invoke the following command:
@example
export ACLOCAL_PATH=/usr/share/aclocal
@end example
@xref{Macro Search Path,,, automake, The GNU Automake Manual}, for
more information.
Then, run @command{./configure} as usual. Make sure to pass
@code{--localstatedir=@var{directory}} where @var{directory} is the
@code{localstatedir} value used by your current installation (@pxref{The
Store}, for information about this).
Finally, you have to invoke @code{make check} to run tests
(@pxref{Running the Test Suite}). If anything
fails, take a look at installation instructions (@pxref{Installation})
or send a message to the @email{guix-devel@@gnu.org, mailing list}.
@node Running Guix Before It Is Installed
@section Running Guix Before It Is Installed
In order to keep a sane working environment, you will find it useful to
test the changes made in your local source tree checkout without
actually installing them. So that you can distinguish between your
``end-user'' hat and your ``motley'' costume.
To that end, all the command-line tools can be used even if you have not
run @code{make install}. To do that, prefix each command with
@command{./pre-inst-env} (the @file{pre-inst-env} script lives in the
top build tree of Guix), as in:
@example
$ sudo ./pre-inst-env guix-daemon --build-users-group=guixbuild
$ ./pre-inst-env guix build hello
@end example
@noindent
Similarly, for a Guile session using the Guix modules:
@example
$ ./pre-inst-env guile -c '(use-modules (guix utils)) (pk (%current-system))'
;;; ("x86_64-linux")
@end example
@noindent
@cindex REPL
@cindex read-eval-print loop
@dots{} and for a REPL (@pxref{Using Guile Interactively,,, guile, Guile
Reference Manual}):
@example
$ ./pre-inst-env guile
scheme@@(guile-user)> ,use(guix)
scheme@@(guile-user)> ,use(gnu)
scheme@@(guile-user)> (define snakes
(fold-packages
(lambda (package lst)
(if (string-prefix? "python"
(package-name package))
(cons package lst)
lst))
'()))
scheme@@(guile-user)> (length snakes)
$1 = 361
@end example
The @command{pre-inst-env} script sets up all the environment variables
necessary to support this, including @env{PATH} and @env{GUILE_LOAD_PATH}.
Note that @command{./pre-inst-env guix pull} does @emph{not} upgrade the
local source tree; it simply updates the @file{~/.config/guix/latest}
symlink (@pxref{Invoking guix pull}). Run @command{git pull} instead if
you want to upgrade your local source tree.@footnote{If you would like
to set up @command{guix} to use your Git checkout, you can point the
@file{~/.config/guix/latest} symlink to your Git checkout directory.
If you are the sole user of your system, you may also consider pointing
the @file{/root/.config/guix/latest} symlink to point to
@file{~/.config/guix/latest}; this way it will always use the same
@command{guix} as your user does.}
@node The Perfect Setup
@section The Perfect Setup
The Perfect Setup to hack on Guix is basically the perfect setup used
for Guile hacking (@pxref{Using Guile in Emacs,,, guile, Guile Reference
Manual}). First, you need more than an editor, you need
@url{http://www.gnu.org/software/emacs, Emacs}, empowered by the
wonderful @url{http://nongnu.org/geiser/, Geiser}.
Geiser allows for interactive and incremental development from within
Emacs: code compilation and evaluation from within buffers, access to
on-line documentation (docstrings), context-sensitive completion,
@kbd{M-.} to jump to an object definition, a REPL to try out your code,
and more (@pxref{Introduction,,, geiser, Geiser User Manual}). For
convenient Guix development, make sure to augment Guiles load path so
that it finds source files from your checkout:
@lisp
;; @r{Assuming the Guix checkout is in ~/src/guix.}
(with-eval-after-load 'geiser-guile
(add-to-list 'geiser-guile-load-path "~/src/guix"))
@end lisp
To actually edit the code, Emacs already has a neat Scheme mode. But in
addition to that, you must not miss
@url{http://www.emacswiki.org/emacs/ParEdit, Paredit}. It provides
facilities to directly operate on the syntax tree, such as raising an
s-expression or wrapping it, swallowing or rejecting the following
s-expression, etc.
GNU Guix also comes with a minor mode that provides some additional
functionality for Scheme buffers (@pxref{Emacs Development}).
@node Coding Style
@section Coding Style
In general our code follows the GNU Coding Standards (@pxref{Top,,,
standards, GNU Coding Standards}). However, they do not say much about
Scheme, so here are some additional rules.
@menu
* Programming Paradigm:: How to compose your elements.
* Modules:: Where to store your code?
* Data Types and Pattern Matching:: Implementing data structures.
* Formatting Code:: Writing conventions.
@end menu
@node Programming Paradigm
@subsection Programming Paradigm
Scheme code in Guix is written in a purely functional style. One
exception is code that involves input/output, and procedures that
implement low-level concepts, such as the @code{memoize} procedure.
@node Modules
@subsection Modules
Guile modules that are meant to be used on the builder side must live in
the @code{(guix build @dots{})} name space. They must not refer to
other Guix or GNU modules. However, it is OK for a ``host-side'' module
to use a build-side module.
Modules that deal with the broader GNU system should be in the
@code{(gnu @dots{})} name space rather than @code{(guix @dots{})}.
@node Data Types and Pattern Matching
@subsection Data Types and Pattern Matching
The tendency in classical Lisp is to use lists to represent everything,
and then to browse them ``by hand'' using @code{car}, @code{cdr},
@code{cadr}, and co. There are several problems with that style,
notably the fact that it is hard to read, error-prone, and a hindrance
to proper type error reports.
Guix code should define appropriate data types (for instance, using
@code{define-record-type*}) rather than abuse lists. In addition, it
should use pattern matching, via Guiles @code{(ice-9 match)} module,
especially when matching lists.
@node Formatting Code
@subsection Formatting Code
When writing Scheme code, we follow common wisdom among Scheme
programmers. In general, we follow the
@url{http://mumble.net/~campbell/scheme/style.txt, Riastradh's Lisp
Style Rules}. This document happens to describe the conventions mostly
used in Guiles code too. It is very thoughtful and well written, so
please do read it.
Some special forms introduced in Guix, such as the @code{substitute*}
macro, have special indentation rules. These are defined in the
@file{.dir-locals.el} file, which Emacs automatically uses. If you do
not use Emacs, please make sure to let your editor know the rules.
We require all top-level procedures to carry a docstring. This
requirement can be relaxed for simple private procedures in the
@code{(guix build @dots{})} name space, though.
Procedures should not have more than four positional parameters. Use
keyword parameters for procedures that take more than four parameters.
@node Submitting Patches
@section Submitting Patches
Development is done using the Git distributed version control system.
Thus, access to the repository is not strictly necessary. We welcome
contributions in the form of patches as produced by @code{git
format-patch} sent to the @email{guix-devel@@gnu.org, mailing list}.
Please write commit logs in the ChangeLog format (@pxref{Change Logs,,,
standards, GNU Coding Standards}); you can check the commit history for
examples.
Before submitting a patch that adds or modifies a package definition,
please run through this check list:
@enumerate
@item
Take some time to provide an adequate synopsis and description for the
package. @xref{Synopses and Descriptions}, for some guidelines.
@item
Run @code{guix lint @var{package}}, where @var{package} is the
name of the new or modified package, and fix any errors it reports
(@pxref{Invoking guix lint}).
@item
Make sure the package builds on your platform, using @code{guix build
@var{package}}.
@item
@cindex bundling
Make sure the package does not use bundled copies of software already
available as separate packages.
Sometimes, packages include copies of the source code of their
dependencies as a convenience for users. However, as a distribution, we
want to make sure that such packages end up using the copy we already
have in the distribution, if there is one. This improves resource usage
(the dependency is built and stored only once), and allows the
distribution to make transverse changes such as applying security
updates for a given software package in a single place and have them
affect the whole system---something that bundled copies prevent.
@item
Take a look at the profile reported by @command{guix size}
(@pxref{Invoking guix size}). This will allow you to notice references
to other packages unwillingly retained. It may also help determine
whether to split the package (@pxref{Packages with Multiple Outputs}),
and which optional dependencies should be used.
@item
For important changes, check that dependent package (if applicable) are
not affected by the change; @code{guix refresh --list-dependent
@var{package}} will help you do that (@pxref{Invoking guix refresh}).
Packages with roughly 100 dependents or more usually have to be
committed to a separate branch. That branch can then be built
separately by our build farm, and later merged into @code{master} once
everything has been successfully built. This allows us to fix issues
before they hit users, and to reduce the window during which pre-built
binaries are not available.
@item
@cindex determinism, of build processes
@cindex reproducible builds, checking
Check whether the package's build process is deterministic. This
typically means checking whether an independent build of the package
yields the exact same result that you obtained, bit for bit.
A simple way to do that is by building the same package several times in
a row on your machine (@pxref{Invoking guix build}):
@example
guix build --rounds=2 my-package
@end example
This is enough to catch a class of common non-determinism issues, such
as timestamps or randomly-generated output in the build result.
Another option is to use @command{guix challenge} (@pxref{Invoking guix
challenge}). You may run it once the package has been committed and
built by @code{hydra.gnu.org} to check whether it obtains the same
result as you did. Better yet: Find another machine that can build it
and run @command{guix publish}. Since the remote build machine is
likely different from yours, this can catch non-determinism issues
related to the hardware---e.g., use of different instruction set
extensions---or to the operating system kernel---e.g., reliance on
@code{uname} or @file{/proc} files.
@item
When writing documentation, please use gender-neutral wording when
referring to people, such as
@uref{https://en.wikipedia.org/wiki/Singular_they, singular
``they''@comma{} ``their''@comma{} ``them''}, and so forth.
@item
Verify that your patch contains only one set of related changes.
Bundling unrelated changes together makes reviewing harder and slower.
Examples of unrelated changes include the addition of several packages,
or a package update along with fixes to that package.
@end enumerate
When posting a patch to the mailing list, use @samp{[PATCH] @dots{}} as
a subject. You may use your email client or the @command{git
send-email} command. We prefer to get patches in plain text messages,
either inline or as MIME attachments. You are advised to pay attention if
your email client changes anything like line breaks or indentation which
could could potentially break the patches.
-881
View File
@@ -1,881 +0,0 @@
@node Emacs Interface
@chapter Emacs Interface
@cindex Emacs
GNU Guix comes with several useful modules (known as ``guix.el'') for
GNU@tie{}Emacs which are intended to make an Emacs user interaction with
Guix convenient and fun.
@menu
* Initial Setup: Emacs Initial Setup. Preparing @file{~/.emacs}.
* Package Management: Emacs Package Management. Managing packages and generations.
* Licenses: Emacs Licenses. Interface for licenses of Guix packages.
* Package Source Locations: Emacs Package Locations. Interface for package location files.
* Popup Interface: Emacs Popup Interface. Magit-like interface for guix commands.
* Prettify Mode: Emacs Prettify. Abbreviating @file{/gnu/store/@dots{}} file names.
* Build Log Mode: Emacs Build Log. Highlighting Guix build logs.
* Completions: Emacs Completions. Completing @command{guix} shell command.
* Development: Emacs Development. Tools for Guix developers.
* Hydra: Emacs Hydra. Interface for Guix build farm.
@end menu
@node Emacs Initial Setup
@section Initial Setup
On the Guix System Distribution (@pxref{GNU Distribution}), ``guix.el''
is ready to use, provided Guix is installed system-wide, which is the
case by default. So if that is what you're using, you can happily skip
this section and read about the fun stuff.
If you're not yet a happy user of GuixSD, a little bit of setup is needed.
To be able to use ``guix.el'', you need to install the following
packages:
@itemize
@item
@uref{http://www.gnu.org/software/emacs/, GNU Emacs}, version 24.3 or
later;
@item
@uref{http://nongnu.org/geiser/, Geiser}, version 0.3 or later: it is
used for interacting with the Guile process.
@item
@uref{https://github.com/magit/magit/, magit-popup library}. You
already have this library if you use Magit 2.1.0 or later. This library
is an optional dependency---it is required only for @kbd{M-x@tie{}guix}
command (@pxref{Emacs Popup Interface}).
@end itemize
When it is done, ``guix.el'' may be configured by requiring
@code{guix-autoloads} file. If you install Guix in your user profile,
this auto-loading is done automatically by our Emacs package
(@pxref{Application Setup}), so a universal recipe for configuring
``guix.el'' is: @command{guix package -i guix}. If you do this, there
is no need to read further.
For the manual installation, you need to add the following code into
your init file (@pxref{Init File,,, emacs, The GNU Emacs Manual}):
@example
(add-to-list 'load-path "/path/to/directory-with-guix.el")
(require 'guix-autoloads nil t)
@end example
So the only thing you need to figure out is where the directory with
elisp files for Guix is placed. It depends on how you installed Guix:
@itemize
@item
If it was installed by a package manager of your distribution or by a
usual @code{./configure && make && make install} command sequence, then
elisp files are placed in a standard directory with Emacs packages
(usually it is @file{/usr/share/emacs/site-lisp/}), which is already in
@code{load-path}, so there is no need to add that directory there. Note
that if you don't update this installation periodically, you may get an
outdated Emacs code which does not work with the current Guile code of
Guix.
@item
If you used a binary installation method (@pxref{Binary Installation}),
then Guix is installed somewhere in the store, so the elisp files are
placed in @file{/gnu/store/@dots{}-guix-0.8.2/share/emacs/site-lisp/} or
alike. However it is not recommended to refer directly to a store
directory, as it may be garbage-collected one day. So a better choice
would be to install Guix using Guix itself with @command{guix package -i
guix}.
@item
If you did not install Guix at all and prefer a hacking way
(@pxref{Running Guix Before It Is Installed}), along with augmenting
@code{load-path} you need to set @code{guix-load-path} variable to the
same directory, so your final configuration will look like this:
@example
(let ((dir "/path/to/your-guix-git-tree/emacs"))
(add-to-list 'load-path dir)
(setq guix-load-path dir))
(require 'guix-autoloads nil t)
@end example
@end itemize
@node Emacs Package Management
@section Package Management
Once ``guix.el'' has been successfully configured, you should be able to
use a visual interface for routine package management tasks, pretty much
like the @command{guix package} command (@pxref{Invoking guix package}).
Specifically, it makes it easy to:
@itemize
@item browse and display packages and generations;
@item search, install, upgrade and remove packages;
@item display packages from previous generations;
@item do some other useful things.
@end itemize
@menu
* Commands: Emacs Commands. @kbd{M-x guix-@dots{}}
* General information: Emacs General info. Common for both interfaces.
* ``List'' buffer: Emacs List buffer. List-like interface.
* ``Info'' buffer: Emacs Info buffer. Help-like interface.
* Configuration: Emacs Configuration. Configuring the interface.
@end menu
@node Emacs Commands
@subsection Commands
All commands for displaying packages and generations use the current
profile, which can be changed with
@kbd{M-x@tie{}guix-set-current-profile}. Alternatively, if you call any
of these commands with prefix argument (@kbd{C-u}), you will be prompted
for a profile just for that command.
Commands for displaying packages:
@table @kbd
@item M-x guix-all-available-packages
@itemx M-x guix-newest-available-packages
Display all/newest available packages.
@item M-x guix-installed-packages
@itemx M-x guix-installed-user-packages
@itemx M-x guix-installed-system-packages
Display installed packages. As described above, @kbd{M-x
guix-installed-packages} uses an arbitrary profile that you can specify,
while the other commands display packages installed in 2 special
profiles: @file{~/.guix-profile} and @file{/run/current-system/profile}
(only on GuixSD).
@item M-x guix-obsolete-packages
Display obsolete packages (the packages that are installed in a profile
but cannot be found among available packages).
@item M-x guix-packages-by-name
Display package(s) with the specified name.
@item M-x guix-packages-by-license
Display package(s) with the specified license.
@item M-x guix-packages-by-location
Display package(s) located in the specified file. These files usually
have the following form: @file{gnu/packages/emacs.scm}, but don't type
them manually! Press @key{TAB} to complete the file name.
@item M-x guix-package-from-file
Display package that the code within the specified file evaluates to.
@xref{Invoking guix package, @code{--install-from-file}}, for an example
of what such a file may look like.
@item M-x guix-search-by-regexp
Search for packages by a specified regexp. By default ``name'',
``synopsis'' and ``description'' of the packages will be searched. This
can be changed by modifying @code{guix-package-search-params} variable.
@item M-x guix-search-by-name
Search for packages with names matching a specified regexp. This
command is the same as @code{guix-search-by-regexp}, except only a
package ``name'' is searched.
@end table
By default, these commands display each output on a separate line. If
you prefer to see a list of packages---i.e., a list with a package per
line, use the following setting:
@example
(setq guix-package-list-type 'package)
@end example
Commands for displaying generations:
@table @kbd
@item M-x guix-generations
List all the generations.
@item M-x guix-last-generations
List the @var{N} last generations. You will be prompted for the number
of generations.
@item M-x guix-generations-by-time
List generations matching time period. You will be prompted for the
period using Org mode time prompt based on Emacs calendar (@pxref{The
date/time prompt,,, org, The Org Manual}).
@end table
Analogously on GuixSD you can also display system generations:
@table @kbd
@item M-x guix-system-generations
@item M-x guix-last-system-generations
@item M-x guix-system-generations-by-time
@end table
You can also invoke the @command{guix pull} command (@pxref{Invoking
guix pull}) from Emacs using:
@table @kbd
@item M-x guix-pull
With @kbd{C-u}, make it verbose.
@end table
Once @command{guix pull} has succeeded, the Guix REPL is restared. This
allows you to keep using the Emacs interface with the updated Guix.
@node Emacs General info
@subsection General information
The following keys are available for both ``list'' and ``info'' types of
buffers:
@table @kbd
@item l
@itemx r
Go backward/forward by the history of the displayed results (this
history is similar to the history of the Emacs @code{help-mode} or
@code{Info-mode}).
@item g
Revert current buffer: update information about the displayed
packages/generations and redisplay it.
@item R
Redisplay current buffer (without updating information).
@item M
Apply manifest to the current profile or to a specified profile, if
prefix argument is used. This has the same meaning as @code{--manifest}
option (@pxref{Invoking guix package}).
@item C-c C-z
@cindex REPL
@cindex read-eval-print loop
Go to the Guix REPL (@pxref{The REPL,,, geiser, Geiser User Manual}).
@item h
@itemx ?
Describe current mode to see all available bindings.
@end table
@emph{Hint:} If you need several ``list'' or ``info'' buffers, you can
simlpy @kbd{M-x clone-buffer} them, and each buffer will have its own
history.
@emph{Warning:} Name/version pairs cannot be used to identify packages
(because a name is not necessarily unique), so ``guix.el'' uses special
identifiers that live only during a guile session, so if the Guix REPL
was restarted, you may want to revert ``list'' buffer (by pressing
@kbd{g}).
@node Emacs List buffer
@subsection ``List'' buffer
An interface of a ``list'' buffer is similar to the interface provided
by ``package.el'' (@pxref{Package Menu,,, emacs, The GNU Emacs Manual}).
Default key bindings available for both ``package-list'' and
``generation-list'' buffers:
@table @kbd
@item m
Mark the current entry (with prefix, mark all entries).
@item u
Unmark the current entry (with prefix, unmark all entries).
@item @key{DEL}
Unmark backward.
@item S
Sort entries by a specified column.
@end table
A ``package-list'' buffer additionally provides the following bindings:
@table @kbd
@item @key{RET}
Describe marked packages (display available information in a
``package-info'' buffer).
@item i
Mark the current package for installation.
@item d
Mark the current package for deletion.
@item U
Mark the current package for upgrading.
@item ^
Mark all obsolete packages for upgrading.
@item e
Edit the definition of the curent package (go to its location). This is
similar to @command{guix edit} command (@pxref{Invoking guix edit}), but
for opening a package recipe in the current Emacs instance.
@item x
Execute actions on the marked packages.
@item B
Display latest builds of the current package (@pxref{Emacs Hydra}).
@end table
A ``generation-list'' buffer additionally provides the following
bindings:
@table @kbd
@item @key{RET}
List packages installed in the current generation.
@item i
Describe marked generations (display available information in a
``generation-info'' buffer).
@item s
Switch profile to the current generation.
@item d
Mark the current generation for deletion (with prefix, mark all
generations).
@item x
Execute actions on the marked generations---i.e., delete generations.
@item e
Run Ediff (@pxref{Top,,, ediff, The Ediff Manual}) on package outputs
installed in the 2 marked generations. With prefix argument, run Ediff
on manifests of the marked generations.
@item D
@itemx =
Run Diff (@pxref{Diff Mode,,, emacs, The GNU Emacs Manual}) on package
outputs installed in the 2 marked generations. With prefix argument,
run Diff on manifests of the marked generations.
@item +
List package outputs added to the latest marked generation comparing
with another marked generation.
@item -
List package outputs removed from the latest marked generation comparing
with another marked generation.
@end table
@node Emacs Info buffer
@subsection ``Info'' buffer
The interface of an ``info'' buffer is similar to the interface of
@code{help-mode} (@pxref{Help Mode,,, emacs, The GNU Emacs Manual}).
``Info'' buffer contains some buttons (as usual you may use @key{TAB} /
@kbd{S-@key{TAB}} to move between buttons---@pxref{Mouse References,,,
emacs, The GNU Emacs Manual}) which can be used to:
@itemize @bullet
@item (in a ``package-info'' buffer)
@itemize @minus
@item install/remove a package;
@item jump to a package location;
@item browse home page of a package;
@item browse license URL;
@item describe packages from ``Inputs'' fields.
@end itemize
@item (in a ``generation-info'' buffer)
@itemize @minus
@item remove a generation;
@item switch to a generation;
@item list packages installed in a generation;
@item jump to a generation directory.
@end itemize
@end itemize
It is also possible to copy a button label (a link to an URL or a file)
by pressing @kbd{c} on a button.
@node Emacs Configuration
@subsection Configuration
There are many variables you can modify to change the appearance or
behavior of Emacs user interface. Some of these variables are described
in this section. Also you can use Custom Interface (@pxref{Easy
Customization,,, emacs, The GNU Emacs Manual}) to explore/set variables
(not all) and faces.
@menu
* Guile and Build Options: Emacs Build Options. Specifying how packages are built.
* Buffer Names: Emacs Buffer Names. Names of Guix buffers.
* Keymaps: Emacs Keymaps. Configuring key bindings.
* Appearance: Emacs Appearance. Settings for visual appearance.
@end menu
@node Emacs Build Options
@subsubsection Guile and Build Options
@table @code
@item guix-guile-program
If you have some special needs for starting a Guile process, you may set
this variable, for example:
@example
(setq guix-guile-program '("/bin/guile" "--no-auto-compile"))
@end example
@item guix-use-substitutes
Has the same meaning as @code{--no-substitutes} option (@pxref{Invoking
guix build}).
@item guix-dry-run
Has the same meaning as @code{--dry-run} option (@pxref{Invoking guix
build}).
@end table
@node Emacs Buffer Names
@subsubsection Buffer Names
Default names of ``guix.el'' buffers (``*Guix@tie{}@dots{}*'') may be
changed with the following variables:
@table @code
@item guix-package-list-buffer-name
@item guix-output-list-buffer-name
@item guix-generation-list-buffer-name
@item guix-package-info-buffer-name
@item guix-output-info-buffer-name
@item guix-generation-info-buffer-name
@item guix-repl-buffer-name
@item guix-internal-repl-buffer-name
@end table
By default, the name of a profile is also displayed in a ``list'' or
``info'' buffer name. To change this behavior, use
@code{guix-ui-buffer-name-function} variable.
For example, if you want to display all types of results in a single
buffer (in such case you will probably use a history (@kbd{l}/@kbd{r})
extensively), you may do it like this:
@example
(let ((name "Guix Universal"))
(setq
guix-package-list-buffer-name name
guix-output-list-buffer-name name
guix-generation-list-buffer-name name
guix-package-info-buffer-name name
guix-output-info-buffer-name name
guix-generation-info-buffer-name name))
@end example
@node Emacs Keymaps
@subsubsection Keymaps
If you want to change default key bindings, use the following keymaps
(@pxref{Init Rebinding,,, emacs, The GNU Emacs Manual}):
@table @code
@item guix-buffer-map
Parent keymap with general keys for any buffer type.
@item guix-ui-map
Parent keymap with general keys for buffers used for Guix package
management (for packages, outputs and generations).
@item guix-list-mode-map
Parent keymap with general keys for ``list'' buffers.
@item guix-package-list-mode-map
Keymap with specific keys for ``package-list'' buffers.
@item guix-output-list-mode-map
Keymap with specific keys for ``output-list'' buffers.
@item guix-generation-list-mode-map
Keymap with specific keys for ``generation-list'' buffers.
@item guix-info-mode-map
Parent keymap with general keys for ``info'' buffers.
@item guix-package-info-mode-map
Keymap with specific keys for ``package-info'' buffers.
@item guix-output-info-mode-map
Keymap with specific keys for ``output-info'' buffers.
@item guix-generation-info-mode-map
Keymap with specific keys for ``generation-info'' buffers.
@item guix-info-button-map
Keymap with keys available when a point is placed on a button.
@end table
@node Emacs Appearance
@subsubsection Appearance
You can change almost any aspect of ``list'' / ``info'' buffers using
the following variables (@dfn{ENTRY-TYPE} means @code{package},
@code{output} or @code{generation}):
@table @code
@item guix-ENTRY-TYPE-list-format
@itemx guix-ENTRY-TYPE-list-titles
Specify the columns, their names, what and how is displayed in ``list''
buffers.
@item guix-ENTRY-TYPE-info-format
@itemx guix-ENTRY-TYPE-info-titles
@itemx guix-info-ignore-empty-values
@itemx guix-info-param-title-format
@itemx guix-info-multiline-prefix
@itemx guix-info-indent
@itemx guix-info-fill
@itemx guix-info-delimiter
Various settings for ``info'' buffers.
@end table
@node Emacs Licenses
@section Licenses
If you want to browse the URL of a particular license, or to look at a
list of licenses, you may use the following commands:
@table @kbd
@item M-x guix-browse-license-url
Choose a license from a completion list to browse its URL using
@code{browse-url} function (@pxref{Browse-URL,,, emacs, The GNU Emacs
Manual}).
@item M-x guix-licenses
Display a list of available licenses. You can press @kbd{@key{RET}}
there to display packages with this license in the same way as @kbd{M-x
guix-packages-by-license} would do (@pxref{Emacs Commands}).
@item M-x guix-find-license-definition
Open @file{@dots{}/guix/licenses.scm} and move to the specified license.
@end table
@node Emacs Package Locations
@section Package Source Locations
As you know, package definitions are placed in Guile files, also known
as @dfn{package locations}. The following commands should help you not
get lost in these locations:
@table @kbd
@item M-x guix-locations
Display a list of package locations. You can press @key{RET} there to
display packages placed in the current location in the same way as
@kbd{M-x guix-packages-by-location} would do (@pxref{Emacs Commands}).
Note that when the point is on a location button, @key{RET} will open
this location file.
@item M-x guix-find-location
Open the given package definition source file (press @key{TAB} to choose
a location from a completion list).
@item M-x guix-edit
Find location of a specified package. This is an Emacs analog of
@command{guix edit} command (@pxref{Invoking guix edit}). As with
@kbd{M-x guix-packages-by-name}, you can press @key{TAB} to complete a
package name.
@end table
If you are contributing to Guix, you may find it useful for @kbd{M-x
guix-find-location} and @kbd{M-x guix-edit} to open locations from your
Git checkout. This can be done by setting @code{guix-directory}
variable. For example, after this:
@example
(setq guix-directory "~/src/guix")
@end example
@kbd{M-x guix-edit guix} opens
@file{~/src/guix/gnu/packages/package-management.scm} file.
Also you can use @kbd{C-u} prefix argument to specify a directory just
for the current @kbd{M-x guix-find-location} or @kbd{M-x guix-edit}
command.
@node Emacs Popup Interface
@section Popup Interface
If you ever used Magit, you know what ``popup interface'' is
(@pxref{Top,,, magit-popup, Magit-Popup User Manual}). Even if you are
not acquainted with Magit, there should be no worries as it is very
intuitive.
So @kbd{M-x@tie{}guix} command provides a top-level popup interface for
all available guix commands. When you select an option, you'll be
prompted for a value in the minibuffer. Many values have completions,
so don't hesitate to press @key{TAB} key. Multiple values (for example,
packages or lint checkers) should be separated by commas.
After specifying all options and switches for a command, you may choose
one of the available actions. The following default actions are
available for all commands:
@itemize
@item
Run the command in the Guix REPL. It is faster than running
@code{guix@tie{}@dots{}} command directly in shell, as there is no
need to run another guile process and to load required modules there.
@item
Run the command in a shell buffer. You can set
@code{guix-run-in-shell-function} variable to fine tune the shell buffer
you want to use.
@item
Add the command line to the kill ring (@pxref{Kill Ring,,, emacs, The
GNU Emacs Manual}).
@end itemize
Several commands (@command{guix graph}, @command{guix system shepherd-graph}
and @command{guix system extension-graph}) also have a ``View graph''
action, which allows you to view a generated graph using @command{dot}
command (specified by @code{guix-dot-program} variable). By default a
PNG file will be saved in @file{/tmp} directory and will be opened
directly in Emacs. This behavior may be changed with the following
variables:
@table @code
@item guix-find-file-function
Function used to open a generated graph. If you want to open a graph in
an external program, you can do it by modifying this variable---for
example, you can use a functionality provided by the Org Mode
(@pxref{Top,,, org, The Org Manual}):
@example
(setq guix-find-file-function 'org-open-file)
(add-to-list 'org-file-apps '("\\.png\\'" . "sxiv %s"))
@end example
@item guix-dot-default-arguments
Command line arguments to run @command{dot} command. If you change an
output format (for example, into @code{-Tpdf}), you also need to change
the next variable.
@item guix-dot-file-name-function
Function used to define a name of the generated graph file. Default
name is @file{/tmp/guix-emacs-graph-XXXXXX.png}.
@end table
So, for example, if you want to generate and open a PDF file in your
Emacs, you may change the settings like this:
@example
(defun my-guix-pdf-graph ()
"/tmp/my-current-guix-graph.pdf")
(setq guix-dot-default-arguments '("-Tpdf")
guix-dot-file-name-function 'my-guix-pdf-graph)
@end example
@node Emacs Prettify
@section Guix Prettify Mode
GNU@tie{}Guix also comes with ``guix-prettify.el''. It provides a minor
mode for abbreviating store file names by replacing hash sequences of
symbols with ``@dots{}'':
@example
/gnu/store/72f54nfp6g1hz873w8z3gfcah0h4nl9p-foo-0.1
@result{} /gnu/store/…-foo-0.1
@end example
Once you set up ``guix.el'' (@pxref{Emacs Initial Setup}), the following
commands become available:
@table @kbd
@item M-x guix-prettify-mode
Enable/disable prettifying for the current buffer.
@item M-x global-guix-prettify-mode
Enable/disable prettifying globally.
@end table
To automatically enable @code{guix-prettify-mode} globally on Emacs
start, add the following line to your init file:
@example
(global-guix-prettify-mode)
@end example
If you want to enable it only for specific major modes, add it to the
mode hooks (@pxref{Hooks,,, emacs, The GNU Emacs Manual}), for example:
@example
(add-hook 'shell-mode-hook 'guix-prettify-mode)
(add-hook 'dired-mode-hook 'guix-prettify-mode)
@end example
@node Emacs Build Log
@section Build Log Mode
GNU@tie{}Guix provides major and minor modes for highlighting build
logs. So when you have a file with a package build output---for
example, a file returned by @command{guix build --log-file @dots{}}
command (@pxref{Invoking guix build}), you may call @kbd{M-x
guix-build-log-mode} command in the buffer with this file. This major
mode highlights some lines specific to build output and provides the
following key bindings:
@table @kbd
@item M-n
Move to the next build phase.
@item M-p
Move to the previous build phase.
@item @key{TAB}
Toggle (show/hide) the body of the current build phase.
@item S-@key{TAB}
Toggle (show/hide) the bodies of all build phases.
@end table
There is also @kbd{M-x guix-build-log-minor-mode} which also provides
the same highlighting and the same key bindings as the major mode, but
prefixed with @kbd{C-c}. By default, this minor mode is enabled in
shell buffers (@pxref{Interactive Shell,,, emacs, The GNU Emacs
Manual}). If you don't like it, set
@code{guix-build-log-minor-mode-activate} to nil.
@node Emacs Completions
@section Shell Completions
Another feature that becomes available after configuring Emacs interface
(@pxref{Emacs Initial Setup}) is completing of @command{guix}
subcommands, options, packages and other things in @code{shell}
(@pxref{Interactive Shell,,, emacs, The GNU Emacs Manual}) and
@code{eshell} (@pxref{Top,,, eshell, Eshell: The Emacs Shell}).
It works the same way as other completions do. Just press @key{TAB}
when your intuition tells you.
And here are some examples, where pressing @key{TAB} may complete
something:
@itemize @w{}
@item @code{guix pa}@key{TAB}
@item @code{guix package -}@key{TAB}
@item @code{guix package --}@key{TAB}
@item @code{guix package -i gei}@key{TAB}
@item @code{guix build -L/tm}@key{TAB}
@item @code{guix build --sy}@key{TAB}
@item @code{guix build --system=i}@key{TAB}
@item @code{guix system rec}@key{TAB}
@item @code{guix lint --checkers=sy}@key{TAB}
@item @code{guix lint --checkers=synopsis,des}@key{TAB}
@end itemize
@node Emacs Development
@section Development
By default, when you open a Scheme file, @code{guix-devel-mode} will be
activated (if you don't want it, set @code{guix-devel-activate-mode} to
nil). This minor mode provides the following key bindings:
@table @kbd
@item C-c . k
Copy the name of the current Guile module into kill ring
(@code{guix-devel-copy-module-as-kill}).
@item C-c . u
Use the current Guile module. Often after opening a Scheme file, you
want to use a module it defines, so you switch to the Geiser REPL and
write @code{,use (some module)} there. You may just use this command
instead (@code{guix-devel-use-module}).
@item C-c . b
Build a package defined by the current variable definition. The
building process is run in the current Geiser REPL. If you modified the
current package definition, don't forget to reevaluate it before calling
this command---for example, with @kbd{C-M-x} (@pxref{To eval or not to
eval,,, geiser, Geiser User Manual})
(@code{guix-devel-build-package-definition}).
@item C-c . s
Build a source derivation of the package defined by the current variable
definition. This command has the same meaning as @code{guix build -S}
shell command (@pxref{Invoking guix build})
(@code{guix-devel-build-package-source}).
@item C-c . l
Lint (check) a package defined by the current variable definition
(@pxref{Invoking guix lint}) (@code{guix-devel-lint-package}).
@end table
Unluckily, there is a limitation related to long-running REPL commands.
When there is a running process in a Geiser REPL, you are not supposed
to evaluate anything in a scheme buffer, because this will ``freeze''
the REPL: it will stop producing any output (however, the evaluating
process will continue---you will just not see any progress anymore). Be
aware: even moving the point in a scheme buffer may ``break'' the REPL
if Autodoc (@pxref{Autodoc and friends,,, geiser, Geiser User Manual})
is enabled (which is the default).
So you have to postpone editing your scheme buffers until the running
evaluation will be finished in the REPL.
Alternatively, to avoid this limitation, you may just run another Geiser
REPL, and while something is being evaluated in the previous REPL, you
can continue editing a scheme file with the help of the current one.
@node Emacs Hydra
@section Hydra
The continuous integration server at @code{hydra.gnu.org} builds all
the distribution packages on the supported architectures and serves
them as substitutes (@pxref{Substitutes}). Continuous integration is
currently orchestrated by @uref{https://nixos.org/hydra/, Hydra}.
This section describes an Emacs interface to query Hydra to know the
build status of specific packages, discover recent and ongoing builds,
view build logs, and so on. This interface is mostly the same as the
``list''/``info'' interface for displaying packages and generations
(@pxref{Emacs Package Management}).
The following commands are available:
@table @kbd
@item M-x guix-hydra-latest-builds
Display latest failed or successful builds (you will be prompted for a
number of builds). With @kbd{C-u}, you will also be prompted for other
parameters (project, jobset, job and system).
@item M-x guix-hydra-queued-builds
Display scheduled or currently running builds (you will be prompted for
a number of builds).
@item M-x guix-hydra-jobsets
Display available jobsets (you will be prompted for a project).
@end table
In a list of builds you can press @kbd{L} key to display a build log of
the current build. Also both a list of builds and a list of jobsets
provide @kbd{B} key to display latest builds of the current job or
jobset (don't forget about @kbd{C-u}).
-13
View File
@@ -1,13 +0,0 @@
(use-modules (guix)
(gnu packages gdb)
(gnu packages autotools)
(gnu packages texinfo))
;; Augment the package definition of GDB with the build tools
;; needed when developing GDB (and which are not needed when
;; simply installing it.)
(package (inherit gdb)
(native-inputs `(("autoconf" ,autoconf-2.64)
("automake" ,automake)
("texinfo" ,texinfo)
,@(package-native-inputs gdb))))
-505
View File
@@ -1,505 +0,0 @@
@c The GNU Free Documentation License.
@center Version 1.3, 3 November 2008
@c This file is intended to be included within another document,
@c hence no sectioning command or @node.
@display
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
@uref{http://fsf.org/}
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@end display
@enumerate 0
@item
PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document @dfn{free} in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of ``copyleft'', which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
@item
APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The ``Document'', below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as ``you''. You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
A ``Modified Version'' of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A ``Secondary Section'' is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The ``Invariant Sections'' are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
The ``Cover Texts'' are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
A ``Transparent'' copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not ``Transparent'' is called ``Opaque''.
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, La@TeX{} input
format, SGML or XML using a publicly available
DTD, and standard-conforming simple HTML,
PostScript or PDF designed for human modification. Examples
of transparent image formats include PNG, XCF and
JPG. Opaque formats include proprietary formats that can be
read and edited only by proprietary word processors, SGML or
XML for which the DTD and/or processing tools are
not generally available, and the machine-generated HTML,
PostScript or PDF produced by some word processors for
output purposes only.
The ``Title Page'' means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, ``Title Page'' means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
The ``publisher'' means any person or entity that distributes copies
of the Document to the public.
A section ``Entitled XYZ'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as ``Acknowledgements'',
``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
of such a section when you modify the Document means that it remains a
section ``Entitled XYZ'' according to this definition.
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
@item
VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
@item
COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
@item
MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
@enumerate A
@item
Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
@item
List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
@item
State on the Title page the name of the publisher of the
Modified Version, as the publisher.
@item
Preserve all the copyright notices of the Document.
@item
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
@item
Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
@item
Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
@item
Include an unaltered copy of this License.
@item
Preserve the section Entitled ``History'', Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled ``History'' in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
@item
Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the ``History'' section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
@item
For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
the Title of the section, and preserve in the section all the
substance and tone of each of the contributor acknowledgements and/or
dedications given therein.
@item
Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
@item
Delete any section Entitled ``Endorsements''. Such a section
may not be included in the Modified Version.
@item
Do not retitle any existing section to be Entitled ``Endorsements'' or
to conflict in title with any Invariant Section.
@item
Preserve any Warranty Disclaimers.
@end enumerate
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled ``Endorsements'', provided it contains
nothing but endorsements of your Modified Version by various
parties---for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
@item
COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled ``History''
in the various original documents, forming one section Entitled
``History''; likewise combine any sections Entitled ``Acknowledgements'',
and any sections Entitled ``Dedications''. You must delete all
sections Entitled ``Endorsements.''
@item
COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
@item
AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an ``aggregate'' if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
@item
TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
If a section in the Document is Entitled ``Acknowledgements'',
``Dedications'', or ``History'', the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
@item
TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
@item
FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
@uref{http://www.gnu.org/copyleft/}.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License ``or any later version'' applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
@item
RELICENSING
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
site means any set of copyrightable works thus published on the MMC
site.
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
``Incorporate'' means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is ``eligible for relicensing'' if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
@end enumerate
@page
@heading ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
@smallexample
@group
Copyright (C) @var{year} @var{your name}.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
@end group
@end smallexample
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the ``with@dots{}Texts.''@: line with this:
@smallexample
@group
with the Invariant Sections being @var{list their titles}, with
the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
being @var{list}.
@end group
@end smallexample
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.
@c Local Variables:
@c ispell-local-pdict: "ispell-dict"
@c End:
-12034
View File
File diff suppressed because it is too large Load Diff
-652
View File
@@ -1,652 +0,0 @@
# htmlxref.cnf - reference file for free Texinfo manuals on the web.
# Modified by Ludovic Courtès <ludo@gnu.org> for the GNU Guix manual.
htmlxrefversion=2016-03-30.07; # UTC
# Copyright 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc.
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.
#
# The latest version of this file is available at
# http://ftpmirror.gnu.org/texinfo/htmlxref.cnf.
# Email corrections or additions to bug-texinfo@gnu.org.
# The primary goal is to list all relevant GNU manuals;
# other free manuals are also welcome.
#
# To be included in this list, a manual must:
#
# - have a generic url, e.g., no version numbers;
# - have a unique file name (e.g., manual identifier), i.e., be related to the
# package name. Things like "refman" or "tutorial" don't work.
# - follow the naming convention for nodes described at
# http://www.gnu.org/software/texinfo/manual/texinfo/html_node/HTML-Xref.html
# This is what makeinfo and texi2html implement.
#
# Unless the above criteria are met, it's not possible to generate
# reliable cross-manual references.
#
# For information on automatically generating all the useful formats for
# a manual to put on the web, see
# http://www.gnu.org/prep/maintain/html_node/Manuals-on-Web-Pages.html.
# For people editing this file: when a manual named foo is related to a
# package named bar, the url should contain a variable reference ${BAR}.
# Otherwise, the gnumaint scripts have no way of knowing they are
# associated, and thus gnu.org/manual can't include them.
# shorten references to manuals on www.gnu.org.
G = http://www.gnu.org
GS = ${G}/software
3dldf mono ${GS}/3dldf/manual/user_ref/3DLDF.html
3dldf node ${GS}/3dldf/manual/user_ref/
alive mono ${GS}/alive/manual/alive.html
alive node ${GS}/alive/manual/html_node/
anubis chapter ${GS}/anubis/manual/html_chapter/
anubis section ${GS}/anubis/manual/html_section/
anubis node ${GS}/anubis/manual/html_node/
artanis mono ${GS}/artanis/manual/artanis.html
artanis node ${GS}/artanis/manual/html_node/
aspell section http://aspell.net/man-html/index.html
auctex mono ${GS}/auctex/manual/auctex.html
auctex node ${GS}/auctex/manual/auctex/
autoconf mono ${GS}/autoconf/manual/autoconf.html
autoconf node ${GS}/autoconf/manual/html_node/
autogen mono ${GS}/autogen/manual/html_mono/autogen.html
autogen chapter ${GS}/autogen/manual/html_chapter/
autogen node ${GS}/autoconf/manual/html_node/
automake mono ${GS}/automake/manual/automake.html
automake node ${GS}/automake/manual/html_node/
avl node http://www.stanford.edu/~blp/avl/libavl.html/
bash mono ${GS}/bash/manual/bash.html
bash node ${GS}/bash/manual/html_node/
BINUTILS = http://sourceware.org/binutils/docs
binutils node ${BINUTILS}/binutils/
as node ${BINUTILS}/as/
bfd node ${BINUTILS}/bfd/
gprof node ${BINUTILS}/gprof/
ld node ${BINUTILS}/ld/
bison mono ${GS}/bison/manual/bison.html
bison node ${GS}/bison/manual/html_node/
bpel2owfn mono ${GS}/bpel2owfn/manual/2.0.x/bpel2owfn.html
ccd2cue mono ${GS}/ccd2cue/manual/ccd2cue.html
ccd2cue node ${GS}/ccd2cue/manual/html_node/
cflow mono ${GS}/cflow/manual/cflow.html
cflow node ${GS}/cflow/manual/html_node/
chess mono ${GS}/chess/manual/gnuchess.html
chess node ${GS}/chess/manual/html_node/
combine mono ${GS}/combine/manual/combine.html
combine chapter ${GS}/combine/manual/html_chapter/
combine section ${GS}/combine/manual/html_section/
combine node ${GS}/combine/manual/html_node/
complexity mono ${GS}/complexity/manual/complexity.html
complexity node ${GS}/complexity/manual/html_node/
coreutils mono ${GS}/coreutils/manual/coreutils
coreutils node ${GS}/coreutils/manual/html_node/
cpio mono ${GS}/cpio/manual/cpio
cpio node ${GS}/cpio/manual/html_node/
cssc node ${GS}/cssc/manual/
#cvs cannot be handled here; see http://ximbiot.com/cvs/manual.
ddd mono ${GS}/ddd/manual/html_mono/ddd.html
ddrescue mono ${GS}/ddrescue/manual/ddrescue_manual.html
DICO = http://puszcza.gnu.org.ua/software/dico/manual
dico mono ${DICO}/dico.html
dico chapter ${DICO}/html_chapter/
dico section ${DICO}/html_section/
dico node ${DICO}/html_node/
diffutils mono ${GS}/diffutils/manual/diffutils
diffutils node ${GS}/diffutils/manual/html_node/
ed mono ${GS}/ed/manual/ed_manual.html
EMACS = ${GS}/emacs/manual
emacs mono ${EMACS}/html_mono/emacs.html
emacs node ${EMACS}/html_node/emacs/
#
ada-mode mono ${EMACS}/html_mono/ada-mode.html
ada-mode node ${EMACS}/html_node/ada-mode/
#
autotype mono ${EMACS}/html_mono/autotype.html
autotype node ${EMACS}/html_node/autotype/
#
ccmode mono ${EMACS}/html_mono/ccmode.html
ccmode node ${EMACS}/html_node/ccmode/
#
cl mono ${EMACS}/html_mono/cl.html
cl node ${EMACS}/html_node/cl/
#
ebrowse mono ${EMACS}/html_mono/ebrowse.html
ebrowse node ${EMACS}/html_node/ebrowse/
#
ediff mono ${EMACS}/html_mono/ediff.html
ediff node ${EMACS}/html_node/ediff/
#
eieio mono ${EMACS}/html_mono/eieio.html
eieio node ${EMACS}/html_node/eieio/
#
elisp mono ${EMACS}/html_mono/elisp.html
elisp node ${EMACS}/html_node/elisp/
#
epa mono ${EMACS}/html_mono/epa.html
epa node ${EMACS}/html_node/epa/
#
erc mono ${EMACS}/html_mono/erc.html
erc node ${EMACS}/html_node/erc/
#
dired-x mono ${EMACS}/html_mono/dired-x.html
dired-x node ${EMACS}/html_node/dired-x/
#
eshell mono ${EMACS}/html_mono/eshell.html
eshell node ${EMACS}/html_node/eshell/
#
flymake mono ${EMACS}/html_mono/flymake.html
flymake node ${EMACS}/html_node/flymake/
#
gnus mono ${EMACS}/html_mono/gnus.html
gnus node ${EMACS}/html_node/gnus/
#
idlwave mono ${EMACS}/html_mono/idlwave.html
idlwave node ${EMACS}/html_node/idlwave/
#
message mono ${EMACS}/html_mono/message.html
message node ${EMACS}/html_node/message/
#
mh-e mono ${EMACS}/html_mono/mh-e.html
mh-e node ${EMACS}/html_node/mh-e/
#
nxml-mode mono ${EMACS}/html_mono/nxml-mode.html
nxml-mode node ${EMACS}/html_node/nxml-mode/
#
org mono ${EMACS}/html_mono/org.html
org node ${EMACS}/html_node/org/
#
pcl-cvs mono ${EMACS}/html_mono/pcl-cvs.html
pcl-cvs node ${EMACS}/html_node/pcl-cvs/
#
rcirc mono ${EMACS}/html_mono/rcirc.html
rcirc node ${EMACS}/html_node/rcirc/
#
semantic mono ${EMACS}/html_mono/semantic.html
semantic node ${EMACS}/html_node/semantic/
#
smtp mono ${EMACS}/html_mono/smtpmail.html
smtp node ${EMACS}/html_node/smtpmail/
#
speedbar mono ${EMACS}/html_mono/speedbar.html
speedbar node ${EMACS}/html_node/speedbar/
#
tramp mono ${EMACS}/html_mono/tramp.html
tramp node ${EMACS}/html_node/tramp/
#
vip mono ${EMACS}/html_mono/vip.html
vip node ${EMACS}/html_node/vip/
#
viper mono ${EMACS}/html_mono/viper.html
viper node ${EMACS}/html_node/viper/
#
woman mono ${EMACS}/html_mono/woman.html
woman node ${EMACS}/html_node/woman/
# (end emacs manuals)
easejs mono ${GS}/easejs/manual/easejs.html
easejs node ${GS}/easejs/manual/
emacs-muse node ${GS}/emacs-muse/manual/muse.html
emacs-muse node ${GS}/emacs-muse/manual/html_node/
emms node ${GS}/emms/manual/
findutils mono ${GS}/findutils/manual/html_mono/find.html
findutils node ${GS}/findutils/manual/html_node/find_html
FLEX = http://flex.sourceforge.net
flex node ${FLEX}/manual/
gama mono ${GS}/gama/manual/gama.html
gama node ${GS}/gama/manual/html_node/
GAWK = ${GS}/gawk/manual
gawk mono ${GAWK}/gawk.html
gawk node ${GAWK}/html_node/
gawkinet mono ${GAWK}/gawkinet/gawkinet.html
gawkinet node ${GAWK}/gawkinet/html_node/
gcal mono ${GS}/gcal/manual/gcal.html
gcal node ${GS}/gcal/manual/html_node/
GCC = http://gcc.gnu.org/onlinedocs
gcc node ${GCC}/gcc/
cpp node ${GCC}/cpp/
gcj node ${GCC}/gcj/
gfortran node ${GCC}/gfortran/
gnat_rm node ${GCC}/gnat_rm/
gnat_ugn_unw node ${GCC}/gnat_ugn_unw/
libgomp node ${GCC}/libgomp/
libstdc++ node ${GCC}/libstdc++/
#
gccint node ${GCC}/gccint/
cppinternals node ${GCC}/cppinternals/
gfc-internals node ${GCC}/gfc-internals/
gnat-style node ${GCC}/gnat-style/
libiberty node ${GCC}/libiberty/
GDB = http://sourceware.org/gdb/current/onlinedocs
gdb node ${GDB}/gdb/
stabs node ${GDB}/stabs/
GDBM = http://www.gnu.org.ua/software/gdbm/manual
gdbm mono ${GDBM}/gdbm.html
gdbm chapter ${GDBM}/html_chapter/
gdbm section ${GDBM}/html_section/
gdbm node ${GDBM}/html_node/
gettext mono ${GS}/gettext/manual/gettext.html
gettext node ${GS}/gettext/manual/html_node/
gforth node http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/
global mono ${GS}/global/manual/global.html
gmediaserver node ${GS}/gmediaserver/manual/
gmp node http://www.gmplib.org/manual/
gnu-arch node ${GS}/gnu-arch/tutorial/
gnu-c-manual mono ${GS}/gnu-c-manual/gnu-c-manual.html
gnu-crypto node ${GS}/gnu-crypto/manual/
gnubg mono ${GS}/gnubg/manual/gnubg.html
gnubg node ${GS}/gnubg/manual/html_node/
gnubik mono ${GS}/gnubik/manual/gnubik.html
gnubik node ${GS}/gnubik/manual/html_node/
gnulib mono ${GS}/gnulib/manual/gnulib.html
gnulib node ${GS}/gnulib/manual/html_node/
GNUN = ${GS}/trans-coord/manual
gnun mono ${GNUN}/gnun/gnun.html
gnun node ${GNUN}/gnun/html_node/
web-trans mono ${GNUN}/web-trans/web-trans.html
web-trans node ${GNUN}/web-trans/html_node/
GNUPG = http://www.gnupg.org/documentation/manuals
gnupg node ${GNUPG}/gnupg/
dirmngr node ${GNUPG}/dirmngr/
gcrypt node ${GNUPG}/gcrypt/
libgcrypt node ${GNUPG}/gcrypt/
ksba node ${GNUPG}/ksba/
assuan node ${GNUPG}/assuan/
gpgme node ${GNUPG}/gpgme/
gnuprologjava node ${GS}/gnuprologjava/manual/
gnuschool mono ${GS}/gnuschool/gnuschool.html
GNUSTANDARDS = ${G}/prep
maintain mono ${GNUSTANDARDS}/maintain/maintain.html
maintain node ${GNUSTANDARDS}/maintain/html_node/
#
standards mono ${GNUSTANDARDS}/standards/standards.html
standards node ${GNUSTANDARDS}/standards/html_node/
gnutls mono http://gnutls.org/manual/gnutls.html
gnutls node http://gnutls.org/manual/html_node/
gnutls-guile mono http://gnutls.org/manual/gnutls-guile.html
gnutls-guile node http://gnutls.org/manual/gnutls-guile/
gperf mono ${GS}/gperf/manual/gperf.html
gperf node ${GS}/gperf/manual/html_node/
grep mono ${GS}/grep/manual/grep.html
grep node ${GS}/grep/manual/html_node/
groff node ${GS}/groff/manual/html_node/
GRUB = ${GS}/grub/manual
grub mono ${GRUB}/grub.html
grub node ${GRUB}/html_node/
#
multiboot mono ${GRUB}/multiboot/multiboot.html
multiboot node ${GRUB}/multiboot/html_node/
gsasl mono ${GS}/gsasl/manual/gsasl.html
gsasl node ${GS}/gsasl/manual/html_node/
gsl node ${GS}/gsl/manual/html_node/
gsrc mono ${GS}/gsrc/manual/gsrc.html
gsrc node ${GS}/gsrc/manual/html_node/
gss mono ${GS}/gss/manual/gss.html
gss node ${GS}/gss/manual/html_node/
gtypist mono ${GS}/gtypist/doc/
guile mono ${GS}/guile/manual/guile.html
guile node ${GS}/guile/manual/html_node/
guile-avahi mono http://nongnu.org/guile-avahi/doc/guile-avahi.html
GUILE_GNOME = ${GS}/guile-gnome/docs
gobject node ${GUILE_GNOME}/gobject/html/
glib node ${GUILE_GNOME}/glib/html/
atk node ${GUILE_GNOME}/atk/html/
pango node ${GUILE_GNOME}/pango/html/
pangocairo node ${GUILE_GNOME}/pangocairo/html/
gdk node ${GUILE_GNOME}/gdk/html/
gtk node ${GUILE_GNOME}/gtk/html/
libglade node ${GUILE_GNOME}/libglade/html/
gnome-vfs node ${GUILE_GNOME}/gnome-vfs/html/
libgnomecanvas node ${GUILE_GNOME}/libgnomecanvas/html/
gconf node ${GUILE_GNOME}/gconf/html/
libgnome node ${GUILE_GNOME}/libgnome/html/
libgnomeui node ${GUILE_GNOME}/libgnomeui/html/
corba node ${GUILE_GNOME}/corba/html/
clutter node ${GUILE_GNOME}/clutter/html/
clutter-glx node ${GUILE_GNOME}/clutter-glx/html/
guile-gtk node ${GS}/guile-gtk/docs/guile-gtk/
guile-rpc mono ${GS}/guile-rpc/manual/guile-rpc.html
guile-rpc node ${GS}/guile-rpc/manual/html_node/
guix mono ${GS}/guix/manual/guix.html
guix node ${GS}/guix/manual/html_node/
gv mono ${GS}/gv/manual/gv.html
gv node ${GS}/gv/manual/html_node/
gzip mono ${GS}/gzip/manual/gzip.html
gzip node ${GS}/gzip/manual/html_node/
hello mono ${GS}/hello/manual/hello.html
hello node ${GS}/hello/manual/html_node/
help2man mono ${GS}/help2man/help2man.html
idutils mono ${GS}/idutils/manual/idutils.html
idutils node ${GS}/idutils/manual/html_node/
inetutils mono ${GS}/inetutils/manual/inetutils.html
inetutils node ${GS}/inetutils/manual/html_node/
jwhois mono ${GS}/jwhois/manual/jwhois.html
jwhois node ${GS}/jwhois/manual/html_node/
libc mono ${GS}/libc/manual/html_mono/libc.html
libc node ${GS}/libc/manual/html_node/
LIBCDIO = ${GS}/libcdio
libcdio mono ${LIBCDIO}/libcdio.html
cd-text mono ${LIBCDIO}/cd-text-format.html
libextractor mono ${GS}/libextractor/manual/libextractor.html
libextractor node ${GS}/libextractor/manual/html_node/
libidn mono ${GS}/libidn/manual/libidn.html
libidn node ${GS}/libidn/manual/html_node/
librejs mono ${GS}/librejs/manual/librejs.html
librejs node ${GS}/librejs/manual/html_node/
libmatheval mono ${GS}/libmatheval/manual/libmatheval.html
LIBMICROHTTPD = ${GS}/libmicrohttpd
libmicrohttpd mono ${LIBMICROHTTPD}/manual/libmicrohttpd.html
libmicrohttpd node ${LIBMICROHTTPD}/manual/html_node/
microhttpd-tutorial mono ${LIBMICROHTTPD}/tutorial.html
libtasn1 mono ${GS}/libtasn1/manual/libtasn1.html
libtasn1 node ${GS}/libtasn1/manual/html_node/
libtool mono ${GS}/libtool/manual/libtool.html
libtool node ${GS}/libtool/manual/html_node/
lightning mono ${GS}/lightning/manual/lightning.html
lightning node ${GS}/lightning/manual/html_node/
# The stable/ url redirects immediately, but that's ok.
# The .html extension is omitted on their web site, but it works if given.
LILYPOND = http://lilypond.org/doc/stable/Documentation
lilypond-internals node ${LILYPOND}/internals/
lilypond-learning node ${LILYPOND}/learning/
lilypond-notation node ${LILYPOND}/notation/
lilypond-snippets node ${LILYPOND}/snippets/
lilypond-usage node ${LILYPOND}/usage/
lilypond-web node ${LILYPOND}/web/
music-glossary node ${LILYPOND}/music-glossary/
liquidwar6 mono ${GS}/liquidwar6/manual/liquidwar6.html
liquidwar6 node ${GS}/liquidwar6/manual/html_node/
lispintro mono ${GS}/emacs/emacs-lisp-intro/html_mono/emacs-lisp-intro.html
lispintro node ${GS}/emacs/emacs-lisp-intro/html_node/index.html
LSH = http://www.lysator.liu.se/~nisse/lsh
lsh mono ${LSH}/lsh.html
m4 mono ${GS}/m4/manual/m4.html
m4 node ${GS}/m4/manual/html_node/
mailutils mono ${GS}/mailutils/manual/mailutils.html
mailutils chapter ${GS}/mailutils/manual/html_chapter/
mailutils section ${GS}/mailutils/manual/html_section/
mailutils node ${GS}/mailutils/manual/html_node/
make mono ${GS}/make/manual/make.html
make node ${GS}/make/manual/html_node/
mdk mono ${GS}/mdk/manual/mdk.html
mdk node ${GS}/mdk/manual/html_node/
METAEXCHANGE = http://ftp.gwdg.de/pub/gnu2/iwfmdh/doc/texinfo
iwf_mh node ${METAEXCHANGE}/iwf_mh.html
scantest node ${METAEXCHANGE}/scantest.html
MIT_SCHEME = ${GS}/mit-scheme/documentation
mit-scheme-ref node ${MIT_SCHEME}/mit-scheme-ref/
mit-scheme-user node ${MIT_SCHEME}/mit-scheme-user/
sos node ${MIT_SCHEME}/mit-scheme-sos/
mit-scheme-imail node ${MIT_SCHEME}/mit-scheme-imail/
moe mono ${GS}/moe/manual/moe_manual.html
motti node ${GS}/motti/manual/
mpc node http://www.multiprecision.org/index.php?prog=mpc&page=html
mpfr mono http://www.mpfr.org/mpfr-current/mpfr.html
mtools mono ${GS}/mtools/manual/mtools.html
myserver node http://www.myserverproject.net/documentation/
nano mono http://www.nano-editor.org/dist/latest/nano.html
nettle chapter http://www.lysator.liu.se/~nisse/nettle/nettle.html
ocrad mono ${GS}/ocrad/manual/ocrad_manual.html
parted mono ${GS}/parted/manual/parted.html
parted node ${GS}/parted/manual/html_node/
pascal mono http://www.gnu-pascal.de/gpc/
# can't use pcb since url's contain dates --30nov10
perl mono ${GS}/perl/manual/perldoc-all.html
PIES = http://www.gnu.org.ua/software/pies/manual
pies mono ${PIES}/pies.html
pies chapter ${PIES}/html_chapter/
pies section ${PIES}/html_section/
pies node ${PIES}/html_node/
plotutils mono ${GS}/plotutils/manual/en/plotutils.html
plotutils node ${GS}/plotutils/manual/en/html_node/
proxyknife mono ${GS}/proxyknife/manual/proxyknife.html
proxyknife node ${GS}/proxyknife/manual/html_node/
pspp mono ${GS}/pspp/manual/pspp.html
pspp node ${GS}/pspp/manual/html_node/
pyconfigure mono ${GS}/pyconfigure/manual/pyconfigure.html
pyconfigure node ${GS}/pyconfigure/manual/html_node/
R = http://cran.r-project.org/doc/manuals
R-intro mono ${R}/R-intro.html
R-lang mono ${R}/R-lang.html
R-exts mono ${R}/R-exts.html
R-data mono ${R}/R-data.html
R-admin mono ${R}/R-admin.html
R-ints mono ${R}/R-ints.html
rcs mono ${GS}/rcs/manual/rcs.html
rcs node ${GS}/rcs/manual/html_node/
READLINE = http://cnswww.cns.cwru.edu/php/chet/readline
readline mono ${READLINE}/readline.html
rluserman mono ${READLINE}/rluserman.html
history mono ${READLINE}/history.html
recode mono http://recode.progiciels-bpi.ca/manual/index.html
recutils mono ${GS}/recutils/manual/recutils.html
recutils node ${GS}/recutils/manual/html_node/
reftex mono ${GS}/auctex/manual/reftex.html
reftex node ${GS}/auctex/manual/reftex/
remotecontrol mono ${GS}/remotecontrol/manual/remotecontrol.html
remotecontrol node ${GS}/remotecontrol/manual/html_node/
rottlog mono ${GS}/rottlog/manual/rottlog.html
rottlog node ${GS}/rottlog/manual/html_node/
RUSH = http://www.gnu.org.ua/software/rush/manual
rush mono ${RUSH}/rush.html
rush chapter ${RUSH}/html_chapter/
rush section ${RUSH}/html_section/
rush node ${RUSH}/html_node/
screen mono ${GS}/screen/manual/screen.html
screen node ${GS}/screen/manual/html_node/
sed mono ${GS}/sed/manual/sed.html
sed node ${GS}/sed/manual/html_node/
sharutils mono ${GS}/sharutils/manual/html_mono/sharutils.html
sharutils chapter ${GS}/sharutils/manual/html_chapter/
sharutils node ${GS}/sharutils/manual/html_node/
shepherd mono ${GS}/shepherd/manual/shepherd.html
shepherd node ${GS}/shepherd/manual/html_node/
# can't use mono files since they have generic names
SMALLTALK = ${GS}/smalltalk
smalltalk node ${SMALLTALK}/manual/html_node/
smalltalk-base node ${SMALLTALK}/manual-base/html_node/
smalltalk-libs node ${SMALLTALK}/manual-libs/html_node/
sourceinstall mono ${GS}/sourceinstall/manual/sourceinstall.html
sourceinstall node ${GS}/sourceinstall/manual/html_node/
sqltutor mono ${GS}/sqltutor/manual/sqltutor.html
sqltutor node ${GS}/sqltutor/manual/html_node/
src-highlite mono ${GS}/src-highlite/source-highlight.html
swbis mono ${GS}/swbis/manual.html
tar mono ${GS}/tar/manual/tar.html
tar chapter ${GS}/tar/manual/html_chapter/
tar section ${GS}/tar/manual/html_section/
tar node ${GS}/autoconf/manual/html_node/
teseq mono ${GS}/teseq/teseq.html
teseq node ${GS}/teseq/html_node/
TEXINFO = ${GS}/texinfo/manual
texinfo mono ${TEXINFO}/texinfo/texinfo.html
texinfo node ${TEXINFO}/texinfo/html_node/
#
info mono ${TEXINFO}/info/info.html
info node ${TEXINFO}/info/html_node/
#
info-stnd mono ${TEXINFO}/info-stnd/info-stnd.html
info-stnd node ${TEXINFO}/info-stnd/html_node/
thales node ${GS}/thales/manual/
units mono ${GS}/units/manual/units.html
units node ${GS}/units/manual/html_node/
vc-dwim mono ${GS}/vc-dwim/manual/vc-dwim.html
vc-dwim node ${GS}/vc-dwim/manual/html_node/
wdiff mono ${GS}/wdiff/manual/wdiff.html
wdiff node ${GS}/wdiff/manual/html_node/
websocket4j mono ${GS}/websocket4j/manual/websocket4j.html
websocket4j node ${GS}/websocket4j/manual/html_node/
wget mono ${GS}/wget/manual/wget.html
wget node ${GS}/wget/manual/html_node/
xboard mono ${GS}/xboard/manual/xboard.html
xboard node ${GS}/xboard/manual/html_node/
# emacs-page
# Free TeX-related Texinfo manuals on tug.org.
T = http://tug.org/texinfohtml
dvipng mono ${T}/dvipng.html
dvips mono ${T}/dvips.html
eplain mono ${T}/eplain.html
kpathsea mono ${T}/kpathsea.html
latex2e mono ${T}/latex2e.html
tlbuild mono ${T}/tlbuild.html
web2c mono ${T}/web2c.html
# Local Variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "htmlxrefversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
-83
View File
@@ -1,83 +0,0 @@
# Obtained by running "nix-store --graph" on the first GCC derivation.
digraph G {
"/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "black"];
"/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "red"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "green"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "blue"];
"/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "magenta"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "burlywood"];
"/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "black"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "red"];
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" -> "/nix/store/x60397za40lx0n88f51a2csfdq5xvb19-gcc-bootstrap-0.drv" [color = "green"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" [label = "tar", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "blue"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "magenta"];
"/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "burlywood"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "black"];
"/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "red"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "green"];
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" -> "/nix/store/4sv9xhcjap6byca130fzpzzjalb7iixv-glibc-bootstrap-0.drv" [color = "blue"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" [label = "xz", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [label = "glibc-bootstrap-0-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [color = "magenta"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/8iivk9hpnps21yrbq3zzsxgzv9ixbhgh-glibc-bootstrap-0-guile-builder" [color = "burlywood"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [label = "module-import.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/9zrdfvnrpljryr82an2n1mj6bh2przhn-module-import-guile-builder" -> "/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [color = "black"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [color = "red"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" [color = "green"];
"/nix/store/9zrdfvnrpljryr82an2n1mj6bh2przhn-module-import-guile-builder" [label = "module-import-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/9zrdfvnrpljryr82an2n1mj6bh2przhn-module-import-guile-builder" [color = "blue"];
"/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [label = "gcc-4.7.2.tar.xz.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/6kslnirvm26fij7wpjqbw617ri4gf5x5-gcc-4.7.2.tar.xz-guile-builder" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "magenta"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "burlywood"];
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "black"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/fl9cwcczfdv73vq5sr0c4rd5hqzrgvac-gcc-4.7.2.tar.xz.drv" [color = "red"];
"/nix/store/6kslnirvm26fij7wpjqbw617ri4gf5x5-gcc-4.7.2.tar.xz-guile-builder" [label = "gcc-4.7.2.tar.xz-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" [label = "bash", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [label = "module-import.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/abagrdbdndkd0y2dwk0nw1gw0g0rhl2z-ftp-client.scm" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "green"];
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "blue"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "magenta"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "burlywood"];
"/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" -> "/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" [color = "black"];
"/nix/store/abagrdbdndkd0y2dwk0nw1gw0g0rhl2z-ftp-client.scm" [label = "ftp-client.scm", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" [label = "download.scm", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" [label = "utils.scm", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [label = "module-import-compiled.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/98gzqlgpm4gxrpl5bzykpqbwrx8ckx8l-module-import-compiled-guile-builder" -> "/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [color = "red"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" -> "/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [color = "green"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" [color = "blue"];
"/nix/store/98gzqlgpm4gxrpl5bzykpqbwrx8ckx8l-module-import-compiled-guile-builder" [label = "module-import-compiled-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [label = "gcc-bootstrap-0-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [color = "magenta"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [color = "burlywood"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" -> "/nix/store/r3dsy5j2c16sv26raala6kahff7w18hb-gcc-bootstrap-0-guile-builder" [color = "black"];
"/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [label = "glibc-2.17.tar.xz.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/kvk5wp8c9rzvvrmq5fv5r58l78q8i6ch-module-import.drv" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "red"];
"/nix/store/pzv319p3q7raiad7nq7fcdw9rafzp14k-module-import-compiled.drv" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "green"];
"/nix/store/q7as3jddipj4g6si8lawrdbkjg0zcjvg-glibc-2.17.tar.xz-guile-builder" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "blue"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/wdwrkg02gn28bkpbxgdb2nv558v8s3ji-glibc-2.17.tar.xz.drv" [color = "magenta"];
"/nix/store/q7as3jddipj4g6si8lawrdbkjg0zcjvg-glibc-2.17.tar.xz-guile-builder" [label = "glibc-2.17.tar.xz-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [label = "guile-bootstrap-2.0.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" -> "/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [color = "burlywood"];
"/nix/store/jaaqdl979wjirnbxz1jqsipg22nva5n4-bash" -> "/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" [color = "black"];
"/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [label = "build-bootstrap-guile.sh", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/3iawic1z95112yfz5y9xdp66qbxxr8l1-tar" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "red"];
"/nix/store/4xv2y0m6zr2lgi8x8pcb3zxjqxsz69kj-mkdir" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "green"];
"/nix/store/8cc81w6m04csm52y247xj3gydrbz2niv-xz" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "blue"];
"/nix/store/c450lqvaaz3ngx9pfiiiw55rqq6ssfda-guile-2.0.7.tar.xz" -> "/nix/store/bplka3yqdg8prqq3zdxza6wxlkjdhr2g-build-bootstrap-guile.sh" [color = "magenta"];
"/nix/store/4xv2y0m6zr2lgi8x8pcb3zxjqxsz69kj-mkdir" [label = "mkdir", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/c450lqvaaz3ngx9pfiiiw55rqq6ssfda-guile-2.0.7.tar.xz" [label = "guile-2.0.7.tar.xz", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [label = "module-import-compiled.drv", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/8jiqjlb6zxjys16ca7s6jvxcc620c71k-module-import-compiled-guile-builder" -> "/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [color = "burlywood"];
"/nix/store/96yx6013dhggr3mpg5ayxv8dm9mv2ghv-module-import.drv" -> "/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [color = "black"];
"/nix/store/x9x1a86flhx15cams7235rfy5gc5cww1-guile-bootstrap-2.0.drv" -> "/nix/store/y4n7rzysx6qz3p0n91dw9qz5w93l6iqv-module-import-compiled.drv" [color = "red"];
"/nix/store/8jiqjlb6zxjys16ca7s6jvxcc620c71k-module-import-compiled-guile-builder" [label = "module-import-compiled-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [label = "module-import-guile-builder", fontname = Helvetica, shape = box, style = filled, fillcolor = "#ffffff"];
"/nix/store/abagrdbdndkd0y2dwk0nw1gw0g0rhl2z-ftp-client.scm" -> "/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [color = "green"];
"/nix/store/dwd2iwd1ban8a8rmx568dpgrbkkidfhw-download.scm" -> "/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [color = "blue"];
"/nix/store/mj7amprgvl2rgash1nr0v64apik8vc7f-utils.scm" -> "/nix/store/yfixjx2gpvsi5dhkpdx5gj6gx0xdk1c8-module-import-guile-builder" [color = "magenta"];
}
-105
View File
@@ -1,105 +0,0 @@
digraph "Guix bag" {
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" [label = "glibc-intermediate-2.22", shape = box, fontname = Helvetica];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/rkm2xr9581hfvcimz6a8xav2s5vfjciv-glibc-intermediate-2.22.drv" -> "/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" [label = "texinfo-6.0", shape = box, fontname = Helvetica];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/r5bbwfhkj6c65mlfki4vgb0xczm3qmlg-texinfo-6.0.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red];
"/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [label = "make-boot0-4.1", shape = box, fontname = Helvetica];
"/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [label = "glibc-bootstrap-0", shape = box, fontname = Helvetica];
"/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [label = "gcc-bootstrap-0", shape = box, fontname = Helvetica];
"/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [label = "binutils-bootstrap-0", shape = box, fontname = Helvetica];
"/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [label = "bootstrap-binaries-0", shape = box, fontname = Helvetica];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [label = "diffutils-boot0-3.3", shape = box, fontname = Helvetica];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [label = "findutils-boot0-4.6.0", shape = box, fontname = Helvetica];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [label = "file-boot0-5.25", shape = box, fontname = Helvetica];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [label = "perl-boot0-5.22.0", shape = box, fontname = Helvetica];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" [label = "gcc-cross-boot0-4.9.3", shape = box, fontname = Helvetica];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/fxzy6h3c9ls97lw9wgv9m5w2ga7mw0kk-gcc-cross-boot0-4.9.3.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" [label = "binutils-cross-boot0-2.25.1", shape = box, fontname = Helvetica];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/bhv3jml5s1llmsswnw3wvw57dj44lgjc-binutils-cross-boot0-2.25.1.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" [label = "linux-libre-headers-3.14.37", shape = box, fontname = Helvetica];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/w88h2mp610hy4i8758bhq6nrjlilzsym-perl-boot0-5.22.0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/yzr9lpl44ixp4k2g7r6sh4fhsx2qx9vd-make-boot0-4.1.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/hwk4rrydk5amqw5xws5p34gi77j0m7m2-diffutils-boot0-3.3.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xf07iqpsiygw2z8rvwdf19zjdlhrl03q-findutils-boot0-4.6.0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/b33cj0h9ii7lnk233sy5q4hlz36cx5x3-file-boot0-5.25.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/dmj22s341y334xwwkimrz4d3d0a4mzdp-glibc-bootstrap-0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/wp4gm50d3jyzxr9pj5b43j05ildh4mfq-gcc-bootstrap-0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/sd2k1ljlzpkp3n5rk5y3dp2l73h3qkpp-binutils-bootstrap-0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
"/gnu/store/2m0i57ad07cmgxh3ij89d4lmf7lngpdz-linux-libre-headers-3.14.37.drv" -> "/gnu/store/xyzv7w42bxs5zhs6b5a9s7gbiq571psm-bootstrap-binaries-0.drv" [color = red];
}
-215
View File
@@ -1,215 +0,0 @@
digraph "Guix bag-emerged" {
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" [color = red];
"/gnu/store/xpgn2qn54c323liliyqj6q11b5xnb1db-coreutils-8.24.drv" -> "/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [label = "perl-5.16.1", shape = box, fontname = Helvetica];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [label = "tar-1.28", shape = box, fontname = Helvetica];
"/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [label = "gzip-1.6", shape = box, fontname = Helvetica];
"/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [label = "bzip2-1.0.6", shape = box, fontname = Helvetica];
"/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [label = "xz-5.0.4", shape = box, fontname = Helvetica];
"/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [label = "file-5.22", shape = box, fontname = Helvetica];
"/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [label = "diffutils-3.3", shape = box, fontname = Helvetica];
"/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [label = "patch-2.7.5", shape = box, fontname = Helvetica];
"/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [label = "sed-4.2.2", shape = box, fontname = Helvetica];
"/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [label = "findutils-4.4.2", shape = box, fontname = Helvetica];
"/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [label = "gawk-4.1.3", shape = box, fontname = Helvetica];
"/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [label = "grep-2.21", shape = box, fontname = Helvetica];
"/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
"/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [label = "make-4.1", shape = box, fontname = Helvetica];
"/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [label = "bash-4.3.39", shape = box, fontname = Helvetica];
"/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [label = "ld-wrapper-0", shape = box, fontname = Helvetica];
"/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [label = "binutils-2.25.1", shape = box, fontname = Helvetica];
"/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [label = "gcc-4.9.3", shape = box, fontname = Helvetica];
"/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [label = "glibc-2.22", shape = box, fontname = Helvetica];
"/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [label = "glibc-utf8-locales-2.22", shape = box, fontname = Helvetica];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/6i8brik0khb2s5r6ih7h6g22l9s2xmph-acl-2.2.52.drv" -> "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [label = "gettext-0.19.6", shape = box, fontname = Helvetica];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" -> "/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" [label = "expat-2.1.0", shape = box, fontname = Helvetica];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/n3ix2bl79ijv1v1winwf4qj46hlhyrdv-expat-2.1.0.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [label = "attr-2.4.46", shape = box, fontname = Helvetica];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/a076d7ng0h3ynr1hsiyk4fmh3w1g4cv8-gettext-0.19.6.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" [label = "gmp-6.0.0a", shape = box, fontname = Helvetica];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/wmvpskqsw6hgriy0vbmmm6c4wp8rxp2c-gmp-6.0.0a.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/1mwk0rc4lfcy3vax50ss8x3qfa304g67-m4-1.4.17.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" [label = "libcap-2.24", shape = box, fontname = Helvetica];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mi4a8m41ssrp7lv3b8vibw0a7ahv2mmg-perl-5.16.1.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/0pr679inn5xj91z4d63scc7vgfji9vpp-tar-1.28.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/p3szkb87bp9fxhn715g88skry8g3jgkq-gzip-1.6.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/i398qn04cwvnzph7a0cckxqr9q0k3lyr-bzip2-1.0.6.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/wvnnsn89magnvn39zm3fv245s9m7yn5f-xz-5.0.4.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/sag0sx1zycnwixwfdrxwj1i9g2phxrh4-file-5.22.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/p61bsw6093x3wfg5vz3172wl9bzrlc3w-diffutils-3.3.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/rzsyx70vnfb8cm40r0b591vyvww2i5y6-patch-2.7.5.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mc5fgclyr0v26242hmg30srv9ij27wyv-sed-4.2.2.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/ig9nr2f5hvr88br028r9nsdg4xpmmybg-findutils-4.4.2.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/jls1kj3pvqjpbmm7c09fhszfd3m61zif-gawk-4.1.3.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/vvlh6szjxr5iy192fsv9p4dwf39nhapf-grep-2.21.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mysb2grsl1wc931xm08adncnqjwvdds7-coreutils-8.24.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/n0n20i1brmhmjvw9lx33f2l3dmzx873n-make-4.1.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/64cizlhq38x99dvjvza6c5ha226a9bf5-bash-4.3.39.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/mbshnjz590h3l1c3y2rxzqvn45bhx32b-ld-wrapper-0.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/hf62yhvyrr1rm5y8mq5afih12s9jasic-binutils-2.25.1.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/8mff0w2203h6m5s495knxg09is3qj15f-gcc-4.9.3.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/2pspbpclj4yq5dqd71fnqwa69s8xxryf-glibc-2.22.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/nflynk1n90yh41yfi91raczynka2mf86-glibc-utf8-locales-2.22.drv" [color = red];
"/gnu/store/d7d6k5bhk7gz3pvhxdn2f33jzlxg4c5l-libcap-2.24.drv" -> "/gnu/store/3lq0fkjmjb917asbj9f24vcxxnq3kwai-attr-2.4.46.drv" [color = red];
}
-25
View File
@@ -1,25 +0,0 @@
digraph "Guix package" {
"70481600" [label = "coreutils-8.24", shape = box, fontname = Helvetica];
"70481600" -> "50717824" [color = red];
"70481600" -> "57499200" [color = red];
"70481600" -> "57496320" [color = red];
"70481600" -> "69877504" [color = red];
"50717824" [label = "perl-5.16.1", shape = box, fontname = Helvetica];
"57499200" [label = "acl-2.2.52", shape = box, fontname = Helvetica];
"57499200" -> "70563904" [color = red];
"57499200" -> "50717824" [color = red];
"57499200" -> "70563520" [color = red];
"70563904" [label = "gettext-0.19.6", shape = box, fontname = Helvetica];
"70563904" -> "69316352" [color = red];
"69316352" [label = "expat-2.1.0", shape = box, fontname = Helvetica];
"70563520" [label = "attr-2.4.46", shape = box, fontname = Helvetica];
"70563520" -> "70563904" [color = red];
"70563520" -> "50717824" [color = red];
"57496320" [label = "gmp-6.0.0a", shape = box, fontname = Helvetica];
"57496320" -> "57498432" [color = red];
"57498432" [label = "m4-1.4.17", shape = box, fontname = Helvetica];
"69877504" [label = "libcap-2.24", shape = box, fontname = Helvetica];
"69877504" -> "50717824" [color = red];
"69877504" -> "70563520" [color = red];
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

-40
View File
@@ -1,40 +0,0 @@
digraph "Service Type Dependencies" {
shepherd [shape = box, fontname = Helvetica];
pam [shape = box, fontname = Helvetica];
etc [shape = box, fontname = Helvetica];
profile [shape = box, fontname = Helvetica];
accounts [shape = box, fontname = Helvetica];
activation [shape = box, fontname = Helvetica];
boot [shape = box, fontname = Helvetica];
system [shape = house, fontname = Helvetica];
lshd -> shepherd;
lshd -> pam;
udev -> shepherd;
nscd -> shepherd [label = "extends"];
"nss-mdns" -> nscd;
"kvm-rules" -> udev;
colord -> udev;
dbus -> shepherd;
colord -> dbus;
upower -> udev;
upower -> dbus;
polkit -> dbus;
polkit -> pam;
elogind -> dbus;
elogind -> udev;
elogind -> polkit [label = "extends"];
shepherd -> boot;
colord -> accounts;
accounts -> activation;
accounts -> etc;
etc -> activation;
activation -> boot;
pam -> etc;
elogind -> pam;
guix -> shepherd;
guix -> activation;
guix -> accounts;
boot -> system;
etc -> system;
profile -> system;
}
-75
View File
@@ -1,75 +0,0 @@
digraph "Guix shepherd-service" {
"user-file-systems" [label = "user-file-systems", shape = box, fontname = Helvetica];
"user-processes" -> "user-file-systems" [color = red];
"user-processes" [label = "user-processes", shape = box, fontname = Helvetica];
"nscd" -> "user-processes" [color = red];
"guix-daemon" -> "user-processes" [color = red];
"syslogd" -> "user-processes" [color = red];
"term-tty6" -> "user-processes" [color = red];
"term-tty5" -> "user-processes" [color = red];
"term-tty4" -> "user-processes" [color = red];
"term-tty3" -> "user-processes" [color = red];
"term-tty2" -> "user-processes" [color = red];
"term-tty1" -> "user-processes" [color = red];
"networking" -> "user-processes" [color = red];
"nscd" [label = "nscd", shape = box, fontname = Helvetica];
"guix-daemon" [label = "guix-daemon", shape = box, fontname = Helvetica];
"syslogd" [label = "syslogd", shape = box, fontname = Helvetica];
"ssh-daemon" -> "syslogd" [color = red];
"ssh-daemon" [label = "ssh-daemon", shape = box, fontname = Helvetica];
"term-tty6" [label = "term-tty6", shape = box, fontname = Helvetica];
"console-font-tty6" -> "term-tty6" [color = red];
"console-font-tty6" [label = "console-font-tty6", shape = box, fontname = Helvetica];
"term-tty5" [label = "term-tty5", shape = box, fontname = Helvetica];
"console-font-tty5" -> "term-tty5" [color = red];
"console-font-tty5" [label = "console-font-tty5", shape = box, fontname = Helvetica];
"term-tty4" [label = "term-tty4", shape = box, fontname = Helvetica];
"console-font-tty4" -> "term-tty4" [color = red];
"console-font-tty4" [label = "console-font-tty4", shape = box, fontname = Helvetica];
"term-tty3" [label = "term-tty3", shape = box, fontname = Helvetica];
"console-font-tty3" -> "term-tty3" [color = red];
"console-font-tty3" [label = "console-font-tty3", shape = box, fontname = Helvetica];
"term-tty2" [label = "term-tty2", shape = box, fontname = Helvetica];
"console-font-tty2" -> "term-tty2" [color = red];
"console-font-tty2" [label = "console-font-tty2", shape = box, fontname = Helvetica];
"term-tty1" [label = "term-tty1", shape = box, fontname = Helvetica];
"console-font-tty1" -> "term-tty1" [color = red];
"console-font-tty1" [label = "console-font-tty1", shape = box, fontname = Helvetica];
"networking" [label = "networking", shape = box, fontname = Helvetica];
"ssh-daemon" -> "networking" [color = red];
"root-file-system" [label = "root-file-system", shape = box, fontname = Helvetica];
"file-system-/run/user" -> "root-file-system" [color = red];
"file-system-/run/systemd" -> "root-file-system" [color = red];
"file-system-/gnu/store" -> "root-file-system" [color = red];
"file-system-/dev/shm" -> "root-file-system" [color = red];
"file-system-/dev/pts" -> "root-file-system" [color = red];
"user-processes" -> "root-file-system" [color = red];
"udev" -> "root-file-system" [color = red];
"file-system-/run/user" [label = "file-system-/run/user", shape = box, fontname = Helvetica];
"user-processes" -> "file-system-/run/user" [color = red];
"file-system-/run/systemd" [label = "file-system-/run/systemd", shape = box, fontname = Helvetica];
"user-processes" -> "file-system-/run/systemd" [color = red];
"file-system-/gnu/store" [label = "file-system-/gnu/store", shape = box, fontname = Helvetica];
"user-processes" -> "file-system-/gnu/store" [color = red];
"file-system-/dev/shm" [label = "file-system-/dev/shm", shape = box, fontname = Helvetica];
"user-processes" -> "file-system-/dev/shm" [color = red];
"file-system-/dev/pts" [label = "file-system-/dev/pts", shape = box, fontname = Helvetica];
"user-processes" -> "file-system-/dev/pts" [color = red];
"udev" [label = "udev", shape = box, fontname = Helvetica];
"term-tty6" -> "udev" [color = red];
"term-tty5" -> "udev" [color = red];
"term-tty4" -> "udev" [color = red];
"term-tty3" -> "udev" [color = red];
"term-tty2" -> "udev" [color = red];
"term-tty1" -> "udev" [color = red];
"networking" -> "udev" [color = red];
"host-name" [label = "host-name", shape = box, fontname = Helvetica];
"term-tty6" -> "host-name" [color = red];
"term-tty5" -> "host-name" [color = red];
"term-tty4" -> "host-name" [color = red];
"term-tty3" -> "host-name" [color = red];
"term-tty2" -> "host-name" [color = red];
"term-tty1" -> "host-name" [color = red];
"loopback" [label = "loopback", shape = box, fontname = Helvetica];
}
-157
View File
@@ -1,157 +0,0 @@
# GNU Guix --- Functional package management for GNU
# Copyright © 2016 Eric Bavier <bavier@member.fsf.org>
# Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
# Copyright © 2013 Andreas Enge <andreas@enge.fr>
# Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
# Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
#
# 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/>.
info_TEXINFOS = %D%/guix.texi
DOT_FILES = \
%D%/images/bootstrap-graph.dot \
%D%/images/bootstrap-packages.dot \
%D%/images/coreutils-graph.dot \
%D%/images/coreutils-bag-graph.dot \
%D%/images/service-graph.dot \
%D%/images/shepherd-graph.dot
DOT_VECTOR_GRAPHICS = \
$(DOT_FILES:%.dot=%.eps) \
$(DOT_FILES:%.dot=%.pdf)
EXTRA_DIST += \
%D%/htmlxref.cnf \
%D%/contributing.texi \
%D%/emacs.texi \
%D%/fdl-1.3.texi \
$(DOT_FILES) \
$(DOT_VECTOR_GRAPHICS) \
%D%/images/coreutils-size-map.eps \
%D%/environment-gdb.scm \
%D%/package-hello.scm
OS_CONFIG_EXAMPLES_TEXI = \
%D%/os-config-bare-bones.texi \
%D%/os-config-desktop.texi \
%D%/os-config-lightweight-desktop.texi
# Bundle this file so that makeinfo finds it in out-of-source-tree builds.
BUILT_SOURCES += $(OS_CONFIG_EXAMPLES_TEXI)
EXTRA_DIST += $(OS_CONFIG_EXAMPLES_TEXI)
MAINTAINERCLEANFILES = $(OS_CONFIG_EXAMPLES_TEXI)
%D%/os-config-%.texi: gnu/system/examples/%.tmpl
$(AM_V_GEN)$(MKDIR_P) "`dirname $@`"; \
cp "$<" "$@"
infoimagedir = $(infodir)/images
dist_infoimage_DATA = \
$(DOT_FILES:%.dot=%.png) \
%D%/images/coreutils-size-map.png
# Try hard to obtain an image size and aspect that's reasonable for inclusion
# in an Info or PDF document.
DOT_OPTIONS = \
-Gratio=.9 -Gnodesep=.005 -Granksep=.00005 \
-Nfontsize=9 -Nheight=.1 -Nwidth=.1
.dot.png:
$(AM_V_DOT)$(DOT) -Tpng $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
.dot.pdf:
$(AM_V_DOT)$(DOT) -Tpdf $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
.dot.eps:
$(AM_V_DOT)$(DOT) -Teps $(DOT_OPTIONS) < "$<" > "$(srcdir)/$@.tmp"; \
mv "$(srcdir)/$@.tmp" "$(srcdir)/$@"
.png.eps:
$(AM_V_GEN)convert "$<" "$@-tmp.eps"; \
mv "$@-tmp.eps" "$@"
# We cannot add new dependencies to `%D%/guix.pdf' & co. (info "(automake)
# Extending"). Using the `-local' rules is imperfect, because they may be
# triggered after the main rule. Oh, well.
pdf-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.pdf)
info-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.png)
ps-local: $(DOT_FILES=%.dot=$(top_srcdir)/%.eps) \
$(top_srcdir)/%D%/images/coreutils-size-map.eps
dvi-local: ps-local
## ----------- ##
## Man pages. ##
## ----------- ##
# The man pages are generated using GNU Help2man. In makefiles rules they
# depend not on the binary, but on the source files. This usage allows a
# manual page to be generated by the maintainer and included in the
# distribution without requiring the end-user to have 'help2man' installed.
# They are built in $(srcdir) like info manuals.
sub_commands_mans = \
$(srcdir)/%D%/guix-archive.1 \
$(srcdir)/%D%/guix-build.1 \
$(srcdir)/%D%/guix-challenge.1 \
$(srcdir)/%D%/guix-download.1 \
$(srcdir)/%D%/guix-edit.1 \
$(srcdir)/%D%/guix-environment.1 \
$(srcdir)/%D%/guix-gc.1 \
$(srcdir)/%D%/guix-hash.1 \
$(srcdir)/%D%/guix-import.1 \
$(srcdir)/%D%/guix-lint.1 \
$(srcdir)/%D%/guix-package.1 \
$(srcdir)/%D%/guix-publish.1 \
$(srcdir)/%D%/guix-pull.1 \
$(srcdir)/%D%/guix-refresh.1 \
$(srcdir)/%D%/guix-size.1 \
$(srcdir)/%D%/guix-system.1
dist_man1_MANS = \
$(srcdir)/%D%/guix.1 \
$(sub_commands_mans)
gen_man = \
LANGUAGE= $(top_builddir)/pre-inst-env $(HELP2MAN) \
$(HELP2MANFLAGS)
HELP2MANFLAGS = --source=GNU --info-page=$(PACKAGE_TARNAME)
$(srcdir)/%D%/guix.1: scripts/guix.in $(sub_commands_mans)
-$(AM_V_HELP2MAN)$(gen_man) --output="$@" `basename "$@" .1`
# The 'case' ensures the man pages are only generated if the corresponding
# source script (the first prerequisite) has been changed. The $(GOBJECTS)
# prerequisite is solely meant to force these docs to be made only after all
# Guile modules have been compiled.
$(srcdir)/%D%/guix-%.1: guix/scripts/%.scm $(GOBJECTS)
-@case '$?' in \
*$<*) $(AM_V_P) && set -x || echo " HELP2MAN $@"; \
$(gen_man) --output="$@" "guix $*";; \
*) : ;; \
esac
if BUILD_DAEMON
dist_man1_MANS += $(srcdir)/%D%/guix-daemon.1
$(srcdir)/%D%/guix-daemon.1: nix/nix-daemon/guix-daemon.cc
-$(AM_V_HELP2MAN)$(gen_man) --output="$@" `basename "$@" .1`
endif
-19
View File
@@ -1,19 +0,0 @@
(use-modules (guix)
(guix build-system gnu)
(guix licenses))
(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 "Guess what GNU Hello prints!")
(home-page "http://www.gnu.org/software/hello/")
(license gpl3+))
+30
View File
@@ -0,0 +1,30 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFidi7gBCADEupvdH6woe3DfqSgC20nTVmLgKKjvHotuEry5BGm62lKsSzPa
eyXT6UkM+MMRG6pYQ8ZgKiAZDZtiTw+fuulRA4bWXd9xBNPT+xYDGMzV8EXWlo6R
ABq3InxJK6Bbl8c+Z8hMTeHF1WR4Ylp2N9BfIw3eQKqk4MSgPPY+NddxEQUdZ4E8
3RNnWFJM08mjJJCfxHi9YmKncoUIua8Tj+SgYLt9yB2MOvm7BKoWg8k8PR1HtTMA
2/wfOyhEETqToMA24Wpq+7ULiPMq52iSjpJMjlRFqtbnd8vTjKOnoIDDuF2SKFnn
fnw/3rhiw10BYLsY/auF7AutovCFA0n+YuTPABEBAAG0HkRhdmlkIENyYXZlbiA8
ZGF2aWRAY3JhdmVuLmNoPokBTgQTAQgAOBYhBF9DtoEENy9LqJimSzO56f3ijSwj
BQJYnYu4AhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEDO56f3ijSwja/0I
AJlTg+KyMRcppViv+TSWpNf9RcyEHWPMLJCtRuZLB3eGc8SliPGL1UX+nyo9Zaap
MwFHdxyt80XWrRmtQHZB1MyRq7YJQBAaeK08UeXtomXnG/aSfr8Yk+pwlaLxGDGc
bn8yz3k+Odfkla/i1JfwvznoG0Ck6x9DsNn1EZKgOyZvCDDSK8wv3Z5BRg5zdxER
THyT+h56cPEFn1zZ75/gTuJZ6AP87m4B0n/zdwn0qxyCeV5C0Vqkq0/5ssKDO3ke
KBe3iDjxpaAQTofgjdY/mUAg8Pl4/5gJLKL4VAM/M/sTMEWmwuIwQuaOzjPt7DOr
D66jexWgs/jHptAKEfBvJ7y5AQ0EWJ2LuAEIAMR1IWIYgIGydlpvIe3+C99HB+Fw
ok+LYRdcdTud0db8dByW/DTdVJlzDN7AHp6IzG/agNaQCQd4F5W0ovIlVY7zBOOR
663XXA5vrdYWq6adFR+tN5bE9MM0xKovvKnx3kb1NXJiWG+nSqdmhd7L8ZG711R7
uh6fk1faXGAbUFSriI2gNiFdOxgfW8mHXYknsuCEI2a//RiFoUQZgScfM7oPmVGq
cCGsFGWTLj+TU5JY01BVSY7x+9lbNvb7WvyYQSUldQG8wfnuu+Xmr7cE3/5GHmMz
fmWbmv8865eKjnG51cPp2LR0VUVxpHs6hwxaXi3BJ0T3NKexIWZQE5CsXb8AEQEA
AYkBNgQYAQgAIBYhBF9DtoEENy9LqJimSzO56f3ijSwjBQJYnYu4AhsMAAoJEDO5
6f3ijSwj6rAH/1jox9X3Pw1CUALihQaN7D8vWMFh3FiboO7SzBnghHkUvlz7LyJJ
FjZkg+M4zIKckCLMVE8qPx1XR24fmFRCSiz2FvLe/FHe7FWltycpiXZzMCqh/8Ch
b8CejLlKkyVbEbD+tPfp95VXM6giIEN2lFEoDvqaXmnYAWWmWBo3sl30oUGM+xvn
e1DyWxbYhiUJ3z/P0URs2kOOl0USbx0uEprJce2vRVwij74swpmCq0K3CyYG9oWC
8ID9UlKNpo4ar3Ni1hfwARjViUev8Xc+iKitkxnAJigsYqwa2qeMEvlheJsCKHFS
eUVaVX/l+Od27ahlXPo54pU7Lc7QNmIkPlA=
=eGxN
-----END PGP PUBLIC KEY BLOCK-----
+62
View File
@@ -0,0 +1,62 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
N8KxEVauZxGaQ4T+xb0k3PWW2byfqQEyu4k=
=lxuw
-----END PGP PUBLIC KEY BLOCK-----
File diff suppressed because it is too large Load Diff
+3668
View File
File diff suppressed because it is too large Load Diff
+52
View File
@@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGcvh/QBEACePF16wEeQaqfJNgeaSQB6ty6PzLaYtl8UVApPSCF1PYNEhDtx
QOOpBXeuk6h68cjhRX7hmug8mAraXotw4aG4Z3kbUro4fzXOYW3rCi/mAm5NFXLU
mBX3E1AV1pcD8hDA5s3LeGzfTo4xRGTW4zTzxGEyrvbChkVib7wTSk52a/WkFas6
l3sXnepF8HmIEOWkwQcYdcuogaNDFP1kjZYvqfKJXmCZnY+lC8Zfe/vlD/x8FZQY
BQ5xgXIfbSR0xlRz/XIHfJv6j+3myUUr2UKMku1dkjlkhNkyfw+RypQzmbJ0oJ4b
k76/ju0nnlN65/LvyeTVUh/2O2VnPnZ49keL8sqrAPXF4di4pWT+/mPxfoEtiSDt
jyzbr8+ajcwLa4SSKLlexqjZj8X6R4tt31Rf/Pliwe4TdPmd2leE3BIJl9bAuslE
vd5tqZ1oa3Zfb62tvpaJCRYMtOEWuGkYdyrwTW7UXJPQpam4X7WoW2jWc5aTpAnp
nqIPzaWJmua1lGQjEXgt4xvVdhVmZq32fkTy/rXw9l5a+XU7N4/Zz8AR/0xO+UBc
Q1J+wHADjL8Q0v0tZLEaiWL72AsxN3GMWNPXWAplaTPUNPUlNK0JPHwhTX/cQVkI
c9avSKc3BeUofC96d13I7QmRjQ0gcBaLtV9lMOuYwbC+6tb70x2fQsI3bwARAQAB
tCJFa2FpdHogWmFycmFnYSA8ZWthaXR6QGVsZW5xLnRlY2g+iQJUBBMBCAA+FiEE
Xb4j05BTZSZ/jMdq/blSvT9zVtYFAmcvh/QCGwMFCQPCZwAFCwkIBwIGFQoJCAsC
BBYCAwECHgECF4AACgkQ/blSvT9zVtbWCRAAkbla35s8RKhQBweqwEcdYDV2Zpt1
6OgENymjLs/qhh7Y9WgWZ0YraSNYDGCt6lemhiorvrXX48+yZC98c8ZgCrr4Hmt8
i/6TvJqVhwlZ9//3W/z/YuYDtUPBzRHgwM8tejiXmNqYM8lFJg64pQaczmGAR29X
f0WTQegSociBSUg9eC7BS74Uh7UbHCgytyretoKmqJAp8SKE/Czt5x4RlXKVgGaw
zg1GerriwnNbudy0eyl1q0Pn7Q+K+tQ14EPDAM+QsGR/fBV4a3uYP6sBF+SdM+DO
LX5MRVbWJ8O3kLmbAKQeLgSLlnYydMY/mTvjgxMAakfGCA4q69gmyDSB0fzAUm3c
1JV5VwIo63rykiOEB/k2m4aiiujH5kOC86sjb273+XXWlOhOEO/vKHHdAh+B7dnE
EYUPXnUEMQ23PaF422u7C62kw3yH/krKr60t5FxcqNWtCOxEWc0WMZw12Q3Gw8+9
oA5DI/f4gjlGvQiQWqj6dvoXvIDmifr0R3sTi6xh+udu2Rp8PsKOW8ZRyQ0/VOiw
zBfQkf4PFowaiRp8LnkjLEVft6ruuA1hawO2SKKJ8WpgZPw5oMigZR5DgbunxMD4
BcqmD7bSoTRV/ljx1I8UgAaQLPqVVnLt31iENtLv43kPHl56AbYpAzcvf8nGU3KP
hGOoByyuyph4RYC5Ag0EZy+H9AEQANc9vw7DnBeNGKhq1Bg5oiGII7npGXCChe7P
B6CJjkvN6n1kXrvBYsaORXvZJPNgmBTKu/ETGYS0t0YeGlI4WTOK9dgB/7T8dngR
mrGjPmZjryzfk18tXnJq0zoLixLizDT3FqV4jOG5KjPTxQvpdBMiX9oX4Je2OMqF
d14fopLGav0rW7Fh5p83OSREpXbJUJJiUaH3p9U9Ss8IBHzr669PViAqe09EfxL/
L0l1JIFjHQjJcg01PUXZAW6aPtd7q6eNCSLTXYPiDRQe2GdRUcB7WfqCogR/LEpz
LLcd0NkxCnc0T6darq2Dupt8rvQ95L4/cOGVcDUDOGE6U92XCkaCvUQkypxQCGKS
EjbTFoLRG/4JQj0pAWSaqxPS7hkTFql4qUAdRwzHN1ib6XedcFfqHSy2Mk5ttW8D
aBGKhCm7Mn6+4smXENHSuQxCqHlCQ2m+9ogpbxavNVfAblE/ucxyfyo6FlDbGHEG
3Yu5296kUPT7PqZLiR3KetMPJfCLY2jVPio3t4tDs7Sj41sG5aIwEApb0Zoz3bPB
t5O5GUoPFnXyjO306WLxXrM2tjY38jwHxF1Qvs3HQTJgRei2g3D3KiiR27cXXs/8
lrr8tblr5J1tE4TaQCea5lDuEgTCDLnlcopoYcKpFAUBGQtzcNkudT9wsM2nf9y6
INcUE3FlABEBAAGJAjwEGAEIACYWIQRdviPTkFNlJn+Mx2r9uVK9P3NW1gUCZy+H
9AIbDAUJA8JnAAAKCRD9uVK9P3NW1td1D/4xx8AbDKAKx9ezT6GdTZbK6FS66qRQ
CEzTa5MXZCEogASOla71CB10l5fFtsRWCtNQLzmgwkFwhdxyjqendDgacc5v/71N
Bb5KpKni6wDJMeiGs3Lq3ZgWfHte3NZ99iSH+La3aBSFbCloJ/Yf/MJBkzrm1sTT
KcgF9/i0pzkume5vtpKRDjjSz4abHu7qk4Sgi5gwWpoKFTT38q6nLP+9SUla3JJj
NqU3gvn8kwv6KDMKc4marnSp/c+5O6E+lNrxMdD0n8+io/Bf/UEI6BU8F7JshPq7
32bHN1NzUXvgMd4cNsAlvsWM8UCKZ4/usFl1euMMFOvnadZinsTHpXhahJzkYWA7
nAKbCoNNq9LPtWxfjHsIfhs+QQafF31Pw+jqHqruB4tH0eiLabrz7kejaZvJdVip
NIzRUWYnpP+18khep2UtT1n9VNs6QNb4cHPsoe+s4ga4ZK/klCdEhLyaXtbcaNEH
b7NZUOBj3HhKFgIY8PD1AptAObHjsUNF5+jfEnl+5WjwyTZTIgDRiOrwn8LWOANQ
0JpR69t06uJwmiogQgnlYe36YFaauHGQZFa+L+R2zgnGn8TnR4C3tH7gNAef9+PK
qgmJT5pNIkFzlDmZi05E9xzhj4WQ/OOsqU64eHL2PaDk+2TdfrzNwNFbkABJ+C7B
HNAytQ6h9cpUbg==
=6go3
-----END PGP PUBLIC KEY BLOCK-----
-37
View File
@@ -1,37 +0,0 @@
;;; guix-about.el --- Various info about Guix
;; Copyright © 2016 Alex Kost <alezost@gmail.com>
;; 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 Location as published by
;; the Free Software Foundation, either version 3 of the Location, 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 Location for more details.
;; You should have received a copy of the GNU General Public Location
;; along with this program. If not, see <http://www.gnu.org/locations/>.
;;; Commentary:
;; This file provides the code to display various info about Guix (e.g., its
;; version).
;;; Code:
(require 'guix-config)
;;;###autoload
(defun guix-version ()
"Display Guix version in the echo area."
(interactive)
(message "%s %s" guix-config-name guix-config-version))
(provide 'guix-about)
;;; guix-about.el ends here
-393
View File
@@ -1,393 +0,0 @@
;;; guix-backend.el --- Making and using Guix REPL
;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides the code for interacting with Guile using Guix REPL
;; (Geiser REPL with some guix-specific additions).
;; By default (if `guix-use-guile-server' is non-nil) 2 Guix REPLs are
;; started. The main one (with "guile --listen" process) is used for
;; "interacting" with a user - for showing a progress of
;; installing/deleting Guix packages. The second (internal) REPL is
;; used for synchronous evaluating, e.g. when information about
;; packages/generations should be received for a list/info buffer.
;;
;; This "2 REPLs concept" makes it possible to have a running process of
;; installing/deleting packages and to continue to search/list/get info
;; about other packages at the same time. If you prefer to use a single
;; Guix REPL, do not try to receive any information while there is a
;; running code in the REPL (see
;; <https://github.com/jaor/geiser/issues/28>).
;;
;; Guix REPLs (unlike the usual Geiser REPLs) are not added to
;; `geiser-repl--repls' variable, and thus cannot be used for evaluating
;; while editing scm-files. The only purpose of Guix REPLs is to be an
;; intermediate between "Guix/Guile level" and "Emacs interface level".
;; That being said you can still want to use a Guix REPL while hacking
;; auxiliary scheme-files for "guix.el". You can just use
;; `geiser-connect-local' command with `guix-repl-current-socket' to
;; have a usual Geiser REPL with all stuff defined by "guix.el" package.
;;; Code:
(require 'geiser-mode)
(require 'geiser-guile)
(require 'guix-geiser)
(require 'guix-config)
(require 'guix-external)
(require 'guix-emacs)
(require 'guix-profiles)
(defvar guix-load-path guix-config-emacs-interface-directory
"Directory with scheme files for \"guix.el\" package.")
(defvar guix-helper-file
(expand-file-name "guix-helper.scm" guix-load-path)
"Auxiliary scheme file for loading.")
;;; REPL
(defgroup guix-repl nil
"Settings for Guix REPLs."
:prefix "guix-repl-"
:group 'guix)
(defcustom guix-repl-startup-time 30000
"Time, in milliseconds, to wait for Guix REPL to startup.
Same as `geiser-repl-startup-time' but is used for Guix REPL.
If you have a slow system, try to increase this time."
:type 'integer
:group 'guix-repl)
(defcustom guix-repl-buffer-name "*Guix REPL*"
"Default name of a Geiser REPL buffer used for Guix."
:type 'string
:group 'guix-repl)
(defcustom guix-after-start-repl-hook '(guix-set-directory)
"Hook called after Guix REPL is started."
:type 'hook
:group 'guix-repl)
(defcustom guix-use-guile-server t
"If non-nil, start guile with '--listen' argument.
This allows to receive information about packages using an additional
REPL while some packages are being installed/removed in the main REPL."
:type 'boolean
:group 'guix-repl)
(defcustom guix-repl-socket-file-name-function
#'guix-repl-socket-file-name
"Function used to define a socket file name used by Guix REPL.
The function is called without arguments."
:type '(choice (function-item guix-repl-socket-file-name)
(function :tag "Other function"))
:group 'guix-repl)
(defcustom guix-emacs-activate-after-operation t
"Activate Emacs packages after installing.
If nil, do not load autoloads of the Emacs packages after
they are successfully installed."
:type 'boolean
:group 'guix-repl)
(defvar guix-repl-current-socket nil
"Name of a socket file used by the current Guix REPL.")
(defvar guix-repl-buffer nil
"Main Geiser REPL buffer used for communicating with Guix.
This REPL is used for processing package actions and for
receiving information if `guix-use-guile-server' is nil.")
(defvar guix-internal-repl-buffer nil
"Additional Geiser REPL buffer used for communicating with Guix.
This REPL is used for receiving information only if
`guix-use-guile-server' is non-nil.")
(defvar guix-internal-repl-buffer-name "*Guix Internal REPL*"
"Default name of an internal Guix REPL buffer.")
(defvar guix-before-repl-operation-hook nil
"Hook run before executing an operation in Guix REPL.")
(defvar guix-after-repl-operation-hook
'(guix-repl-autoload-emacs-packages-maybe
guix-repl-operation-success-message)
"Hook run after executing successful operation in Guix REPL.")
(defvar guix-repl-operation-p nil
"Non-nil, if current operation is performed by `guix-eval-in-repl'.
This internal variable is used to distinguish Guix operations
from operations performed in Guix REPL by a user.")
(defvar guix-repl-operation-type nil
"Type of the current operation performed by `guix-eval-in-repl'.
This internal variable is used to define what actions should be
executed after the current operation succeeds.
See `guix-eval-in-repl' for details.")
(defun guix-repl-autoload-emacs-packages-maybe ()
"Load autoloads for Emacs packages if needed.
See `guix-emacs-activate-after-operation' for details."
(and guix-emacs-activate-after-operation
;; FIXME Since a user can work with a non-current profile (using
;; C-u before `guix-search-by-name' and other commands), emacs
;; packages can be installed to another profile, and the
;; following code will not work (i.e., the autoloads for this
;; profile will not be loaded).
(guix-emacs-autoload-packages guix-current-profile)))
(defun guix-repl-operation-success-message ()
"Message telling about successful Guix operation."
(message "Guix operation has been performed."))
(defun guix-get-guile-program (&optional socket)
"Return a value suitable for `geiser-guile-binary'."
(if (null socket)
guix-guile-program
(append (if (listp guix-guile-program)
guix-guile-program
(list guix-guile-program))
(list (concat "--listen=" socket)))))
(defun guix-repl-socket-file-name ()
"Return a name of a socket file used by Guix REPL."
(make-temp-name
(concat (file-name-as-directory temporary-file-directory)
"guix-repl-")))
(defun guix-repl-delete-socket-maybe ()
"Delete `guix-repl-current-socket' file if it exists."
(and guix-repl-current-socket
(file-exists-p guix-repl-current-socket)
(delete-file guix-repl-current-socket)))
(add-hook 'kill-emacs-hook 'guix-repl-delete-socket-maybe)
(defun guix-start-process-maybe (&optional start-msg end-msg)
"Start Geiser REPL configured for Guix if needed.
START-MSG and END-MSG are strings displayed in the minibuffer in
the beginning and in the end of the starting process. If nil,
display default messages."
(guix-start-repl-maybe nil
(or start-msg "Starting Guix REPL ...")
(or end-msg "Guix REPL has been started."))
(if guix-use-guile-server
(guix-start-repl-maybe 'internal)
(setq guix-internal-repl-buffer guix-repl-buffer)))
(defun guix-start-repl-maybe (&optional internal start-msg end-msg)
"Start Guix REPL if needed.
If INTERNAL is non-nil, start an internal REPL.
START-MSG and END-MSG are strings displayed in the minibuffer in
the beginning and in the end of the process. If nil, do not
display messages."
(let* ((repl-var (guix-get-repl-buffer-variable internal))
(repl (symbol-value repl-var)))
(unless (and (buffer-live-p repl)
(get-buffer-process repl))
(and start-msg (message start-msg))
(setq guix-repl-operation-p nil)
(unless internal
;; Guile leaves socket file after exit, so remove it if it
;; exists (after the REPL restart).
(guix-repl-delete-socket-maybe)
(setq guix-repl-current-socket
(and guix-use-guile-server
(or guix-repl-current-socket
(funcall guix-repl-socket-file-name-function)))))
(let ((geiser-guile-binary (guix-get-guile-program
(unless internal
guix-repl-current-socket)))
(geiser-guile-init-file (unless internal guix-helper-file))
(repl (get-buffer-create
(guix-get-repl-buffer-name internal))))
(guix-start-repl repl (and internal guix-repl-current-socket))
(set repl-var repl)
(and end-msg (message end-msg))
(unless internal
(run-hooks 'guix-after-start-repl-hook))))))
(defun guix-start-repl (buffer &optional address)
"Start Guix REPL in BUFFER.
If ADDRESS is non-nil, connect to a remote guile process using
this address (it should be defined by
`geiser-repl--read-address')."
;; A mix of the code from `geiser-repl--start-repl' and
;; `geiser-repl--to-repl-buffer'.
(let ((impl 'guile)
(geiser-guile-load-path (cons (expand-file-name guix-load-path)
geiser-guile-load-path))
(geiser-repl-startup-time guix-repl-startup-time))
(with-current-buffer buffer
(geiser-repl-mode)
(geiser-impl--set-buffer-implementation impl)
(geiser-repl--autodoc-mode -1)
(goto-char (point-max))
(let ((prompt (geiser-con--combined-prompt
geiser-guile--prompt-regexp
geiser-guile--debugger-prompt-regexp)))
(geiser-repl--save-remote-data address)
(geiser-repl--start-scheme impl address prompt)
(geiser-repl--quit-setup)
(geiser-repl--history-setup)
(setq-local geiser-repl--repls (list buffer))
(geiser-repl--set-this-buffer-repl buffer)
(setq geiser-repl--connection
(geiser-con--make-connection
(get-buffer-process (current-buffer))
geiser-guile--prompt-regexp
geiser-guile--debugger-prompt-regexp))
(geiser-repl--startup impl address)
(geiser-repl--autodoc-mode 1)
(geiser-company--setup geiser-repl-company-p)
(add-hook 'comint-output-filter-functions
'guix-repl-output-filter
nil t)
(set-process-query-on-exit-flag
(get-buffer-process (current-buffer))
geiser-repl-query-on-kill-p)))))
(defun guix-repl-output-filter (str)
"Filter function suitable for `comint-output-filter-functions'.
This is a replacement for `geiser-repl--output-filter'."
(cond
((string-match-p geiser-guile--prompt-regexp str)
(geiser-autodoc--disinhibit-autodoc)
(when guix-repl-operation-p
(setq guix-repl-operation-p nil)
(run-hooks 'guix-after-repl-operation-hook)
;; Run hooks specific to the current operation type.
(when guix-repl-operation-type
(let ((type-hook (intern
(concat "guix-after-"
(symbol-name guix-repl-operation-type)
"-hook"))))
(setq guix-repl-operation-type nil)
(and (boundp type-hook)
(run-hooks type-hook))))))
((string-match geiser-guile--debugger-prompt-regexp str)
(setq guix-repl-operation-p nil)
(geiser-con--connection-set-debugging geiser-repl--connection
(match-beginning 0))
(geiser-autodoc--disinhibit-autodoc))))
(defun guix-repl-exit (&optional internal no-wait)
"Exit the current Guix REPL.
If INTERNAL is non-nil, exit the internal REPL.
If NO-WAIT is non-nil, do not wait for the REPL process to exit:
send a kill signal to it and return immediately."
(let ((repl (symbol-value (guix-get-repl-buffer-variable internal))))
(when (get-buffer-process repl)
(with-current-buffer repl
(geiser-con--connection-deactivate geiser-repl--connection t)
(comint-kill-subjob)
(unless no-wait
(while (get-buffer-process repl)
(sleep-for 0.1)))))))
(defun guix-get-repl-buffer (&optional internal)
"Return Guix REPL buffer; start REPL if needed.
If INTERNAL is non-nil, return an additional internal REPL."
(guix-start-process-maybe)
(let ((repl (symbol-value (guix-get-repl-buffer-variable internal))))
;; If a new Geiser REPL is started, `geiser-repl--repl' variable may
;; be set to the new value in a Guix REPL, so set it back to a
;; proper value here.
(with-current-buffer repl
(geiser-repl--set-this-buffer-repl repl))
repl))
(defun guix-get-repl-buffer-variable (&optional internal)
"Return the name of a variable with a REPL buffer."
(if internal
'guix-internal-repl-buffer
'guix-repl-buffer))
(defun guix-get-repl-buffer-name (&optional internal)
"Return the name of a REPL buffer."
(if internal
guix-internal-repl-buffer-name
guix-repl-buffer-name))
(defun guix-switch-to-repl (&optional internal)
"Switch to Guix REPL.
If INTERNAL is non-nil (interactively with prefix), switch to the
additional internal REPL if it exists."
(interactive "P")
(geiser-repl--switch-to-buffer (guix-get-repl-buffer internal)))
;;; Guix directory
(defvar guix-directory nil
"Default directory with Guix source.
If it is not set by a user, it is set after starting Guile REPL.
This directory is used to define package locations.")
(defun guix-read-directory ()
"Return `guix-directory' or prompt for it.
This function is intended for using in `interactive' forms."
(if current-prefix-arg
(read-directory-name "Directory with Guix modules: "
guix-directory)
guix-directory))
(defun guix-set-directory ()
"Set `guix-directory' if needed."
(or guix-directory
(setq guix-directory
(guix-eval-read "%guix-dir"))))
;;; Evaluating expressions
(defvar guix-operation-buffer nil
"Buffer from which the latest Guix operation was performed.")
(defun guix-eval (str)
"Evaluate STR with guile expression using Guix REPL.
See `guix-geiser-eval' for details."
(guix-geiser-eval str (guix-get-repl-buffer 'internal)))
(defun guix-eval-read (str)
"Evaluate STR with guile expression using Guix REPL.
See `guix-geiser-eval-read' for details."
(guix-geiser-eval-read str (guix-get-repl-buffer 'internal)))
(defun guix-eval-in-repl (str &optional operation-buffer operation-type)
"Switch to Guix REPL and evaluate STR with guile expression there.
If OPERATION-BUFFER is non-nil, it should be a buffer from which
the current operation was performed.
If OPERATION-TYPE is non-nil, it should be a symbol. After
successful executing of the current operation,
`guix-after-OPERATION-TYPE-hook' is called."
(run-hooks 'guix-before-repl-operation-hook)
(setq guix-repl-operation-p t
guix-repl-operation-type operation-type
guix-operation-buffer operation-buffer)
(guix-geiser-eval-in-repl str (guix-get-repl-buffer)))
(provide 'guix-backend)
;;; guix-backend.el ends here
-377
View File
@@ -1,377 +0,0 @@
;;; guix-base.el --- Common definitions -*- lexical-binding: t -*-
;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides some base and common definitions for guix.el
;; package.
;;; Code:
(require 'cl-lib)
(require 'guix-backend)
(require 'guix-guile)
(require 'guix-read)
(require 'guix-utils)
(require 'guix-ui)
(require 'guix-profiles)
(defgroup guix nil
"Settings for Guix package manager and friends."
:prefix "guix-"
:group 'external)
(defgroup guix-faces nil
"Guix faces."
:group 'guix
:group 'faces)
(defun guix-package-name-specification (name version &optional output)
"Return Guix package specification by its NAME, VERSION and OUTPUT."
(concat name "@" version
(when output (concat ":" output))))
;;; Location of profiles and manifests
(defun guix-generation-file (profile generation)
"Return the file name of a PROFILE's GENERATION."
(format "%s-%s-link" profile generation))
(defun guix-packages-profile (profile &optional generation system?)
"Return a directory where packages are installed for the
PROFILE's GENERATION.
If SYSTEM? is non-nil, then PROFILE is considered to be a system
profile. Unlike usual profiles, for a system profile, packages
are placed in 'profile' subdirectory."
(let ((profile (if generation
(guix-generation-file profile generation)
profile)))
(if system?
(expand-file-name "profile" profile)
profile)))
(defun guix-manifest-file (profile &optional generation system?)
"Return the file name of a PROFILE's manifest.
See `guix-packages-profile'."
(expand-file-name "manifest"
(guix-packages-profile profile generation system?)))
;;; Actions on packages and generations
(defface guix-operation-option-key
'((t :inherit font-lock-warning-face))
"Face used for the keys of operation options."
:group 'guix-faces)
(defcustom guix-operation-confirm t
"If nil, do not prompt to confirm an operation."
:type 'boolean
:group 'guix)
(defcustom guix-use-substitutes t
"If non-nil, use substitutes for the Guix packages."
:type 'boolean
:group 'guix)
(defvar guix-dry-run nil
"If non-nil, do not perform the real actions, just simulate.")
(defvar guix-temp-buffer-name " *Guix temp*"
"Name of a buffer used for displaying info before executing operation.")
(defvar guix-operation-option-true-string "yes"
"String displayed in the mode-line when operation option is t.")
(defvar guix-operation-option-false-string "no "
"String displayed in the mode-line when operation option is nil.")
(defvar guix-operation-option-separator " | "
"String used in the mode-line to separate operation options.")
(defvar guix-operation-options
'((?s "substitutes" guix-use-substitutes)
(?d "dry-run" guix-dry-run))
"List of available operation options.
Each element of the list has a form:
(KEY NAME VARIABLE)
KEY is a character that may be pressed during confirmation to
toggle the option.
NAME is a string displayed in the mode-line.
VARIABLE is a name of an option variable.")
(defun guix-operation-option-by-key (key)
"Return operation option by KEY (character)."
(assq key guix-operation-options))
(defun guix-operation-option-key (option)
"Return key (character) of the operation OPTION."
(car option))
(defun guix-operation-option-name (option)
"Return name of the operation OPTION."
(nth 1 option))
(defun guix-operation-option-variable (option)
"Return name of the variable of the operation OPTION."
(nth 2 option))
(defun guix-operation-option-value (option)
"Return boolean value of the operation OPTION."
(symbol-value (guix-operation-option-variable option)))
(defun guix-operation-option-string-value (option)
"Convert boolean value of the operation OPTION to string and return it."
(if (guix-operation-option-value option)
guix-operation-option-true-string
guix-operation-option-false-string))
(defun guix-operation-prompt (&optional prompt)
"Prompt a user for continuing the current operation.
Return non-nil, if the operation should be continued; nil otherwise.
Ask a user with PROMPT for continuing an operation."
(let* ((option-keys (mapcar #'guix-operation-option-key
guix-operation-options))
(keys (append '(?y ?n) option-keys))
(prompt (concat (propertize (or prompt "Continue operation?")
'face 'minibuffer-prompt)
" ("
(mapconcat
(lambda (key)
(propertize (string key)
'face 'guix-operation-option-key))
keys
", ")
") ")))
(let ((mode-line mode-line-format))
(prog1 (guix-operation-prompt-1 prompt keys)
(setq mode-line-format mode-line)
;; Clear the minibuffer after prompting.
(message "")))))
(defun guix-operation-prompt-1 (prompt keys)
"This function is internal for `guix-operation-prompt'."
(guix-operation-set-mode-line)
(let ((key (read-char-choice prompt (cons ?\C-g keys) t)))
(cl-case key
(?y t)
((?n ?\C-g) nil)
(t (let* ((option (guix-operation-option-by-key key))
(var (guix-operation-option-variable option)))
(set var (not (symbol-value var)))
(guix-operation-prompt-1 prompt keys))))))
(defun guix-operation-set-mode-line ()
"Display operation options in the mode-line of the current buffer."
(setq mode-line-format
(concat (propertize " Options: "
'face 'mode-line-buffer-id)
(mapconcat
(lambda (option)
(let ((key (guix-operation-option-key option))
(name (guix-operation-option-name option))
(val (guix-operation-option-string-value option)))
(concat name
" ("
(propertize (string key)
'face 'guix-operation-option-key)
"): " val)))
guix-operation-options
guix-operation-option-separator)))
(force-mode-line-update))
(defun guix-package-source-path (package-id)
"Return a store file path to a source of a package PACKAGE-ID."
(message "Calculating the source derivation ...")
(guix-eval-read
(guix-make-guile-expression
'package-source-path package-id)))
(defun guix-package-store-path (package-id)
"Return a list of store directories of outputs of package PACKAGE-ID."
(message "Calculating the package derivation ...")
(guix-eval-read
(guix-make-guile-expression
'package-store-path package-id)))
(defvar guix-after-source-download-hook nil
"Hook run after successful performing a 'source-download' operation.")
(defun guix-package-source-build-derivation (package-id &optional prompt)
"Build source derivation of a package PACKAGE-ID.
Ask a user with PROMPT for continuing an operation."
(when (or (not guix-operation-confirm)
(guix-operation-prompt (or prompt
"Build the source derivation?")))
(guix-eval-in-repl
(guix-make-guile-expression
'package-source-build-derivation
package-id
:use-substitutes? (or guix-use-substitutes 'f)
:dry-run? (or guix-dry-run 'f))
nil 'source-download)))
(defun guix-build-package (package-id &optional prompt)
"Build package with PACKAGE-ID.
Ask a user with PROMPT for continuing the build operation."
(when (or (not guix-operation-confirm)
(guix-operation-prompt (or prompt "Build package?")))
(guix-eval-in-repl
(format (concat ",run-in-store "
"(build-package (package-by-id %d)"
" #:use-substitutes? %s"
" #:dry-run? %s)")
package-id
(guix-guile-boolean guix-use-substitutes)
(guix-guile-boolean guix-dry-run)))))
;;;###autoload
(defun guix-apply-manifest (profile file &optional operation-buffer)
"Apply manifest from FILE to PROFILE.
This function has the same meaning as 'guix package --manifest' command.
See Info node `(guix) Invoking guix package' for details.
Interactively, use the current profile and prompt for manifest
FILE. With a prefix argument, also prompt for PROFILE."
(interactive
(let* ((current-profile (guix-ui-current-profile))
(profile (if current-prefix-arg
(guix-profile-prompt)
(or current-profile guix-current-profile)))
(file (read-file-name "File with manifest: "))
(buffer (and current-profile (current-buffer))))
(list profile file buffer)))
(when (or (not guix-operation-confirm)
(y-or-n-p (format "Apply manifest from '%s' to profile '%s'? "
file profile)))
(guix-eval-in-repl
(guix-make-guile-expression
'guix-command
"package"
(concat "--profile=" (expand-file-name profile))
(concat "--manifest=" (expand-file-name file)))
operation-buffer)))
;;; Executing guix commands
(defcustom guix-run-in-shell-function #'guix-run-in-shell
"Function used to run guix command.
The function is called with a single argument - a command line string."
:type '(choice (function-item guix-run-in-shell)
(function-item guix-run-in-eshell)
(function :tag "Other function"))
:group 'guix)
(defcustom guix-shell-buffer-name "*shell*"
"Default name of a shell buffer used for running guix commands."
:type 'string
:group 'guix)
(declare-function comint-send-input "comint" t)
(defun guix-run-in-shell (string)
"Run command line STRING in `guix-shell-buffer-name' buffer."
(shell guix-shell-buffer-name)
(goto-char (point-max))
(insert string)
(comint-send-input))
(declare-function eshell-send-input "esh-mode" t)
(defun guix-run-in-eshell (string)
"Run command line STRING in eshell buffer."
(eshell)
(goto-char (point-max))
(insert string)
(eshell-send-input))
(defun guix-run-command-in-shell (args)
"Execute 'guix ARGS ...' command in a shell buffer."
(funcall guix-run-in-shell-function
(guix-command-string args)))
(defun guix-run-command-in-repl (args)
"Execute 'guix ARGS ...' command in Guix REPL."
(guix-eval-in-repl
(apply #'guix-make-guile-expression
'guix-command args)))
(defun guix-command-output (args)
"Return string with 'guix ARGS ...' output."
(cl-multiple-value-bind (output error)
(guix-eval (apply #'guix-make-guile-expression
'guix-command-output args))
;; Remove trailing new space from the error string.
(message (replace-regexp-in-string "\n\\'" "" (read error)))
(read output)))
(defun guix-help-string (&optional commands)
"Return string with 'guix COMMANDS ... --help' output."
(guix-eval-read
(apply #'guix-make-guile-expression
'help-string commands)))
;;; Pull
(defcustom guix-update-after-pull t
"If non-nil, update Guix buffers after performing \\[guix-pull]."
:type 'boolean
:group 'guix)
(defvar guix-after-pull-hook
'(guix-restart-repl-after-pull guix-update-buffers-maybe-after-pull)
"Hook run after successful performing `guix-pull' operation.")
(defun guix-restart-repl-after-pull ()
"Restart Guix REPL after `guix-pull' operation."
(guix-repl-exit)
(guix-start-process-maybe
"Restarting Guix REPL after pull operation ..."))
(defun guix-update-buffers-maybe-after-pull ()
"Update buffers depending on `guix-update-after-pull'."
(when guix-update-after-pull
(mapc #'guix-ui-update-buffer
;; No need to update "generation" buffers.
(guix-ui-buffers '(guix-package-list-mode
guix-package-info-mode
guix-output-list-mode
guix-output-info-mode)))
(message "Guix buffers have been updated.")))
;;;###autoload
(defun guix-pull (&optional verbose)
"Run Guix pull operation.
If VERBOSE is non-nil (with prefix argument), produce verbose output."
(interactive "P")
(let ((args (and verbose '("--verbose"))))
(guix-eval-in-repl
(apply #'guix-make-guile-expression
'guix-command "pull" args)
nil 'pull)))
(provide 'guix-base)
;;; guix-base.el ends here
-624
View File
@@ -1,624 +0,0 @@
;;; guix-buffer.el --- Buffer interface for displaying data -*- lexical-binding: t -*-
;; Copyright © 2014, 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides a general 'buffer' interface for displaying an
;; arbitrary data.
;;; Code:
(require 'cl-lib)
(require 'guix-history)
(require 'guix-utils)
(defvar guix-buffer-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "l") 'guix-history-back)
(define-key map (kbd "r") 'guix-history-forward)
(define-key map (kbd "g") 'revert-buffer)
(define-key map (kbd "R") 'guix-buffer-redisplay)
map)
"Parent keymap for Guix buffer modes.")
;;; Buffer item
(cl-defstruct (guix-buffer-item
(:constructor nil)
(:constructor guix-buffer-make-item
(entries buffer-type entry-type args))
(:copier nil))
entries buffer-type entry-type args)
(defvar-local guix-buffer-item nil
"Data (structure) for the current Guix buffer.
The structure consists of the following elements:
- `entries': list of the currently displayed entries.
Each element of the list is an alist with an entry data of the
following form:
((PARAM . VAL) ...)
PARAM is a name of the entry parameter.
VAL is a value of this parameter.
- `entry-type': type of the currently displayed entries.
- `buffer-type': type of the current buffer.
- `args': search arguments used to get the current entries.")
(put 'guix-buffer-item 'permanent-local t)
(defmacro guix-buffer-with-item (item &rest body)
"Evaluate BODY using buffer ITEM.
The following local variables are available inside BODY:
`%entries', `%buffer-type', `%entry-type', `%args'.
See `guix-buffer-item' for details."
(declare (indent 1) (debug t))
(let ((item-var (make-symbol "item")))
`(let ((,item-var ,item))
(let ((%entries (guix-buffer-item-entries ,item-var))
(%buffer-type (guix-buffer-item-buffer-type ,item-var))
(%entry-type (guix-buffer-item-entry-type ,item-var))
(%args (guix-buffer-item-args ,item-var)))
,@body))))
(defmacro guix-buffer-with-current-item (&rest body)
"Evaluate BODY using `guix-buffer-item'.
See `guix-buffer-with-item' for details."
(declare (indent 0) (debug t))
`(guix-buffer-with-item guix-buffer-item
,@body))
(defmacro guix-buffer-define-current-item-accessor (name)
"Define `guix-buffer-current-NAME' function to access NAME
element of `guix-buffer-item' structure.
NAME should be a symbol."
(let* ((name-str (symbol-name name))
(accessor (intern (concat "guix-buffer-item-" name-str)))
(fun-name (intern (concat "guix-buffer-current-" name-str)))
(doc (format "\
Return '%s' of the current Guix buffer.
See `guix-buffer-item' for details."
name-str)))
`(defun ,fun-name ()
,doc
(and guix-buffer-item
(,accessor guix-buffer-item)))))
(defmacro guix-buffer-define-current-item-accessors (&rest names)
"Define `guix-buffer-current-NAME' functions for NAMES.
See `guix-buffer-define-current-item-accessor' for details."
`(progn
,@(mapcar (lambda (name)
`(guix-buffer-define-current-item-accessor ,name))
names)))
(guix-buffer-define-current-item-accessors
entries entry-type buffer-type args)
(defmacro guix-buffer-define-current-args-accessor (n prefix name)
"Define `PREFIX-NAME' function to access Nth element of 'args'
field of `guix-buffer-item' structure.
PREFIX and NAME should be strings."
(let ((fun-name (intern (concat prefix "-" name)))
(doc (format "\
Return '%s' of the current Guix buffer.
'%s' is the element number %d in 'args' of `guix-buffer-item'."
name name n)))
`(defun ,fun-name ()
,doc
(nth ,n (guix-buffer-current-args)))))
(defmacro guix-buffer-define-current-args-accessors (prefix &rest names)
"Define `PREFIX-NAME' functions for NAMES.
See `guix-buffer-define-current-args-accessor' for details."
`(progn
,@(cl-loop for name in names
for i from 0
collect `(guix-buffer-define-current-args-accessor
,i ,prefix ,name))))
;;; Wrappers for defined variables
(defvar guix-buffer-data nil
"Alist with 'buffer' data.
This alist is filled by `guix-buffer-define-interface' macro.")
(defun guix-buffer-value (buffer-type entry-type symbol)
"Return SYMBOL's value for BUFFER-TYPE/ENTRY-TYPE from `guix-buffer-data'."
(symbol-value
(guix-assq-value guix-buffer-data buffer-type entry-type symbol)))
(defun guix-buffer-get-entries (buffer-type entry-type args)
"Return ENTRY-TYPE entries.
Call an appropriate 'get-entries' function from `guix-buffer'
using ARGS as its arguments."
(apply (guix-buffer-value buffer-type entry-type 'get-entries)
args))
(defun guix-buffer-mode-enable (buffer-type entry-type)
"Turn on major mode to display ENTRY-TYPE ENTRIES in BUFFER-TYPE buffer."
(funcall (guix-buffer-value buffer-type entry-type 'mode)))
(defun guix-buffer-mode-initialize (buffer-type entry-type)
"Set up the current BUFFER-TYPE buffer to display ENTRY-TYPE entries."
(let ((fun (guix-buffer-value buffer-type entry-type 'mode-init)))
(when fun
(funcall fun))))
(defun guix-buffer-insert-entries (entries buffer-type entry-type)
"Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer."
(funcall (guix-buffer-value buffer-type entry-type 'insert-entries)
entries))
(defun guix-buffer-show-entries-default (entries buffer-type entry-type)
"Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer."
(let ((inhibit-read-only t))
(erase-buffer)
(guix-buffer-mode-enable buffer-type entry-type)
(guix-buffer-insert-entries entries buffer-type entry-type)
(goto-char (point-min))))
(defun guix-buffer-show-entries (entries buffer-type entry-type)
"Show ENTRY-TYPE ENTRIES in the current BUFFER-TYPE buffer."
(funcall (guix-buffer-value buffer-type entry-type 'show-entries)
entries))
(defun guix-buffer-message (entries buffer-type entry-type args)
"Display a message for BUFFER-ITEM after showing entries."
(let ((fun (guix-buffer-value buffer-type entry-type 'message)))
(when fun
(apply fun entries args))))
(defun guix-buffer-name (buffer-type entry-type args)
"Return name of BUFFER-TYPE buffer for displaying ENTRY-TYPE entries."
(let ((str-or-fun (guix-buffer-value buffer-type entry-type
'buffer-name)))
(if (stringp str-or-fun)
str-or-fun
(apply str-or-fun args))))
(defun guix-buffer-param-title (buffer-type entry-type param)
"Return PARAM title for BUFFER-TYPE/ENTRY-TYPE."
(or (guix-assq-value (guix-buffer-value buffer-type entry-type 'titles)
param)
;; Fallback to a title defined in 'info' interface.
(unless (eq buffer-type 'info)
(guix-assq-value (guix-buffer-value 'info entry-type 'titles)
param))
(guix-symbol-title param)))
(defun guix-buffer-history-size (buffer-type entry-type)
"Return history size for BUFFER-TYPE/ENTRY-TYPE."
(guix-buffer-value buffer-type entry-type 'history-size))
(defun guix-buffer-revert-confirm? (buffer-type entry-type)
"Return 'revert-confirm' value for BUFFER-TYPE/ENTRY-TYPE."
(guix-buffer-value buffer-type entry-type 'revert-confirm))
;;; Displaying entries
(defun guix-buffer-display (buffer)
"Switch to a Guix BUFFER."
(pop-to-buffer buffer
'((display-buffer-reuse-window
display-buffer-same-window))))
(defun guix-buffer-history-item (buffer-item)
"Make and return a history item for displaying BUFFER-ITEM."
(list #'guix-buffer-set buffer-item))
(defun guix-buffer-set (buffer-item &optional history)
"Set up the current buffer for displaying BUFFER-ITEM.
HISTORY should be one of the following:
`nil' - do not save BUFFER-ITEM in history,
`add' - add it to history,
`replace' - replace the current history item."
(guix-buffer-with-item buffer-item
(when %entries
;; Set buffer item before showing entries, so that its value can
;; be used by the code for displaying entries.
(setq guix-buffer-item buffer-item)
(guix-buffer-show-entries %entries %buffer-type %entry-type)
(when history
(funcall (cl-ecase history
(add #'guix-history-add)
(replace #'guix-history-replace))
(guix-buffer-history-item buffer-item))))
(guix-buffer-message %entries %buffer-type %entry-type %args)))
(defun guix-buffer-display-entries-current
(entries buffer-type entry-type args &optional history)
"Show ENTRIES in the current Guix buffer.
See `guix-buffer-item' for the meaning of BUFFER-TYPE, ENTRY-TYPE
and ARGS, and `guix-buffer-set' for the meaning of HISTORY."
(let ((item (guix-buffer-make-item entries buffer-type
entry-type args)))
(guix-buffer-set item history)))
(defun guix-buffer-get-display-entries-current
(buffer-type entry-type args &optional history)
"Search for entries and show them in the current Guix buffer.
See `guix-buffer-display-entries-current' for details."
(guix-buffer-display-entries-current
(guix-buffer-get-entries buffer-type entry-type args)
buffer-type entry-type args history))
(defun guix-buffer-display-entries
(entries buffer-type entry-type args &optional history)
"Show ENTRIES in a BUFFER-TYPE buffer.
See `guix-buffer-display-entries-current' for details."
(let ((buffer (get-buffer-create
(guix-buffer-name buffer-type entry-type args))))
(with-current-buffer buffer
(guix-buffer-display-entries-current
entries buffer-type entry-type args history))
(when entries
(guix-buffer-display buffer))))
(defun guix-buffer-get-display-entries
(buffer-type entry-type args &optional history)
"Search for entries and show them in a BUFFER-TYPE buffer.
See `guix-buffer-display-entries-current' for details."
(guix-buffer-display-entries
(guix-buffer-get-entries buffer-type entry-type args)
buffer-type entry-type args history))
(defun guix-buffer-revert (_ignore-auto noconfirm)
"Update the data in the current Guix buffer.
This function is suitable for `revert-buffer-function'.
See `revert-buffer' for the meaning of NOCONFIRM."
(guix-buffer-with-current-item
(when (or noconfirm
(not (guix-buffer-revert-confirm? %buffer-type %entry-type))
(y-or-n-p "Update the current buffer? "))
(guix-buffer-get-display-entries-current
%buffer-type %entry-type %args 'replace))))
(defvar guix-buffer-after-redisplay-hook nil
"Hook run by `guix-buffer-redisplay'.
This hook is called before seting up a window position.")
(defun guix-buffer-redisplay ()
"Redisplay the current Guix buffer.
Restore the point and window positions after redisplaying.
This function does not update the buffer data, use
'\\[revert-buffer]' if you want the full update."
(interactive)
(let* ((old-point (point))
;; For simplicity, ignore an unlikely case when multiple
;; windows display the same buffer.
(window (car (get-buffer-window-list (current-buffer) nil t)))
(window-start (and window (window-start window))))
(guix-buffer-set guix-buffer-item)
(goto-char old-point)
(run-hooks 'guix-buffer-after-redisplay-hook)
(when window
(set-window-point window (point))
(set-window-start window window-start))))
(defun guix-buffer-redisplay-goto-button ()
"Redisplay the current buffer and go to the next button, if needed."
(let ((guix-buffer-after-redisplay-hook
(cons (lambda ()
(unless (button-at (point))
(forward-button 1)))
guix-buffer-after-redisplay-hook)))
(guix-buffer-redisplay)))
;;; Interface definers
(defmacro guix-define-groups (type &rest args)
"Define `guix-TYPE' and `guix-TYPE-faces' custom groups.
Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
Optional keywords:
- `:parent-group' - name of a parent custom group.
- `:parent-faces-group' - name of a parent custom faces group.
- `:group-doc' - docstring of a `guix-TYPE' group.
- `:faces-group-doc' - docstring of a `guix-TYPE-faces' group."
(declare (indent 1))
(let* ((type-str (symbol-name type))
(prefix (concat "guix-" type-str))
(group (intern prefix))
(faces-group (intern (concat prefix "-faces"))))
(guix-keyword-args-let args
((parent-group :parent-group 'guix)
(parent-faces-group :parent-faces-group 'guix-faces)
(group-doc :group-doc
(format "Settings for '%s' buffers."
type-str))
(faces-group-doc :faces-group-doc
(format "Faces for '%s' buffers."
type-str)))
`(progn
(defgroup ,group nil
,group-doc
:group ',parent-group)
(defgroup ,faces-group nil
,faces-group-doc
:group ',group
:group ',parent-faces-group)))))
(defmacro guix-define-entry-type (entry-type &rest args)
"Define general code for ENTRY-TYPE.
See `guix-define-groups'."
(declare (indent 1))
`(guix-define-groups ,entry-type
,@args))
(defmacro guix-define-buffer-type (buffer-type &rest args)
"Define general code for BUFFER-TYPE.
See `guix-define-groups'."
(declare (indent 1))
`(guix-define-groups ,buffer-type
,@args))
(defmacro guix-buffer-define-interface (buffer-type entry-type &rest args)
"Define BUFFER-TYPE interface for displaying ENTRY-TYPE entries.
Remaining arguments (ARGS) should have a form [KEYWORD VALUE] ...
In the following description TYPE means ENTRY-TYPE-BUFFER-TYPE.
Required keywords:
- `:buffer-name' - default value of the generated
`guix-TYPE-buffer-name' variable.
- `:get-entries-function' - default value of the generated
`guix-TYPE-get-function' variable.
- `:show-entries-function' - default value of the generated
`guix-TYPE-show-function' variable.
Alternatively, if `:show-entries-function' is not specified, a
default `guix-TYPE-show-entries' will be generated, and the
following keyword should be specified instead:
- `:insert-entries-function' - default value of the generated
`guix-TYPE-insert-function' variable.
Optional keywords:
- `:message-function' - default value of the generated
`guix-TYPE-message-function' variable.
- `:titles' - default value of the generated
`guix-TYPE-titles' variable.
- `:history-size' - default value of the generated
`guix-TYPE-history-size' variable.
- `:revert-confirm?' - default value of the generated
`guix-TYPE-revert-confirm' variable.
- `:mode-name' - name (a string appeared in the mode-line) of
the generated `guix-TYPE-mode'.
- `:mode-init-function' - default value of the generated
`guix-TYPE-mode-initialize-function' variable.
- `:reduced?' - if non-nil, generate only group, faces group
and titles variable (if specified); all keywords become
optional."
(declare (indent 2))
(let* ((entry-type-str (symbol-name entry-type))
(buffer-type-str (symbol-name buffer-type))
(prefix (concat "guix-" entry-type-str "-"
buffer-type-str))
(group (intern prefix))
(faces-group (intern (concat prefix "-faces")))
(get-entries-var (intern (concat prefix "-get-function")))
(show-entries-var (intern (concat prefix "-show-function")))
(show-entries-fun (intern (concat prefix "-show-entries")))
(message-var (intern (concat prefix "-message-function")))
(buffer-name-var (intern (concat prefix "-buffer-name")))
(titles-var (intern (concat prefix "-titles")))
(history-size-var (intern (concat prefix "-history-size")))
(revert-confirm-var (intern (concat prefix "-revert-confirm"))))
(guix-keyword-args-let args
((get-entries-val :get-entries-function)
(show-entries-val :show-entries-function)
(insert-entries-val :insert-entries-function)
(mode-name :mode-name (capitalize prefix))
(mode-init-val :mode-init-function)
(message-val :message-function)
(buffer-name-val :buffer-name)
(titles-val :titles)
(history-size-val :history-size 20)
(revert-confirm-val :revert-confirm? t)
(reduced? :reduced?))
`(progn
(defgroup ,group nil
,(format "Displaying '%s' entries in '%s' buffer."
entry-type-str buffer-type-str)
:group ',(intern (concat "guix-" entry-type-str))
:group ',(intern (concat "guix-" buffer-type-str)))
(defgroup ,faces-group nil
,(format "Faces for displaying '%s' entries in '%s' buffer."
entry-type-str buffer-type-str)
:group ',group
:group ',(intern (concat "guix-" entry-type-str "-faces"))
:group ',(intern (concat "guix-" buffer-type-str "-faces")))
(defcustom ,titles-var ,titles-val
,(format "Alist of titles of '%s' parameters."
entry-type-str)
:type '(alist :key-type symbol :value-type string)
:group ',group)
,(unless reduced?
`(progn
(defvar ,get-entries-var ,get-entries-val
,(format "\
Function used to receive '%s' entries for '%s' buffer."
entry-type-str buffer-type-str))
(defvar ,show-entries-var
,(or show-entries-val `',show-entries-fun)
,(format "\
Function used to show '%s' entries in '%s' buffer."
entry-type-str buffer-type-str))
(defvar ,message-var ,message-val
,(format "\
Function used to display a message after showing '%s' entries.
If nil, do not display messages."
entry-type-str))
(defcustom ,buffer-name-var ,buffer-name-val
,(format "\
Default name of '%s' buffer for displaying '%s' entries.
May be a string or a function returning a string. The function
is called with the same arguments as `%S'."
buffer-type-str entry-type-str get-entries-var)
:type '(choice string function)
:group ',group)
(defcustom ,history-size-var ,history-size-val
,(format "\
Maximum number of items saved in history of `%S' buffer.
If 0, the history is disabled."
buffer-name-var)
:type 'integer
:group ',group)
(defcustom ,revert-confirm-var ,revert-confirm-val
,(format "\
If non-nil, ask to confirm for reverting `%S' buffer."
buffer-name-var)
:type 'boolean
:group ',group)
(guix-alist-put!
'((get-entries . ,get-entries-var)
(show-entries . ,show-entries-var)
(message . ,message-var)
(buffer-name . ,buffer-name-var)
(history-size . ,history-size-var)
(revert-confirm . ,revert-confirm-var))
'guix-buffer-data ',buffer-type ',entry-type)
,(unless show-entries-val
`(defun ,show-entries-fun (entries)
,(format "\
Show '%s' ENTRIES in the current '%s' buffer."
entry-type-str buffer-type-str)
(guix-buffer-show-entries-default
entries ',buffer-type ',entry-type)))
,(when (or insert-entries-val
(null show-entries-val))
(let ((insert-entries-var
(intern (concat prefix "-insert-function"))))
`(progn
(defvar ,insert-entries-var ,insert-entries-val
,(format "\
Function used to print '%s' entries in '%s' buffer."
entry-type-str buffer-type-str))
(guix-alist-put!
',insert-entries-var 'guix-buffer-data
',buffer-type ',entry-type
'insert-entries))))
,(when (or mode-name
mode-init-val
(null show-entries-val))
(let* ((mode-str (concat prefix "-mode"))
(mode-map-str (concat mode-str "-map"))
(mode (intern mode-str))
(parent-mode (intern
(concat "guix-" buffer-type-str
"-mode")))
(mode-var (intern
(concat mode-str "-function")))
(mode-init-var (intern
(concat mode-str
"-initialize-function"))))
`(progn
(defvar ,mode-var ',mode
,(format "\
Major mode for displaying '%s' entries in '%s' buffer."
entry-type-str buffer-type-str))
(defvar ,mode-init-var ,mode-init-val
,(format "\
Function used to set up '%s' buffer for displaying '%s' entries."
buffer-type-str entry-type-str))
(define-derived-mode ,mode ,parent-mode ,mode-name
,(format "\
Major mode for displaying '%s' entries in '%s' buffer.
\\{%s}"
entry-type-str buffer-type-str mode-map-str)
(setq-local revert-buffer-function
'guix-buffer-revert)
(setq-local guix-history-size
(guix-buffer-history-size
',buffer-type ',entry-type))
(guix-buffer-mode-initialize
',buffer-type ',entry-type))
(guix-alist-put!
',mode-var 'guix-buffer-data
',buffer-type ',entry-type 'mode)
(guix-alist-put!
',mode-init-var 'guix-buffer-data
',buffer-type ',entry-type
'mode-init))))))
(guix-alist-put!
',titles-var 'guix-buffer-data
',buffer-type ',entry-type 'titles)))))
(defvar guix-buffer-font-lock-keywords
(eval-when-compile
`((,(rx "(" (group (or "guix-buffer-with-item"
"guix-buffer-with-current-item"
"guix-buffer-define-interface"
"guix-define-groups"
"guix-define-entry-type"
"guix-define-buffer-type"))
symbol-end)
. 1))))
(font-lock-add-keywords 'emacs-lisp-mode guix-buffer-font-lock-keywords)
(provide 'guix-buffer)
;;; guix-buffer.el ends here
-381
View File
@@ -1,381 +0,0 @@
;;; guix-build-log.el --- Major and minor modes for build logs -*- lexical-binding: t -*-
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides a major mode (`guix-build-log-mode') and a minor mode
;; (`guix-build-log-minor-mode') for highlighting Guix build logs.
;;; Code:
(require 'guix-utils)
(defgroup guix-build-log nil
"Settings for `guix-build-log-mode'."
:group 'guix)
(defgroup guix-build-log-faces nil
"Faces for `guix-build-log-mode'."
:group 'guix-build-log
:group 'guix-faces)
(defface guix-build-log-title-head
'((t :inherit font-lock-keyword-face))
"Face for '@' symbol of a log title."
:group 'guix-build-log-faces)
(defface guix-build-log-title-start
'((t :inherit guix-build-log-title-head))
"Face for a log title denoting a start of a process."
:group 'guix-build-log-faces)
(defface guix-build-log-title-success
'((t :inherit guix-build-log-title-head))
"Face for a log title denoting a successful end of a process."
:group 'guix-build-log-faces)
(defface guix-build-log-title-fail
'((t :inherit error))
"Face for a log title denoting a failed end of a process."
:group 'guix-build-log-faces)
(defface guix-build-log-title-end
'((t :inherit guix-build-log-title-head))
"Face for a log title denoting an undefined end of a process."
:group 'guix-build-log-faces)
(defface guix-build-log-phase-name
'((t :inherit font-lock-function-name-face))
"Face for a phase name."
:group 'guix-build-log-faces)
(defface guix-build-log-phase-start
'((default :weight bold)
(((class grayscale) (background light)) :foreground "Gray90")
(((class grayscale) (background dark)) :foreground "DimGray")
(((class color) (min-colors 16) (background light))
:foreground "DarkGreen")
(((class color) (min-colors 16) (background dark))
:foreground "LimeGreen")
(((class color) (min-colors 8)) :foreground "green"))
"Face for the start line of a phase."
:group 'guix-build-log-faces)
(defface guix-build-log-phase-end
'((((class grayscale) (background light)) :foreground "Gray90")
(((class grayscale) (background dark)) :foreground "DimGray")
(((class color) (min-colors 16) (background light))
:foreground "ForestGreen")
(((class color) (min-colors 16) (background dark))
:foreground "LightGreen")
(((class color) (min-colors 8)) :foreground "green")
(t :weight bold))
"Face for the end line of a phase."
:group 'guix-build-log-faces)
(defface guix-build-log-phase-success
'((t))
"Face for the 'succeeded' word of a phase line."
:group 'guix-build-log-faces)
(defface guix-build-log-phase-fail
'((t :inherit error))
"Face for the 'failed' word of a phase line."
:group 'guix-build-log-faces)
(defface guix-build-log-phase-seconds
'((t :inherit font-lock-constant-face))
"Face for the number of seconds for a phase."
:group 'guix-build-log-faces)
(defcustom guix-build-log-minor-mode-activate t
"If non-nil, then `guix-build-log-minor-mode' is automatically
activated in `shell-mode' buffers."
:type 'boolean
:group 'guix-build-log)
(defcustom guix-build-log-mode-hook '()
"Hook run after `guix-build-log-mode' is entered."
:type 'hook
:group 'guix-build-log)
(defvar guix-build-log-phase-name-regexp "`\\([^']+\\)'"
"Regexp for a phase name.")
(defvar guix-build-log-phase-start-regexp
(concat "^starting phase " guix-build-log-phase-name-regexp)
"Regexp for the start line of a 'build' phase.")
(defun guix-build-log-title-regexp (&optional state)
"Return regexp for the log title.
STATE is a symbol denoting a state of the title. It should be
`start', `fail', `success' or `nil' (for a regexp matching any
state)."
(let* ((word-rx (rx (1+ (any word "-"))))
(state-rx (cond ((eq state 'start) (concat word-rx "started"))
((eq state 'success) (concat word-rx "succeeded"))
((eq state 'fail) (concat word-rx "failed"))
(t word-rx))))
(rx-to-string
`(and bol (group "@") " " (group (regexp ,state-rx)))
t)))
(defun guix-build-log-phase-end-regexp (&optional state)
"Return regexp for the end line of a 'build' phase.
STATE is a symbol denoting how a build phase was ended. It should be
`fail', `success' or `nil' (for a regexp matching any state)."
(let ((state-rx (cond ((eq state 'success) "succeeded")
((eq state 'fail) "failed")
(t (regexp-opt '("succeeded" "failed"))))))
(rx-to-string
`(and bol "phase " (regexp ,guix-build-log-phase-name-regexp)
" " (group (regexp ,state-rx)) " after "
(group (1+ (or digit "."))) " seconds")
t)))
(defvar guix-build-log-phase-end-regexp
;; For efficiency, it is better to have a regexp for the general line
;; of the phase end, then to call the function all the time.
(guix-build-log-phase-end-regexp)
"Regexp for the end line of a 'build' phase.")
(defvar guix-build-log-font-lock-keywords
`((,(guix-build-log-title-regexp 'start)
(1 'guix-build-log-title-head)
(2 'guix-build-log-title-start))
(,(guix-build-log-title-regexp 'success)
(1 'guix-build-log-title-head)
(2 'guix-build-log-title-success))
(,(guix-build-log-title-regexp 'fail)
(1 'guix-build-log-title-head)
(2 'guix-build-log-title-fail))
(,(guix-build-log-title-regexp)
(1 'guix-build-log-title-head)
(2 'guix-build-log-title-end))
(,guix-build-log-phase-start-regexp
(0 'guix-build-log-phase-start)
(1 'guix-build-log-phase-name prepend))
(,(guix-build-log-phase-end-regexp 'success)
(0 'guix-build-log-phase-end)
(1 'guix-build-log-phase-name prepend)
(2 'guix-build-log-phase-success prepend)
(3 'guix-build-log-phase-seconds prepend))
(,(guix-build-log-phase-end-regexp 'fail)
(0 'guix-build-log-phase-end)
(1 'guix-build-log-phase-name prepend)
(2 'guix-build-log-phase-fail prepend)
(3 'guix-build-log-phase-seconds prepend)))
"A list of `font-lock-keywords' for `guix-build-log-mode'.")
(defvar guix-build-log-common-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "M-n") 'guix-build-log-next-phase)
(define-key map (kbd "M-p") 'guix-build-log-previous-phase)
(define-key map (kbd "TAB") 'guix-build-log-phase-toggle)
(define-key map (kbd "<tab>") 'guix-build-log-phase-toggle)
(define-key map (kbd "<backtab>") 'guix-build-log-phase-toggle-all)
(define-key map [(shift tab)] 'guix-build-log-phase-toggle-all)
map)
"Parent keymap for 'build-log' buffers.
For `guix-build-log-mode' this map is used as is.
For `guix-build-log-minor-mode' this map is prefixed with 'C-c'.")
(defvar guix-build-log-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent
map (make-composed-keymap (list guix-build-log-common-map)
special-mode-map))
(define-key map (kbd "c") 'compilation-shell-minor-mode)
(define-key map (kbd "v") 'view-mode)
map)
"Keymap for `guix-build-log-mode' buffers.")
(defvar guix-build-log-minor-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-c") guix-build-log-common-map)
map)
"Keymap for `guix-build-log-minor-mode' buffers.")
(defun guix-build-log-phase-start (&optional with-header?)
"Return the start point of the current build phase.
If WITH-HEADER? is non-nil, do not skip 'starting phase ...' header.
Return nil, if there is no phase start before the current point."
(save-excursion
(end-of-line)
(when (re-search-backward guix-build-log-phase-start-regexp nil t)
(unless with-header? (end-of-line))
(point))))
(defun guix-build-log-phase-end ()
"Return the end point of the current build phase."
(save-excursion
(beginning-of-line)
(when (re-search-forward guix-build-log-phase-end-regexp nil t)
(point))))
(defun guix-build-log-phase-hide ()
"Hide the body of the current build phase."
(interactive)
(let ((beg (guix-build-log-phase-start))
(end (guix-build-log-phase-end)))
(when (and beg end)
;; If not on the header line, move to it.
(when (and (> (point) beg)
(< (point) end))
(goto-char (guix-build-log-phase-start t)))
(remove-overlays beg end 'invisible t)
(let ((o (make-overlay beg end)))
(overlay-put o 'evaporate t)
(overlay-put o 'invisible t)))))
(defun guix-build-log-phase-show ()
"Show the body of the current build phase."
(interactive)
(let ((beg (guix-build-log-phase-start))
(end (guix-build-log-phase-end)))
(when (and beg end)
(remove-overlays beg end 'invisible t))))
(defun guix-build-log-phase-hidden-p ()
"Return non-nil, if the body of the current build phase is hidden."
(let ((beg (guix-build-log-phase-start)))
(and beg
(cl-some (lambda (o)
(overlay-get o 'invisible))
(overlays-at beg)))))
(defun guix-build-log-phase-toggle-function ()
"Return a function to toggle the body of the current build phase."
(if (guix-build-log-phase-hidden-p)
#'guix-build-log-phase-show
#'guix-build-log-phase-hide))
(defun guix-build-log-phase-toggle ()
"Show/hide the body of the current build phase."
(interactive)
(funcall (guix-build-log-phase-toggle-function)))
(defun guix-build-log-phase-toggle-all ()
"Show/hide the bodies of all build phases."
(interactive)
(save-excursion
;; Some phases may be hidden, and some shown. Whether to hide or to
;; show them, it is determined by the state of the first phase here.
(goto-char (point-min))
(let ((fun (save-excursion
(re-search-forward guix-build-log-phase-start-regexp nil t)
(guix-build-log-phase-toggle-function))))
(while (re-search-forward guix-build-log-phase-start-regexp nil t)
(funcall fun)))))
(defun guix-build-log-next-phase (&optional arg)
"Move to the next build phase.
With ARG, do it that many times. Negative ARG means move
backward."
(interactive "^p")
(if arg
(when (zerop arg) (user-error "Try again"))
(setq arg 1))
(let ((search-fun (if (> arg 0)
#'re-search-forward
#'re-search-backward))
(n (abs arg))
found last-found)
(save-excursion
(end-of-line (if (> arg 0) 1 0)) ; skip the current line
(while (and (not (zerop n))
(setq found
(funcall search-fun
guix-build-log-phase-start-regexp
nil t)))
(setq n (1- n)
last-found found)))
(when last-found
(goto-char last-found)
(forward-line 0))
(or found
(user-error (if (> arg 0)
"No next build phase"
"No previous build phase")))))
(defun guix-build-log-previous-phase (&optional arg)
"Move to the previous build phase.
With ARG, do it that many times. Negative ARG means move
forward."
(interactive "^p")
(guix-build-log-next-phase (- (or arg 1))))
;;;###autoload
(define-derived-mode guix-build-log-mode special-mode
"Guix-Build-Log"
"Major mode for viewing Guix build logs.
\\{guix-build-log-mode-map}"
(setq font-lock-defaults '(guix-build-log-font-lock-keywords t)))
;;;###autoload
(define-minor-mode guix-build-log-minor-mode
"Toggle Guix Build Log minor mode.
With a prefix argument ARG, enable Guix Build Log minor mode if
ARG is positive, and disable it otherwise. If called from Lisp,
enable the mode if ARG is omitted or nil.
When Guix Build Log minor mode is enabled, it highlights build
log in the current buffer. This mode can be enabled
programmatically using hooks:
(add-hook 'shell-mode-hook 'guix-build-log-minor-mode)
\\{guix-build-log-minor-mode-map}"
:init-value nil
:lighter " Guix-Build-Log"
:keymap guix-build-log-minor-mode-map
:group 'guix-build-log
(if guix-build-log-minor-mode
(font-lock-add-keywords nil guix-build-log-font-lock-keywords)
(font-lock-remove-keywords nil guix-build-log-font-lock-keywords))
(when font-lock-mode
(font-lock-fontify-buffer)))
;;;###autoload
(defun guix-build-log-minor-mode-activate-maybe ()
"Activate `guix-build-log-minor-mode' depending on
`guix-build-log-minor-mode-activate' variable."
(when guix-build-log-minor-mode-activate
(guix-build-log-minor-mode)))
(defun guix-build-log-find-file (file-or-url)
"Open FILE-OR-URL in `guix-build-log-mode'."
(guix-find-file-or-url file-or-url)
(guix-build-log-mode))
;;;###autoload
(add-hook 'shell-mode-hook 'guix-build-log-minor-mode-activate-maybe)
;;;###autoload
(add-to-list 'auto-mode-alist
;; Regexp for log files (usually placed in /var/log/guix/...)
(cons (rx "/guix/drvs/" (= 2 alnum) "/" (= 30 alnum)
"-" (+ (any alnum "-+.")) ".drv" string-end)
'guix-build-log-mode))
(provide 'guix-build-log)
;;; guix-build-log.el ends here
-830
View File
@@ -1,830 +0,0 @@
;;; guix-command.el --- Popup interface for guix commands -*- lexical-binding: t -*-
;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides a magit-like popup interface for running guix
;; commands in Guix REPL. The entry point is "M-x guix". When it is
;; called the first time, "guix --help" output is parsed and
;; `guix-COMMAND-action' functions are generated for each available guix
;; COMMAND. Then a window with these commands is popped up. When a
;; particular COMMAND is called, "guix COMMAND --help" output is parsed,
;; and a user get a new popup window with available options for this
;; command and so on.
;; To avoid hard-coding all guix options, actions, etc., as much data is
;; taken from "guix ... --help" outputs as possible. But this data is
;; still incomplete: not all long options have short analogs, also
;; special readers should be used for some options (for example, to
;; complete package names while prompting for a package). So after
;; parsing --help output, the arguments are "improved". All arguments
;; (switches, options and actions) are `guix-command-argument'
;; structures.
;; Only "M-x guix" command is available after this file is loaded. The
;; rest commands/actions/popups are generated on the fly only when they
;; are needed (that's why there is a couple of `eval'-s in this file).
;; COMMANDS argument is used by many functions in this file. It means a
;; list of guix commands without "guix" itself, e.g.: ("build"),
;; ("import" "gnu"). The empty list stands for the plain "guix" without
;; subcommands.
;; All actions in popup windows are divided into 2 groups:
;;
;; - 'Popup' actions - used to pop up another window. For example, every
;; action in the 'guix' or 'guix import' window is a popup action. They
;; are defined by `guix-command-define-popup-action' macro.
;;
;; - 'Execute' actions - used to do something with the command line (to
;; run a command in Guix REPL or to copy it into kill-ring) constructed
;; with the current popup. They are defined by
;; `guix-command-define-execute-action' macro.
;;; Code:
(require 'cl-lib)
(require 'guix-popup)
(require 'guix-utils)
(require 'guix-help-vars)
(require 'guix-read)
(require 'guix-base)
(require 'guix-build-log)
(require 'guix-guile)
(require 'guix-external)
(defgroup guix-commands nil
"Settings for guix popup windows."
:group 'guix)
(defvar guix-command-complex-with-shared-arguments
'("system")
"List of guix commands which have subcommands with shared options.
I.e., 'guix foo --help' is the same as 'guix foo bar --help'.")
(defun guix-command-action-name (&optional commands &rest name-parts)
"Return name of action function for guix COMMANDS."
(guix-command-symbol (append commands name-parts (list "action"))))
;;; Command arguments
(cl-defstruct (guix-command-argument
(:constructor guix-command-make-argument)
(:copier guix-command-copy-argument))
name char doc fun switch? option? action?)
(cl-defun guix-command-modify-argument
(argument &key
(name nil name-bound?)
(char nil char-bound?)
(doc nil doc-bound?)
(fun nil fun-bound?)
(switch? nil switch?-bound?)
(option? nil option?-bound?)
(action? nil action?-bound?))
"Return a modified version of ARGUMENT."
(declare (indent 1))
(let ((copy (guix-command-copy-argument argument)))
(and name-bound? (setf (guix-command-argument-name copy) name))
(and char-bound? (setf (guix-command-argument-char copy) char))
(and doc-bound? (setf (guix-command-argument-doc copy) doc))
(and fun-bound? (setf (guix-command-argument-fun copy) fun))
(and switch?-bound? (setf (guix-command-argument-switch? copy) switch?))
(and option?-bound? (setf (guix-command-argument-option? copy) option?))
(and action?-bound? (setf (guix-command-argument-action? copy) action?))
copy))
(defun guix-command-modify-argument-from-alist (argument alist)
"Return a modified version of ARGUMENT or nil if it wasn't modified.
Each assoc from ALIST have a form (NAME . PLIST). NAME is an
argument name. PLIST is a property list of argument parameters
to be modified."
(let* ((name (guix-command-argument-name argument))
(plist (guix-assoc-value alist name)))
(when plist
(apply #'guix-command-modify-argument
argument plist))))
(defmacro guix-command-define-argument-improver (name alist)
"Define NAME variable and function to modify an argument from ALIST."
(declare (indent 1))
`(progn
(defvar ,name ,alist)
(defun ,name (argument)
(guix-command-modify-argument-from-alist argument ,name))))
(guix-command-define-argument-improver
guix-command-improve-action-argument
'(("container" :char ?C)
("graph" :char ?G)
("environment" :char ?E)
("publish" :char ?u)
("pull" :char ?P)
("size" :char ?z)))
(guix-command-define-argument-improver
guix-command-improve-common-argument
'(("--help" :switch? nil)
("--version" :switch? nil)))
(guix-command-define-argument-improver
guix-command-improve-target-argument
'(("--target" :char ?T)))
(guix-command-define-argument-improver
guix-command-improve-system-type-argument
'(("--system" :fun guix-read-system-type)))
(guix-command-define-argument-improver
guix-command-improve-load-path-argument
'(("--load-path" :fun read-directory-name)))
(guix-command-define-argument-improver
guix-command-improve-search-paths-argument
'(("--search-paths" :char ?P)))
(guix-command-define-argument-improver
guix-command-improve-substitute-urls-argument
'(("--substitute-urls" :char ?U)))
(guix-command-define-argument-improver
guix-command-improve-hash-argument
'(("--format" :fun guix-read-hash-format)))
(guix-command-define-argument-improver
guix-command-improve-key-policy-argument
'(("--key-download" :fun guix-read-key-policy)))
(defvar guix-command-improve-common-build-argument
'(("--no-substitutes" :char ?s)
("--no-build-hook" :char ?h)
("--max-silent-time" :char ?x)
("--rounds" :char ?R :fun read-number)
("--with-input" :char ?W)))
(defun guix-command-improve-common-build-argument (argument)
(guix-command-modify-argument-from-alist
argument
(append guix-command-improve-load-path-argument
guix-command-improve-substitute-urls-argument
guix-command-improve-common-build-argument)))
(guix-command-define-argument-improver
guix-command-improve-archive-argument
'(("--generate-key" :char ?k)))
(guix-command-define-argument-improver
guix-command-improve-build-argument
'(("--no-grafts" :char ?g)
("--file" :fun guix-read-file-name)
("--root" :fun guix-read-file-name)
("--sources" :char ?S :fun guix-read-source-type :switch? nil)
("--with-source" :fun guix-read-file-name)))
(guix-command-define-argument-improver
guix-command-improve-environment-argument
'(("--ad-hoc"
:name "--ad-hoc " :fun guix-read-package-names-string
:switch? nil :option? t)
("--expose" :char ?E)
("--share" :char ?S)
("--load" :fun guix-read-file-name)))
(guix-command-define-argument-improver
guix-command-improve-gc-argument
'(("--list-dead" :char ?D)
("--list-live" :char ?L)
("--referrers" :char ?f)
("--verify" :fun guix-read-verify-options-string)))
(guix-command-define-argument-improver
guix-command-improve-graph-argument
'(("--type" :fun guix-read-graph-type)))
(guix-command-define-argument-improver
guix-command-improve-import-argument
'(("cran" :char ?r)))
(guix-command-define-argument-improver
guix-command-improve-import-elpa-argument
'(("--archive" :fun guix-read-elpa-archive)))
(guix-command-define-argument-improver
guix-command-improve-lint-argument
'(("--checkers" :fun guix-read-lint-checker-names-string)))
(guix-command-define-argument-improver
guix-command-improve-package-argument
;; Unlike all other options, --install/--remove do not have a form
;; '--install=foo,bar' but '--install foo bar' instead, so we need
;; some tweaks.
'(("--install"
:name "--install " :fun guix-read-package-names-string
:switch? nil :option? t)
("--remove"
:name "--remove " :fun guix-read-package-names-string
:switch? nil :option? t)
("--install-from-file" :fun guix-read-file-name)
("--manifest" :fun guix-read-file-name)
("--profile" :fun guix-read-file-name)
("--do-not-upgrade" :char ?U)
("--roll-back" :char ?R)
("--show" :char ?w :fun guix-read-package-name)))
(guix-command-define-argument-improver
guix-command-improve-refresh-argument
'(("--select" :fun guix-read-refresh-subset)
("--type" :fun guix-read-refresh-updater-names-string)
("--key-server" :char ?S)))
(guix-command-define-argument-improver
guix-command-improve-size-argument
'(("--map-file" :fun guix-read-file-name)))
(guix-command-define-argument-improver
guix-command-improve-system-argument
'(("disk-image" :char ?D)
("vm-image" :char ?V)
("--on-error" :char ?E)
("--no-grub" :char ?g)
("--full-boot" :char ?b)))
(defvar guix-command-argument-improvers
'((()
guix-command-improve-action-argument)
(("archive")
guix-command-improve-common-build-argument
guix-command-improve-target-argument
guix-command-improve-system-type-argument
guix-command-improve-archive-argument)
(("build")
guix-command-improve-common-build-argument
guix-command-improve-target-argument
guix-command-improve-system-type-argument
guix-command-improve-build-argument)
(("download")
guix-command-improve-hash-argument)
(("hash")
guix-command-improve-hash-argument)
(("environment")
guix-command-improve-common-build-argument
guix-command-improve-search-paths-argument
guix-command-improve-system-type-argument
guix-command-improve-environment-argument)
(("gc")
guix-command-improve-gc-argument)
(("graph")
guix-command-improve-graph-argument)
(("import")
guix-command-improve-import-argument)
(("import" "gnu")
guix-command-improve-key-policy-argument)
(("import" "elpa")
guix-command-improve-import-elpa-argument)
(("lint")
guix-command-improve-lint-argument)
(("package")
guix-command-improve-common-build-argument
guix-command-improve-search-paths-argument
guix-command-improve-package-argument)
(("refresh")
guix-command-improve-key-policy-argument
guix-command-improve-refresh-argument)
(("size")
guix-command-improve-system-type-argument
guix-command-improve-substitute-urls-argument
guix-command-improve-size-argument)
(("system")
guix-command-improve-common-build-argument
guix-command-improve-system-argument))
"Alist of guix commands and argument improvers for them.")
(defun guix-command-improve-argument (argument improvers)
"Return ARGUMENT modified with IMPROVERS."
(or (cl-some (lambda (improver)
(funcall improver argument))
improvers)
argument))
(defun guix-command-improve-arguments (arguments commands)
"Return ARGUMENTS for 'guix COMMANDS ...' modified for popup interface."
(let ((improvers (cons 'guix-command-improve-common-argument
(guix-assoc-value guix-command-argument-improvers
commands))))
(mapcar (lambda (argument)
(guix-command-improve-argument argument improvers))
arguments)))
(defun guix-command-parse-arguments (&optional commands)
"Return a list of parsed 'guix COMMANDS ...' arguments."
(with-temp-buffer
(insert (guix-help-string commands))
(let (args)
(guix-while-search guix-help-parse-option-regexp
(let* ((short (match-string-no-properties 1))
(name (match-string-no-properties 2))
(arg (match-string-no-properties 3))
(doc (match-string-no-properties 4))
(char (if short
(elt short 1) ; short option letter
(elt name 2))) ; first letter of the long option
;; If "--foo=bar" or "--foo[=bar]" then it is 'option'.
(option? (not (string= "" arg)))
;; If "--foo" or "--foo[=bar]" then it is 'switch'.
(switch? (or (string= "" arg)
(eq ?\[ (elt arg 0)))))
(push (guix-command-make-argument
:name name
:char char
:doc doc
:switch? switch?
:option? option?)
args)))
(guix-while-search guix-help-parse-command-regexp
(let* ((name (match-string-no-properties 1))
(char (elt name 0)))
(push (guix-command-make-argument
:name name
:char char
:fun (guix-command-action-name commands name)
:action? t)
args)))
args)))
(defun guix-command-rest-argument (&optional commands)
"Return '--' argument for COMMANDS."
(cl-flet ((argument (&rest args)
(apply #'guix-command-make-argument
:name "-- " :char ?= :option? t args)))
(let ((command (car commands)))
(cond
((member command
'("archive" "build" "challenge" "edit"
"graph" "lint" "refresh"))
(argument :doc "Packages" :fun 'guix-read-package-names-string))
((equal commands '("container" "exec"))
(argument :doc "PID Command [Args...]"))
((string= command "download")
(argument :doc "URL"))
((string= command "environment")
(argument :doc "Command [Args...]" :fun 'read-shell-command))
((string= command "gc")
(argument :doc "Paths" :fun 'guix-read-file-name))
((member command '("hash" "system"))
(argument :doc "File" :fun 'guix-read-file-name))
((string= command "size")
(argument :doc "Package" :fun 'guix-read-package-name))
((equal commands '("import" "nix"))
(argument :doc "Nixpkgs Attribute"))
;; Other 'guix import' subcommands, but not 'import' itself.
((and (cdr commands)
(string= command "import"))
(argument :doc "Package name"))))))
(defvar guix-command-additional-arguments
`((("environment")
,(guix-command-make-argument
:name "++packages " :char ?p :option? t
:doc "build inputs of the specified packages"
:fun 'guix-read-package-names-string)))
"Alist of guix commands and additional arguments for them.
These are 'fake' arguments that are not presented in 'guix' shell
commands.")
(defun guix-command-additional-arguments (&optional commands)
"Return additional arguments for COMMANDS."
(let ((rest-arg (guix-command-rest-argument commands)))
(append (guix-assoc-value guix-command-additional-arguments
commands)
(and rest-arg (list rest-arg)))))
;; Ideally only `guix-command-arguments' function should exist with the
;; contents of `guix-command-all-arguments', but we need to make a
;; special case for `guix-command-complex-with-shared-arguments' commands.
(defun guix-command-all-arguments (&optional commands)
"Return list of all arguments for 'guix COMMANDS ...'."
(let ((parsed (guix-command-parse-arguments commands)))
(append (guix-command-improve-arguments parsed commands)
(guix-command-additional-arguments commands))))
(guix-memoized-defalias guix-command-all-arguments-memoize
guix-command-all-arguments)
(defun guix-command-arguments (&optional commands)
"Return list of arguments for 'guix COMMANDS ...'."
(let ((command (car commands)))
(if (member command
guix-command-complex-with-shared-arguments)
;; Take actions only for 'guix system', and switches+options for
;; 'guix system foo'.
(funcall (if (null (cdr commands))
#'cl-remove-if-not
#'cl-remove-if)
#'guix-command-argument-action?
(guix-command-all-arguments-memoize (list command)))
(guix-command-all-arguments commands))))
(defun guix-command-switch->popup-switch (switch)
"Return popup switch from command SWITCH argument."
(list (guix-command-argument-char switch)
(or (guix-command-argument-doc switch)
"Unknown")
(guix-command-argument-name switch)))
(defun guix-command-option->popup-option (option)
"Return popup option from command OPTION argument."
(list (guix-command-argument-char option)
(or (guix-command-argument-doc option)
"Unknown")
(let ((name (guix-command-argument-name option)))
(if (string-match-p " \\'" name) ; ends with space
name
(concat name "=")))
(or (guix-command-argument-fun option)
'read-from-minibuffer)))
(defun guix-command-action->popup-action (action)
"Return popup action from command ACTION argument."
(list (guix-command-argument-char action)
(or (guix-command-argument-doc action)
(guix-command-argument-name action)
"Unknown")
(guix-command-argument-fun action)))
(defun guix-command-sort-arguments (arguments)
"Sort ARGUMENTS by name in alphabetical order."
(sort arguments
(lambda (a1 a2)
(let ((name1 (guix-command-argument-name a1))
(name2 (guix-command-argument-name a2)))
(cond ((null name1) nil)
((null name2) t)
(t (string< name1 name2)))))))
(defun guix-command-switches (arguments)
"Return switches from ARGUMENTS."
(cl-remove-if-not #'guix-command-argument-switch? arguments))
(defun guix-command-options (arguments)
"Return options from ARGUMENTS."
(cl-remove-if-not #'guix-command-argument-option? arguments))
(defun guix-command-actions (arguments)
"Return actions from ARGUMENTS."
(cl-remove-if-not #'guix-command-argument-action? arguments))
;;; Post processing popup arguments
(defvar guix-command-post-processors
'(("environment"
guix-command-post-process-environment-packages
guix-command-post-process-environment-ad-hoc
guix-command-post-process-rest-multiple-leave)
("hash"
guix-command-post-process-rest-single)
("package"
guix-command-post-process-package-args)
("system"
guix-command-post-process-rest-single))
"Alist of guix commands and functions for post-processing
a list of arguments returned from popup interface.
Each function is called on the returned arguments in turn.")
(defvar guix-command-rest-arg-regexp
(rx string-start "-- " (group (+ any)))
"Regexp to match a string with the 'rest' arguments.")
(defun guix-command-replace-args (args predicate modifier)
"Replace arguments matching PREDICATE from ARGS.
Call MODIFIER on each argument matching PREDICATE and append the
returned list of strings to the end of ARGS. Remove the original
arguments."
(let* ((rest nil)
(args (mapcar (lambda (arg)
(if (funcall predicate arg)
(progn
(push (funcall modifier arg) rest)
nil)
arg))
args)))
(if rest
(apply #'append (delq nil args) rest)
args)))
(cl-defun guix-command-post-process-matching-args (args regexp
&key group split?)
"Modify arguments from ARGS matching REGEXP by moving them to
the end of ARGS list. If SPLIT? is non-nil, split matching
arguments into multiple subarguments."
(guix-command-replace-args
args
(lambda (arg)
(string-match regexp arg))
(lambda (arg)
(let ((val (match-string (or group 0) arg))
(fun (if split? #'split-string #'list)))
(funcall fun val)))))
(defun guix-command-post-process-rest-single (args)
"Modify ARGS by moving '-- ARG' argument to the end of ARGS list."
(guix-command-post-process-matching-args
args guix-command-rest-arg-regexp
:group 1))
(defun guix-command-post-process-rest-multiple (args)
"Modify ARGS by splitting '-- ARG ...' into multiple subarguments
and moving them to the end of ARGS list.
Remove '-- ' string."
(guix-command-post-process-matching-args
args guix-command-rest-arg-regexp
:group 1
:split? t))
(defun guix-command-post-process-rest-multiple-leave (args)
"Modify ARGS by splitting '-- ARG ...' into multiple subarguments
and moving them to the end of ARGS list.
Leave '--' string as a separate argument."
(guix-command-post-process-matching-args
args guix-command-rest-arg-regexp
:split? t))
(defun guix-command-post-process-package-args (args)
"Adjust popup ARGS for 'guix package' command."
(guix-command-post-process-matching-args
args (rx string-start (or "--install " "--remove ") (+ any))
:split? t))
(defun guix-command-post-process-environment-packages (args)
"Adjust popup ARGS for specified packages of 'guix environment'
command."
(guix-command-post-process-matching-args
args (rx string-start "++packages " (group (+ any)))
:group 1
:split? t))
(defun guix-command-post-process-environment-ad-hoc (args)
"Adjust popup ARGS for '--ad-hoc' argument of 'guix environment'
command."
(guix-command-post-process-matching-args
args (rx string-start "--ad-hoc " (+ any))
:split? t))
(defun guix-command-post-process-args (commands args)
"Adjust popup ARGS for guix COMMANDS."
(let* ((command (car commands))
(processors
(append (guix-assoc-value guix-command-post-processors commands)
(guix-assoc-value guix-command-post-processors command))))
(guix-modify args
(or processors
(list #'guix-command-post-process-rest-multiple)))))
;;; 'Execute' actions
(defvar guix-command-default-execute-arguments
(list
(guix-command-make-argument
:name "repl" :char ?r :doc "Run in Guix REPL")
(guix-command-make-argument
:name "shell" :char ?s :doc "Run in shell")
(guix-command-make-argument
:name "copy" :char ?c :doc "Copy command line"))
"List of default 'execute' action arguments.")
(defvar guix-command-additional-execute-arguments
(let ((graph-arg (guix-command-make-argument
:name "view" :char ?v :doc "View graph")))
`((("build")
,(guix-command-make-argument
:name "log" :char ?l :doc "View build log"))
(("graph") ,graph-arg)
(("size")
,(guix-command-make-argument
:name "view" :char ?v :doc "View map"))
(("system" "shepherd-graph") ,graph-arg)
(("system" "extension-graph") ,graph-arg)))
"Alist of guix commands and additional 'execute' action arguments.")
(defun guix-command-execute-arguments (commands)
"Return a list of 'execute' action arguments for COMMANDS."
(mapcar (lambda (arg)
(guix-command-modify-argument arg
:action? t
:fun (guix-command-action-name
commands (guix-command-argument-name arg))))
(append guix-command-default-execute-arguments
(guix-assoc-value
guix-command-additional-execute-arguments commands))))
(defvar guix-command-special-executors
'((("environment")
("repl" . guix-run-environment-command-in-repl))
(("pull")
("repl" . guix-run-pull-command-in-repl))
(("build")
("log" . guix-run-view-build-log))
(("graph")
("view" . guix-run-view-graph))
(("size")
("view" . guix-run-view-size-map))
(("system" "shepherd-graph")
("view" . guix-run-view-graph))
(("system" "extension-graph")
("view" . guix-run-view-graph)))
"Alist of guix commands and alists of special executers for them.
See also `guix-command-default-executors'.")
(defvar guix-command-default-executors
'(("repl" . guix-run-command-in-repl)
("shell" . guix-run-command-in-shell)
("copy" . guix-copy-command-as-kill))
"Alist of default executers for action names.")
(defun guix-command-executor (commands name)
"Return function to run command line arguments for guix COMMANDS."
(or (guix-assoc-value guix-command-special-executors commands name)
(guix-assoc-value guix-command-default-executors name)))
(defun guix-run-environment-command-in-repl (args)
"Run 'guix ARGS ...' environment command in Guix REPL."
;; As 'guix environment' usually tries to run another process, it may
;; be fun but not wise to run this command in Geiser REPL.
(when (or (member "--dry-run" args)
(member "--search-paths" args)
(when (y-or-n-p
(format "'%s' command will spawn an external process.
Do you really want to execute this command in Geiser REPL? "
(guix-command-string args)))
(message "May \"M-x shell-mode\" be with you!")
t))
(guix-run-command-in-repl args)))
(defun guix-run-pull-command-in-repl (args)
"Run 'guix ARGS ...' pull command in Guix REPL.
Perform pull-specific actions after operation, see
`guix-after-pull-hook' and `guix-update-after-pull'."
(guix-eval-in-repl
(apply #'guix-make-guile-expression 'guix-command args)
nil 'pull))
(defun guix-run-view-build-log (args)
"Add --log-file to ARGS, run 'guix ARGS ...' build command, and
open the log file(s)."
(let* ((args (if (member "--log-file" args)
args
(cl-list* (car args) "--log-file" (cdr args))))
(output (guix-command-output args))
(files (split-string output "\n" t)))
(dolist (file files)
(guix-build-log-find-file file))))
(defun guix-run-view-graph (args)
"Run 'guix ARGS ...' graph command, make the image and open it."
(let* ((graph-file (guix-dot-file-name))
(dot-args (guix-dot-arguments graph-file)))
(if (guix-eval-read (guix-make-guile-expression
'pipe-guix-output args dot-args))
(guix-find-file graph-file)
(error "Couldn't create a graph"))))
(defun guix-run-view-size-map (args)
"Run 'guix ARGS ...' size command, and open the map file."
(let* ((wished-map-file
(cl-some (lambda (arg)
(and (string-match "--map-file=\\(.+\\)" arg)
(match-string 1 arg)))
args))
(map-file (or wished-map-file (guix-png-file-name)))
(args (if wished-map-file
args
(cl-list* (car args)
(concat "--map-file=" map-file)
(cdr args)))))
(guix-command-output args)
(guix-find-file map-file)))
;;; Generating popups, actions, etc.
(defmacro guix-command-define-popup-action (name &optional commands)
"Define NAME function to generate (if needed) and run popup for COMMANDS."
(declare (indent 1) (debug t))
(let* ((popup-fun (guix-command-symbol `(,@commands "popup")))
(doc (format "Call `%s' (generate it if needed)."
popup-fun)))
`(defun ,name (&optional arg)
,doc
(interactive "P")
(unless (fboundp ',popup-fun)
(guix-command-generate-popup ',popup-fun ',commands))
(,popup-fun arg))))
(defmacro guix-command-define-execute-action (name executor
&optional commands)
"Define NAME function to execute the current action for guix COMMANDS.
EXECUTOR function is called with the current command line arguments."
(declare (indent 1) (debug t))
(let* ((arguments-fun (guix-command-symbol `(,@commands "arguments")))
(doc (format "Call `%s' with the current popup arguments."
executor)))
`(defun ,name (&rest args)
,doc
(interactive (,arguments-fun))
(,executor (append ',commands
(guix-command-post-process-args
',commands args))))))
(defun guix-command-generate-popup-actions (actions &optional commands)
"Generate 'popup' commands from ACTIONS arguments for guix COMMANDS."
(dolist (action actions)
(let ((fun (guix-command-argument-fun action)))
(unless (fboundp fun)
(eval `(guix-command-define-popup-action ,fun
,(append commands
(list (guix-command-argument-name action)))))))))
(defun guix-command-generate-execute-actions (actions &optional commands)
"Generate 'execute' commands from ACTIONS arguments for guix COMMANDS."
(dolist (action actions)
(let ((fun (guix-command-argument-fun action)))
(unless (fboundp fun)
(eval `(guix-command-define-execute-action ,fun
,(guix-command-executor
commands (guix-command-argument-name action))
,commands))))))
(defun guix-command-generate-popup (name &optional commands)
"Define NAME popup with 'guix COMMANDS ...' interface."
(let* ((command (car commands))
(man-page (concat "guix" (and command (concat "-" command))))
(doc (format "Popup window for '%s' command."
(guix-concat-strings (cons "guix" commands)
" ")))
(args (guix-command-arguments commands))
(switches (guix-command-sort-arguments
(guix-command-switches args)))
(options (guix-command-sort-arguments
(guix-command-options args)))
(popup-actions (guix-command-sort-arguments
(guix-command-actions args)))
(execute-actions (unless popup-actions
(guix-command-execute-arguments commands)))
(actions (or popup-actions execute-actions)))
(if popup-actions
(guix-command-generate-popup-actions popup-actions commands)
(guix-command-generate-execute-actions execute-actions commands))
(eval
`(guix-define-popup ,name
,doc
'guix-commands
:man-page ,man-page
:switches ',(mapcar #'guix-command-switch->popup-switch switches)
:options ',(mapcar #'guix-command-option->popup-option options)
:actions ',(mapcar #'guix-command-action->popup-action actions)
:max-action-columns 4))))
;;;###autoload (autoload 'guix "guix-command" "Popup window for 'guix'." t)
(guix-command-define-popup-action guix)
(defalias 'guix-edit-action #'guix-edit)
(defvar guix-command-font-lock-keywords
(eval-when-compile
`((,(rx "("
(group "guix-command-define-"
(or "popup-action"
"execute-action"
"argument-improver"))
symbol-end
(zero-or-more blank)
(zero-or-one
(group (one-or-more (or (syntax word) (syntax symbol))))))
(1 font-lock-keyword-face)
(2 font-lock-function-name-face nil t)))))
(font-lock-add-keywords 'emacs-lisp-mode guix-command-font-lock-keywords)
(provide 'guix-command)
;;; guix-command.el ends here
-44
View File
@@ -1,44 +0,0 @@
;;; guix-config.el --- Compile-time configuration of Guix.
;; Copyright © 2015 Mathieu Lirzin <mthl@openmailbox.org>
;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Code:
(defconst guix-config-name "@PACKAGE_NAME@"
"Guix full name.")
(defconst guix-config-version "@PACKAGE_VERSION@"
"Guix version.")
(defconst guix-config-emacs-interface-directory
(replace-regexp-in-string "${prefix}" "@prefix@" "@emacsuidir@"))
(defconst guix-config-state-directory
;; This must match `NIX_STATE_DIR' as defined in `nix/local.mk'.
(or (getenv "NIX_STATE_DIR") "@guix_localstatedir@/guix"))
(defconst guix-config-guile-program "@GUILE@"
"Name of the 'guile' executable defined at configure time.")
(defconst guix-config-dot-program "@DOT_USER_PROGRAM@"
"Name of the 'dot' executable defined at configure time.")
(provide 'guix-config)
;;; guix-config.el ends here
-382
View File
@@ -1,382 +0,0 @@
;;; guix-devel.el --- Development tools -*- lexical-binding: t -*-
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides commands useful for developing Guix (or even
;; arbitrary Guile code) with Geiser.
;;; Code:
(require 'lisp-mode)
(require 'guix-guile)
(require 'guix-geiser)
(require 'guix-utils)
(require 'guix-base)
(defgroup guix-devel nil
"Settings for Guix development utils."
:group 'guix)
(defgroup guix-devel-faces nil
"Faces for `guix-devel-mode'."
:group 'guix-devel
:group 'guix-faces)
(defface guix-devel-modify-phases-keyword
'((t :inherit font-lock-preprocessor-face))
"Face for a `modify-phases' keyword ('delete', 'replace', etc.)."
:group 'guix-devel-faces)
(defface guix-devel-gexp-symbol
'((t :inherit font-lock-keyword-face))
"Face for gexp symbols ('#~', '#$', etc.).
See Info node `(guix) G-Expressions'."
:group 'guix-devel-faces)
(defcustom guix-devel-activate-mode t
"If non-nil, then `guix-devel-mode' is automatically activated
in Scheme buffers."
:type 'boolean
:group 'guix-devel)
(defun guix-devel-use-modules (&rest modules)
"Use guile MODULES."
(apply #'guix-geiser-call "use-modules" modules))
(defun guix-devel-use-module (&optional module)
"Use guile MODULE in the current Geiser REPL.
MODULE is a string with the module name - e.g., \"(ice-9 match)\".
Interactively, use the module defined by the current scheme file."
(interactive (list (guix-guile-current-module)))
(guix-devel-use-modules module)
(message "Using %s module." module))
(defun guix-devel-copy-module-as-kill ()
"Put the name of the current guile module into `kill-ring'."
(interactive)
(guix-copy-as-kill (guix-guile-current-module)))
(defun guix-devel-setup-repl (&optional repl)
"Setup REPL for using `guix-devel-...' commands."
(guix-devel-use-modules "(guix monad-repl)"
"(guix scripts)"
"(guix store)"
"(guix ui)")
;; Without this workaround, the warning/build output disappears. See
;; <https://github.com/jaor/geiser/issues/83> for details.
(guix-geiser-eval-in-repl-synchronously
"(begin
(guix-warning-port (current-warning-port))
(current-build-output-port (current-error-port)))"
repl 'no-history 'no-display))
(defvar guix-devel-repl-processes nil
"List of REPL processes configured by `guix-devel-setup-repl'.")
(defun guix-devel-setup-repl-maybe (&optional repl)
"Setup (if needed) REPL for using `guix-devel-...' commands."
(let ((process (get-buffer-process (or repl (guix-geiser-repl)))))
(when (and process
(not (memq process guix-devel-repl-processes)))
(guix-devel-setup-repl repl)
(push process guix-devel-repl-processes))))
(defmacro guix-devel-with-definition (def-var &rest body)
"Run BODY with the current guile definition bound to DEF-VAR.
Bind DEF-VAR variable to the name of the current top-level
definition, setup the current REPL, use the current module, and
run BODY."
(declare (indent 1) (debug (symbolp body)))
`(let ((,def-var (guix-guile-current-definition)))
(guix-devel-setup-repl-maybe)
(guix-devel-use-modules (guix-guile-current-module))
,@body))
(defun guix-devel-build-package-definition ()
"Build a package defined by the current top-level variable definition."
(interactive)
(guix-devel-with-definition def
(when (or (not guix-operation-confirm)
(guix-operation-prompt (format "Build '%s'?" def)))
(guix-geiser-eval-in-repl
(concat ",run-in-store "
(guix-guile-make-call-expression
"build-package" def
"#:use-substitutes?" (guix-guile-boolean
guix-use-substitutes)
"#:dry-run?" (guix-guile-boolean guix-dry-run)))))))
(defun guix-devel-build-package-source ()
"Build the source of the current package definition."
(interactive)
(guix-devel-with-definition def
(when (or (not guix-operation-confirm)
(guix-operation-prompt
(format "Build '%s' package source?" def)))
(guix-geiser-eval-in-repl
(concat ",run-in-store "
(guix-guile-make-call-expression
"build-package-source" def
"#:use-substitutes?" (guix-guile-boolean
guix-use-substitutes)
"#:dry-run?" (guix-guile-boolean guix-dry-run)))))))
(defun guix-devel-lint-package ()
"Check the current package.
See Info node `(guix) Invoking guix lint' for details."
(interactive)
(guix-devel-with-definition def
(guix-devel-use-modules "(guix scripts lint)")
(when (or (not guix-operation-confirm)
(y-or-n-p (format "Lint '%s' package?" def)))
(guix-geiser-eval-in-repl
(format "(run-checkers %s)" def)))))
;;; Font-lock
(defvar guix-devel-modify-phases-keyword-regexp
(rx (+ word))
"Regexp for a 'modify-phases' keyword ('delete', 'replace', etc.).")
(defun guix-devel-modify-phases-font-lock-matcher (limit)
"Find a 'modify-phases' keyword.
This function is used as a MATCHER for `font-lock-keywords'."
(ignore-errors
(down-list)
(or (re-search-forward guix-devel-modify-phases-keyword-regexp
limit t)
(set-match-data nil))
(up-list)
t))
(defun guix-devel-modify-phases-font-lock-pre ()
"Skip the next sexp, and return the end point of the current list.
This function is used as a PRE-MATCH-FORM for `font-lock-keywords'
to find 'modify-phases' keywords."
(let ((in-comment? (nth 4 (syntax-ppss))))
;; If 'modify-phases' is commented, do not try to search for its
;; keywords.
(unless in-comment?
(ignore-errors (forward-sexp))
(save-excursion (up-list) (point)))))
(defconst guix-devel-keywords
'("call-with-compressed-output-port"
"call-with-container"
"call-with-decompressed-port"
"call-with-derivation-narinfo"
"call-with-derivation-substitute"
"call-with-error-handling"
"call-with-temporary-directory"
"call-with-temporary-output-file"
"define-enumerate-type"
"define-gexp-compiler"
"define-lift"
"define-monad"
"define-operation"
"define-record-type*"
"emacs-substitute-sexps"
"emacs-substitute-variables"
"mbegin"
"mlet"
"mlet*"
"modify-services"
"munless"
"mwhen"
"run-with-state"
"run-with-store"
"signature-case"
"substitute*"
"substitute-keyword-arguments"
"test-assertm"
"use-package-modules"
"use-service-modules"
"use-system-modules"
"with-atomic-file-output"
"with-atomic-file-replacement"
"with-derivation-narinfo"
"with-derivation-substitute"
"with-directory-excursion"
"with-error-handling"
"with-imported-modules"
"with-monad"
"with-mutex"
"with-store"))
(defvar guix-devel-font-lock-keywords
`((,(rx (or "#~" "#$" "#$@" "#+" "#+@")) .
'guix-devel-gexp-symbol)
(,(guix-guile-keyword-regexp (regexp-opt guix-devel-keywords))
(1 'font-lock-keyword-face))
(,(guix-guile-keyword-regexp "modify-phases")
(1 'font-lock-keyword-face)
(guix-devel-modify-phases-font-lock-matcher
(guix-devel-modify-phases-font-lock-pre)
nil
(0 'guix-devel-modify-phases-keyword nil t))))
"A list of `font-lock-keywords' for `guix-devel-mode'.")
;;; Indentation
(defmacro guix-devel-scheme-indent (&rest rules)
"Set `scheme-indent-function' according to RULES.
Each rule should have a form (SYMBOL VALUE). See `put' for details."
(declare (indent 0))
`(progn
,@(mapcar (lambda (rule)
`(put ',(car rule) 'scheme-indent-function ,(cadr rule)))
rules)))
(defun guix-devel-indent-package (state indent-point normal-indent)
"Indentation rule for 'package' form."
(let* ((package-eol (line-end-position))
(count (if (and (ignore-errors (down-list) t)
(< (point) package-eol)
(looking-at "inherit\\>"))
1
0)))
(lisp-indent-specform count state indent-point normal-indent)))
(defun guix-devel-indent-modify-phases-keyword (count)
"Return indentation function for 'modify-phases' keywords."
(lambda (state indent-point normal-indent)
(when (ignore-errors
(goto-char (nth 1 state)) ; start of keyword sexp
(backward-up-list)
(looking-at "(modify-phases\\>"))
(lisp-indent-specform count state indent-point normal-indent))))
(defalias 'guix-devel-indent-modify-phases-keyword-1
(guix-devel-indent-modify-phases-keyword 1))
(defalias 'guix-devel-indent-modify-phases-keyword-2
(guix-devel-indent-modify-phases-keyword 2))
(guix-devel-scheme-indent
(bag 0)
(build-system 0)
(call-with-compressed-output-port 2)
(call-with-container 1)
(call-with-decompressed-port 2)
(call-with-error-handling 0)
(container-excursion 1)
(emacs-batch-edit-file 1)
(emacs-batch-eval 0)
(emacs-substitute-sexps 1)
(emacs-substitute-variables 1)
(file-system 0)
(graft 0)
(manifest-entry 0)
(manifest-pattern 0)
(mbegin 1)
(mlet 2)
(mlet* 2)
(modify-phases 1)
(modify-services 1)
(munless 1)
(mwhen 1)
(operating-system 0)
(origin 0)
(package 'guix-devel-indent-package)
(run-with-state 1)
(run-with-store 1)
(signature-case 1)
(substitute* 1)
(substitute-keyword-arguments 1)
(test-assertm 1)
(with-atomic-file-output 1)
(with-derivation-narinfo 1)
(with-derivation-substitute 2)
(with-directory-excursion 1)
(with-error-handling 0)
(with-imported-modules 1)
(with-monad 1)
(with-mutex 1)
(with-store 1)
(wrap-program 1)
;; 'modify-phases' keywords:
(replace 'guix-devel-indent-modify-phases-keyword-1)
(add-after 'guix-devel-indent-modify-phases-keyword-2)
(add-before 'guix-devel-indent-modify-phases-keyword-2))
(defvar guix-devel-keys-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "b") 'guix-devel-build-package-definition)
(define-key map (kbd "s") 'guix-devel-build-package-source)
(define-key map (kbd "l") 'guix-devel-lint-package)
(define-key map (kbd "k") 'guix-devel-copy-module-as-kill)
(define-key map (kbd "u") 'guix-devel-use-module)
map)
"Keymap with subkeys for `guix-devel-mode-map'.")
(defvar guix-devel-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-c .") guix-devel-keys-map)
map)
"Keymap for `guix-devel-mode'.")
;;;###autoload
(define-minor-mode guix-devel-mode
"Minor mode for `scheme-mode' buffers.
With a prefix argument ARG, enable the mode if ARG is positive,
and disable it otherwise. If called from Lisp, enable the mode
if ARG is omitted or nil.
When Guix Devel mode is enabled, it provides the following key
bindings:
\\{guix-devel-mode-map}"
:init-value nil
:lighter " Guix"
:keymap guix-devel-mode-map
(if guix-devel-mode
(progn
(setq-local font-lock-multiline t)
(font-lock-add-keywords nil guix-devel-font-lock-keywords))
(setq-local font-lock-multiline nil)
(font-lock-remove-keywords nil guix-devel-font-lock-keywords))
(when font-lock-mode
(font-lock-fontify-buffer)))
;;;###autoload
(defun guix-devel-activate-mode-maybe ()
"Activate `guix-devel-mode' depending on
`guix-devel-activate-mode' variable."
(when guix-devel-activate-mode
(guix-devel-mode)))
;;;###autoload
(add-hook 'scheme-mode-hook 'guix-devel-activate-mode-maybe)
(defvar guix-devel-emacs-font-lock-keywords
(eval-when-compile
`((,(rx "(" (group "guix-devel-with-definition") symbol-end) . 1))))
(font-lock-add-keywords 'emacs-lisp-mode
guix-devel-emacs-font-lock-keywords)
(provide 'guix-devel)
;;; guix-devel.el ends here
-123
View File
@@ -1,123 +0,0 @@
;;; guix-emacs.el --- Emacs packages installed with Guix
;; Copyright © 2014, 2015, 2016 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides auxiliary code for working with Emacs packages
;; installed with Guix.
;;; Code:
(require 'cl-lib)
(unless (require 'guix-profiles nil t)
(defvar guix-user-profile (expand-file-name "~/.guix-profile")))
(defcustom guix-package-enable-at-startup t
"If non-nil, activate Emacs packages installed in a user profile.
Set this variable to nil before requiring `guix-emacs' file to
avoid loading autoloads of Emacs packages installed in
`guix-user-profile'."
:type 'boolean
:group 'guix)
(defvar guix-emacs-autoloads nil
"List of the last loaded Emacs autoloads.")
(defvar guix-emacs-autoloads-regexp
(rx (group (* any) "-autoloads")
".el" (zero-or-one "c") string-end)
"Regexp to match Emacs 'autoloads' file.")
(defun guix-emacs-directory (&optional profile)
"Return directory with Emacs packages installed in PROFILE.
If PROFILE is nil, use `guix-user-profile'."
(expand-file-name "share/emacs/site-lisp"
(or profile guix-user-profile)))
(defun guix-emacs-find-autoloads (directory)
"Return a list of Emacs 'autoloads' files in DIRECTORY.
The files in the list do not have extensions (.el, .elc)."
(cl-remove-duplicates
(delq nil
(mapcar (lambda (file)
(when (string-match guix-emacs-autoloads-regexp file)
(match-string 1 file)))
(directory-files directory 'full-name nil 'no-sort)))
:test #'string=))
(defun guix-emacs-subdirs (directory)
"Return list of DIRECTORY subdirectories."
(cl-remove-if (lambda (file)
(or (string-match-p (rx "/." string-end) file)
(string-match-p (rx "/.." string-end) file)
(not (file-directory-p file))))
(directory-files directory 'full-name nil 'no-sort)))
(defun guix-emacs-directories (&optional profile)
"Return the list of directories under PROFILE that contain Emacs packages.
This includes both `share/emacs/site-lisp/guix.d/PACKAGE'
sub-directories and `share/emacs/site-lisp' itself.
If PROFILE is nil, use `guix-user-profile'.
Return nil, if Emacs packages are not installed in PROFILE."
(let ((root-dir (guix-emacs-directory (or profile guix-user-profile))))
(when (file-directory-p root-dir)
(let* ((pkgs-dir (expand-file-name "guix.d" root-dir))
(pkgs-dirs (when (file-directory-p pkgs-dir)
(guix-emacs-subdirs pkgs-dir))))
(cons root-dir pkgs-dirs)))))
;;;###autoload
(defun guix-emacs-autoload-packages (&rest profiles)
"Autoload Emacs packages installed in PROFILES.
If PROFILES are not specified, use a default user and system
profiles.
'Autoload' means add directories with Emacs packages to
`load-path' and load 'autoloads' files matching
`guix-emacs-autoloads-regexp'."
(interactive (list (if (fboundp 'guix-profile-prompt)
(funcall 'guix-profile-prompt)
guix-user-profile)))
(let ((profiles (or profiles
(list "/run/current-system/profile"
guix-user-profile))))
(dolist (profile profiles)
(let ((dirs (guix-emacs-directories profile)))
(when dirs
(let* ((autoloads (cl-mapcan #'guix-emacs-find-autoloads
dirs))
(new-autoloads (cl-nset-difference autoloads
guix-emacs-autoloads
:test #'string=)))
(dolist (dir dirs)
(cl-pushnew (directory-file-name dir)
load-path
:test #'string=))
(dolist (file new-autoloads)
(load file 'noerror))
(setq guix-emacs-autoloads
(append new-autoloads guix-emacs-autoloads))))))))
(when guix-package-enable-at-startup
(guix-emacs-autoload-packages))
(provide 'guix-emacs)
;;; guix-emacs.el ends here
-59
View File
@@ -1,59 +0,0 @@
;;; guix-entry.el --- 'Entry' type -*- lexical-binding: t -*-
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides an API for 'entry' type which is just an alist of
;; KEY/VALUE pairs (KEY should be a symbol) with the required 'id' KEY.
;;; Code:
(require 'cl-lib)
(require 'guix-utils)
(defalias 'guix-entry-value #'guix-assq-value)
(defun guix-entry-id (entry)
"Return ENTRY ID."
(guix-entry-value entry 'id))
(defun guix-entry-by-id (id entries)
"Return an entry from ENTRIES by its ID."
(cl-find-if (lambda (entry)
(equal (guix-entry-id entry) id))
entries))
(defun guix-entries-by-ids (ids entries)
"Return entries with IDS (a list of identifiers) from ENTRIES."
(cl-remove-if-not (lambda (entry)
(member (guix-entry-id entry) ids))
entries))
(defun guix-replace-entry (id new-entry entries)
"Replace an entry with ID from ENTRIES by NEW-ENTRY.
Return a list of entries with the replaced entry."
(cl-substitute-if new-entry
(lambda (entry)
(equal id (guix-entry-id entry)))
entries
:count 1))
(provide 'guix-entry)
;;; guix-entry.el ends here
-88
View File
@@ -1,88 +0,0 @@
;;; guix-external.el --- External programs -*- lexical-binding: t -*-
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides auxiliary code for running external programs.
;;; Code:
(require 'cl-lib)
(require 'guix-config)
(defgroup guix-external nil
"Settings for external programs."
:group 'guix)
(defcustom guix-guile-program guix-config-guile-program
"Name of the 'guile' executable used for Guix REPL.
May be either a string (the name of the executable) or a list of
strings of the form:
(NAME . ARGS)
Where ARGS is a list of arguments to the guile program."
:type 'string
:group 'guix-external)
(defcustom guix-dot-program
(if (file-name-absolute-p guix-config-dot-program)
guix-config-dot-program
(executable-find "dot"))
"Name of the 'dot' executable."
:type 'string
:group 'guix-external)
(defcustom guix-dot-default-arguments
'("-Tpng")
"Default arguments for 'dot' program."
:type '(repeat string)
:group 'guix-external)
(defcustom guix-dot-file-name-function #'guix-png-file-name
"Function used to define a file name of a temporary 'dot' file.
The function is called without arguments."
:type '(choice (function-item guix-png-file-name)
(function :tag "Other function"))
:group 'guix-external)
(defun guix-dot-arguments (output-file &rest args)
"Return a list of dot arguments for writing a graph into OUTPUT-FILE.
If ARGS is nil, use `guix-dot-default-arguments'."
(or guix-dot-program
(error (concat "Couldn't find 'dot'.\n"
"Set guix-dot-program to a proper value")))
(cl-list* guix-dot-program
(concat "-o" output-file)
(or args guix-dot-default-arguments)))
(defun guix-dot-file-name ()
"Call `guix-dot-file-name-function'."
(funcall guix-dot-file-name-function))
(defun guix-png-file-name ()
"Return '.png' file name in the `temporary-file-directory'."
(concat (make-temp-name
(concat (file-name-as-directory temporary-file-directory)
"guix-emacs-graph-"))
".png"))
(provide 'guix-external)
;;; guix-external.el ends here
-126
View File
@@ -1,126 +0,0 @@
;;; guix-geiser.el --- Interacting with Geiser -*- lexical-binding: t -*-
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides functions to evaluate guile code using Geiser.
;;; Code:
(require 'geiser-mode)
(require 'guix-guile)
(defun guix-geiser-repl ()
"Return the current Geiser REPL."
(or geiser-repl--repl
(geiser-repl--repl/impl 'guile)
(error "Geiser REPL not found")))
(defun guix-geiser-eval (str &optional repl)
"Evaluate STR with guile expression using Geiser REPL.
If REPL is nil, use the current Geiser REPL.
Return a list of strings with result values of evaluation."
(with-current-buffer (or repl (guix-geiser-repl))
(let ((res (geiser-eval--send/wait `(:eval (:scm ,str)))))
(if (geiser-eval--retort-error res)
(error "Error in evaluating guile expression: %s"
(geiser-eval--retort-output res))
(cdr (assq 'result res))))))
(defun guix-geiser-eval-read (str &optional repl)
"Evaluate STR with guile expression using Geiser REPL.
Return elisp expression of the first result value of evaluation."
;; The goal is to convert a string with scheme expression into elisp
;; expression.
(let ((result (car (guix-geiser-eval str repl))))
(cond
((or (string= result "#f")
(string= result "#<unspecified>"))
nil)
((string= result "#t")
t)
(t
(read (replace-regexp-in-string
"[ (]\\(#f\\)" "nil"
(replace-regexp-in-string
"[ (]\\(#t\\)" "t"
result
nil nil 1)
nil nil 1))))))
(defun guix-repl-send (cmd &optional save-history)
"Send CMD input string to the current REPL buffer.
This is the same as `geiser-repl--send', but with SAVE-HISTORY
argument. If SAVE-HISTORY is non-nil, save CMD in the REPL
history."
(when (and cmd (eq major-mode 'geiser-repl-mode))
(geiser-repl--prepare-send)
(goto-char (point-max))
(comint-kill-input)
(insert cmd)
(let ((comint-input-filter (if save-history
comint-input-filter
'ignore)))
(comint-send-input nil t))))
(defun guix-geiser-eval-in-repl (str &optional repl no-history no-display)
"Switch to Geiser REPL and evaluate STR with guile expression there.
If NO-HISTORY is non-nil, do not save STR in the REPL history.
If NO-DISPLAY is non-nil, do not switch to the REPL buffer."
(let ((repl (or repl (guix-geiser-repl))))
(with-current-buffer repl
;; XXX Since Geiser 0.8, `geiser-repl--send' has SAVE-HISTORY
;; argument, so use this function eventually and remove
;; `guix-repl-send'.
(guix-repl-send str (not no-history)))
(unless no-display
(geiser-repl--switch-to-buffer repl))))
(defun guix-geiser-eval-in-repl-synchronously (str &optional repl
no-history no-display)
"Evaluate STR in Geiser REPL synchronously, i.e. wait until the
REPL operation will be finished.
See `guix-geiser-eval-in-repl' for the meaning of arguments."
(let* ((repl (if repl (get-buffer repl) (guix-geiser-repl)))
(running? nil)
(filter (lambda (output)
(setq running?
(and (get-buffer-process repl)
(not (guix-guile-prompt? output))))))
(comint-output-filter-functions
(cons filter comint-output-filter-functions)))
(guix-geiser-eval-in-repl str repl no-history no-display)
(while running?
(sleep-for 0.1))))
(defun guix-geiser-call (proc &rest args)
"Call (PROC ARGS ...) synchronously using the current Geiser REPL.
PROC and ARGS should be strings."
(guix-geiser-eval
(apply #'guix-guile-make-call-expression proc args)))
(defun guix-geiser-call-in-repl (proc &rest args)
"Call (PROC ARGS ...) in the current Geiser REPL.
PROC and ARGS should be strings."
(guix-geiser-eval-in-repl
(apply #'guix-guile-make-call-expression proc args)))
(provide 'guix-geiser)
;;; guix-geiser.el ends here
-98
View File
@@ -1,98 +0,0 @@
;;; guix-guile.el --- Auxiliary tools for working with guile code -*- lexical-binding: t -*-
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides functions for parsing guile code, making guile
;; expressions, etc.
;;; Code:
(require 'geiser-guile)
(defvar guix-guile-definition-regexp
(rx bol "(define"
(zero-or-one "*")
(zero-or-one "-public")
(one-or-more space)
(zero-or-one "(")
(group (one-or-more (or word (syntax symbol)))))
"Regexp used to find the guile definition.")
(defun guix-guile-current-definition ()
"Return string with name of the current top-level guile definition."
(save-excursion
(beginning-of-defun)
(if (looking-at guix-guile-definition-regexp)
(match-string-no-properties 1)
(error "Couldn't find the current definition"))))
(defun guix-guile-current-module ()
"Return a string with the current guile module.
Return nil, if current buffer does not define a module."
;; Modified version of `geiser-guile--get-module'.
(save-excursion
(geiser-syntax--pop-to-top)
(when (or (re-search-backward geiser-guile--module-re nil t)
(looking-at geiser-guile--library-re)
(re-search-forward geiser-guile--module-re nil t))
(match-string-no-properties 1))))
(defun guix-guile-boolean (arg)
"Return a string with guile boolean value.
Transform elisp ARG (nil or non-nil) to the guile boolean (#f or #t)."
(if arg "#t" "#f"))
(defun guix-guile-keyword-regexp (keyword)
"Return regexp to find guile KEYWORD."
(format "(\\(%s\\)\\_>" keyword))
(defun guix-guile-make-call-expression (proc &rest args)
"Return \"(PROC ARGS ...)\" string.
PROC and ARGS should be strings."
(format "(%s %s)"
proc
(mapconcat #'identity args " ")))
(defun guix-make-guile-expression (fun &rest args)
"Return string containing a guile expression for calling FUN with ARGS."
(format "(%S %s)" fun
(mapconcat
(lambda (arg)
(cond
((null arg) "'()")
((or (eq arg t)
;; An ugly hack to separate 'false' from nil.
(equal arg 'f)
(keywordp arg))
(concat "#" (prin1-to-string arg t)))
((or (symbolp arg) (listp arg))
(concat "'" (prin1-to-string arg)))
(t (prin1-to-string arg))))
args
" ")))
(defun guix-guile-prompt? (string)
"Return non-nil, if STRING contains a Guile prompt."
(or (string-match-p geiser-guile--prompt-regexp string)
(string-match-p geiser-guile--debugger-prompt-regexp string)))
(provide 'guix-guile)
;;; guix-guile.el ends here
-108
View File
@@ -1,108 +0,0 @@
;;; guix-help-vars.el --- Variables related to --help output
;; Copyright © 2015 Alex Kost <alezost@gmail.com>
;; 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This file provides regular expressions to parse various "guix
;; ... --help" outputs and lists of non-receivable items (system types,
;; hash formats, etc.).
;;; Code:
;;; Regexps for parsing "guix ..." outputs
(defvar guix-help-parse-option-regexp
(rx bol " "
(zero-or-one (group "-" (not (any "- ")))
",")
(one-or-more " ")
(group "--" (one-or-more (or wordchar "-")))
(group (zero-or-one "[")
(zero-or-one "="))
(zero-or-more (not space))
(one-or-more space)
(group (one-or-more any)))
"Common regexp used to find command options.")
(defvar guix-help-parse-command-regexp
(rx bol " "
(group wordchar (one-or-more (or wordchar "-"))))
"Regexp used to find guix commands.
'Command' means any option not prefixed with '-'. For example,
guix subcommand, system action, importer, etc.")
(defvar guix-help-parse-long-option-regexp
(rx (or " " ", ")
(group "--" (one-or-more (or wordchar "-"))
(zero-or-one "=")))
"Regexp used to find long options.")
(defvar guix-help-parse-short-option-regexp
(rx bol (one-or-more blank)
"-" (group (not (any "- "))))
"Regexp used to find short options.")
(defvar guix-help-parse-package-regexp
(rx bol (group (one-or-more (not blank))))
"Regexp used to find names of the packages.")
(defvar guix-help-parse-list-regexp
(rx bol (zero-or-more blank) "- "
(group (one-or-more (or wordchar "-"))))
"Regexp used to find various lists (lint checkers, graph types).")
(defvar guix-help-parse-regexp-group 1
"Parenthesized expression of regexps used to find commands and
options.")
;;; Non-receivable lists of system types, hash formats, etc.
(defvar guix-help-system-types
'("x86_64-linux" "i686-linux" "armhf-linux" "mips64el-linux")
"List of supported systems.")
(defvar guix-help-source-types
'("package" "all" "transitive")
"List of supported sources types.")
(defvar guix-help-hash-formats
'("nix-base32" "base32" "base16" "hex" "hexadecimal")
"List of supported hash formats.")
(defvar guix-help-refresh-subsets
'("core" "non-core")
"List of supported 'refresh' subsets.")
(defvar guix-help-key-policies
'("interactive" "always" "never")
"List of supported key download policies.")
(defvar guix-help-verify-options
'("repair" "contents")
"List of supported 'verify' options")
(defvar guix-help-elpa-archives
'("gnu" "melpa" "melpa-stable")
"List of supported ELPA archives.")
(provide 'guix-help-vars)
;;; guix-help-vars.el ends here
-65
View File
@@ -1,65 +0,0 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
;;;
;;; 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/>.
;;; Commentary:
;; This is an auxiliary file for the Emacs UI. It is used to add Guix
;; directories to path variables and to load the main code.
;;; Code:
(use-modules (ice-9 regex)
(srfi srfi-26))
(define %guix-dir)
;; The code is taken from guix executable script
(define (set-paths!)
(define-syntax-rule (push! elt v) (set! v (cons elt v)))
(define config-lookup
(let ((config '(("prefix" . "@prefix@")
("guilemoduledir" . "@guilemoduledir@")))
(var-ref-regexp (make-regexp "\\$\\{([a-z]+)\\}")))
(define (expand-var-ref match)
(lookup (match:substring match 1)))
(define (expand str)
(regexp-substitute/global #f var-ref-regexp str
'pre expand-var-ref 'post))
(define (lookup name)
(expand (assoc-ref config name)))
lookup))
(let ((module-dir (config-lookup "guilemoduledir"))
(updates-dir (and=> (or (getenv "XDG_CONFIG_HOME")
(and=> (getenv "HOME")
(cut string-append <> "/.config")))
(cut string-append <> "/guix/latest"))))
(push! module-dir %load-path)
(push! module-dir %load-compiled-path)
(if (and updates-dir (file-exists? updates-dir))
(begin
(set! %guix-dir updates-dir)
(push! updates-dir %load-path)
(push! updates-dir %load-compiled-path))
(set! %guix-dir module-dir))))
(set-paths!)
(load-from-path "guix-main")

Some files were not shown because too many files have changed in this diff Show More