user environment, e.g.,
$ nix-env -i /nix/store/z58v41v21xd3ywrqk1vmvdwlagjx7f10-aterm-2.3.1.drv
or
$ nix-env -i /nix/store/hsyj5pbn0d9iz7q0aj0fga7cpaadvp1l-aterm-2.3.1
This is useful because it allows Nix expressions to be bypassed
entirely. For instance, if only a nix-pull manifest is provided,
plus the top-level path of some component, it can be installed
without having to supply the Nix expression (e.g., for obfuscation,
or to be independent of Nix expression language changes or context
dependencies).
38 lines
1 KiB
C++
38 lines
1 KiB
C++
#include "build.hh"
|
|
|
|
|
|
Derivation derivationFromPath(const Path & drvPath)
|
|
{
|
|
assertStorePath(drvPath);
|
|
ensurePath(drvPath);
|
|
ATerm t = ATreadFromNamedFile(drvPath.c_str());
|
|
if (!t) throw Error(format("cannot read aterm from `%1%'") % drvPath);
|
|
return parseDerivation(t);
|
|
}
|
|
|
|
|
|
void computeFSClosure(const Path & storePath,
|
|
PathSet & paths, bool flipDirection)
|
|
{
|
|
if (paths.find(storePath) != paths.end()) return;
|
|
paths.insert(storePath);
|
|
|
|
PathSet references;
|
|
if (flipDirection)
|
|
queryReferers(noTxn, storePath, references);
|
|
else
|
|
queryReferences(noTxn, storePath, references);
|
|
|
|
for (PathSet::iterator i = references.begin();
|
|
i != references.end(); ++i)
|
|
computeFSClosure(*i, paths, flipDirection);
|
|
}
|
|
|
|
|
|
Path findOutput(const Derivation & drv, string id)
|
|
{
|
|
for (DerivationOutputs::const_iterator i = drv.outputs.begin();
|
|
i != drv.outputs.end(); ++i)
|
|
if (i->first == id) return i->second.path;
|
|
throw Error(format("derivation has no output `%1%'") % id);
|
|
}
|