From 48cea0d01ef48733ab38a73a20611f63aeb1b5cc Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 3 Jan 2012 00:16:29 +0000 Subject: [PATCH] * Refactoring: Get rid of a few subdirectories in corepkgs/, and some other simplifications. * Use to locate the corepkgs. This allows them to be overriden through $NIX_PATH. * Use bash's pipefail option in the NAR builder so that we don't need to create a temporary file. --- corepkgs/Makefile.am | 12 +++++++- .../{buildenv/default.nix => buildenv.nix} | 7 +++-- .../{buildenv/builder.pl.in => buildenv.pl} | 2 -- corepkgs/buildenv/Makefile.am | 11 ------- corepkgs/nar.nix | 30 +++++++++++++++++++ corepkgs/nar/Makefile.am | 11 ------- corepkgs/nar/nar.nix | 7 ----- corepkgs/nar/nar.sh.in | 12 -------- scripts/nix-push.in | 5 +--- src/nix-env/user-env.cc | 2 +- tests/common.sh.in | 7 +---- tests/init.sh | 24 --------------- tests/lang.sh | 2 +- tests/lang/eval-okay-search-path.nix | 2 +- tests/user-envs.sh | 2 +- 15 files changed, 52 insertions(+), 84 deletions(-) rename corepkgs/{buildenv/default.nix => buildenv.nix} (81%) rename corepkgs/{buildenv/builder.pl.in => buildenv.pl} (99%) mode change 100755 => 100644 delete mode 100644 corepkgs/buildenv/Makefile.am create mode 100644 corepkgs/nar.nix delete mode 100644 corepkgs/nar/Makefile.am delete mode 100644 corepkgs/nar/nar.nix delete mode 100644 corepkgs/nar/nar.sh.in diff --git a/corepkgs/Makefile.am b/corepkgs/Makefile.am index b303a30eb..7f43a700e 100644 --- a/corepkgs/Makefile.am +++ b/corepkgs/Makefile.am @@ -1 +1,11 @@ -SUBDIRS = nar buildenv channels +SUBDIRS = channels + +all-local: config.nix + +install-exec-local: + $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs + $(INSTALL_DATA) config.nix $(srcdir)/nar.nix $(srcdir)/buildenv.nix $(srcdir)/buildenv.pl $(DESTDIR)$(datadir)/nix/corepkgs + +include ../substitute.mk + +EXTRA_DIST = config.nix.in nar.nix buildenv.nix buildenv.pl diff --git a/corepkgs/buildenv/default.nix b/corepkgs/buildenv.nix similarity index 81% rename from corepkgs/buildenv/default.nix rename to corepkgs/buildenv.nix index d76f52740..6e2bee10b 100644 --- a/corepkgs/buildenv/default.nix +++ b/corepkgs/buildenv.nix @@ -1,9 +1,12 @@ -{system, derivations, manifest}: +with import ; + +{ system, derivations, manifest }: derivation { name = "user-environment"; system = system; - builder = ./builder.pl; + builder = perl; + args = [ "-w" ./buildenv.pl ]; manifest = manifest; diff --git a/corepkgs/buildenv/builder.pl.in b/corepkgs/buildenv.pl old mode 100755 new mode 100644 similarity index 99% rename from corepkgs/buildenv/builder.pl.in rename to corepkgs/buildenv.pl index 86abe0ca1..52a703c06 --- a/corepkgs/buildenv/builder.pl.in +++ b/corepkgs/buildenv.pl @@ -1,5 +1,3 @@ -#! @perl@ -w - use strict; use Cwd; use IO::Handle; diff --git a/corepkgs/buildenv/Makefile.am b/corepkgs/buildenv/Makefile.am deleted file mode 100644 index eeab538ab..000000000 --- a/corepkgs/buildenv/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -all-local: builder.pl - -install-exec-local: - $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs - $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs/buildenv - $(INSTALL_DATA) $(srcdir)/default.nix $(DESTDIR)$(datadir)/nix/corepkgs/buildenv - $(INSTALL_PROGRAM) builder.pl $(DESTDIR)$(datadir)/nix/corepkgs/buildenv - -include ../../substitute.mk - -EXTRA_DIST = default.nix builder.pl.in diff --git a/corepkgs/nar.nix b/corepkgs/nar.nix new file mode 100644 index 000000000..70a4af2f9 --- /dev/null +++ b/corepkgs/nar.nix @@ -0,0 +1,30 @@ +with import ; + +let + + builder = builtins.toFile "nar.sh" + '' + export PATH=${nixBinDir}:${coreutils} + + echo "packing ‘$storePath’..." + mkdir $out + dst=$out/tmp.nar.bz2 + + set -o pipefail + nix-store --dump "$storePath" | ${bzip2} > $dst + + nix-hash --flat --type $hashAlgo --base32 $dst > $out/narbz2-hash + + mv $out/tmp.nar.bz2 $out/$(cat $out/narbz2-hash).nar.bz2 + ''; + +in + +{ system, storePath, hashAlgo }: + +derivation { + name = "nar"; + builder = shell; + args = [ "-e" builder ]; + inherit system storePath hashAlgo; +} diff --git a/corepkgs/nar/Makefile.am b/corepkgs/nar/Makefile.am deleted file mode 100644 index 103051e22..000000000 --- a/corepkgs/nar/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -all-local: nar.sh - -install-exec-local: - $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs - $(INSTALL) -d $(DESTDIR)$(datadir)/nix/corepkgs/nar - $(INSTALL_DATA) $(srcdir)/nar.nix $(DESTDIR)$(datadir)/nix/corepkgs/nar - $(INSTALL_PROGRAM) nar.sh $(DESTDIR)$(datadir)/nix/corepkgs/nar - -include ../../substitute.mk - -EXTRA_DIST = nar.nix nar.sh.in diff --git a/corepkgs/nar/nar.nix b/corepkgs/nar/nar.nix deleted file mode 100644 index d3d799998..000000000 --- a/corepkgs/nar/nar.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ system, storePath, hashAlgo }: - -derivation { - name = "nar"; - builder = ./nar.sh; - inherit system storePath hashAlgo; -} diff --git a/corepkgs/nar/nar.sh.in b/corepkgs/nar/nar.sh.in deleted file mode 100644 index 1369d3a21..000000000 --- a/corepkgs/nar/nar.sh.in +++ /dev/null @@ -1,12 +0,0 @@ -#! @shell@ -e - -echo "packing $storePath into $out..." -@coreutils@/mkdir $out -dst=$out/tmp.nar.bz2 -@bindir@/nix-store --dump "$storePath" > tmp - -@bzip2@ < tmp > $dst - -@bindir@/nix-hash --flat --type $hashAlgo --base32 $dst > $out/narbz2-hash - -@coreutils@/mv $out/tmp.nar.bz2 $out/$(@coreutils@/cat $out/narbz2-hash).nar.bz2 diff --git a/scripts/nix-push.in b/scripts/nix-push.in index cf46d00df..cb7a478ba 100755 --- a/scripts/nix-push.in +++ b/scripts/nix-push.in @@ -20,9 +20,6 @@ $curl = "$curl $extraCurlFlags" if defined $extraCurlFlags; my $binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@"; -my $dataDir = $ENV{"NIX_DATA_DIR"}; -$dataDir = "@datadir@" unless defined $dataDir; - # Parse the command line. my $localCopy; @@ -107,7 +104,7 @@ foreach my $storePath (@storePaths) { # Construct a Nix expression that creates a Nix archive. my $nixexpr = - "((import $dataDir/nix/corepkgs/nar/nar.nix) " . + "(import " . "{ storePath = builtins.storePath \"$storePath\"; system = \"@system@\"; hashAlgo = \"$hashAlgo\"; }) "; print NIX $nixexpr; diff --git a/src/nix-env/user-env.cc b/src/nix-env/user-env.cc index 670052bcb..0dcdcc0d1 100644 --- a/src/nix-env/user-env.cc +++ b/src/nix-env/user-env.cc @@ -112,7 +112,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, /* Get the environment builder expression. */ Value envBuilder; - state.evalFile(nixDataDir + "/nix/corepkgs/buildenv", envBuilder); + state.evalFile(state.findFile("nix/buildenv.nix"), envBuilder); /* Construct a Nix expression that calls the user environment builder with the manifest as argument. */ diff --git a/tests/common.sh.in b/tests/common.sh.in index 4ab490a62..7504dc059 100644 --- a/tests/common.sh.in +++ b/tests/common.sh.in @@ -9,7 +9,6 @@ if ! NIX_STORE_DIR=$(readlink -f $TEST_ROOT/store 2> /dev/null); then export NIX_IGNORE_SYMLINK_STORE=1 NIX_STORE_DIR=$TEST_ROOT/store fi -export NIX_DATA_DIR=$TEST_ROOT/data export NIX_LOCALSTATE_DIR=$TEST_ROOT/var export NIX_LOG_DIR=$TEST_ROOT/var/log/nix export NIX_STATE_DIR=$TEST_ROOT/var/nix @@ -19,15 +18,11 @@ export NIX_BIN_DIR=$TEST_ROOT/bin export NIX_LIBEXEC_DIR=$TEST_ROOT/bin export NIX_MANIFESTS_DIR=$TEST_ROOT/var/nix/manifests export NIX_ROOT_FINDER= +export NIX_PATH=nix=$TOP/corepkgs export SHARED=$TEST_ROOT/shared export PATH=$NIX_BIN_DIR:$TOP/scripts:$PATH -export REAL_BIN_DIR=@bindir@ -export REAL_LIBEXEC_DIR=@libexecdir@ -export REAL_LOCALSTATE_DIR=@localstatedir@ -export REAL_DATA_DIR=@datadir@ -export REAL_STORE_DIR=@storedir@ export NIX_BUILD_HOOK= export PERL=perl export PERL5LIB=$TOP/perl/lib:$PERL5LIB diff --git a/tests/init.sh b/tests/init.sh index 63e939dff..9ce7985d7 100644 --- a/tests/init.sh +++ b/tests/init.sh @@ -10,7 +10,6 @@ fi mkdir "$TEST_ROOT" mkdir "$NIX_STORE_DIR" -mkdir "$NIX_DATA_DIR" mkdir "$NIX_LOCALSTATE_DIR" mkdir -p "$NIX_LOG_DIR"/drvs mkdir "$NIX_STATE_DIR" @@ -39,29 +38,6 @@ env-keep-derivations = false fsync-metadata = false EOF -mkdir $NIX_DATA_DIR/nix -cp -pr $TOP/corepkgs $NIX_DATA_DIR/nix/ -# Bah, scripts have the prefix hard-coded. This is really messy stuff -# (and likely to fail). -for i in \ - $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh \ - ; do - sed < $i > $i.tmp \ - -e "s^$REAL_BIN_DIR/nix-store^$NIX_BIN_DIR/nix-store^" \ - -e "s^$REAL_BIN_DIR/nix-hash^$NIX_BIN_DIR/nix-hash^" \ - -e "s^$REAL_LIBEXEC_DIR^$NIX_LIBEXEC_DIR^" \ - -e "s^$REAL_LOCALSTATE_DIR^$NIX_LOCALSTATE_DIR^" \ - -e "s^$REAL_DATA_DIR^$NIX_DATA_DIR^" \ - -e "s^$REAL_STORE_DIR\([^/]\)^$NIX_STORE_DIR\1^" - mv $i.tmp $i - chmod +x $i -done - -# Another ugly hack. -sed "s|^$|PATH='$PATH'|" < $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh > tmp -chmod +x tmp -mv tmp $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh - # An uberhack for Mac OS X 10.5: download-using-manifests uses Perl, # and Perl links against Darwin's libutil.dylib (in /usr/lib), but # when running "make check", the libtool wrapper script around the Nix diff --git a/tests/lang.sh b/tests/lang.sh index c9fc65e6a..cab1cfd9b 100644 --- a/tests/lang.sh +++ b/tests/lang.sh @@ -40,7 +40,7 @@ for i in lang/eval-okay-*.nix; do if test -e lang/$i.flags; then flags=$(cat lang/$i.flags) fi - if ! NIX_PATH=lang/dir3:lang/dir4 nix-instantiate $flags --eval-only --strict lang/$i.nix > lang/$i.out; then + if ! NIX_PATH=lang/dir3:lang/dir4:$NIX_PATH nix-instantiate $flags --eval-only --strict lang/$i.nix > lang/$i.out; then echo "FAIL: $i should evaluate" fail=1 elif ! diff lang/$i.out lang/$i.exp; then diff --git a/tests/lang/eval-okay-search-path.nix b/tests/lang/eval-okay-search-path.nix index 21485dbbf..9b7115023 100644 --- a/tests/lang/eval-okay-search-path.nix +++ b/tests/lang/eval-okay-search-path.nix @@ -1,3 +1,3 @@ -assert builtins.pathExists ; +assert builtins.pathExists ; import + import + import + import diff --git a/tests/user-envs.sh b/tests/user-envs.sh index 5037e28b9..2bc9bee50 100644 --- a/tests/user-envs.sh +++ b/tests/user-envs.sh @@ -36,7 +36,7 @@ nix-env -p $profiles/test -q '*' | grep -q foo-2.0pre1 test "$($profiles/test/bin/foo)" = "foo-2.0pre1" # Upgrade "foo": should install foo-2.0. -NIX_PATH=nixpkgs=./user-envs.nix nix-env -p $profiles/test -f '' -u foo +NIX_PATH=nixpkgs=./user-envs.nix:$NIX_PATH nix-env -p $profiles/test -f '' -u foo # Query installed: should contain foo-2.0 now. test "$(nix-env -p $profiles/test -q '*' | wc -l)" -eq 1