1511aa9f48
Previously, to build a derivation remotely, we had to copy the entire closure of the .drv file to the remote machine, even though we only need the top-level derivation. This is very wasteful: the closure can contain thousands of store paths, and in some Hydra use cases, include source paths that are very large (e.g. Git/Mercurial checkouts). So now there is a new operation, StoreAPI::buildDerivation(), that performs a build from an in-memory representation of a derivation (BasicDerivation) rather than from a on-disk .drv file. The only files that need to be in the Nix store are the sources of the derivation (drv.inputSrcs), and the needed output paths of the dependencies (as described by drv.inputDrvs). "nix-store --serve" exposes this interface. Note that this is a privileged operation, because you can construct a derivation that builds any store path whatsoever. Fixing this will require changing the hashing scheme (i.e., the output paths should be computed from the other fields in BasicDerivation, allowing them to be verified without access to other derivations). However, this would be quite nice because it would allow .drv-free building (e.g. "nix-env -i" wouldn't have to write any .drv files to disk). Fixes #173.
41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include "derivations.hh"
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
/* Read a derivation, after ensuring its existence through
|
|
ensurePath(). */
|
|
Derivation derivationFromPath(StoreAPI & store, const Path & drvPath);
|
|
|
|
/* Place in `paths' the set of all store paths in the file system
|
|
closure of `storePath'; that is, all paths than can be directly or
|
|
indirectly reached from it. `paths' is not cleared. If
|
|
`flipDirection' is true, the set of paths that can reach
|
|
`storePath' is returned; that is, the closures under the
|
|
`referrers' relation instead of the `references' relation is
|
|
returned. */
|
|
void computeFSClosure(StoreAPI & store, const Path & path,
|
|
PathSet & paths, bool flipDirection = false,
|
|
bool includeOutputs = false, bool includeDerivers = false);
|
|
|
|
/* Return the path corresponding to the output identifier `id' in the
|
|
given derivation. */
|
|
Path findOutput(const Derivation & drv, string id);
|
|
|
|
/* Given a set of paths that are to be built, return the set of
|
|
derivations that will be built, and the set of output paths that
|
|
will be substituted. */
|
|
void queryMissing(StoreAPI & store, const PathSet & targets,
|
|
PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown,
|
|
unsigned long long & downloadSize, unsigned long long & narSize);
|
|
|
|
bool willBuildLocally(const BasicDerivation & drv);
|
|
|
|
bool substitutesAllowed(const BasicDerivation & drv);
|
|
|
|
|
|
}
|