about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/conf-file.xml9
-rw-r--r--src/libstore/build.cc2
-rw-r--r--src/libstore/misc.cc4
-rw-r--r--src/libstore/remote-store.cc3
-rw-r--r--src/libstore/worker-protocol.hh2
-rw-r--r--src/nix-worker/nix-worker.cc7
6 files changed, 23 insertions, 4 deletions
diff --git a/doc/manual/conf-file.xml b/doc/manual/conf-file.xml
index 10e6d08cde76..f220c8374ae6 100644
--- a/doc/manual/conf-file.xml
+++ b/doc/manual/conf-file.xml
@@ -225,6 +225,15 @@ env-keep-derivations = false
   </varlistentry>
 
   
+  <varlistentry><term><literal>build-use-substitutes</literal></term>
+
+    <listitem><para>If set to <literal>true</literal> (default), Nix
+    will use binary substitutes if available.  This option can be
+    disabled to force building from source.</para></listitem>
+
+  </varlistentry>
+
+    
   <varlistentry xml:id="conf-build-chroot-dirs"><term><literal>build-chroot-dirs</literal></term>
 
     <listitem><para>When builds are performed in a chroot environment,
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index acc2923059db..789a7f617c2c 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -962,7 +962,7 @@ void DerivationGoal::haveDerivation()
     foreach (PathSet::iterator, i, invalidOutputs)
         /* Don't bother creating a substitution goal if there are no
            substitutes. */
-        if (worker.store.hasSubstitutes(*i))
+        if (queryBoolSetting("build-use-substitutes", true) && worker.store.hasSubstitutes(*i))
             addWaitee(worker.makeSubstitutionGoal(*i));
     
     if (waitees.empty()) /* to prevent hang (no wake-up event) */
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc
index 4ac0afe844b6..093499936349 100644
--- a/src/libstore/misc.cc
+++ b/src/libstore/misc.cc
@@ -1,6 +1,7 @@
 #include "misc.hh"
 #include "store-api.hh"
 #include "local-store.hh"
+#include "globals.hh"
 
 
 namespace nix {
@@ -69,7 +70,8 @@ void queryMissing(StoreAPI & store, const PathSet & targets,
 
             bool mustBuild = false;
             foreach (DerivationOutputs::iterator, i, drv.outputs)
-                if (!store.isValidPath(i->second.path) && !store.hasSubstitutes(i->second.path))
+                if (!store.isValidPath(i->second.path) &&
+                    !(queryBoolSetting("build-use-substitutes", true) && store.hasSubstitutes(i->second.path)))
                     mustBuild = true;
 
             if (mustBuild) {
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 0b8fa36f6df4..0fd759b07b4b 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -197,6 +197,9 @@ void RemoteStore::setOptions()
     }
     if (GET_PROTOCOL_MINOR(daemonVersion) >= 6)
         writeInt(buildCores, to);
+    if (GET_PROTOCOL_MINOR(daemonVersion) >= 10) 
+        writeInt(queryBoolSetting("build-use-substitutes", true), to);
+    
     processStderr();
 }
 
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index ef1e0993df28..6e0aadad4ae0 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -8,7 +8,7 @@ namespace nix {
 #define WORKER_MAGIC_1 0x6e697863
 #define WORKER_MAGIC_2 0x6478696f
 
-#define PROTOCOL_VERSION 0x109
+#define PROTOCOL_VERSION 0x10a
 #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
 #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
 
diff --git a/src/nix-worker/nix-worker.cc b/src/nix-worker/nix-worker.cc
index 4b0c9e319130..c69b9de506d6 100644
--- a/src/nix-worker/nix-worker.cc
+++ b/src/nix-worker/nix-worker.cc
@@ -513,8 +513,13 @@ static void performOp(unsigned int clientVersion,
             logType = (LogType) readInt(from);
             printBuildTrace = readInt(from) != 0;
         }
-        if (GET_PROTOCOL_MINOR(clientVersion) >= 6) {
+        if (GET_PROTOCOL_MINOR(clientVersion) >= 6)
             buildCores = readInt(from);
+        if (GET_PROTOCOL_MINOR(clientVersion) >= 10) {
+            int x = readInt(from);
+            Strings ss;
+            ss.push_back(x == 0 ? "false" : "true");
+            overrideSetting("build-use-substitutes", ss);
         }
         startWork();
         stopWork();