diff --git a/pkgs/stdenv/default.nix b/pkgs/stdenv/default.nix index 5cfefe6b178..ab954416a5f 100644 --- a/pkgs/stdenv/default.nix +++ b/pkgs/stdenv/default.nix @@ -55,7 +55,7 @@ rec { # Linux standard environment. - stdenvLinux = (import ./linux {inherit allPackages;}).stdenvLinux; + stdenvLinux = (import ./linux {inherit system allPackages;}).stdenvLinux; # Darwin (Mac OS X) standard environment. Very simple for now diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index 4eb5862186b..f07fa0b0e12 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -4,100 +4,69 @@ # compiler and linker that do not search in default locations, # ensuring purity of components produced by it. -{allPackages}: +{system, allPackages}: rec { - system = "i686-linux"; + bootstrapTools = + if system == "i686-linux" then import ./bootstrap/i686 + else if system == "x86_64-linux" then import ./bootstrap/x86_64 + else abort "unsupported platform for the pure Linux stdenv"; # The bootstrap process proceeds in several steps. + # 1) Create a standard environment by downloading pre-built # statically linked binaries of coreutils, gcc, etc. # To fetch the pre-built binaries, we use a statically linked `curl' # binary which is unpacked here. curl = derivation { - name = "curl"; - builder = ./tools/bash; - tar = ./tools/tar; - bunzip2 = ./tools/bunzip2; - cp = ./tools/cp; - curl = ./tools/curl-7.15.1-static.tar.bz2; inherit system; - args = [ ./scripts/unpack-curl.sh ]; + name = "curl"; + builder = bootstrapTools.bash; + inherit (bootstrapTools) bunzip2 cp curl; + args = [ ./new-scripts/unpack-curl.sh ]; }; # This function downloads a file. - download = {url, md5, pkgname}: derivation { + download = {url, sha1, pkgname}: derivation { name = baseNameOf (toString url); - builder = ./tools/bash; + builder = bootstrapTools.bash; inherit system curl url; - args = [ ./scripts/download.sh ]; - - # Nix 0.8 fixed-output derivations. - outputHashAlgo = "md5"; - outputHash = md5; - - # Compatibility with Nix <= 0.7. - id = md5; + args = [ ./new-scripts/download.sh ]; + outputHashAlgo = "sha1"; + outputHash = sha1; }; # This function downloads and unpacks a file. - downloadAndUnpack = - { url, md5, pkgname, postProcess ? [], addToPath ? [] - , extra ? null, extra2 ? null - , extra3 ? null, extra4? null, patchelf ? null}: - derivation { + downloadAndUnpack = pkgname: {url, sha1}: derivation { name = pkgname; - builder = ./tools/bash; - tar = ./tools/tar; - bunzip2 = ./tools/bunzip2; - cp = ./tools/cp; - args = [ ./scripts/unpack.sh ]; - tarball = download {inherit url md5 pkgname;}; - inherit system postProcess addToPath extra extra2 extra3 extra4 patchelf; + builder = bootstrapTools.bash; + inherit (bootstrapTools) bunzip2 tar cp; + args = [ ./new-scripts/unpack.sh ]; + tarball = download {inherit url sha1 pkgname;}; + inherit system; + allowedReferences = []; }; # The various statically linked components that make up the standard # environment. - staticTools = downloadAndUnpack { - url = http://nix.cs.uu.nl/dist/tarballs/stdenv-linux/static-tools.tar.bz2; - pkgname = "static-tools"; - md5 = "90578c603079313123e8c754a85e40d7"; - }; - - binutils = downloadAndUnpack { - url = http://nix.cs.uu.nl/dist/tarballs/stdenv-linux/binutils-2.15-static.tar.bz2; - pkgname = "binutils"; - md5 = "9c134038b7f1894a4b307d600207047c"; - }; - - staticGCC = (downloadAndUnpack { - url = http://nix.cs.uu.nl/dist/tarballs/stdenv-linux/gcc-3.4.2-static.tar.bz2; - pkgname = "gcc"; - md5 = "600452fac470a49a41ea81d39c209f35"; - postProcess = [./scripts/fix-outpath.sh]; - addToPath = [staticTools]; - }) // { langC = true; langCC = false; langF77 = false; }; - - glibc = downloadAndUnpack { - url = http://nix.cs.uu.nl/dist/tarballs/stdenv-linux/glibc-2.3.3-static.tar.bz2; - pkgname = "glibc"; - md5 = "36ff244e666c60784edfe1cc66f68e4c"; - postProcess = [./scripts/fix-outpath.sh]; - addToPath = [staticTools]; - }; + staticTools = downloadAndUnpack "static-tools" bootstrapTools.staticToolsURL; + staticBinutils = downloadAndUnpack "static-binutils" bootstrapTools.binutilsURL; + staticGCC = (downloadAndUnpack "static-gcc" bootstrapTools.gccURL) + // { langC = true; langCC = false; langF77 = false; }; + staticGlibc = downloadAndUnpack "static-glibc" bootstrapTools.glibcURL; # A helper function to call gcc-wrapper. wrapGCC = - {gcc ? staticGCC, glibc, binutils, shell ? ""}: + {gcc ? staticGCC, libc, binutils, shell ? ""}: (import ../../build-support/gcc-wrapper) { nativeTools = false; - nativeGlibc = false; - inherit gcc binutils glibc shell; + nativeLibc = false; + inherit gcc binutils libc shell; stdenv = stdenvInitial; }; @@ -108,18 +77,18 @@ rec { stdenvInitial = let { body = derivation { name = "stdenv-linux-initial"; - builder = ./tools/bash; - args = [ ./scripts/builder-stdenv-initial.sh ]; - inherit system staticTools; + builder = bootstrapTools.bash; + args = [ ./new-scripts/builder-stdenv-initial.sh ]; + inherit system staticTools curl; } // { # !!! too much duplication with stdenv/generic/default.nix mkDerivation = attrs: (derivation ((removeAttrs attrs ["meta"]) // { - builder = ./tools/bash; + builder = bootstrapTools.bash; args = ["-e" attrs.builder]; stdenv = body; system = body.system; })) // { meta = if attrs ? meta then attrs.meta else {}; }; - shell = ./tools/bash; + shell = bootstrapTools.bash; }; }; @@ -132,9 +101,9 @@ rec { import ../generic { name = "stdenv-linux-boot"; param1 = if staticGlibc then "static" else "dynamic"; - preHook = ./prehook.sh; + preHook = ./new-scripts/prehook.sh; stdenv = stdenvInitial; - shell = ./tools/bash; + shell = bootstrapTools.bash; initialPath = [ staticTools ]; @@ -147,10 +116,11 @@ rec { # the gcc configure script happy. stdenvLinuxBoot1 = stdenvBootFun { # Use the statically linked, downloaded glibc/gcc/binutils. - gcc = wrapGCC {inherit glibc binutils;}; + gcc = wrapGCC {libc = staticGlibc; binutils = staticBinutils;}; 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). @@ -159,25 +129,29 @@ rec { bootStdenv = stdenvLinuxBoot1; }; + # 3) Build Glibc with the statically linked tools. The result is the # full, dynamically linked, final Glibc. - stdenvLinuxGlibc = stdenvLinuxBoot1Pkgs.glibc; + stdenvLinuxGlibc = stdenvLinuxBoot1Pkgs.glibcNew; + # 4) Construct a second stdenv identical to the first, except that # this one uses the Glibc built in step 3. It still uses # statically linked tools. stdenvLinuxBoot2 = removeAttrs (stdenvBootFun { staticGlibc = false; - gcc = wrapGCC {inherit binutils; glibc = stdenvLinuxGlibc;}; + gcc = wrapGCC {binutils = staticBinutils; libc = stdenvLinuxGlibc;}; extraAttrs = {inherit curl; glibc = stdenvLinuxGlibc;}; }) ["gcc" "binutils"]; + # 5) The packages that can be built using the second stdenv. stdenvLinuxBoot2Pkgs = allPackages { inherit system; bootStdenv = stdenvLinuxBoot2; }; + # 6) Construct a third stdenv identical to the second, except that # this one uses the dynamically linked GCC and Binutils from step # 5. The other tools (e.g. coreutils) are still static. @@ -185,24 +159,26 @@ rec { staticGlibc = false; gcc = wrapGCC { inherit (stdenvLinuxBoot2Pkgs) binutils; - glibc = stdenvLinuxGlibc; + libc = stdenvLinuxGlibc; gcc = stdenvLinuxBoot2Pkgs.gcc.gcc; }; extraAttrs = {inherit curl;}; }; + # 7) The packages that can be built using the third stdenv. stdenvLinuxBoot3Pkgs = allPackages { inherit system; bootStdenv = stdenvLinuxBoot3; }; + # 8) Construct the final stdenv. It uses the Glibc, GCC and # Binutils built above, and adds in dynamically linked versions # of all other tools. stdenvLinux = (import ../generic) { name = "stdenv-linux"; - preHook = ./prehook.sh; + preHook = ./new-scripts/prehook.sh; initialPath = [ ((import ../common-path.nix) {pkgs = stdenvLinuxBoot3Pkgs;}) stdenvLinuxBoot3Pkgs.patchelf @@ -212,7 +188,7 @@ rec { gcc = wrapGCC { inherit (stdenvLinuxBoot2Pkgs) binutils; - glibc = stdenvLinuxGlibc; + libc = stdenvLinuxGlibc; gcc = stdenvLinuxBoot2Pkgs.gcc.gcc; shell = stdenvLinuxBoot3Pkgs.bash + "/bin/sh"; }; diff --git a/pkgs/stdenv/linux/new.nix b/pkgs/stdenv/linux/new.nix deleted file mode 100644 index f07fa0b0e12..00000000000 --- a/pkgs/stdenv/linux/new.nix +++ /dev/null @@ -1,207 +0,0 @@ -# This file constructs the standard build environment for the -# Linux/i686 platform. It's completely pure; that is, it relies on no -# external (non-Nix) tools, such as /usr/bin/gcc, and it contains a C -# compiler and linker that do not search in default locations, -# ensuring purity of components produced by it. - -{system, allPackages}: - -rec { - - bootstrapTools = - if system == "i686-linux" then import ./bootstrap/i686 - else if system == "x86_64-linux" then import ./bootstrap/x86_64 - else abort "unsupported platform for the pure Linux stdenv"; - - - # The bootstrap process proceeds in several steps. - - - # 1) Create a standard environment by downloading pre-built - # statically linked binaries of coreutils, gcc, etc. - - # To fetch the pre-built binaries, we use a statically linked `curl' - # binary which is unpacked here. - curl = derivation { - inherit system; - name = "curl"; - builder = bootstrapTools.bash; - inherit (bootstrapTools) bunzip2 cp curl; - args = [ ./new-scripts/unpack-curl.sh ]; - }; - - # This function downloads a file. - download = {url, sha1, pkgname}: derivation { - name = baseNameOf (toString url); - builder = bootstrapTools.bash; - inherit system curl url; - args = [ ./new-scripts/download.sh ]; - outputHashAlgo = "sha1"; - outputHash = sha1; - }; - - # This function downloads and unpacks a file. - downloadAndUnpack = pkgname: {url, sha1}: derivation { - name = pkgname; - builder = bootstrapTools.bash; - inherit (bootstrapTools) bunzip2 tar cp; - args = [ ./new-scripts/unpack.sh ]; - tarball = download {inherit url sha1 pkgname;}; - inherit system; - allowedReferences = []; - }; - - # The various statically linked components that make up the standard - # environment. - staticTools = downloadAndUnpack "static-tools" bootstrapTools.staticToolsURL; - staticBinutils = downloadAndUnpack "static-binutils" bootstrapTools.binutilsURL; - staticGCC = (downloadAndUnpack "static-gcc" bootstrapTools.gccURL) - // { langC = true; langCC = false; langF77 = false; }; - staticGlibc = downloadAndUnpack "static-glibc" bootstrapTools.glibcURL; - - - # A helper function to call gcc-wrapper. - wrapGCC = - {gcc ? staticGCC, libc, binutils, shell ? ""}: - (import ../../build-support/gcc-wrapper) { - nativeTools = false; - nativeLibc = false; - inherit gcc binutils libc shell; - stdenv = stdenvInitial; - }; - - - # The "fake" standard environment used to build "real" standard - # environments. It consists of just the basic statically linked - # tools. - stdenvInitial = let { - body = derivation { - name = "stdenv-linux-initial"; - builder = bootstrapTools.bash; - args = [ ./new-scripts/builder-stdenv-initial.sh ]; - inherit system staticTools curl; - } // { - # !!! too much duplication with stdenv/generic/default.nix - mkDerivation = attrs: (derivation ((removeAttrs attrs ["meta"]) // { - builder = bootstrapTools.bash; - args = ["-e" attrs.builder]; - stdenv = body; - system = body.system; - })) // { meta = if attrs ? meta then attrs.meta else {}; }; - shell = bootstrapTools.bash; - }; - }; - - - # This function builds the various standard environments used during - # the bootstrap. - stdenvBootFun = - {gcc, staticGlibc, extraAttrs ? {}}: - - import ../generic { - name = "stdenv-linux-boot"; - param1 = if staticGlibc then "static" else "dynamic"; - preHook = ./new-scripts/prehook.sh; - stdenv = stdenvInitial; - shell = bootstrapTools.bash; - initialPath = [ - staticTools - ]; - inherit gcc extraAttrs; - }; - - - # Create the first "real" standard environment. This one consists - # of statically linked components only, and a minimal glibc to keep - # the gcc configure script happy. - stdenvLinuxBoot1 = stdenvBootFun { - # Use the statically linked, downloaded glibc/gcc/binutils. - gcc = wrapGCC {libc = staticGlibc; binutils = staticBinutils;}; - 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 { - inherit system; - bootStdenv = stdenvLinuxBoot1; - }; - - - # 3) Build Glibc with the statically linked tools. The result is the - # full, dynamically linked, final Glibc. - stdenvLinuxGlibc = stdenvLinuxBoot1Pkgs.glibcNew; - - - # 4) Construct a second stdenv identical to the first, except that - # this one uses the Glibc built in step 3. It still uses - # statically linked tools. - stdenvLinuxBoot2 = removeAttrs (stdenvBootFun { - staticGlibc = false; - gcc = wrapGCC {binutils = staticBinutils; libc = stdenvLinuxGlibc;}; - extraAttrs = {inherit curl; glibc = stdenvLinuxGlibc;}; - }) ["gcc" "binutils"]; - - - # 5) The packages that can be built using the second stdenv. - stdenvLinuxBoot2Pkgs = allPackages { - inherit system; - bootStdenv = stdenvLinuxBoot2; - }; - - - # 6) Construct a third stdenv identical to the second, except that - # this one uses the dynamically linked GCC and Binutils from step - # 5. The other tools (e.g. coreutils) are still static. - stdenvLinuxBoot3 = stdenvBootFun { - staticGlibc = false; - gcc = wrapGCC { - inherit (stdenvLinuxBoot2Pkgs) binutils; - libc = stdenvLinuxGlibc; - gcc = stdenvLinuxBoot2Pkgs.gcc.gcc; - }; - extraAttrs = {inherit curl;}; - }; - - - # 7) The packages that can be built using the third stdenv. - stdenvLinuxBoot3Pkgs = allPackages { - inherit system; - bootStdenv = stdenvLinuxBoot3; - }; - - - # 8) Construct the final stdenv. It uses the Glibc, GCC and - # Binutils built above, and adds in dynamically linked versions - # of all other tools. - stdenvLinux = (import ../generic) { - name = "stdenv-linux"; - preHook = ./new-scripts/prehook.sh; - initialPath = [ - ((import ../common-path.nix) {pkgs = stdenvLinuxBoot3Pkgs;}) - stdenvLinuxBoot3Pkgs.patchelf - ]; - - stdenv = stdenvInitial; - - gcc = wrapGCC { - inherit (stdenvLinuxBoot2Pkgs) binutils; - libc = stdenvLinuxGlibc; - gcc = stdenvLinuxBoot2Pkgs.gcc.gcc; - shell = stdenvLinuxBoot3Pkgs.bash + "/bin/sh"; - }; - - shell = stdenvLinuxBoot3Pkgs.bash + "/bin/sh"; - - extraAttrs = { - curl = stdenvLinuxBoot3Pkgs.realCurl; - inherit (stdenvLinuxBoot2Pkgs) binutils /* gcc */ glibc; - inherit (stdenvLinuxBoot3Pkgs) - gzip bzip2 bash coreutils diffutils findutils gawk - gnumake gnused gnutar gnugrep patch patchelf; - }; - }; - -} diff --git a/pkgs/stdenv/linux/prehook.sh b/pkgs/stdenv/linux/prehook.sh deleted file mode 100644 index 4ba81f1eef7..00000000000 --- a/pkgs/stdenv/linux/prehook.sh +++ /dev/null @@ -1,8 +0,0 @@ -export NIX_ENFORCE_PURITY=1 - -if test "$param1" = "static"; then - export NIX_CFLAGS_LINK="-static" - export NIX_LDFLAGS_BEFORE="-static" -fi - -havePatchELF=1 diff --git a/pkgs/stdenv/linux/scripts/builder-stdenv-initial.sh b/pkgs/stdenv/linux/scripts/builder-stdenv-initial.sh deleted file mode 100644 index 87de17817fd..00000000000 --- a/pkgs/stdenv/linux/scripts/builder-stdenv-initial.sh +++ /dev/null @@ -1,9 +0,0 @@ -set -e - -PATH=$staticTools/bin - -mkdir $out - -cat > $out/setup < "$out" diff --git a/pkgs/stdenv/linux/scripts/fix-outpath.sh b/pkgs/stdenv/linux/scripts/fix-outpath.sh deleted file mode 100644 index e6dc1139bb5..00000000000 --- a/pkgs/stdenv/linux/scripts/fix-outpath.sh +++ /dev/null @@ -1,9 +0,0 @@ -cd $out - -chmod -R +w . - -find . -type f | while read fn; do - cat $fn | sed "s|/nix/store/[a-z0-9]*-|/nix/store/ffffffffffffffffffffffffffffffff-|g" > $fn.tmp - if test -x $fn; then chmod +x $fn.tmp; fi - mv $fn.tmp $fn -done diff --git a/pkgs/stdenv/linux/scripts/unpack-curl.sh b/pkgs/stdenv/linux/scripts/unpack-curl.sh deleted file mode 100644 index 1761bce1a6a..00000000000 --- a/pkgs/stdenv/linux/scripts/unpack-curl.sh +++ /dev/null @@ -1,8 +0,0 @@ -set -x -set -e - -echo $curl - -$bunzip2 -d < $curl | $tar xvf - - -$cp -prvd * $out diff --git a/pkgs/stdenv/linux/scripts/unpack.sh b/pkgs/stdenv/linux/scripts/unpack.sh deleted file mode 100644 index 6ba1f1bddd8..00000000000 --- a/pkgs/stdenv/linux/scripts/unpack.sh +++ /dev/null @@ -1,14 +0,0 @@ -set -e - -$bunzip2 -d < $tarball | $tar xvf - - -$cp -prd * $out - -if test -n "$postProcess"; then - for i in $addToPath; do - export PATH=$PATH:$i/bin - done - for i in $postProcess; do - source $i - done -fi diff --git a/pkgs/stdenv/linux/tools/bash b/pkgs/stdenv/linux/tools/bash deleted file mode 100755 index 77ff01cf186..00000000000 Binary files a/pkgs/stdenv/linux/tools/bash and /dev/null differ diff --git a/pkgs/stdenv/linux/tools/bunzip2 b/pkgs/stdenv/linux/tools/bunzip2 deleted file mode 100755 index 14fbed32a09..00000000000 Binary files a/pkgs/stdenv/linux/tools/bunzip2 and /dev/null differ diff --git a/pkgs/stdenv/linux/tools/cp b/pkgs/stdenv/linux/tools/cp deleted file mode 100755 index b5974d88350..00000000000 Binary files a/pkgs/stdenv/linux/tools/cp and /dev/null differ diff --git a/pkgs/stdenv/linux/tools/curl-7.15.1-static.tar.bz2 b/pkgs/stdenv/linux/tools/curl-7.15.1-static.tar.bz2 deleted file mode 100644 index 99672789c7b..00000000000 Binary files a/pkgs/stdenv/linux/tools/curl-7.15.1-static.tar.bz2 and /dev/null differ diff --git a/pkgs/stdenv/linux/tools/tar b/pkgs/stdenv/linux/tools/tar deleted file mode 100755 index a001a9c9884..00000000000 Binary files a/pkgs/stdenv/linux/tools/tar and /dev/null differ