we generally do not want to catch or throw these. catching them to print and discard is fine, tests are largely exempt, and cases in which we can be certain where the exception came from are also fine to *catch*. we'll try to never *throw* (or rethrow) these if possible though because doing so will make it impossible to construct async traces for the exceptions. Change-Id: I3b71c32ecd16afc2246c946472f5629a1fa31f2c
48 lines
1.3 KiB
C++
48 lines
1.3 KiB
C++
#include "lix/libstore/globals.hh"
|
|
#include "lix/libstore/store-api.hh"
|
|
#include "lix/libstore/build-result.hh"
|
|
#include "lix/libutil/async.hh"
|
|
#include <iostream>
|
|
|
|
using namespace nix;
|
|
|
|
int main (int argc, char **argv)
|
|
{
|
|
try {
|
|
if (argc != 2) {
|
|
std::cerr << "Usage: " << argv[0] << " store/path/to/something.drv\n";
|
|
return 1;
|
|
}
|
|
|
|
AsyncIoRoot aio;
|
|
std::string drvPath = argv[1];
|
|
|
|
initLibStore();
|
|
|
|
auto store = aio.blockOn(nix::openStore());
|
|
|
|
// build the derivation
|
|
|
|
std::vector<DerivedPath> paths {
|
|
DerivedPath::Built {
|
|
.drvPath = makeConstantStorePathRef(store->parseStorePath(drvPath)),
|
|
.outputs = OutputsSpec::Names{"out"}
|
|
}
|
|
};
|
|
|
|
const auto results = aio.blockOn(store->buildPathsWithResults(paths, bmNormal, store));
|
|
|
|
for (const auto & result : results) {
|
|
for (const auto & [outputName, realisation] : result.builtOutputs) {
|
|
std::cout << store->printStorePath(realisation.outPath) << "\n";
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
} catch (const std::exception & e) { // NOLINT(lix-foreign-exceptions)
|
|
std::cerr << "Error: " << e.what() << "\n";
|
|
return 1;
|
|
}
|
|
}
|