doc: Add “Source Tree Structure” section.
* doc/contributing.texi (Source Tree Structure): New node. * doc/guix.texi (Programming Interface): Add cross-reference. Change-Id: I141a1f4d806ae5f72c7a246e18c14dc63056a607
This commit is contained in:
parent
a2077e5bee
commit
d67e4f0f9b
@ -23,7 +23,8 @@ choice.
|
|||||||
* Building from Git:: The latest and greatest.
|
* Building from Git:: The latest and greatest.
|
||||||
* Running Guix Before It Is Installed:: Hacker tricks.
|
* Running Guix Before It Is Installed:: Hacker tricks.
|
||||||
* The Perfect Setup:: The right tools.
|
* The Perfect Setup:: The right tools.
|
||||||
* Alternative Setups:: Other posible tools that do the job.
|
* Alternative Setups:: Other possible tools that do the job.
|
||||||
|
* Source Tree Structure:: Source code guided tour.
|
||||||
* Packaging Guidelines:: Growing the distribution.
|
* Packaging Guidelines:: Growing the distribution.
|
||||||
* Coding Style:: Hygiene of the contributor.
|
* Coding Style:: Hygiene of the contributor.
|
||||||
* Submitting Patches:: Share your work.
|
* Submitting Patches:: Share your work.
|
||||||
@ -546,6 +547,257 @@ In NeoVim you can even make a similar setup to Geiser using
|
|||||||
process and inject your code there live (sadly it's not packaged in Guix yet).
|
process and inject your code there live (sadly it's not packaged in Guix yet).
|
||||||
|
|
||||||
|
|
||||||
|
@node Source Tree Structure
|
||||||
|
@section Source Tree Structure
|
||||||
|
|
||||||
|
@cindex structure, of the source tree
|
||||||
|
If you're willing to contribute to Guix beyond packages, or if you'd
|
||||||
|
like to learn how it all fits together, this section provides a guided
|
||||||
|
tour in the code base that you may find useful.
|
||||||
|
|
||||||
|
Overall, the Guix source tree contains almost exclusively Guile
|
||||||
|
@dfn{modules}, each of which can be seen as an independent library
|
||||||
|
(@pxref{Modules,,, guile, GNU Guile Reference Manual}).
|
||||||
|
|
||||||
|
The following table gives an overview of the main directories and what
|
||||||
|
they contain. Remember that in Guile, each module name is derived from
|
||||||
|
its file name---e.g., the module in file @file{guix/packages.scm} is
|
||||||
|
called @code{(guix packages)}.
|
||||||
|
|
||||||
|
@table @file
|
||||||
|
@item guix
|
||||||
|
This is the location of core Guix mechanisms. To illustrate what is
|
||||||
|
meant by ``core'', here are a few examples, starting from low-level
|
||||||
|
tools and going towards higher-level tools:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (guix store)
|
||||||
|
Connecting to and interacting with the build daemon (@pxref{The Store}).
|
||||||
|
@item (guix derivations)
|
||||||
|
Creating derivations (@pxref{Derivations}).
|
||||||
|
@item (guix gexps)
|
||||||
|
Writing G-expressions (@pxref{G-Expressions}).
|
||||||
|
@item (guix packages)
|
||||||
|
Defining packages and origins (@pxref{package Reference}).
|
||||||
|
@item (guix download)
|
||||||
|
@itemx (guix git-download)
|
||||||
|
The @code{url-fetch} and @code{git-fetch} origin download methods
|
||||||
|
(@pxref{origin Reference}).
|
||||||
|
@item (guix swh)
|
||||||
|
Fetching source code from the
|
||||||
|
@uref{https://archive.softwareheritage.org,Software Heritage archive}.
|
||||||
|
@item (guix search-paths)
|
||||||
|
Implementing search paths (@pxref{Search Paths}).
|
||||||
|
@item (guix build-system)
|
||||||
|
The build system interface (@pxref{Build Systems}).
|
||||||
|
@item (guix profiles)
|
||||||
|
Implementing profiles.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@cindex build system, directory structure
|
||||||
|
@item guix/build-system
|
||||||
|
This directory contains specific build system implementations
|
||||||
|
(@pxref{Build Systems}), such as:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (guix build-system gnu)
|
||||||
|
the GNU build system;
|
||||||
|
@item (guix build-system cmake)
|
||||||
|
the CMake build system;
|
||||||
|
@item (guix build-system pyproject)
|
||||||
|
The Python ``pyproject'' build system.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item guix/build
|
||||||
|
This contains code generally used on the ``build side''
|
||||||
|
(@pxref{G-Expressions, strata of code}). This includes code used to
|
||||||
|
build packages or other operating system components, as well as
|
||||||
|
utilities:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (guix build utils)
|
||||||
|
Utilities for package definitions and more (@pxref{Build Utilities}).
|
||||||
|
@item (guix build gnu-build-system)
|
||||||
|
@itemx (guix build cmake-build-system)
|
||||||
|
@itemx (guix build pyproject-build-system)
|
||||||
|
Implementation of build systems, and in particular definition of their
|
||||||
|
build phases (@pxref{Build Phases}).
|
||||||
|
@item (guix build syscalls)
|
||||||
|
Interface to the C library and to Linux system calls.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@cindex command-line tools, as Guile modules
|
||||||
|
@cindex command modules
|
||||||
|
@item guix/scripts
|
||||||
|
This contains modules corresponding to @command{guix} sub-commands. For
|
||||||
|
example, the @code{(guix scripts shell)} module exports the
|
||||||
|
@code{guix-shell} procedure, which directly corresponds to the
|
||||||
|
@command{guix shell} command (@pxref{Invoking guix shell}).
|
||||||
|
|
||||||
|
@cindex importer modules
|
||||||
|
@item guix/import
|
||||||
|
This contains supporting code for the importers and updaters
|
||||||
|
(@pxref{Invoking guix import}, and @pxref{Invoking guix refresh}). For
|
||||||
|
example, @code{(guix import pypi)} defines the interface to PyPI, which
|
||||||
|
is used by the @code{guix import pypi} command.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
The directories we have seen so far all live under @file{guix/}. The
|
||||||
|
other important place is the @file{gnu/} directory, which contains
|
||||||
|
primarily package definitions as well as libraries and tools for Guix
|
||||||
|
System (@pxref{System Configuration}) and Guix Home (@pxref{Home
|
||||||
|
Configuration}), all of which build upon functionality provided by
|
||||||
|
@code{(guix @dots{})} modules@footnote{For this reason, @code{(guix
|
||||||
|
@dots{})} modules must generally not depend on @code{(gnu @dots{})}
|
||||||
|
modules, with notable exceptions: @code{(guix build-system @dots{})}
|
||||||
|
modules may look up packages at run time---e.g., @code{(guix
|
||||||
|
build-system cmake)} needs to access the @code{cmake} variable at run
|
||||||
|
time---, @code{(guix scripts @dots{})} often rely on @code{(gnu @dots{})}
|
||||||
|
modules, and the same goes for some of the @code{(guix import @dots{})}
|
||||||
|
modules.}.
|
||||||
|
|
||||||
|
@table @file
|
||||||
|
@cindex package modules
|
||||||
|
@item gnu/packages
|
||||||
|
This is by far the most crowded directory of the source tree: it
|
||||||
|
contains @dfn{package modules} that export package definitions
|
||||||
|
(@pxref{Package Modules}). A few examples:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (gnu packages base)
|
||||||
|
Module providing ``base'' packages: @code{glibc}, @code{coreutils},
|
||||||
|
@code{grep}, etc.
|
||||||
|
@item (gnu packages guile)
|
||||||
|
Guile and core Guile packages.
|
||||||
|
@item (gnu packages linux)
|
||||||
|
The Linux-libre kernel and related packages.
|
||||||
|
@item (gnu packages python)
|
||||||
|
Python and core Python packages.
|
||||||
|
@item (gnu packages python-xyz)
|
||||||
|
Miscellaneous Python packages (we were not very creative).
|
||||||
|
@end table
|
||||||
|
|
||||||
|
In any case, you can jump to a package definition using @command{guix
|
||||||
|
edit} (@pxref{Invoking guix edit}) and view its location with
|
||||||
|
@command{guix show} (@pxref{Invoking guix package}).
|
||||||
|
|
||||||
|
@findex search-patches
|
||||||
|
@item gnu/packages/patches
|
||||||
|
This directory contains patches applied against packages and obtained
|
||||||
|
using the @code{search-patches} procedure.
|
||||||
|
|
||||||
|
@item gnu/services
|
||||||
|
This contains service definitions, primarily for Guix System
|
||||||
|
(@pxref{Services}) but some of them are adapted and reused for Guix Home
|
||||||
|
as we will see below. Examples:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (gnu services)
|
||||||
|
The service framework itself, which defines the service and service type
|
||||||
|
data types (@pxref{Service Composition}).
|
||||||
|
@item (gnu services base)
|
||||||
|
``Base'' services (@pxref{Base Services}).
|
||||||
|
@item (gnu services desktop)
|
||||||
|
``Desktop'' services (@pxref{Desktop Services}).
|
||||||
|
@item (gnu services shepherd)
|
||||||
|
Support for Shepherd services (@pxref{Shepherd Services}).
|
||||||
|
@end table
|
||||||
|
|
||||||
|
You can jump to a service definition using @command{guix system edit}
|
||||||
|
and view its location with @command{guix system search} (@pxref{Invoking
|
||||||
|
guix system}).
|
||||||
|
|
||||||
|
@item gnu/system
|
||||||
|
These are core Guix System modules, such as:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (gnu system)
|
||||||
|
Defines @code{operating-system} (@pxref{operating-system Reference}).
|
||||||
|
@item (gnu system file-systems)
|
||||||
|
Defines @code{file-system} (@pxref{File Systems}).
|
||||||
|
@item (gnu system mapped-devices)
|
||||||
|
Defines @code{mapped-device} (@pxref{Mapped Devices}).
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item gnu/build
|
||||||
|
These are modules that are either used on the ``build side'' when
|
||||||
|
building operating systems or packages, or at run time by operating
|
||||||
|
systems.
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (gnu build accounts)
|
||||||
|
Creating @file{/etc/passwd}, @file{/etc/shadow}, etc. (@pxref{User
|
||||||
|
Accounts}).
|
||||||
|
@item (gnu build activation)
|
||||||
|
Activating an operating system at boot time or reconfiguration time.
|
||||||
|
@item (gnu build file-systems)
|
||||||
|
Searching, checking, and mounting file systems.
|
||||||
|
@item (gnu build linux-boot)
|
||||||
|
@itemx (gnu build hurd-boot)
|
||||||
|
Booting GNU/Linux and GNU/Hurd operating systems.
|
||||||
|
@item (gnu build linux-initrd)
|
||||||
|
Creating a Linux initial RAM disk (@pxref{Initial RAM Disk}).
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item gnu/home
|
||||||
|
This contains all things Guix Home (@pxref{Home Configuration});
|
||||||
|
examples:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item (gnu home services)
|
||||||
|
Core services such as @code{home-files-service-type}.
|
||||||
|
@item (gnu home services ssh)
|
||||||
|
SSH-related services (@pxref{Secure Shell}).
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item gnu/installer
|
||||||
|
This contains the text-mode graphical system installer (@pxref{Guided
|
||||||
|
Graphical Installation}).
|
||||||
|
|
||||||
|
@item gnu/machine
|
||||||
|
These are the @dfn{machine abstractions} used by @command{guix deploy}
|
||||||
|
(@pxref{Invoking guix deploy}).
|
||||||
|
|
||||||
|
@item gnu/tests
|
||||||
|
This contains system tests---tests that spawn virtual machines to check
|
||||||
|
that system services work as expected (@pxref{Running the Test Suite}).
|
||||||
|
@end table
|
||||||
|
|
||||||
|
Last, there's also a few directories that contain files that are
|
||||||
|
@emph{not} Guile modules:
|
||||||
|
|
||||||
|
@table @file
|
||||||
|
@item nix
|
||||||
|
This is the C++ implementation of @command{guix-daemon}, inherited from
|
||||||
|
Nix (@pxref{Invoking guix-daemon}).
|
||||||
|
|
||||||
|
@item tests
|
||||||
|
These are unit tests, each file corresponding more or less to one
|
||||||
|
module, in particular @code{(guix @dots{})} modules (@pxref{Running the
|
||||||
|
Test Suite}).
|
||||||
|
|
||||||
|
@item doc
|
||||||
|
This is the documentation in the form of Texinfo files: this manual and
|
||||||
|
the Cookbook. @xref{Writing a Texinfo File,,, texinfo, GNU Texinfo},
|
||||||
|
for information on Texinfo markup language.
|
||||||
|
|
||||||
|
@item po
|
||||||
|
This is the location of translations of Guix itself, of package synopses
|
||||||
|
and descriptions, of the manual, and of the cookbook. Note that
|
||||||
|
@file{.po} files that live here are pulled directly from Weblate
|
||||||
|
(@pxref{Translating Guix}).
|
||||||
|
|
||||||
|
@item etc
|
||||||
|
Miscellaneous files: shell completions, support for systemd and other
|
||||||
|
init systems, Git hooks, etc.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
With all this, a fair chunk of your operating system is at your
|
||||||
|
fingertips! Beyond @command{grep} and @command{git grep}, @pxref{The
|
||||||
|
Perfect Setup} on how to navigate code from your editor, and
|
||||||
|
@pxref{Using Guix Interactively} for information on how to use Scheme
|
||||||
|
modules interactively. Enjoy!
|
||||||
|
|
||||||
@node Packaging Guidelines
|
@node Packaging Guidelines
|
||||||
@section Packaging Guidelines
|
@section Packaging Guidelines
|
||||||
|
|
||||||
|
@ -7680,7 +7680,8 @@ assembly is to C programs. The term ``derivation'' comes from the fact
|
|||||||
that build results @emph{derive} from them.
|
that build results @emph{derive} from them.
|
||||||
|
|
||||||
This chapter describes all these APIs in turn, starting from high-level
|
This chapter describes all these APIs in turn, starting from high-level
|
||||||
package definitions.
|
package definitions. @xref{Source Tree Structure}, for a more general
|
||||||
|
overview of the source code.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Package Modules:: Packages from the programmer's viewpoint.
|
* Package Modules:: Packages from the programmer's viewpoint.
|
||||||
|
Loading…
Reference in New Issue
Block a user