diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2019-08-07T13·02+0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-07T13·02+0200 |
commit | 56df30cd3f89f76f608b469044c17a42cdb2b338 (patch) | |
tree | 0a8cb3bf92293f9fd6d684f62a5d1f63874290d8 /src/libstore | |
parent | 399b6f3c46077e10a7047e8216fc1a67425a768a (diff) | |
parent | 363a2f68261af73aefe4edead9c0526030751a27 (diff) |
Merge pull request #2995 from tweag/post-build-hook
Add a post build hook
Diffstat (limited to 'src/libstore')
-rw-r--r-- | src/libstore/build.cc | 55 | ||||
-rw-r--r-- | src/libstore/globals.hh | 3 |
2 files changed, 58 insertions, 0 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index a28619ab907d..4bec37e0f7ba 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1629,6 +1629,61 @@ void DerivationGoal::buildDone() being valid. */ registerOutputs(); + if (settings.postBuildHook != "") { + Activity act(*logger, lvlInfo, actPostBuildHook, + fmt("running post-build-hook '%s'", settings.postBuildHook), + Logger::Fields{drvPath}); + PushActivity pact(act.id); + auto outputPaths = drv->outputPaths(); + std::map<std::string, std::string> hookEnvironment = getEnv(); + + hookEnvironment.emplace("DRV_PATH", drvPath); + hookEnvironment.emplace("OUT_PATHS", chomp(concatStringsSep(" ", outputPaths))); + + RunOptions opts(settings.postBuildHook, {}); + opts.environment = hookEnvironment; + + struct LogSink : Sink { + Activity & act; + std::string currentLine; + + LogSink(Activity & act) : act(act) { } + + void operator() (const unsigned char * data, size_t len) override { + for (size_t i = 0; i < len; i++) { + auto c = data[i]; + + if (c == '\n') { + flushLine(); + } else { + currentLine += c; + } + } + } + + void flushLine() { + if (settings.verboseBuild) { + printError("post-build-hook: " + currentLine); + } else { + act.result(resPostBuildLogLine, currentLine); + } + currentLine.clear(); + } + + ~LogSink() { + if (currentLine != "") { + currentLine += '\n'; + flushLine(); + } + } + }; + LogSink sink(act); + + opts.standardOut = &sink; + opts.mergeStderrToStdout = true; + runProgram2(opts); + } + if (buildMode == bmCheck) { done(BuildResult::Built); return; diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh index 0c0a9ec544ea..13effb507b81 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -315,6 +315,9 @@ public: "pre-build-hook", "A program to run just before a build to set derivation-specific build settings."}; + Setting<std::string> postBuildHook{this, "", "post-build-hook", + "A program to run just after each succesful build."}; + Setting<std::string> netrcFile{this, fmt("%s/%s", nixConfDir, "netrc"), "netrc-file", "Path to the netrc file used to obtain usernames/passwords for downloads."}; |