Merge pull request #298967 from vbgl/ocaml-5.2.0
[NixPkgs.git] / doc / build-helpers / fetchers.chapter.md
blob5c7c3257e6d4b2bab219e206a008ba6c9695db7f
1 # Fetchers {#chap-pkgs-fetchers}
3 Building software with Nix often requires downloading source code and other files from the internet.
4 To this end, Nixpkgs provides *fetchers*: functions to obtain remote sources via various protocols and services.
6 Nixpkgs fetchers differ from built-in fetchers such as [`builtins.fetchTarball`](https://nixos.org/manual/nix/stable/language/builtins.html#builtins-fetchTarball):
7 - A built-in fetcher will download and cache files at evaluation time and produce a [store path](https://nixos.org/manual/nix/stable/glossary#gloss-store-path).
8   A Nixpkgs fetcher will create a ([fixed-output](https://nixos.org/manual/nix/stable/glossary#gloss-fixed-output-derivation)) [derivation](https://nixos.org/manual/nix/stable/language/derivations), and files are downloaded at build time.
9 - Built-in fetchers will invalidate their cache after [`tarball-ttl`](https://nixos.org/manual/nix/stable/command-ref/conf-file#conf-tarball-ttl) expires, and will require network activity to check if the cache entry is up to date.
10   Nixpkgs fetchers only re-download if the specified hash changes or the store object is not otherwise available.
11 - Built-in fetchers do not use [substituters](https://nixos.org/manual/nix/stable/command-ref/conf-file#conf-substituters).
12   Derivations produced by Nixpkgs fetchers will use any configured binary cache transparently.
14 This significantly reduces the time needed to evaluate the entirety of Nixpkgs, and allows [Hydra](https://nixos.org/hydra) to retain and re-distribute sources used by Nixpkgs in the [public binary cache](https://cache.nixos.org).
15 For these reasons, built-in fetchers are not allowed in Nixpkgs source code.
17 The following table shows an overview of the differences:
19 | Fetchers | Download | Output | Cache | Re-download when |
20 |-|-|-|-|-|
21 | `builtins.fetch*` | evaluation time | store path | `/nix/store`, `~/.cache/nix` | `tarball-ttl` expires, cache miss in `~/.cache/nix`, output store object not in local store |
22 | `pkgs.fetch*` | build time | derivation | `/nix/store`, substituters | output store object not available |
24 ## Caveats {#chap-pkgs-fetchers-caveats}
26 The fact that the hash belongs to the Nix derivation output and not the file itself can lead to confusion.
27 For example, consider the following fetcher:
29 ```nix
30 fetchurl {
31   url = "http://www.example.org/hello-1.0.tar.gz";
32   hash = "sha256-lTeyxzJNQeMdu1IVdovNMtgn77jRIhSybLdMbTkf2Ww=";
34 ```
36 A common mistake is to update a fetcher’s URL, or a version parameter, without updating the hash.
38 ```nix
39 fetchurl {
40   url = "http://www.example.org/hello-1.1.tar.gz";
41   hash = "sha256-lTeyxzJNQeMdu1IVdovNMtgn77jRIhSybLdMbTkf2Ww=";
43 ```
45 **This will reuse the old contents**.
46 Remember to invalidate the hash argument, in this case by setting the `hash` attribute to an empty string.
48 ```nix
49 fetchurl {
50   url = "http://www.example.org/hello-1.1.tar.gz";
51   hash = "";
53 ```
55 Use the resulting error message to determine the correct hash.
57 ```
58 error: hash mismatch in fixed-output derivation '/path/to/my.drv':
59          specified: sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
60             got:    sha256-lTeyxzJNQeMdu1IVdovNMtgn77jRIhSybLdMbTkf2Ww=
61 ```
63 A similar problem arises while testing changes to a fetcher's implementation. If the output of the derivation already exists in the Nix store, test failures can go undetected. The [`invalidateFetcherByDrvHash`](#tester-invalidateFetcherByDrvHash) function helps prevent reusing cached derivations.
65 ## `fetchurl` and `fetchzip` {#fetchurl}
67 Two basic fetchers are `fetchurl` and `fetchzip`. Both of these have two required arguments, a URL and a hash. The hash is typically `hash`, although many more hash algorithms are supported. Nixpkgs contributors are currently recommended to use `hash`. This hash will be used by Nix to identify your source. A typical usage of `fetchurl` is provided below.
69 ```nix
70 { stdenv, fetchurl }:
72 stdenv.mkDerivation {
73   name = "hello";
74   src = fetchurl {
75     url = "http://www.example.org/hello.tar.gz";
76     hash = "sha256-BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=";
77   };
79 ```
81 The main difference between `fetchurl` and `fetchzip` is in how they store the contents. `fetchurl` will store the unaltered contents of the URL within the Nix store. `fetchzip` on the other hand, will decompress the archive for you, making files and directories directly accessible in the future. `fetchzip` can only be used with archives. Despite the name, `fetchzip` is not limited to .zip files and can also be used with any tarball.
83 Additional parameters to `fetchurl`:
84 - `downloadToTemp`: Defaults to `false`. If `true`, saves the source to `$downloadedFile`, to be used in conjunction with `postFetch`
85 - `postFetch`: Shell code executed after the file has been fetched successfully. Use it for postprocessing, to check or transform the file.
87 ## `fetchpatch` {#fetchpatch}
89 `fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example, it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
91 - `relative`: Similar to using `git-diff`'s `--relative` flag, only keep changes inside the specified directory, making paths relative to it.
92 - `stripLen`: Remove the first `stripLen` components of pathnames in the patch.
93 - `decode`: Pipe the downloaded data through this command before processing it as a patch.
94 - `extraPrefix`: Prefix pathnames by this string.
95 - `excludes`: Exclude files matching these patterns (applies after the above arguments).
96 - `includes`: Include only files matching these patterns (applies after the above arguments).
97 - `revert`: Revert the patch.
99 Note that because the checksum is computed after applying these effects, using or modifying these arguments will have no effect unless the `hash` argument is changed as well.
102 Most other fetchers return a directory rather than a single file.
105 ## `fetchDebianPatch` {#fetchdebianpatch}
107 A wrapper around `fetchpatch`, which takes:
108 - `patch` and `hash`: the patch's filename,
109   and its hash after normalization by `fetchpatch` ;
110 - `pname`: the Debian source package's name ;
111 - `version`: the upstream version number ;
112 - `debianRevision`: the [Debian revision number] if applicable ;
113 - the `area` of the Debian archive: `main` (default), `contrib`, or `non-free`.
115 Here is an example of `fetchDebianPatch` in action:
117 ```nix
118 { lib
119 , fetchDebianPatch
120 , buildPythonPackage
123 buildPythonPackage rec {
124   pname = "pysimplesoap";
125   version = "1.16.2";
126   src = <...>;
128   patches = [
129     (fetchDebianPatch {
130       inherit pname version;
131       debianRevision = "5";
132       name = "Add-quotes-to-SOAPAction-header-in-SoapClient.patch";
133       hash = "sha256-xA8Wnrpr31H8wy3zHSNfezFNjUJt1HbSXn3qUMzeKc0=";
134     })
135   ];
137   # ...
141 Patches are fetched from `sources.debian.org`, and so must come from a
142 package version that was uploaded to the Debian archive.  Packages may
143 be removed from there once that specific version isn't in any suite
144 anymore (stable, testing, unstable, etc.), so maintainers should use
145 `copy-tarballs.pl` to archive the patch if it needs to be available
146 longer-term.
148 [Debian revision number]: https://www.debian.org/doc/debian-policy/ch-controlfields.html#version
151 ## `fetchsvn` {#fetchsvn}
153 Used with Subversion. Expects `url` to a Subversion directory, `rev`, and `hash`.
155 ## `fetchgit` {#fetchgit}
157 Used with Git. Expects `url` to a Git repo, `rev`, and `hash`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
159 Additionally, the following optional arguments can be given: `fetchSubmodules = true` makes `fetchgit` also fetch the submodules of a repository. If `deepClone` is set to true, the entire repository is cloned as opposing to just creating a shallow clone. `deepClone = true` also implies `leaveDotGit = true` which means that the `.git` directory of the clone won't be removed after checkout.
161 If only parts of the repository are needed, `sparseCheckout` can be used. This will prevent git from fetching unnecessary blobs from server, see [git sparse-checkout](https://git-scm.com/docs/git-sparse-checkout) for more information:
163 ```nix
164 { stdenv, fetchgit }:
166 stdenv.mkDerivation {
167   name = "hello";
168   src = fetchgit {
169     url = "https://...";
170     sparseCheckout = [
171       "directory/to/be/included"
172       "another/directory"
173     ];
174     hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
175   };
179 ## `fetchfossil` {#fetchfossil}
181 Used with Fossil. Expects `url` to a Fossil archive, `rev`, and `hash`.
183 ## `fetchcvs` {#fetchcvs}
185 Used with CVS. Expects `cvsRoot`, `tag`, and `hash`.
187 ## `fetchhg` {#fetchhg}
189 Used with Mercurial. Expects `url`, `rev`, and `hash`.
191 A number of fetcher functions wrap part of `fetchurl` and `fetchzip`. They are mainly convenience functions intended for commonly used destinations of source code in Nixpkgs. These wrapper fetchers are listed below.
193 ## `fetchFromGitea` {#fetchfromgitea}
195 `fetchFromGitea` expects five arguments. `domain` is the gitea server name. `owner` is a string corresponding to the Gitea user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every Gitea HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `hash` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `hash` is currently preferred.
197 ## `fetchFromGitHub` {#fetchfromgithub}
199 `fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `hash` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available, but `hash` is currently preferred.
201 To use a different GitHub instance, use `githubBase` (defaults to `"github.com"`).
203 `fetchFromGitHub` uses `fetchzip` to download the source archive generated by GitHub for the specified revision. If `leaveDotGit`, `deepClone` or `fetchSubmodules` are set to `true`, `fetchFromGitHub` will use `fetchgit` instead. Refer to its section for documentation of these options.
205 ## `fetchFromGitLab` {#fetchfromgitlab}
207 This is used with GitLab repositories. It behaves similarly to `fetchFromGitHub`, and expects `owner`, `repo`, `rev`, and `hash`.
209 To use a specific GitLab instance, use `domain` (defaults to `"gitlab.com"`).
212 ## `fetchFromGitiles` {#fetchfromgitiles}
214 This is used with Gitiles repositories. The arguments expected are similar to `fetchgit`.
216 ## `fetchFromBitbucket` {#fetchfrombitbucket}
218 This is used with BitBucket repositories. The arguments expected are very similar to `fetchFromGitHub` above.
220 ## `fetchFromSavannah` {#fetchfromsavannah}
222 This is used with Savannah repositories. The arguments expected are very similar to `fetchFromGitHub` above.
224 ## `fetchFromRepoOrCz` {#fetchfromrepoorcz}
226 This is used with repo.or.cz repositories. The arguments expected are very similar to `fetchFromGitHub` above.
228 ## `fetchFromSourcehut` {#fetchfromsourcehut}
230 This is used with sourcehut repositories. Similar to `fetchFromGitHub` above,
231 it expects `owner`, `repo`, `rev` and `hash`, but don't forget the tilde (~)
232 in front of the username! Expected arguments also include `vc` ("git" (default)
233 or "hg"), `domain` and `fetchSubmodules`.
235 If `fetchSubmodules` is `true`, `fetchFromSourcehut` uses `fetchgit`
236 or `fetchhg` with `fetchSubmodules` or `fetchSubrepos` set to `true`,
237 respectively. Otherwise, the fetcher uses `fetchzip`.
239 ## `requireFile` {#requirefile}
241 `requireFile` allows requesting files that cannot be fetched automatically, but whose content is known.
242 This is a useful last-resort workaround for license restrictions that prohibit redistribution, or for downloads that are only accessible after authenticating interactively in a browser.
243 If the requested file is present in the Nix store, the resulting derivation will not be built, because its expected output is already available.
244 Otherwise, the builder will run, but fail with a message explaining to the user how to provide the file. The following code, for example:
246 ```nix
247 requireFile {
248   name = "jdk-${version}_linux-x64_bin.tar.gz";
249   url = "https://www.oracle.com/java/technologies/javase-jdk11-downloads.html";
250   hash = "sha256-lL00+F7jjT71nlKJ7HRQuUQ7kkxVYlZh//5msD8sjeI=";
253 results in this error message:
256 Unfortunately, we cannot download file jdk-11.0.10_linux-x64_bin.tar.gz automatically.
257 Please go to https://www.oracle.com/java/technologies/javase-jdk11-downloads.html to download it yourself, and add it to the Nix store
258 using either
259   nix-store --add-fixed sha256 jdk-11.0.10_linux-x64_bin.tar.gz
261   nix-prefetch-url --type sha256 file:///path/to/jdk-11.0.10_linux-x64_bin.tar.gz
266 This function should only be used by non-redistributable software with an unfree license that we need to require the user to download manually.
267 It produces packages that cannot be built automatically.
269 ## `fetchtorrent` {#fetchtorrent}
271 `fetchtorrent` expects two arguments. `url` which can either be a Magnet URI (Magnet Link) such as `magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c` or an HTTP URL pointing to a `.torrent` file. It can also take a `config` argument which will craft a `settings.json` configuration file and give it to `transmission`, the underlying program that is performing the fetch. The available config options for `transmission` can be found [here](https://github.com/transmission/transmission/blob/main/docs/Editing-Configuration-Files.md#options)
273 ```nix
274 { fetchtorrent }:
276 fetchtorrent {
277   config = { peer-limit-global = 100; };
278   url = "magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c";
279   sha256 = "";
283 ### Parameters {#fetchtorrent-parameters}
285 - `url`: Magnet URI (Magnet Link) such as `magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c` or an HTTP URL pointing to a `.torrent` file.
287 - `backend`: Which bittorrent program to use. Default: `"transmission"`. Valid values are `"rqbit"` or `"transmission"`. These are the two most suitable torrent clients for fetching in a fixed-output derivation at the time of writing, as they can be easily exited after usage. `rqbit` is written in Rust and has a smaller closure size than `transmission`, and the performance and peer discovery properties differs between these clients, requiring experimentation to decide upon which is the best.
289 - `config`: When using `transmission` as the `backend`, a json configuration can
290   be supplied to transmission. Refer to the [upstream documentation](https://github.com/transmission/transmission/blob/main/docs/Editing-Configuration-Files.md) for information on how to configure.