pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / build-support / fetchurl / default.nix
blobe4a70743334b5429ee14cd13c4548d8b8c1c1f8a
2   lib,
3   buildPackages ? {
4     inherit stdenvNoCC;
5   },
6   stdenvNoCC,
7   curl, # Note that `curl' may be `null', in case of the native stdenvNoCC.
8   cacert ? null,
9 }:
11 let
13   mirrors = import ./mirrors.nix;
15   # Write the list of mirrors to a file that we can reuse between
16   # fetchurl instantiations, instead of passing the mirrors to
17   # fetchurl instantiations via environment variables.  This makes the
18   # resulting store derivations (.drv files) much smaller, which in
19   # turn makes nix-env/nix-instantiate faster.
20   mirrorsFile = buildPackages.stdenvNoCC.mkDerivation (
21     {
22       name = "mirrors-list";
23       strictDeps = true;
24       builder = ./write-mirror-list.sh;
25       preferLocalBuild = true;
26     }
27     // mirrors
28   );
30   # Names of the master sites that are mirrored (i.e., "sourceforge",
31   # "gnu", etc.).
32   sites = builtins.attrNames mirrors;
34   impureEnvVars =
35     lib.fetchers.proxyImpureEnvVars
36     ++ [
37       # This variable allows the user to pass additional options to curl
38       "NIX_CURL_FLAGS"
40       # This variable allows the user to override hashedMirrors from the
41       # command-line.
42       "NIX_HASHED_MIRRORS"
44       # This variable allows overriding the timeout for connecting to
45       # the hashed mirrors.
46       "NIX_CONNECT_TIMEOUT"
47     ]
48     ++ (map (site: "NIX_MIRRORS_${site}") sites);
53   # URL to fetch.
54   url ? "",
56   # Alternatively, a list of URLs specifying alternative download
57   # locations.  They are tried in order.
58   urls ? [ ],
60   # Additional curl options needed for the download to succeed.
61   # Warning: Each space (no matter the escaping) will start a new argument.
62   # If you wish to pass arguments with spaces, use `curlOptsList`
63   curlOpts ? "",
65   # Additional curl options needed for the download to succeed.
66   curlOptsList ? [ ],
68   # Name of the file.  If empty, use the basename of `url' (or of the
69   # first element of `urls').
70   name ? "",
72   # for versioned downloads optionally take pname + version.
73   pname ? "",
74   version ? "",
76   # SRI hash.
77   hash ? "",
79   # Legacy ways of specifying the hash.
80   outputHash ? "",
81   outputHashAlgo ? "",
82   sha1 ? "",
83   sha256 ? "",
84   sha512 ? "",
86   recursiveHash ? false,
88   # Shell code to build a netrc file for BASIC auth
89   netrcPhase ? null,
91   # Impure env vars (https://nixos.org/nix/manual/#sec-advanced-attributes)
92   # needed for netrcPhase
93   netrcImpureEnvVars ? [ ],
95   # Shell code executed after the file has been fetched
96   # successfully. This can do things like check or transform the file.
97   postFetch ? "",
99   # Whether to download to a temporary path rather than $out. Useful
100   # in conjunction with postFetch. The location of the temporary file
101   # is communicated to postFetch via $downloadedFile.
102   downloadToTemp ? false,
104   # If true, set executable bit on downloaded file
105   executable ? false,
107   # If set, don't download the file, but write a list of all possible
108   # URLs (resulting from resolving mirror:// URLs) to $out.
109   showURLs ? false,
111   # Meta information, if any.
112   meta ? { },
114   # Passthru information, if any.
115   passthru ? { },
116   # Doing the download on a remote machine just duplicates network
117   # traffic, so don't do that by default
118   preferLocalBuild ? true,
120   # Additional packages needed as part of a fetch
121   nativeBuildInputs ? [ ],
125   urls_ =
126     if urls != [ ] && url == "" then
127       (if lib.isList urls then urls else throw "`urls` is not a list")
128     else if urls == [ ] && url != "" then
129       (if lib.isString url then [ url ] else throw "`url` is not a string")
130     else
131       throw "fetchurl requires either `url` or `urls` to be set";
133   hash_ =
134     if
135       with lib.lists;
136       length (
137         filter (s: s != "") [
138           hash
139           outputHash
140           sha1
141           sha256
142           sha512
143         ]
144       ) > 1
145     then
146       throw "multiple hashes passed to fetchurl"
147     else
149     if hash != "" then
150       {
151         outputHashAlgo = null;
152         outputHash = hash;
153       }
154     else if outputHash != "" then
155       if outputHashAlgo != "" then
156         { inherit outputHashAlgo outputHash; }
157       else
158         throw "fetchurl was passed outputHash without outputHashAlgo"
159     else if sha512 != "" then
160       {
161         outputHashAlgo = "sha512";
162         outputHash = sha512;
163       }
164     else if sha256 != "" then
165       {
166         outputHashAlgo = "sha256";
167         outputHash = sha256;
168       }
169     else if sha1 != "" then
170       {
171         outputHashAlgo = "sha1";
172         outputHash = sha1;
173       }
174     else if cacert != null then
175       {
176         outputHashAlgo = "sha256";
177         outputHash = "";
178       }
179     else
180       throw "fetchurl requires a hash for fixed-output derivation: ${lib.concatStringsSep ", " urls_}";
183 assert
184   (lib.isList curlOpts)
185   -> lib.warn ''
186     fetchurl for ${toString (builtins.head urls_)}: curlOpts is a list (${
187       lib.generators.toPretty { multiline = false; } curlOpts
188     }), which is not supported anymore.
189     - If you wish to get the same effect as before, for elements with spaces (even if escaped) to expand to multiple curl arguments, use a string argument instead:
190       curlOpts = ${lib.strings.escapeNixString (toString curlOpts)};
191     - If you wish for each list element to be passed as a separate curl argument, allowing arguments to contain spaces, use curlOptsList instead:
192       curlOptsList = [ ${lib.concatMapStringsSep " " lib.strings.escapeNixString curlOpts} ];'' true;
194 stdenvNoCC.mkDerivation (
195   (
196     if (pname != "" && version != "") then
197       { inherit pname version; }
198     else
199       {
200         name =
201           if showURLs then
202             "urls"
203           else if name != "" then
204             name
205           else
206             baseNameOf (toString (builtins.head urls_));
207       }
208   )
209   // {
210     builder = ./builder.sh;
212     nativeBuildInputs = [ curl ] ++ nativeBuildInputs;
214     urls = urls_;
216     # If set, prefer the content-addressable mirrors
217     # (http://tarballs.nixos.org) over the original URLs.
218     preferHashedMirrors = true;
220     # New-style output content requirements.
221     inherit (hash_) outputHashAlgo outputHash;
223     # Disable TLS verification only when we know the hash and no credentials are
224     # needed to access the resource
225     SSL_CERT_FILE =
226       if
227         (
228           hash_.outputHash == ""
229           || hash_.outputHash == lib.fakeSha256
230           || hash_.outputHash == lib.fakeSha512
231           || hash_.outputHash == lib.fakeHash
232           || netrcPhase != null
233         )
234       then
235         "${cacert}/etc/ssl/certs/ca-bundle.crt"
236       else
237         "/no-cert-file.crt";
239     outputHashMode = if (recursiveHash || executable) then "recursive" else "flat";
241     inherit curlOpts;
242     curlOptsList = lib.escapeShellArgs curlOptsList;
243     inherit
244       showURLs
245       mirrorsFile
246       postFetch
247       downloadToTemp
248       executable
249       ;
251     impureEnvVars = impureEnvVars ++ netrcImpureEnvVars;
253     nixpkgsVersion = lib.trivial.release;
255     inherit preferLocalBuild;
257     postHook =
258       if netrcPhase == null then
259         null
260       else
261         ''
262           ${netrcPhase}
263           curlOpts="$curlOpts --netrc-file $PWD/netrc"
264         '';
266     inherit meta;
267     passthru = {
268       inherit url;
269     } // passthru;
270   }