nix build: Add --out-link and --no-link options

This commit is contained in:
Eelco Dolstra 2017-09-06 16:20:34 +02:00
parent df4342bc17
commit dff440aab3
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
4 changed files with 37 additions and 10 deletions

View file

@ -80,6 +80,19 @@ public:
FlagMaker & arity(size_t arity) { flag->arity = arity; return *this; }; FlagMaker & arity(size_t arity) { flag->arity = arity; return *this; };
FlagMaker & handler(std::function<void(Strings)> handler) { flag->handler = handler; 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 & 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(); FlagMaker mkFlag();

View file

@ -7,8 +7,22 @@ using namespace nix;
struct CmdBuild : MixDryRun, InstallablesCommand struct CmdBuild : MixDryRun, InstallablesCommand
{ {
Path outLink = "result";
CmdBuild() 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 std::string name() override
@ -28,16 +42,16 @@ struct CmdBuild : MixDryRun, InstallablesCommand
for (size_t i = 0; i < buildables.size(); ++i) { for (size_t i = 0; i < buildables.size(); ++i) {
auto & b(buildables[i]); auto & b(buildables[i]);
for (auto & output : b.outputs) { if (outLink != "")
for (auto & output : b.outputs)
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) { if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) {
std::string symlink = "result"; std::string symlink = outLink;
if (i) symlink += fmt("-%d", i); if (i) symlink += fmt("-%d", i);
if (output.first != "out") symlink += fmt("-%s", output.first); if (output.first != "out") symlink += fmt("-%s", output.first);
store2->addPermRoot(output.second, absPath(symlink), true); store2->addPermRoot(output.second, absPath(symlink), true);
} }
} }
} }
}
}; };
static RegisterCommand r1(make_ref<CmdBuild>()); static RegisterCommand r1(make_ref<CmdBuild>());

View file

@ -22,7 +22,7 @@ struct CmdCopy : StorePathsCommand
mkFlag() mkFlag()
.longName("no-check-sigs") .longName("no-check-sigs")
.description("do not require that paths are signed by trusted keys") .description("do not require that paths are signed by trusted keys")
.handler([&](Strings ss) { checkSigs = NoCheckSigs; }); .set(&checkSigs, NoCheckSigs);
} }
std::string name() override std::string name() override

View file

@ -41,7 +41,7 @@ struct CmdRun : InstallablesCommand
.longName("ignore-environment") .longName("ignore-environment")
.shortName('i') .shortName('i')
.description("clear the entire environment (except those specified with --keep)") .description("clear the entire environment (except those specified with --keep)")
.handler([&](Strings ss) { ignoreEnvironment = true; }); .set(&ignoreEnvironment, true);
mkFlag() mkFlag()
.longName("keep") .longName("keep")