From c370755583d7350f4b96136eb0a6a8a7b08551b1 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 16 Nov 2007 16:15:26 +0000 Subject: [PATCH] * Flag `--no-build-hook' to disable distributed builds. * queryDeriver in daemon mode: don't barf if the other side returns an empty string (which means there is no deriver). --- scripts/nix-push.in | 2 +- src/libmain/shared.cc | 2 ++ src/libstore/build.cc | 1 + src/libstore/globals.cc | 1 + src/libstore/globals.hh | 4 ++++ src/libstore/remote-store.cc | 8 ++++++-- src/libstore/remote-store.hh | 1 + src/libstore/worker-protocol.hh | 3 ++- src/nix-worker/nix-worker.cc | 7 +++++-- 9 files changed, 23 insertions(+), 6 deletions(-) diff --git a/scripts/nix-push.in b/scripts/nix-push.in index dd00841d7..6250f8b0a 100644 --- a/scripts/nix-push.in +++ b/scripts/nix-push.in @@ -146,7 +146,7 @@ while (scalar @tmp > 0) { # probably wouldn't make that much sense; pumping lots of data # around just to compress them won't gain that much. $ENV{"NIX_BUILD_HOOK"} = ""; - my $pid = open(READ, "$binDir/nix-store --realise @tmp2|") + my $pid = open(READ, "$binDir/nix-store --no-build-hook --realise @tmp2|") or die "cannot run nix-store"; while () { chomp; diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index a606f0dae..09841e45b 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -212,6 +212,8 @@ static void initAndRun(int argc, char * * argv) readOnlyMode = true; else if (arg == "--max-silent-time") maxSilentTime = getIntArg(arg, i, args.end()); + else if (arg == "--no-build-hook") + useBuildHook = false; else remaining.push_back(arg); } diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 36e3b5e1d..d46286713 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1247,6 +1247,7 @@ static string makeValidityRegistration(const PathSet & paths, DerivationGoal::HookReply DerivationGoal::tryBuildHook() { + if (!useBuildHook) return rpDecline; Path buildHook = getEnv("NIX_BUILD_HOOK"); if (buildHook == "") return rpDecline; buildHook = absPath(buildHook); diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index 6c4944539..eaea4b707 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -26,6 +26,7 @@ bool readOnlyMode = false; string thisSystem = "unset"; unsigned int maxSilentTime = 0; Paths substituters; +bool useBuildHook = true; static bool settingsRead = false; diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh index ea15da0e6..f650cd1b7 100644 --- a/src/libstore/globals.hh +++ b/src/libstore/globals.hh @@ -72,6 +72,10 @@ extern unsigned int maxSilentTime; from a CD. */ extern Paths substituters; +/* Whether to use build hooks (for distributed builds). Sometimes + users want to disable this from the command-line. */ +extern bool useBuildHook; + Strings querySetting(const string & name, const Strings & def); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 4d866071b..cc847c050 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -59,7 +59,7 @@ RemoteStore::RemoteStore() unsigned int magic = readInt(from); if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch"); - unsigned int daemonVersion = readInt(from); + daemonVersion = readInt(from); if (GET_PROTOCOL_MAJOR(daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION)) throw Error("Nix daemon protocol version not supported"); writeInt(PROTOCOL_VERSION, to); @@ -169,6 +169,8 @@ void RemoteStore::setOptions() writeInt(verbosity, to); writeInt(maxBuildJobs, to); writeInt(maxSilentTime, to); + if (GET_PROTOCOL_MINOR(daemonVersion) >= 2) + writeInt(useBuildHook, to); processStderr(); } @@ -230,7 +232,9 @@ Path RemoteStore::queryDeriver(const Path & path) writeInt(wopQueryDeriver, to); writeString(path, to); processStderr(); - return readStorePath(from); + Path drvPath = readString(from); + if (drvPath != "") assertStorePath(drvPath); + return drvPath; } diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index 79a15e11e..01cac93a4 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -71,6 +71,7 @@ private: FdSink to; FdSource from; Pid child; + unsigned int daemonVersion; void processStderr(Sink * sink = 0, Source * source = 0); diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh index 22f5973a9..44db4ad9b 100644 --- a/src/libstore/worker-protocol.hh +++ b/src/libstore/worker-protocol.hh @@ -8,8 +8,9 @@ namespace nix { #define WORKER_MAGIC_1 0x6e697863 #define WORKER_MAGIC_2 0x6478696f -#define PROTOCOL_VERSION 0x101 +#define PROTOCOL_VERSION 0x102 #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) +#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) typedef enum { diff --git a/src/nix-worker/nix-worker.cc b/src/nix-worker/nix-worker.cc index 9f387a4ec..5e261aa16 100644 --- a/src/nix-worker/nix-worker.cc +++ b/src/nix-worker/nix-worker.cc @@ -223,7 +223,8 @@ struct TunnelSource : Source }; -static void performOp(Source & from, Sink & to, unsigned int op) +static void performOp(unsigned int clientVersion, + Source & from, Sink & to, unsigned int op) { switch (op) { @@ -422,6 +423,8 @@ static void performOp(Source & from, Sink & to, unsigned int op) verbosity = (Verbosity) readInt(from); maxBuildJobs = readInt(from); maxSilentTime = readInt(from); + if (GET_PROTOCOL_MINOR(clientVersion) >= 2) + useBuildHook = readInt(from) != 0; startWork(); stopWork(); break; @@ -492,7 +495,7 @@ static void processConnection() opCount++; try { - performOp(from, to, op); + performOp(clientVersion, from, to, op); } catch (Error & e) { stopWork(false, e.msg()); }