about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-08-03T18·05+0100
committertazjin <mail@tazj.in>2020-08-03T18·26+0000
commit1f12544179041b151f146fbb604e9af165ffe379 (patch)
treef1cba1958e25749cd9a85192c672d1ffb9aca82b
parent229c1ed820fe20515a69f749c38d5f9f89d20c8d (diff)
refactor(3p/nix): Build nix-daemon as a separate binary r/1569
Skips over all the monobinary stuff and moves to a separate binary for
nix-daemon.

This also replaces the flag parsing logic with absl::flags. This
causes a behaviour change for --help, which no longer tries to display
a man page but instead shows the actual command-line help.

Note: This binary no longer links to the Boehm GC.

Change-Id: Ib852e994b82f2d56e91262878c10650e656427a9
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1622
Tested-by: BuildkiteCI
Reviewed-by: glittershark <grfn@gws.fyi>
-rw-r--r--third_party/nix/default.nix1
-rw-r--r--third_party/nix/src/CMakeLists.txt3
-rw-r--r--third_party/nix/src/nix-daemon/CMakeLists.txt26
-rw-r--r--third_party/nix/src/nix-daemon/nix-daemon.cc (renamed from third_party/nix/src/nix-daemon/nix-daemon-main.cc)50
4 files changed, 46 insertions, 34 deletions
diff --git a/third_party/nix/default.nix b/third_party/nix/default.nix
index adb1bd33d1..96c5c250e4 100644
--- a/third_party/nix/default.nix
+++ b/third_party/nix/default.nix
@@ -121,7 +121,6 @@ in lib.fix (self: pkgs.llvmPackages.libcxxStdenv.mkDerivation {
     ln -s $out/bin/nix $out/bin/nix-channel
     ln -s $out/bin/nix $out/bin/nix-collect-garbage
     ln -s $out/bin/nix $out/bin/nix-copy-closure
-    ln -s $out/bin/nix $out/bin/nix-daemon
     ln -s $out/bin/nix $out/bin/nix-env
     ln -s $out/bin/nix $out/bin/nix-hash
     ln -s $out/bin/nix $out/bin/nix-instantiate
diff --git a/third_party/nix/src/CMakeLists.txt b/third_party/nix/src/CMakeLists.txt
index a142bfafb4..486c69fa2a 100644
--- a/third_party/nix/src/CMakeLists.txt
+++ b/third_party/nix/src/CMakeLists.txt
@@ -10,6 +10,7 @@ add_subdirectory(libutil)
 add_subdirectory(libstore)
 add_subdirectory(libmain)
 add_subdirectory(libexpr)
+add_subdirectory(nix-daemon)
 
 if (PACKAGE_TESTS)
   add_subdirectory(tests)
@@ -61,8 +62,6 @@ target_sources(nix
     nix-channel/nix-channel.cc
     nix-collect-garbage/nix-collect-garbage.cc
     nix-copy-closure/nix-copy-closure.cc
-    nix-daemon/nix-daemon-proto.cc
-    nix-daemon/nix-daemon-main.cc
     nix-env/nix-env.cc
     nix-env/user-env.cc
     nix-instantiate/nix-instantiate.cc
diff --git a/third_party/nix/src/nix-daemon/CMakeLists.txt b/third_party/nix/src/nix-daemon/CMakeLists.txt
new file mode 100644
index 0000000000..27a4a1254e
--- /dev/null
+++ b/third_party/nix/src/nix-daemon/CMakeLists.txt
@@ -0,0 +1,26 @@
+# -*- mode: cmake; -*-
+
+# The nix-daemon is the binary running the gRPC server component to
+# which other components of Nix talk to perform store and builder
+# operations.
+
+add_executable(nix-daemon)
+include_directories(${PROJECT_BINARY_DIR}) # for config.h
+set_property(TARGET nix-daemon PROPERTY CXX_STANDARD 17)
+
+target_sources(nix-daemon
+  PRIVATE
+    nix-daemon-proto.hh
+    nix-daemon-proto.cc
+    nix-daemon.cc
+)
+
+target_link_libraries(nix-daemon
+  nixutil
+  nixstore
+  nixmain
+  absl::flags
+  absl::flags_parse
+)
+
+install(TARGETS nix-daemon DESTINATION bin)
diff --git a/third_party/nix/src/nix-daemon/nix-daemon-main.cc b/third_party/nix/src/nix-daemon/nix-daemon.cc
index e492c343b9..02b350c3d8 100644
--- a/third_party/nix/src/nix-daemon/nix-daemon-main.cc
+++ b/third_party/nix/src/nix-daemon/nix-daemon.cc
@@ -1,5 +1,8 @@
 #include <filesystem>
 
+#include <absl/flags/flag.h>
+#include <absl/flags/parse.h>
+#include <absl/flags/usage_config.h>
 #include <absl/strings/str_format.h>
 #include <fcntl.h>
 #include <glog/logging.h>
@@ -9,7 +12,7 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 
-#include "libmain/shared.hh"
+#include "libmain/shared.hh"  // TODO(tazjin): can this be removed?
 #include "libstore/globals.hh"
 #include "libstore/store-api.hh"
 #include "libutil/util.hh"
@@ -17,6 +20,8 @@
 #include "nix-daemon/nix-daemon-proto.hh"
 #include "nix/legacy.hh"
 
+ABSL_FLAG(bool, pipe, false, "Use pipes for daemon communication");
+
 namespace nix::daemon {
 
 using grpc::Server;
@@ -105,39 +110,22 @@ int RunServer() {
   }
 }
 
-static int main_(int argc, char** argv) {
-  auto pipe = false;
-
-  // TODO(grfn): Replace with absl::flags
-  parseCmdLine(argc, argv,
-               [&](Strings::iterator& arg, const Strings::iterator& end) {
-                 if (*arg == "--help") {
-                   showManPage("nix-daemon");
-                 } else if (*arg == "--version") {
-                   printVersion("nix-daemon");
-                 } else if (*arg == "--pipe") {
-                   // Causes the daemon to forward stdin and stdout to and from
-                   // the actual daemon socket
-                   pipe = true;
-                 } else {
-                   return false;
-                 }
-                 return true;
-               });
-
-  if (pipe) {
-    if (getStoreType() == tDaemon) {
-      return ForwardToSocket(settings.nixDaemonSocketFile);
+}  // namespace nix::daemon
+
+int main(int argc, char** argv) {
+  absl::SetFlagsUsageConfig({.version_string = [] { return nix::nixVersion; }});
+  absl::ParseCommandLine(argc, argv);
+
+  if (absl::GetFlag(FLAGS_pipe)) {
+    if (nix::getStoreType() == nix::tDaemon) {
+      return nix::daemon::ForwardToSocket(nix::settings.nixDaemonSocketFile);
     } else {
       // TODO(grfn): Need to launch a server on stdin here - upstream calls
       // processConnection(true, "root", 0);
-      throw "Not implemented";
+      LOG(ERROR) << "not implemented";
+      return 1;
     }
   }
-  return RunServer();
-}
-
-// TODO(grfn): Replace this with something less magical
-static RegisterLegacyCommand s1("nix-daemon", main_);
 
-}  // namespace nix::daemon
+  return nix::daemon::RunServer();
+}