about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libutil/args.hh13
-rw-r--r--src/nix/build.cc30
-rw-r--r--src/nix/copy.cc2
-rw-r--r--src/nix/run.cc2
4 files changed, 37 insertions, 10 deletions
diff --git a/src/libutil/args.hh b/src/libutil/args.hh
index 044ed209e3bf..7f8ea647c909 100644
--- a/src/libutil/args.hh
+++ b/src/libutil/args.hh
@@ -80,6 +80,19 @@ public:
         FlagMaker & arity(size_t arity) { flag->arity = arity; return *this; };
         FlagMaker & handler(std::function<void(Strings)> handler) { flag->handler = handler; return *this; };
         FlagMaker & category(const std::string & s) { flag->category = s; return *this; };
+
+        FlagMaker & dest(std::string * dest) {
+            assert(flag->arity == 1);
+            flag->handler = [=](Strings ss) { *dest = ss.front(); };
+            return *this;
+        };
+
+        template<class T>
+        FlagMaker & set(T * dest, const T & val) {
+            assert(flag->arity == 0);
+            flag->handler = [=](Strings ss) { *dest = val; };
+            return *this;
+        };
     };
 
     FlagMaker mkFlag();
diff --git a/src/nix/build.cc b/src/nix/build.cc
index 64bcafd2d934..4240f06ade7d 100644
--- a/src/nix/build.cc
+++ b/src/nix/build.cc
@@ -7,8 +7,22 @@ using namespace nix;
 
 struct CmdBuild : MixDryRun, InstallablesCommand
 {
+    Path outLink = "result";
+
     CmdBuild()
     {
+        mkFlag()
+            .longName("out-link")
+            .shortName('o')
+            .description("path of the symlink to the build result")
+            .arity(1)
+            .labels({"path"})
+            .dest(&outLink);
+
+        mkFlag()
+            .longName("no-link")
+            .description("do not create a symlink to the build result")
+            .set(&outLink, Path(""));
     }
 
     std::string name() override
@@ -28,14 +42,14 @@ struct CmdBuild : MixDryRun, InstallablesCommand
         for (size_t i = 0; i < buildables.size(); ++i) {
             auto & b(buildables[i]);
 
-            for (auto & output : b.outputs) {
-                if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) {
-                    std::string symlink = "result";
-                    if (i) symlink += fmt("-%d", i);
-                    if (output.first != "out") symlink += fmt("-%s", output.first);
-                    store2->addPermRoot(output.second, absPath(symlink), true);
-                }
-            }
+            if (outLink != "")
+                for (auto & output : b.outputs)
+                    if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) {
+                        std::string symlink = outLink;
+                        if (i) symlink += fmt("-%d", i);
+                        if (output.first != "out") symlink += fmt("-%s", output.first);
+                        store2->addPermRoot(output.second, absPath(symlink), true);
+                    }
         }
     }
 };
diff --git a/src/nix/copy.cc b/src/nix/copy.cc
index d9e6c949352b..fe963e794277 100644
--- a/src/nix/copy.cc
+++ b/src/nix/copy.cc
@@ -22,7 +22,7 @@ struct CmdCopy : StorePathsCommand
         mkFlag()
             .longName("no-check-sigs")
             .description("do not require that paths are signed by trusted keys")
-            .handler([&](Strings ss) { checkSigs = NoCheckSigs; });
+            .set(&checkSigs, NoCheckSigs);
     }
 
     std::string name() override
diff --git a/src/nix/run.cc b/src/nix/run.cc
index f016b04a1ec8..64a5cbd304d2 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -41,7 +41,7 @@ struct CmdRun : InstallablesCommand
             .longName("ignore-environment")
             .shortName('i')
             .description("clear the entire environment (except those specified with --keep)")
-            .handler([&](Strings ss) { ignoreEnvironment = true; });
+            .set(&ignoreEnvironment, true);
 
         mkFlag()
             .longName("keep")