From 1134464c49ab056a52d8ddd8babd5c2888abbd5b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 16 Jan 2009 17:10:29 +0000 Subject: [PATCH] * Start of the new, simplified stdenv-linux bootstrap binaries. Instead of using a mishmash of statically linked and dietlibc programs (which often have problems on various platforms), we just use normal, dynamically linked binaries, and use some patchelf magic to rewrite them so that they can find Glibc. Also include G++ and Perl, since there are some builds in the bootstrap that need them. svn path=/nixpkgs/branches/stdenv-updates/; revision=13788 --- pkgs/stdenv/linux/test.nix | 186 +++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 pkgs/stdenv/linux/test.nix diff --git a/pkgs/stdenv/linux/test.nix b/pkgs/stdenv/linux/test.nix new file mode 100644 index 000000000000..209ec651e1d2 --- /dev/null +++ b/pkgs/stdenv/linux/test.nix @@ -0,0 +1,186 @@ +{system ? builtins.currentSystem}: + +with import ../../top-level/all-packages.nix {inherit system;}; + +rec { + + + # We want coreutils without ACL support. + coreutils_ = coreutils.function (args: { + aclSupport = false; + }); + + + build = + + stdenv.mkDerivation { + name = "build"; + + buildInputs = [nukeReferences]; + + buildCommand = '' + ensureDir $out/bin $out/lib $out/libexec + + # Copy what we need of Glibc. + cp -d ${glibc}/lib/ld-*.so* $out/lib + cp -d ${glibc}/lib/libc*.so* $out/lib + cp -d ${glibc}/lib/libc_nonshared.a $out/lib + cp -d ${glibc}/lib/libm*.so* $out/lib + cp -d ${glibc}/lib/libdl*.so* $out/lib + cp -d ${glibc}/lib/librt*.so* $out/lib + cp -d ${glibc}/lib/libpthread*.so* $out/lib + cp -d ${glibc}/lib/libnsl*.so* $out/lib + cp -d ${glibc}/lib/libutil*.so* $out/lib + cp -d ${glibc}/lib/crt?.o $out/lib + + cp -rL ${glibc}/include $out + chmod -R u+w $out/include + + # Hopefully we won't need these. + rm -rf $out/include/mtd $out/include/rdma $out/include/sound $out/include/video + + # Copy coreutils, bash, etc. + cp ${coreutils_}/bin/* $out/bin + (cd $out/bin && rm vdir dir sha*sum pinky factor pathchk runcon shuf who whoami shred users) + + cp ${bash}/bin/bash $out/bin + cp ${findutils}/bin/find $out/bin + cp ${findutils}/bin/xargs $out/bin + cp -d ${diffutils}/bin/* $out/bin + cp -d ${gnused}/bin/* $out/bin + cp -d ${gnugrep}/bin/* $out/bin + cp ${gawk}/bin/gawk $out/bin + cp -d ${gawk}/bin/awk $out/bin + cp ${gnutar}/bin/tar $out/bin + cp ${gzip}/bin/gzip $out/bin + cp ${bzip2}/bin/bzip2 $out/bin + cp -d ${gnumake}/bin/* $out/bin + cp -d ${patch}/bin/* $out/bin + cp ${patchelf}/bin/* $out/bin + cp ${replace}/bin/* $out/bin + + cp -d ${gnugrep.pcre}/lib/libpcre*.so* $out/lib # needed by grep + + # Copy what we need of gcc. + cp -d ${gcc.gcc}/bin/gcc $out/bin + cp -d ${gcc.gcc}/bin/cpp $out/bin + cp -d ${gcc.gcc}/bin/g++ $out/bin + cp -d ${gcc.gcc}/lib/libgcc_s.so* $out/lib + cp -d ${gcc.gcc}/lib/libstdc++.so* $out/lib + cp -rd ${gcc.gcc}/lib/gcc $out/lib + chmod -R u+w $out/lib + rm -f $out/lib/gcc/*/*/include/linux + rm -f $out/lib/gcc/*/*/include/sound + cp -rd ${gcc.gcc}/libexec/* $out/libexec + cp -rd ${gcc.gcc}/include/c++ $out/include + + # Copy binutils. + for i in as ld ar ranlib nm strip readelf objdump; do + cp ${binutils}/bin/$i $out/bin + done + + # Copy perl. + cp ${perl}/bin/perl $out/bin + + chmod -R u+w $out + + # Strip executables even further. + for i in $out/bin/* $out/libexec/gcc/*/*/*; do + if test -x $i -a ! -L $i; then + chmod +w $i + strip -s $i || true + fi + done + + nuke-refs $out/bin/* + nuke-refs $out/lib/* + nuke-refs $out/libexec/gcc/*/*/* + + sleep 5 + (cd $out && tar cvfj $out/static-tools.tar.bz2 bin lib libexec include) + ''; # */ + + # The result should not contain any references (store paths) so + # that we can safely copy them out of the store and to other + # locations in the store. + allowedReferences = []; + }; + + + unpack = + + stdenv.mkDerivation { + name = "unpack"; + + buildCommand = '' + tar xvfj ${build}/static-tools.tar.bz2 + cp -prd . $out + rm $out/env-vars + + for i in $out/bin/* $out/libexec/gcc/*/*/*; do + echo patching $i + if ! test -L $i; then + LD_LIBRARY_PATH=$out/lib $out/lib/ld-linux.so.2 \ + $out/bin/patchelf --set-interpreter $out/lib/ld-linux.so.2 --set-rpath $out/lib $i + fi + done + + # Fix the libc linker script. + for i in $out/lib/libc.so; do + cat $i | sed "s|/nix/store/e*-[^/]*/|$out/|g" > $i.tmp + mv $i.tmp $i + done + ''; # */ + + allowedReferences = ["out"]; + }; + + + test = + + stdenv.mkDerivation { + name = "test"; + + LD_LIBRARY_PATH = "${unpack}/lib"; + + realBuilder = "${unpack}/bin/bash"; + + buildCommand = '' + export PATH=${unpack}/bin + ls -l + mkdir $out + mkdir $out/bin + sed --version + find --version + diff --version + patch --version + make --version + awk --version + grep --version + gcc --version + + perl -e 'print 1 + 2, "\n";' + + export CPP="cpp -B${unpack}" + export CC="gcc -B${unpack} -Wl,-dynamic-linker,${unpack}/lib/ld-linux.so.2 -Wl,-rpath,${unpack}/lib" + export CXX="g++ -B${unpack} -Wl,-dynamic-linker,${unpack}/lib/ld-linux.so.2 -Wl,-rpath,${unpack}/lib" + + echo '#include ' >> foo.c + echo 'int main() { printf("Hello World\n"); return 0; }' >> foo.c + $CC -o $out/bin/foo foo.c + $out/bin/foo + + echo '#include ' >> bar.cc + echo 'int main() { std::cout << "Hello World\n"; }' >> bar.cc + $CXX -o $out/bin/bar bar.cc + $out/bin/bar + + tar xvf ${hello.src} + cd hello-* + ./configure --prefix=$out || cat config.log + make + make install + ''; # */ + }; + +}