From 07bc3fbf002a802c5e0c57c9700c4c8b693ff212 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 9 Feb 2006 17:04:18 +0000 Subject: [PATCH] * Push packages from the final stdenv bootstrapping phase to all-packages. That is, an attribute like "bash" in all-packages.nix should evaluate to the "bash" used to build stdenv, it shouldn't build a new one. Hm, this would be a lot cleaner if we had lazy_rec ;-) svn path=/nixpkgs/branches/usability/; revision=4775 --- pkgs/stdenv/generic/default.nix | 11 ++++- pkgs/stdenv/linux/default.nix | 60 ++++++++++++------------- pkgs/top-level/all-packages.nix | 79 ++++++++++++++++++--------------- 3 files changed, 83 insertions(+), 67 deletions(-) diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index b25703eb9af4..5bb63f1b815d 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -1,5 +1,6 @@ { stdenv, name, preHook ? null, postHook ? null, initialPath, gcc, shell , param1 ? "", param2 ? "", param3 ? "", param4 ? "", param5 ? "" +, extraAttrs ? {} }: let { @@ -24,6 +25,7 @@ let { # Add a utility function to produce derivations that use this # stdenv and its shell. // { + mkDerivation = attrs: derivation (attrs // { builder = if attrs ? realBuilder then attrs.realBuilder else shell; args = if attrs ? args then attrs.args else @@ -31,6 +33,13 @@ let { stdenv = body; system = body.system; }); - }; + + } + + # Propagate any extra attributes. For instance, we use this to + # "lift" packages like curl from the final stdenv for Linux to + # all-packages.nix for that platform (meaning that it has a line + # like curl = if stdenv ? curl then stdenv.curl else ...). + // extraAttrs; } diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index c5b05a1f198e..3fc3c16e01fd 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -114,22 +114,26 @@ rec { # This function builds the various standard environments used during # the bootstrap. - stdenvBootFun = {glibc, gcc, binutils, staticGlibc}: (import ../generic) { - name = "stdenv-linux-boot"; - param1 = if staticGlibc then "static" else "dynamic"; - preHook = ./prehook.sh; - stdenv = stdenvInitial; - shell = ./tools/bash; - gcc = (import ../../build-support/gcc-wrapper) { + stdenvBootFun = + {glibc, gcc, binutils, staticGlibc, extraAttrs ? {}}: + + import ../generic { + name = "stdenv-linux-boot"; + param1 = if staticGlibc then "static" else "dynamic"; + preHook = ./prehook.sh; stdenv = stdenvInitial; - nativeTools = false; - nativeGlibc = false; - inherit gcc glibc binutils; + shell = ./tools/bash; + gcc = (import ../../build-support/gcc-wrapper) { + stdenv = stdenvInitial; + nativeTools = false; + nativeGlibc = false; + inherit gcc glibc binutils; + }; + initialPath = [ + staticTools + ]; + inherit extraAttrs; }; - initialPath = [ - staticTools - ]; - }; # Create the first "real" standard environment. This one consists @@ -139,13 +143,13 @@ rec { # Use the statically linked, downloaded glibc/gcc/binutils. inherit glibc gcc binutils; staticGlibc = true; + extraAttrs = {inherit curl;}; }; # 2) These are the packages that we can build with the first # stdenv. We only need Glibc (in step 3). stdenvLinuxBoot1Pkgs = allPackages { bootStdenv = stdenvLinuxBoot1; -# bootCurl = curl; }; # 3) Build Glibc with the statically linked tools. The result is the @@ -159,12 +163,12 @@ rec { glibc = stdenvLinuxGlibc; staticGlibc = false; inherit gcc binutils; + extraAttrs = {inherit curl;}; }; # 5) The packages that can be built using the second stdenv. stdenvLinuxBoot2Pkgs = allPackages { bootStdenv = stdenvLinuxBoot2; -# bootCurl = curl; }; # 6) Construct a third stdenv identical to the second, except that @@ -174,12 +178,12 @@ rec { glibc = stdenvLinuxGlibc; staticGlibc = false; inherit (stdenvLinuxBoot2Pkgs) gcc binutils; + extraAttrs = {inherit curl;}; }; # 7) The packages that can be built using the third stdenv. stdenvLinuxBoot3Pkgs = allPackages { bootStdenv = stdenvLinuxBoot3; -# bootCurl = curl; }; # 8) Construct the final stdenv. It uses the Glibc, GCC and @@ -205,20 +209,14 @@ rec { }; shell = stdenvLinuxBoot3Pkgs.bash ~ /bin/sh; + + extraAttrs = { + curl = stdenvLinuxBoot3Pkgs.realCurl; + inherit (stdenvLinuxBoot2Pkgs) binutils /* gcc */; + inherit (stdenvLinuxBoot3Pkgs) + gzip bzip2 bash coreutils diffutils findutils gawk + gnumake gnused gnutar gnugrep patch patchelf; + }; }; - # 8) Finally, the set of components built using the Linux stdenv. - # Reuse the tools built in the previous steps. - stdenvLinuxPkgs = - allPackages { - bootStdenv = stdenvLinux; -# bootCurl = stdenvLinuxBoot3Pkgs.curl; - } // - {inherit (stdenvLinuxBoot2Pkgs) binutils gcc;} // - {inherit (stdenvLinuxBoot3Pkgs) - gzip bzip2 bash coreutils diffutils findutils gawk - gnumake gnused gnutar gnugrep curl patch patchelf; - } // - {glibc = stdenvLinuxGlibc;}; - } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a88ebc862de3..a91948607c3f 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -37,6 +37,10 @@ rec { x11 = if useOldXLibs then xlibsOld.xlibs else xlibsWrapper; + ### Helper functions. + useFromStdenv = hasIt: it: alternative: if hasIt then it else alternative; + + ### STANDARD ENVIRONMENT stdenv = if bootStdenv == null then defaultStdenv else bootStdenv; @@ -47,14 +51,11 @@ rec { allPackages = import ./all-packages.nix; }).stdenv; - bootCurl = null; - ### BUILD SUPPORT fetchurl = (import ../build-support/fetchurl) { - inherit stdenv; - curl = bootCurl; + inherit stdenv curl; }; fetchsvn = (import ../build-support/fetchsvn) { @@ -76,17 +77,19 @@ rec { inherit fetchurl stdenv flex; }; - coreutils = (import ../tools/misc/coreutils) { + coreutils = useFromStdenv (stdenv ? coreutils) stdenv.coreutils + (import ../tools/misc/coreutils { inherit fetchurl stdenv; - }; + }); coreutilsDiet = (import ../tools/misc/coreutils-diet) { inherit fetchurl stdenv dietgcc perl; }; - findutils = (import ../tools/misc/findutils) { + findutils = useFromStdenv (stdenv ? findutils) stdenv.findutils + (import ../tools/misc/findutils { inherit fetchurl stdenv coreutils; - }; + }); findutilsWrapper = (import ../tools/misc/findutils-wrapper) { inherit stdenv findutils; @@ -121,27 +124,29 @@ rec { inherit fetchurl stdenv unzip jdk; }; - diffutils = (import ../tools/text/diffutils) { + diffutils = useFromStdenv (stdenv ? diffutils) stdenv.diffutils + (import ../tools/text/diffutils { inherit fetchurl stdenv coreutils; - }; + }); gnupatch = (import ../tools/text/gnupatch) { inherit fetchurl stdenv; }; - patch = if stdenv.system == "powerpc-darwin" then null else gnupatch; + patch = useFromStdenv (stdenv ? patch) stdenv.patch + (if stdenv.system == "powerpc-darwin" then null else gnupatch); - gnused = (import ../tools/text/gnused) { + gnused = useFromStdenv (stdenv ? gnused) stdenv.gnused (import ../tools/text/gnused { inherit fetchurl stdenv; - }; + }); - gnugrep = (import ../tools/text/gnugrep) { + gnugrep = useFromStdenv (stdenv ? gnugrep) stdenv.gnugrep (import ../tools/text/gnugrep { inherit fetchurl stdenv pcre; - }; + }); - gawk = (import ../tools/text/gawk) { + gawk = useFromStdenv (stdenv ? gawk) stdenv.gawk (import ../tools/text/gawk { inherit fetchurl stdenv; - }; + }); groff = (import ../tools/text/groff) { inherit fetchurl stdenv; @@ -181,9 +186,9 @@ rec { inherit fetchurl stdenv; }; - gnutar = (import ../tools/archivers/gnutar) { + gnutar = useFromStdenv (stdenv ? gnutar) stdenv.gnutar (import ../tools/archivers/gnutar { inherit fetchurl stdenv; - }; + }); gnutarDiet = (import ../tools/archivers/gnutar-diet) { inherit fetchurl stdenv dietgcc; @@ -197,13 +202,13 @@ rec { inherit fetchurl stdenv; }; - gzip = (import ../tools/compression/gzip) { + gzip = useFromStdenv (stdenv ? gzip) stdenv.gzip (import ../tools/compression/gzip { inherit fetchurl stdenv; - }; + }); - bzip2 = (import ../tools/compression/bzip2) { + bzip2 = useFromStdenv (stdenv ? bzip2) stdenv.bzip2 (import ../tools/compression/bzip2 { inherit fetchurl stdenv; - }; + }); zdelta = (import ../tools/compression/zdelta) { inherit fetchurl stdenv; @@ -221,7 +226,9 @@ rec { inherit fetchurl stdenv; }; - curl = (import ../tools/networking/curl) { + curl = useFromStdenv (stdenv ? curl) stdenv.curl realCurl; + + realCurl = (import ../tools/networking/curl) { inherit fetchurl stdenv zlib; }; @@ -331,9 +338,9 @@ rec { ### SHELLS - bash = (import ../shells/bash) { + bash = useFromStdenv (stdenv ? bash) stdenv.bash (import ../shells/bash { inherit fetchurl stdenv; - }; + }); tcsh = (import ../shells/tcsh) { inherit fetchurl stdenv ncurses; @@ -346,9 +353,10 @@ rec { ### DEVELOPMENT - binutils = (import ../development/tools/misc/binutils) { + binutils = useFromStdenv (stdenv ? binutils) stdenv.binutils + (import ../development/tools/misc/binutils { inherit fetchurl stdenv noSysDirs; - }; + }); binutilsMips = (import ../development/tools/misc/binutils-cross) { inherit fetchurl stdenv noSysDirs; @@ -365,7 +373,8 @@ rec { cross = "sparc-linux"; }; - patchelf = (import ../development/tools/misc/patchelf) { + patchelf = useFromStdenv (stdenv ? patchelf) stdenv.patchelf + (import ../development/tools/misc/patchelf) { inherit fetchurl stdenv; }; @@ -458,9 +467,10 @@ rec { inherit fetchurl stdenv readline ncurses g77 perl flex; }; - gnumake = (import ../development/tools/build-managers/gnumake) { + gnumake = useFromStdenv (stdenv ? gnumake) stdenv.gnumake + (import ../development/tools/build-managers/gnumake { inherit fetchurl stdenv; - }; + }); mk = (import ../development/tools/build-managers/mk) { inherit fetchurl stdenv; @@ -2233,14 +2243,12 @@ rec { }; #nixStatic = (import ../misc/nix-static) { - # inherit fetchurl stdenv aterm perl; - # curl = bootCurl; /* !!! ugly */ + # inherit fetchurl stdenv aterm perl curl; # bdb = db4; #}; nix = (import ../misc/nix) { - inherit fetchurl stdenv aterm perl; - curl = bootCurl; /* !!! ugly */ + inherit fetchurl stdenv aterm perl curl; bdb = db4; }; @@ -2272,4 +2280,5 @@ rec { joe = (import ../applications/editors/joe) { inherit stdenv fetchurl; }; + }