about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--corepkgs/buildenv.nix3
-rw-r--r--corepkgs/config.nix.in12
-rw-r--r--corepkgs/fetchurl.nix9
-rw-r--r--corepkgs/nar.nix5
-rw-r--r--corepkgs/unpack-channel.nix3
-rw-r--r--src/libexpr/primops.cc7
6 files changed, 24 insertions, 15 deletions
diff --git a/corepkgs/buildenv.nix b/corepkgs/buildenv.nix
index c52a0ea93d..5bf7b4e560 100644
--- a/corepkgs/buildenv.nix
+++ b/corepkgs/buildenv.nix
@@ -23,6 +23,5 @@ derivation {
   # network traffic, so don't do that.
   preferLocalBuild = true;
 
-  # Don't build in a chroot because Nix's dependencies may not be there.
-  __noChroot = true;
+  inherit chrootDeps;
 }
diff --git a/corepkgs/config.nix.in b/corepkgs/config.nix.in
index a5ec83b9ea..8918f4ddde 100644
--- a/corepkgs/config.nix.in
+++ b/corepkgs/config.nix.in
@@ -2,7 +2,7 @@ let
   fromEnv = var: def:
     let val = builtins.getEnv var; in
     if val != "" then val else def;
-in {
+in rec {
   perl = "@perl@";
   shell = "@bash@";
   coreutils = "@coreutils@";
@@ -14,4 +14,14 @@ in {
   tr = "@tr@";
   curl = "@curl@";
   nixBinDir = fromEnv "NIX_BIN_DIR" "@bindir@";
+  nixPrefix = "@prefix@";
+
+  # If Nix is installed in the Nix store, then automatically add it as
+  # a dependency to the core packages. This ensures that they work
+  # properly in a chroot.
+  chrootDeps =
+    if dirOf nixPrefix == builtins.storeDir then
+      [ (builtins.storePath nixPrefix) ]
+    else
+      [ ];
 }
diff --git a/corepkgs/fetchurl.nix b/corepkgs/fetchurl.nix
index 4faedb1406..1ce88593cf 100644
--- a/corepkgs/fetchurl.nix
+++ b/corepkgs/fetchurl.nix
@@ -14,7 +14,7 @@ let
     '' + (if executable then "${coreutils}/chmod +x $out" else ""));
 
 in
-    
+
 derivation {
   name = baseNameOf (toString url);
   builder = shell;
@@ -26,15 +26,12 @@ derivation {
   outputHash = if outputHash != "" then outputHash else
       if sha256 != "" then sha256 else if sha1 != "" then sha1 else md5;
   outputHashMode = if executable then "recursive" else "flat";
-  
+
   inherit system url;
 
   # No need to double the amount of network traffic
   preferLocalBuild = true;
 
-  # Don't build in a chroot because Nix's dependencies may not be there.
-  __noChroot = true;
-
   impureEnvVars = [
     # We borrow these environment variables from the caller to allow
     # easy proxy configuration.  This is impure, but a fixed-output
@@ -42,4 +39,6 @@ derivation {
     # by definition pure.
     "http_proxy" "https_proxy" "ftp_proxy" "all_proxy" "no_proxy"
   ];
+
+  inherit chrootDeps;
 }
diff --git a/corepkgs/nar.nix b/corepkgs/nar.nix
index 04be17fb0c..61b3fc6772 100644
--- a/corepkgs/nar.nix
+++ b/corepkgs/nar.nix
@@ -41,9 +41,8 @@ derivation {
   args = [ "-e" builder ];
   inherit storePath hashAlgo compressionType;
 
-  # Don't build in a chroot because Nix's dependencies may not be there.
-  __noChroot = true;
-
   # Remote machines may not have ${nixBinDir} or ${coreutils} in the same prefixes
   preferLocalBuild = true;
+
+  inherit chrootDeps;
 }
diff --git a/corepkgs/unpack-channel.nix b/corepkgs/unpack-channel.nix
index f7c5210354..9445532ded 100644
--- a/corepkgs/unpack-channel.nix
+++ b/corepkgs/unpack-channel.nix
@@ -37,6 +37,5 @@ derivation {
   # No point in doing this remotely.
   preferLocalBuild = true;
 
-  # Don't build in a chroot because Nix's dependencies may not be there.
-  __noChroot = true;
+  inherit chrootDeps;
 }
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 9d18dc54eb..9723cdfd24 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1507,12 +1507,15 @@ void EvalState::createBaseEnv()
     mkInt(v, time(0));
     addConstant("__currentTime", v);
 
-    mkString(v, settings.thisSystem.c_str());
+    mkString(v, settings.thisSystem);
     addConstant("__currentSystem", v);
 
-    mkString(v, nixVersion.c_str());
+    mkString(v, nixVersion);
     addConstant("__nixVersion", v);
 
+    mkString(v, settings.nixStore);
+    addConstant("__storeDir", v);
+
     /* Language version.  This should be increased every time a new
        language feature gets added.  It's not necessary to increase it
        when primops get added, because you can just use `builtins ?