diff --git a/pkgs/build-support/fetchurl/builder.sh b/pkgs/build-support/fetchurl/builder.sh index bfa57143b4b7..2276bfc1de3d 100644 --- a/pkgs/build-support/fetchurl/builder.sh +++ b/pkgs/build-support/fetchurl/builder.sh @@ -1,5 +1,7 @@ source $stdenv/setup +source $mirrorsFile + if test -n "$showURLs"; then header "downloading file $name with $outputHashAlgo hash $outputHash..." fi diff --git a/pkgs/build-support/fetchurl/default.nix b/pkgs/build-support/fetchurl/default.nix index 2643008e33fb..ee3800f6d9bb 100644 --- a/pkgs/build-support/fetchurl/default.nix +++ b/pkgs/build-support/fetchurl/default.nix @@ -3,6 +3,30 @@ {stdenv, curl}: # Note that `curl' may be `null', in case of the native stdenv. +let + + mirrors = import ./mirrors.nix; + + # Write the list of mirrors to a file that we can reuse between + # fetchurl instantiations, instead of passing the mirrors to + # fetchurl instantiations via environment variables. This makes the + # resulting store derivations (.drv files) much smaller, which in + # turn makes nix-env/nix-instantiate faster. + mirrorsFile = + stdenv.mkDerivation ({ + name = "mirrors-list"; + builder = ./write-mirror-list.sh; + } // mirrors); + + # Names of the master sites that are mirrored (i.e., "sourceforge", + # "gnu", etc.). + sites = + if builtins ? attrNames + then builtins.attrNames mirrors + else [] /* backwards compatibility */; + +in + { # URL to fetch. url ? "" @@ -36,23 +60,16 @@ let urls_ = if urls != [] then urls else [url]; - mirrors = import ./mirrors.nix; - - # Names of the master sites that are mirrored (i.e., "sourceforge", - # "gnu", etc.). - sites = - if builtins ? attrNames - then builtins.attrNames mirrors - else [] /* backwards compatibility */; - in -stdenv.mkDerivation ({ +stdenv.mkDerivation { name = if showURLs then "urls" else if name != "" then name else baseNameOf (toString (builtins.head urls_)); + builder = ./builder.sh; + buildInputs = [curl]; urls = urls_; @@ -82,10 +99,5 @@ stdenv.mkDerivation ({ "NIX_HASHED_MIRRORS" ] ++ (map (site: "NIX_MIRRORS_${site}") sites); - inherit showURLs; + inherit showURLs mirrorsFile; } - -# Pass the mirror locations to the builder. -// mirrors - -) diff --git a/pkgs/build-support/fetchurl/write-mirror-list.sh b/pkgs/build-support/fetchurl/write-mirror-list.sh new file mode 100644 index 000000000000..55508742dd36 --- /dev/null +++ b/pkgs/build-support/fetchurl/write-mirror-list.sh @@ -0,0 +1,4 @@ +source $stdenv/setup + +# !!! this is kinda hacky. +set | grep '^[a-zA-Z]\+=.*://' > $out