diff options
-rw-r--r-- | src/libutil/args.hh | 13 | ||||
-rw-r--r-- | src/nix/build.cc | 30 | ||||
-rw-r--r-- | src/nix/copy.cc | 2 | ||||
-rw-r--r-- | src/nix/run.cc | 2 |
4 files changed, 37 insertions, 10 deletions
diff --git a/src/libutil/args.hh b/src/libutil/args.hh index 044ed209e..7f8ea647c 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 64bcafd2d..4240f06ad 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 d9e6c9493..fe963e794 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 f016b04a1..64a5cbd30 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") |