aboutsummaryrefslogtreecommitdiff
path: root/HACKING
blob: 9adef201c259ab28d2e8ad91bf46596a4c4cc3c7 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-*- mode: org; coding: utf-8; -*-

#+TITLE: Hacking GNU Guix and Its Incredible Distro

Copyright © 2012, 2013, 2014, 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
Copyright © 2015, 2017 Mathieu Lirzin <mthl@gnu.org>
Copyright © 2017 Leo Famulari <leo@famulari.name>
Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>

  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 information, either by running

  info -f doc/guix.info "Contributing"

or by checking the [[https://guix.gnu.org/manual/devel/en/html_node/Contributing.html][web copy of the manual]].
s.scm ("package-input-rewriting/spec, replace hidden package"): New test. * doc/guix.texi (Defining Package Variants): Update. Change-Id: I0a7988cac70e0c6b88b0fe6e27c1036fa723e030 Signed-off-by: Ludovic Courtès <ludo@gnu.org> Greg Hogan 2024-12-01transformations: ‘package-with-upstream-version’ can preserve patches....* guix/transformations.scm (upstream-fetch): New procedure. (package-with-upstream-version): Add #:preserve-patches? and honor it. Change-Id: Ib56b84957d8bdad2eebe2551e2a6e477506fc55e Ludovic Courtès 2024-12-01guix build: Add ‘--dependents’....* guix/scripts/build.scm (show-help, %options): Add ‘--dependents’. (dependents): New procedure. (options->things-to-build): Add ‘store’ parameter; honor ‘dependents’ option. [for-type]: Handle ‘dependents’ type. (options->derivations): Update call to ‘options->things-to-build’. * tests/guix-build.sh: Add test. * doc/guix.texi (Additional Build Options): Document ‘--dependents’. (Invoking guix refresh): Cross-reference it. * doc/contributing.texi (Submitting Patches): Mention it. Change-Id: I00b6d5831e1f1d35dc8b84a82605391d5a8f417c Ludovic Courtès 2024-12-01guix build: Add ‘--development’ option....* guix/scripts/build.scm (show-help, %options): Add ‘-D’. (options->things-to-build): Change ‘append-map’ to a loop. Honor ‘-D’. * tests/guix-build.sh: Add test. * doc/guix.texi (Additional Build Options): Document it. Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail.com> Change-Id: I99227aadfe861e43c001a4872292bd687b37f5d4 Ludovic Courtès 2024-11-23pack: Add support for AppImage pack format....* guix/scripts/pack.scm (self-contained-appimage): New procedure. (%formats, show-formats): Add it. (guix-pack): Honor it. * doc/guix.texi: Document AppImage pack. * tests/pack.scm ("appimage", "appimage + localstatedir"): New tests. Co-authored-by: Noé Lopez <noelopez@free.fr> Change-Id: I33ebfec623cff1cfcd6f029d2d3054c23ab1949a Signed-off-by: Ludovic Courtès <ludo@gnu.org> Sebastian Dümcke 2024-11-17tests: Fix the 'go-module->guix-package' test....This fixes a regression that would have been introduced by commit a8b927a562a ("import: go: Add an option to use pinned versions.") which is already 3 years old (!). * tests/go.scm (fixtures-go-check-test): Register new URL and data for http-fetch and http-get mocks. Change-Id: Ie9d306612971de54ce534563731f52baf64bc8e7 Maxim Cournoyer 2024-11-12derivations: ‘derivation-build-plan’ returns builds in topological order....That makes ‘derivation-build-plan’ directly usable in cases where one wants to sequentially build derivations one by one, or to report builds in the right order in the user interface. * guix/derivations.scm (derivation-build-plan): Wrap ‘loop’ in ‘traverse’. Perform a depth-first traversal. Return the list of builds in topological order. * tests/derivations.scm ("derivation-build-plan, topological ordering"): New test. Change-Id: I7cd9083f42c4381b4213794a40dbb5b234df966d Ludovic Courtès 2024-11-12tests: Fix gremlin.scm for GCC 14...* tests/gremlin.scm: Include stdio.h before using puts since GCC 14 no longer allows implicit declarations. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Ting-Wei Lan 2024-09-28tests: Make ‘tests/print.scm’ deterministic....The “package with inputs” test would fail non-deterministically: sometimes ‘package->code’ would pick the ‘glibc’ symbol, sometimes it would take ‘glibc/hurd’, which is an alias for ‘glibc’. * tests/print.scm (pkg-with-inputs)[inputs]: Replace ‘glibc’ with ‘gnu-make’. Change-Id: Ie192adda98d66546fae820a6bcdd5bb4b9f4dae7 Ludovic Courtès 2024-09-19Revert "import: crate: Emit new-style package inputs."...This reverts commit b8af6694b9bbea96e8b0d1c9aea64b7f8e690812, which led ‘guix import crate’ to produce invalid code (missing quasiquote) and triggered a failure of ‘tests/crate.scm’. Fixes <https://issues.guix.gnu.org/72939>. Reported-by: Aleksandr Vityazev <avityazev@disroot.org> Change-Id: If309caaa594f912788e20007bfa1f55b7d581a93 Ludovic Courtès 2024-09-17tests: Adjust ‘elm’ importer test to expect inputs without labels....This is a followup af85c38b017be3d932d4665acd9ff4b5c56a9790. * tests/elm.scm ("(guix import elm)"): Expect new-style inputs. Change-Id: If3c6b17b5a5d17ad443c3ddb05f94dc2458ba182 Ludovic Courtès 2024-09-16gexp: ‘imported-files’ does not create symlinks....Fixes <https://issues.guix.gnu.org/73275>. This is presumably what e529d46828c359b449fc570bdc293fc12534647c meant to do, except that it wrongfully pass #:symlink? a true value instead, most likely due to a typo. * guix/gexp.scm (imported-files): Pass #:symlink? #f. * tests/gexp.scm ("imported-files does not create symlinks"): New test. Change-Id: Ic31be56a2adf4dfa55e1ec390c53cc9ba5f8a96c Ludovic Courtès 2024-09-04gexp: Add ‘assume-source-relative-file-name’....* guix/gexp.scm (assume-source-relative-file-name): New macro. (local-file): Use assume-source-relative-file-name to look up a non-literal file relative to the current source directory. * doc/guix.texi (G-expressions): Document it. * tests/gexp.scm ("local-file, non-literal source relative file name"): New test. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Change-Id: I18573c8c7a6c87e8351b34412f9d26bb23b068b4 Richard Sent 2024-09-03scripts: style: Add 'alphabetical-sort' option....* guix/scripts/style.scm (show-help): Describe option. (order-packages): Add procedure. (format-whole-file): Add 'order?' argument. (%options): Add 'alphabetical-sort' option. (guix-style): Alphabetically order packages in files. * tests/guix-style.sh: Test alphabetical ordering. * doc/guix.texi (Invoking guix style): Document option. Change-Id: I4aa7c0bd0b6d42529ae7d304587ffb10bf5f4006 Signed-off-by: Ludovic Courtès <ludo@gnu.org> Herman Rimm 2024-08-31guix: import texlive: Add UPSTREAM-NAME property when necessary....* guix/import/texlive.scm (tlpdb->package): Add UPSTREAM-NAME property when necessary. * tests/texlive.scm ("texlive->guix-package, with upstream-name property"): Add new test. Change-Id: I134a065cbe0a7f0ff4d72b0929dba4e4d46cfaeb Nicolas Goaziou 2024-08-31guix: import texlive: Adjust to generate new source format....* guix/import/texlive.scm (tlpdb->package): Adjust source according to new format. * tests/texlive.scm (%fake-tlpdb): Add database revision. ("texlive->guix-package, no docfiles"): ("texlive->guix-package"): ("texlive->guix-package, with catalogue entry, no inputs"): ("texlive->guix-package, multiple licenses"): ("texlive->guix-package, with TeX format"): Update checks. Change-Id: I60d5fe0f5f8db194c679dcb262f64c824cd19909 Nicolas Goaziou 2024-08-31gnu: TeX Live packages built from TEXLIVE-SOURCE use same version....* gnu/packages/tex.scm (%texlive-version): New variable. (texlive-source): (texlive-libkpathsea)[version]: (texlive-libptexenc)[version]: (texlive-bin)[version]: (texlive-scheme-basic)[version]: (texlive-scheme-bookpub)[version]: (texlive-scheme-context)[version]: (texlive-scheme-full)[version]: (texlive-scheme-gust)[version]: (texlive-scheme-medium)[version]: (texlive-scheme-minimal)[version]: (texlive-scheme-small)[version]: (texlive-scheme-tetex)[version]: (texlive-collection-basic)[version]: (texlive-collection-bibtexextra)[version]: (texlive-collection-binextra)[version]: (texlive-collection-context)[version]: (texlive-collection-fontsextra)[version]: (texlive-collection-fontsrecommended)[version]: (texlive-collection-fontutils)[version]: (texlive-collection-formatsextra)[version]: (texlive-collection-games)[version]: (texlive-collection-humanities)[version]: (texlive-collection-langarabic)[version]: (texlive-collection-langchinese)[version]: (texlive-collection-langcjk)[version]: (texlive-collection-langcyrillic)[version]: (texlive-collection-langczechslovak)[version]: (texlive-collection-langenglish)[version]: (texlive-collection-langeuropean)[version]: (texlive-collection-langfrench)[version]: (texlive-collection-langgerman)[version]: (texlive-collection-langgreek)[version]: (texlive-collection-langitalian)[version]: (texlive-collection-langjapanese)[version]: (texlive-collection-langkorean)[version]: (texlive-collection-langother)[version]: (texlive-collection-langpolish)[version]: (texlive-collection-langportuguese)[version]: (texlive-collection-langspanish)[version]: (texlive-collection-latex)[version]: (texlive-collection-latexextra)[version]: (texlive-collection-latexrecommended)[version]: (texlive-collection-luatex)[version]: (texlive-collection-mathscience)[version]: (texlive-collection-metapost)[version]: (texlive-collection-music)[version]: (texlive-collection-pictures)[version]: (texlive-collection-plaingeneric)[version]: (texlive-collection-pstricks)[version]: (texlive-collection-publishers)[version]: (texlive-collection-xetex)[version]: Use new variable. * guix/import/texlive.scm (tlpdb->package): Always use version from %TEXLIVE-VERSION. * tests/texlive.scm ("texlive->guix-package, meta-package"): Test change to importer. Since meta-packages are empty, they are not going through an updater. This change makes sure they always refer to an up-to-date version when the rest of TeX Live is updated. Change-Id: I55445e3337c1dea22158103d9ed952f75c3c4964 texlive-source Change-Id: I198a361fd6df3c5dd2b4fa376e1ad623937f08cc Nicolas Goaziou 2024-08-31guix: import texlive: Handle versions....* guix/import/texlive.scm (texlive-repository): (texlive-repository-location): (svn-command): (version->revision): (current-day): (latest-texlive-tag): (texlive->svn-multi-reference): New variables. (tlpdb-file) Remove function. (tlpdb): Add VERSION argument. * guix/import/texlive.scm (list-upstream-inputs): Add VERSION and DATABASE arguments. (tlpdb->package): Do not use fixed version. Instead, make use of the version provided as an argument. Add DATABASE argument for testing. (texlive->guix-package): Do not memoize. Allow providing any TeX Live release tag as version. Default to latest tag. Add DATABASE argument for testing. Improve docstring. * tests/texlive.scm ("texlive->guix-package, no docfiles"): ("texlive->guix-package"): ("texlive->guix-package, with METAFONT files"): ("texlive->guix-package, with catalogue entry, no inputs"): ("texlive->guix-package, multiple licenses"): ("texlive->guix-package, meta-package"): ("texlive->guix-package, with TeX format"): ("texlive->guix-package, execute but no TeX format"): ("texlive->guix-package, translate dependencies"): ("texlive->guix-package, lonely `hyphen-base' dependency and ARCH"): ("texlive->guix-package, single script, no extension"): ("texlive->guix-package, multiple scripts, with extensions"): ("texlive->guix-package, script with associated input"): ("texlive->guix-package, propagated binaries, no script"): ("texlive->guix-package, propagated binaries and scripts"): ("texlive->guix-package, with skipped propagated binaries"): Update tests. Change-Id: I7576b6e31e9ec3ff84258b71d0c4dd180d2b5c38 Nicolas Goaziou 2024-08-31guix: import texlive: Propagate binaries when necessary....* guix/import/texlive.scm (no-bin-propagation-packages): New variable. (list-binfiles): New function. (linked-scripts): Renamed to... (list-linked-scripts): ... this. Now always return a list. (tlpdb->package): Handle binary propagation. * tests/texlive.scm (%fake-tlpdb): Add data for new tests. ("texlive->guix-package, propagated binaries, no script"): ("texlive->guix-package, propagated binaries and scripts"): ("texlive->guix-package, with skipped propagated binaries"): New tests. Change-Id: I707ba33a10aa98ad27151724d3ecc4158db6b7cc Nicolas Goaziou 2024-08-31import: go: Emit new-style package inputs....Since PACKAGE-NAMES->PACKAGE-INPUTS is used by both the go and crate importers, give the crate importer a copy of the original so it continues to use old-style inputs until it is updated. * guix/import/utils.scm (package-names->package-inputs)[make-input]: Return new-style package inputs. (maybe-inputs): Wrap PACKAGE-INPUTS in 'list' instead of 'quasiquote'. * guix/import/crate.scm (package-names->package-inputs): New variable. * tests/go.scm ("go-module->guix-package"): Adjust to new-style package inputs. Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com> Sarah Morgensen 2024-08-31import: crate: Emit new-style package inputs....* guix/import/crate.scm (maybe-cargo-development-inputs) (maybe-cargo-inputs): Wrap PACKAGE-INPUTS in unquoted 'list'. * tests/crate.scm ("crate->guix-package") ("cargo-recursive-import") ("cargo-recursive-import-honors-existing-packages"): Adjust accordingly. Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com> Modified-by: Maxim Cournoyer <maxim.cournoyer@gmail.com> Change-Id: I4dfb745272ecbc893926446872514fb815c07236 Sarah Morgensen 2024-08-31profiles: Use C.UTF-8 instead of ‘glibc-utf8-locales’ where possible....This is a followup to 1cebc334a77030c0c94955981652f4df7608c9e3. * guix/profiles.scm (ca-certificate-bundle)[libc-utf8-locales-for-target]: Remove. [build]: Use “C.UTF-8” instead of “en_US.utf8”. (profile-derivation)[libc-utf8-locales-for-target]: Remove. [set-utf8-locale]: Rewrite to a gexp that calls ‘setlocale’ for “C.UTF-8”. * tests/profiles.scm ("profile-derivation, cross-compilation"): Remove ‘locales’ variable and related check. Change-Id: I7cb148b9149fe5fbe5b9b1b25fdce1002ad1f37e Ludovic Courtès 2024-08-31build-systems: gnu: Export %default-gnu-imported-modules and %default-gnu-mod......Until now users would have to cargo cult or inspect the private %default-modules variable of (guix build-systems gnu) to discover which modules to include when extending the used modules via the #:modules argument. The renaming was automated via the command: $ git grep -l %gnu-build-system-modules | xargs sed 's/%gnu-build-system-modules/%default-gnu-imported-modules/' -i * guix/build-system/gnu.scm (%gnu-build-system-modules): Rename to... (%default-gnu-imported-modules): ... this. (%default-modules): Rename to... (%default-gnu-modules): ... this. Export. (dist-package, gnu-build, gnu-cross-build): Adjust accordingly. Change-Id: Idef307fff13cb76f3182d782b26e1cd3a5c757ee Maxim Cournoyer 2024-08-31build: utils: Raise error in modify-phases upon missing key....* guix/build/utils.scm (alist-cons-before) (alist-cons-after): Error with a match failure if the reference is not found, instead of appending to the alist. * tests/build-utils.scm: Update tests to match the new behavior. Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com> Change-Id: I3044b101bd06231d5cd55a544ac1009e6ce6f9a0 Carlo Zancanaro 2024-08-21cache: Avoid cache cleanup storms from concurrent processes....Reported by Christopher Baines <guix@cbaines.net>. * guix/cache.scm (maybe-remove-expired-cache-entries): Define ‘expiry-port’; create it with ‘lock-file’. Change ‘last-expiry-date’ accordingly. Write timestamp straight to ‘expiry-port’. * tests/cache.scm ("maybe-remove-expired-cache-entries, cleanup needed but lock taken"): New test. Change-Id: I22441d9d2c4a339d3d3878de131864db5a0ae826 Ludovic Courtès 2024-08-21syscalls: Add ‘mode’ parameter to ‘lock-file’....* guix/build/syscalls.scm (lock-file): Add ‘mode’ parameter and honor it. * tests/syscalls.scm ("lock-file + unlock-file"): New test. Change-Id: I113fb4a8b35dd8782b9c0991574e39a4b4393333 Ludovic Courtès 2024-08-01tests: gexp: Handle incorrect guile-bootstrap version for riscv....The tests currently fail when run on riscv-linux (affecting the guix package) because Guile 3 is used as the bootstrap guile. Correcting the package version seems hard, so I'm just tweaking the tests to use the right effective version for riscv64-linux. * tests/gexp.scm (bootstrap-guile-effective-version): New procedure. ("gexp->derivation & with-extensions", "lower-gexp", "lower-gexp, raw-derivation-file"): Use bootstrap-guile-effective-version. Change-Id: I3995e1f6b58ada1baf38a8ec55b0173059dd0079 Christopher Baines 2024-07-18modules: ‘file-name->module-name’ strips leading “./”....Fixes <https://issues.guix.gnu.org/71979>. * guix/modules.scm (file-name->module-name): Strip leading “.” component from FILE. * tests/modules.scm ("file-name->module-name") ("file-name->module-name, leading dot"): New tests. Reported-by: Tomas Volf <~@wolfsden.cz> Change-Id: I3d1b9f3f21448050cac4f3b1aed5f8f03758d4c9 Ludovic Courtès 2024-07-18git: Remove untracked files from cached checkouts....Cached checkouts could end up with stale untracked files, for example because the checkout was interrupted. As a result, when this happens for the Guix checkout, users would not get substitutes for ‘guix pull’. * guix/git.scm (delete-untracked-files): New procedure. (switch-to-ref): Use it. * tests/git.scm ("update-cached-checkout, untracked files removed"): New test. Co-authored-by: Ricardo Wurmus <rekado@elephly.net> Change-Id: Iccbe644ade396ad27a037db7e0ef1c2a68ef91ce Ludovic Courtès 2024-07-18guix build: Take ‘--system’ into account together with ‘-S’....* guix/scripts/build.scm (options->derivations)[compute-derivation]: Pass ‘system’ to ‘package-source-derivation’. * tests/guix-build.sh: Test ‘-S’ together with ‘-s’. Change-Id: If35f116285dd9caaf939221163ad0ba831eea993 Ludovic Courtès