aboutsummaryrefslogtreecommitdiff
path: root/src/nix/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix/main.cc')
-rw-r--r--src/nix/main.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/nix/main.cc b/src/nix/main.cc
new file mode 100644
index 000000000..20d3ea5c2
--- /dev/null
+++ b/src/nix/main.cc
@@ -0,0 +1,55 @@
+#include <algorithm>
+
+#include "command.hh"
+#include "common-args.hh"
+#include "eval.hh"
+#include "globals.hh"
+#include "legacy.hh"
+#include "shared.hh"
+#include "store-api.hh"
+
+namespace nix {
+
+struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
+{
+ NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
+ {
+ mkFlag('h', "help", "show usage information", [=]() {
+ printHelp(programName, std::cout);
+ throw Exit();
+ });
+
+ mkFlag(0, "version", "show version information", std::bind(printVersion, programName));
+ }
+};
+
+void mainWrapped(int argc, char * * argv)
+{
+ initNix();
+ initGC();
+
+ string programName = baseNameOf(argv[0]);
+
+ {
+ auto legacy = (*RegisterLegacyCommand::commands)[programName];
+ if (legacy) return legacy(argc, argv);
+ }
+
+ NixArgs args;
+
+ args.parseCmdline(argvToStrings(argc, argv));
+
+ assert(args.command);
+
+ args.command->prepare();
+ args.command->run();
+}
+
+}
+
+int main(int argc, char * * argv)
+{
+ return nix::handleExceptions(argv[0], [&]() {
+ nix::mainWrapped(argc, argv);
+ });
+}