summary refs log tree commit diff
path: root/nix/libstore
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2017-01-11 17:06:31 +0100
committerLudovic Courtès <ludo@gnu.org>2017-01-11 17:06:31 +0100
commit9b5364a3afb03414bd6e3ded2fbfdacabe4e8870 (patch)
tree82ff386c867e792cf8ca2d1cf3c1b68390d6d2de /nix/libstore
parentaa042770da2fe6411089a965ea8b2219a99d3448 (diff)
downloadguix-9b5364a3afb03414bd6e3ded2fbfdacabe4e8870.tar.gz
daemon: Allow check builds of 'builtin:download' derivations.
Fixes <http://bugs.gnu.org/25089>.
Reported by Leo Famulari <leo@famulari.name>.

* nix/libstore/build.cc (DerivationGoal::runChild): In the 'isBuiltin'
case, check whether DRV's output is in 'redirectedOutputs', and pass an
'output' argument to the built-in builder.
(DerivationGoal::addHashRewrite): Add 'printMsg' call.
* nix/libstore/builtins.hh (derivationBuilder): Add 'output' parameter.
* nix/libstore/builtins.cc (builtinDownload): Likewise.
Add OUTPUT to ARGV.
* guix/scripts/perform-download.scm (perform-download): Add 'output'
parameter.
(guix-perform-download): Adjust 'match' clauses accordingly.
* tests/derivations.scm ("'download' built-in builder, check mode"): New
test.
Diffstat (limited to 'nix/libstore')
-rw-r--r--nix/libstore/build.cc15
-rw-r--r--nix/libstore/builtins.cc10
-rw-r--r--nix/libstore/builtins.hh5
3 files changed, 23 insertions, 7 deletions
diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index 38048ceebc..cebc404d1c 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -2271,8 +2271,17 @@ void DerivationGoal::runChild()
                 logType = ltFlat;
 
 		auto buildDrv = lookupBuiltinBuilder(drv.builder);
-                if (buildDrv != NULL)
-                    buildDrv(drv, drvPath);
+                if (buildDrv != NULL) {
+		    /* Check what the output file name is.  When doing a
+		       'bmCheck' build, the output file name is different from
+		       that specified in DRV due to hash rewriting.  */
+		    Path output = drv.outputs["out"].path;
+		    auto redirected = redirectedOutputs.find(output);
+		    if (redirected != redirectedOutputs.end())
+			output = redirected->second;
+
+                    buildDrv(drv, drvPath, output);
+		}
                 else
                     throw Error(format("unsupported builtin function '%1%'") % string(drv.builder, 8));
                 _exit(0);
@@ -2742,6 +2751,8 @@ Path DerivationGoal::addHashRewrite(const Path & path)
     rewritesToTmp[h1] = h2;
     rewritesFromTmp[h2] = h1;
     redirectedOutputs[path] = p;
+    printMsg(lvlChatty, format("output '%1%' redirected to '%2%'")
+	     % path % p);
     return p;
 }
 
diff --git a/nix/libstore/builtins.cc b/nix/libstore/builtins.cc
index 32af767dc4..7ed75e5079 100644
--- a/nix/libstore/builtins.cc
+++ b/nix/libstore/builtins.cc
@@ -1,5 +1,5 @@
 /* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2016 Ludovic Courtès <ludo@gnu.org>
+   Copyright (C) 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 
    This file is part of GNU Guix.
 
@@ -25,7 +25,8 @@
 namespace nix {
 
 static void builtinDownload(const Derivation &drv,
-			    const std::string &drvPath)
+			    const std::string &drvPath,
+			    const std::string &output)
 {
     /* Invoke 'guix perform-download'.  */
     Strings args;
@@ -35,7 +36,10 @@ static void builtinDownload(const Derivation &drv,
     /* Close all other file descriptors. */
     closeMostFDs(set<int>());
 
-    const char *const argv[] = { "download", drvPath.c_str(), NULL };
+    const char *const argv[] =
+      {
+	"download", drvPath.c_str(), output.c_str(), NULL
+      };
 
     /* XXX: Hack our way to use the 'download' script from 'LIBEXECDIR/guix'
        or just 'LIBEXECDIR', depending on whether we're running uninstalled or
diff --git a/nix/libstore/builtins.hh b/nix/libstore/builtins.hh
index 79171fcb6c..396ea14ebc 100644
--- a/nix/libstore/builtins.hh
+++ b/nix/libstore/builtins.hh
@@ -1,5 +1,5 @@
 /* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2016 Ludovic Courtès <ludo@gnu.org>
+   Copyright (C) 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 
    This file is part of GNU Guix.
 
@@ -33,7 +33,8 @@ namespace nix {
 
     /* Build DRV, which lives at DRVPATH.  */
     typedef void (*derivationBuilder) (const Derivation &drv,
-				       const std::string &drvPath);
+				       const std::string &drvPath,
+				       const std::string &output);
 
     /* Return the built-in builder called BUILDER, or NULL if none was
        found.  */