aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-01-24 17:18:11 +0100
committerEelco Dolstra <edolstra@gmail.com>2017-01-26 20:40:32 +0100
commit4425a5c5470e4f26213cfecac404fed88d0f35aa (patch)
tree8a705ca4d6c6d6c7871c40b0ee2890b0a3f8db51 /src
parent49bcb18035081fb893357baf3c3cb2a59dab7c80 (diff)
Move exportReferencesGraph into a separate method
startBuilder() is getting rather obese.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/build.cc99
1 files changed, 55 insertions, 44 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 7fc6ff0df..607601e2a 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -864,6 +864,9 @@ private:
/* Start building a derivation. */
void startBuilder();
+ /* Handle the exportReferencesGraph attribute. */
+ void doExportReferencesGraph();
+
/* Run the builder's process. */
void runChild();
@@ -1791,51 +1794,9 @@ void DerivationGoal::startBuilder()
for (auto & output : drv->outputs)
inputRewrites[hashPlaceholder(output.first)] = output.second.path;
- /* The `exportReferencesGraph' feature allows the references graph
- to be passed to a builder. This attribute should be a list of
- pairs [name1 path1 name2 path2 ...]. The references graph of
- each `pathN' will be stored in a text file `nameN' in the
- temporary build directory. The text files have the format used
- by `nix-store --register-validity'. However, the deriver
- fields are left empty. */
- string s = get(drv->env, "exportReferencesGraph");
- Strings ss = tokenizeString<Strings>(s);
- if (ss.size() % 2 != 0)
- throw BuildError(format("odd number of tokens in ‘exportReferencesGraph’: ‘%1%’") % s);
- for (Strings::iterator i = ss.begin(); i != ss.end(); ) {
- string fileName = *i++;
- checkStoreName(fileName); /* !!! abuse of this function */
- /* Check that the store path is valid. */
- Path storePath = *i++;
- if (!worker.store.isInStore(storePath))
- throw BuildError(format("‘exportReferencesGraph’ contains a non-store path ‘%1%’")
- % storePath);
- storePath = worker.store.toStorePath(storePath);
- if (!worker.store.isValidPath(storePath))
- throw BuildError(format("‘exportReferencesGraph’ contains an invalid path ‘%1%’")
- % storePath);
-
- /* If there are derivations in the graph, then include their
- outputs as well. This is useful if you want to do things
- like passing all build-time dependencies of some path to a
- derivation that builds a NixOS DVD image. */
- PathSet paths, paths2;
- worker.store.computeFSClosure(storePath, paths);
- paths2 = paths;
-
- for (auto & j : paths2) {
- if (isDerivation(j)) {
- Derivation drv = worker.store.derivationFromPath(j);
- for (auto & k : drv.outputs)
- worker.store.computeFSClosure(k.second.path, paths);
- }
- }
-
- /* Write closure info to `fileName'. */
- writeFile(tmpDir + "/" + fileName,
- worker.store.makeValidityRegistration(paths, false, false));
- }
+ /* Handle exportReferencesGraph(), if set. */
+ doExportReferencesGraph();
/* If `build-users-group' is not empty, then we have to build as
@@ -2242,6 +2203,56 @@ void DerivationGoal::startBuilder()
}
+void DerivationGoal::doExportReferencesGraph()
+{
+ /* The `exportReferencesGraph' feature allows the references graph
+ to be passed to a builder. This attribute should be a list of
+ pairs [name1 path1 name2 path2 ...]. The references graph of
+ each `pathN' will be stored in a text file `nameN' in the
+ temporary build directory. The text files have the format used
+ by `nix-store --register-validity'. However, the deriver
+ fields are left empty. */
+ string s = get(drv->env, "exportReferencesGraph");
+ Strings ss = tokenizeString<Strings>(s);
+ if (ss.size() % 2 != 0)
+ throw BuildError(format("odd number of tokens in ‘exportReferencesGraph’: ‘%1%’") % s);
+ for (Strings::iterator i = ss.begin(); i != ss.end(); ) {
+ string fileName = *i++;
+ checkStoreName(fileName); /* !!! abuse of this function */
+
+ /* Check that the store path is valid. */
+ Path storePath = *i++;
+ if (!worker.store.isInStore(storePath))
+ throw BuildError(format("‘exportReferencesGraph’ contains a non-store path ‘%1%’")
+ % storePath);
+ storePath = worker.store.toStorePath(storePath);
+ if (!worker.store.isValidPath(storePath))
+ throw BuildError(format("‘exportReferencesGraph’ contains an invalid path ‘%1%’")
+ % storePath);
+
+ /* If there are derivations in the graph, then include their
+ outputs as well. This is useful if you want to do things
+ like passing all build-time dependencies of some path to a
+ derivation that builds a NixOS DVD image. */
+ PathSet paths, paths2;
+ worker.store.computeFSClosure(storePath, paths);
+ paths2 = paths;
+
+ for (auto & j : paths2) {
+ if (isDerivation(j)) {
+ Derivation drv = worker.store.derivationFromPath(j);
+ for (auto & k : drv.outputs)
+ worker.store.computeFSClosure(k.second.path, paths);
+ }
+ }
+
+ /* Write closure info to `fileName'. */
+ writeFile(tmpDir + "/" + fileName,
+ worker.store.makeValidityRegistration(paths, false, false));
+ }
+}
+
+
void DerivationGoal::runChild()
{
/* Warning: in the child we should absolutely not make any SQLite