aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorThéophane Hufschmitt <7226587+thufschmitt@users.noreply.github.com>2023-01-02 14:42:01 +0100
committerGitHub <noreply@github.com>2023-01-02 14:42:01 +0100
commita654ae826914335043cac8e3e00194fda04e8651 (patch)
tree915016a58677cc954b39417fe0cda2878c0656e6 /doc
parent80a0f77e49817a0fdb67109f2a7c3afb2c4e7d9d (diff)
parentc162c90b432590e1dbdeb5f4361bf4b48de82bac (diff)
Merge pull request #7066 from fricklerhandwerk/architecture-overview
manual: architecture overview
Diffstat (limited to 'doc')
-rw-r--r--doc/manual/src/SUMMARY.md.in1
-rw-r--r--doc/manual/src/architecture/architecture.md115
2 files changed, 116 insertions, 0 deletions
diff --git a/doc/manual/src/SUMMARY.md.in b/doc/manual/src/SUMMARY.md.in
index 6a514fa2c..019a3f1fe 100644
--- a/doc/manual/src/SUMMARY.md.in
+++ b/doc/manual/src/SUMMARY.md.in
@@ -59,6 +59,7 @@
@manpages@
- [Files](command-ref/files.md)
- [nix.conf](command-ref/conf-file.md)
+- [Architecture](architecture/architecture.md)
- [Glossary](glossary.md)
- [Contributing](contributing/contributing.md)
- [Hacking](contributing/hacking.md)
diff --git a/doc/manual/src/architecture/architecture.md b/doc/manual/src/architecture/architecture.md
new file mode 100644
index 000000000..2d1b26558
--- /dev/null
+++ b/doc/manual/src/architecture/architecture.md
@@ -0,0 +1,115 @@
+# Architecture
+
+This chapter describes how Nix works.
+It should help users understand why Nix behaves as it does, and it should help developers understand how to modify Nix and how to write similar tools.
+
+## Overview
+
+Nix consists of [hierarchical layers].
+
+[hierarchical layers]: https://en.m.wikipedia.org/wiki/Multitier_architecture#Layers
+
+The following [concept map] shows its main components (rectangles), the objects they operate on (rounded rectangles), and their interactions (connecting phrases):
+
+[concept map]: https://en.m.wikipedia.org/wiki/Concept_map
+
+```
+
+ .----------------.
+ | Nix expression |----------.
+ '----------------' |
+ | passed to
+ | |
++----------|-------------------|--------------------------------+
+| Nix | V |
+| | +-------------------------+ |
+| | | commmand line interface |------. |
+| | +-------------------------+ | |
+| | | | |
+| evaluated by calls manages |
+| | | | |
+| | V | |
+| | +--------------------+ | |
+| '-------->| language evaluator | | |
+| +--------------------+ | |
+| | | |
+| produces | |
+| | V |
+| +----------------------------|------------------------------+ |
+| | store | | |
+| | referenced by V builds | |
+| | .-------------. .------------. .--------------. | |
+| | | build input |----->| build plan |----->| build result | | |
+| | '-------------' '------------' '--------------' | |
+| +-------------------------------------------------|---------+ |
++---------------------------------------------------|-----------+
+ |
+ represented as
+ |
+ V
+ .---------------.
+ | file |
+ '---------------'
+```
+
+At the top is the [command line interface](../command-ref/command-ref.md) that drives the underlying layers.
+
+The [Nix language](../language/index.md) evaluator transforms Nix expressions into self-contained *build plans*, which are used to derive *build results* from referenced *build inputs*.
+
+The command line interface and Nix expressions are what users deal with most.
+
+> **Note**
+> The Nix language itself does not have a notion of *packages* or *configurations*.
+> As far as we are concerned here, the inputs and results of a build plan are just data.
+
+Underlying the command line interface and the Nix language evaluator is the [Nix store](../glossary.md#gloss-store), a mechanism to keep track of build plans, data, and references between them.
+It can also execute build plans to produce new data, which are made available to the operating system as files.
+
+A build plan itself is a series of *build tasks*, together with their build inputs.
+
+> **Important**
+> A build task in Nix is called [derivation](../glossary#gloss-derivation).
+
+Each build task has a special build input executed as *build instructions* in order to perform the build.
+The result of a build task can be input to another build task.
+
+The following [data flow diagram] shows a build plan for illustration.
+Build inputs used as instructions to a build task are marked accordingly:
+
+[data flow diagram]: https://en.m.wikipedia.org/wiki/Data-flow_diagram
+
+```
++--------------------------------------------------------------------+
+| build plan |
+| |
+| .-------------. |
+| | build input |---------. |
+| '-------------' | |
+| instructions |
+| | |
+| v |
+| .-------------. .----------. |
+| | build input |-->( build task )-------. |
+| '-------------' '----------' | |
+| instructions |
+| | |
+| v |
+| .-------------. .----------. .--------------. |
+| | build input |---------. ( build task )--->| build result | |
+| '-------------' | '----------' '--------------' |
+| instructions ^ |
+| | | |
+| v | |
+| .-------------. .----------. | |
+| | build input |-->( build task )-------' |
+| '-------------' '----------' |
+| ^ |
+| | |
+| | |
+| .-------------. | |
+| | build input |---------' |
+| '-------------' |
+| |
++--------------------------------------------------------------------+
+```
+