aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build.cc
diff options
context:
space:
mode:
authorMichael Raskin <7c6f434c@mail.ru>2007-12-30 09:30:56 +0000
committerMichael Raskin <7c6f434c@mail.ru>2007-12-30 09:30:56 +0000
commit2196cb67c5a47eeb822351f1669c201e16ea6ebc (patch)
tree531491033cdfc7745a36dcba64866aeffc2d0849 /src/libstore/build.cc
parentdf303666bceb5715e706478fad0325447a2a52f6 (diff)
Added a way to include derivation with its outputs and dependencies - exportBuildReferenceGraph
Diffstat (limited to 'src/libstore/build.cc')
-rw-r--r--src/libstore/build.cc38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index d46286713..6f045dbc3 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1619,6 +1619,44 @@ void DerivationGoal::startBuilder()
makeValidityRegistration(refs, false));
}
+ // The same for derivations
+ s = drv.env["exportBuildReferencesGraph"];
+ ss = tokenizeString(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 (!isInStore(storePath))
+ throw BuildError(format("`exportReferencesGraph' contains a non-store path `%1%'")
+ % storePath);
+ storePath = toStorePath(storePath);
+ if (!store->isValidPath(storePath))
+ throw BuildError(format("`exportReferencesGraph' contains an invalid path `%1%'")
+ % storePath);
+
+ /* Write closure info to `fileName'. */
+ PathSet refs1,refs;
+ computeFSClosure(storePath, refs1);
+ for (PathSet::iterator j = refs1.begin(); j != refs1.end() ; j++) {
+ refs.insert (*j);
+ if (isDerivation (*j)) {
+ Derivation deriv = derivationFromPath (*j);
+ for (DerivationOutputs::iterator k=deriv.outputs.begin();
+ k != deriv.outputs.end(); k++) {
+ refs.insert(k->second.path);
+ }
+ }
+ }
+ /* !!! in secure Nix, the writing should be done on the
+ build uid for security (maybe). */
+ writeStringToFile(tmpDir + "/" + fileName,
+ makeValidityRegistration(refs, false));
+ }
+
/* If `build-users-group' is not empty, then we have to build as
one of the members of that group. */