about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2020-07-05T19·02+0100
committertazjin <mail@tazj.in>2020-07-05T19·17+0000
commit0064e554863f454137a85370595bda9e7c4b692a (patch)
tree8dfa6399cb913f846d7a05a1e45031d4cb326c68
parenta6da980a0b4b95e1ac06d20aca7fbe59fff3c36c (diff)
feat(3p/nix): Add protobuf & gRPC dependencies and generate sources r/1216
Adds dependencies on the gRPC & protobuf libraries, and implements Nix
code to generate the C++ sources from the included proto definitions.

This is theoretically supported via CMake, but practically doesn't
work and I don't care to debug why.

Doing it like this lets us instead add a CMake library target for our
proto definitions based on the sources generated by Nix.

Pros:
  * no need to deal with the gRPC CMake mess
  * it works!

Cons: * iteration requires nix-shell restart
Change-Id: Ie1fe9807fc96c49cb8f7161ba59d093456062b15
Reviewed-on: https://cl.tvl.fyi/c/depot/+/927
Tested-by: BuildkiteCI
Reviewed-by: isomer <isomer@tvl.fyi>
-rw-r--r--third_party/nix/CMakeLists.txt4
-rw-r--r--third_party/nix/default.nix22
-rw-r--r--third_party/nix/src/CMakeLists.txt1
-rw-r--r--third_party/nix/src/proto/CMakeLists.txt37
4 files changed, 62 insertions, 2 deletions
diff --git a/third_party/nix/CMakeLists.txt b/third_party/nix/CMakeLists.txt
index 58a1fe23fc..4e6b209c36 100644
--- a/third_party/nix/CMakeLists.txt
+++ b/third_party/nix/CMakeLists.txt
@@ -15,12 +15,14 @@ set(PKGCONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
 # contain useful definitions. Other dependencies are not treated
 # specially by CMake and are only linked into the resulting binary.
 find_package(BZip2)
-find_package(Boost COMPONENTS context) # probably coroutine + ::headers, lets find out
+find_package(Boost COMPONENTS context)
 find_package(CURL)
 find_package(LibLZMA)
+find_package(Protobuf REQUIRED)
 find_package(SQLite3)
 find_package(Threads)
 find_package(absl REQUIRED)
+find_package(gRPC REQUIRED)
 find_package(glog REQUIRED)
 
 # generate a configuration file (autoheader-style) to configure
diff --git a/third_party/nix/default.nix b/third_party/nix/default.nix
index b6e59213fc..b95309ff10 100644
--- a/third_party/nix/default.nix
+++ b/third_party/nix/default.nix
@@ -12,10 +12,23 @@ let
   largeBoehm = pkgs.boehmgc.override {
     enableLargeConfig = true;
   };
+
+  src = ./.;
+
+  # Proto generation in CMake is theoretically possible, but that is
+  # very theoretical - this does it in Nix instead.
+  protoSrcs = pkgs.runCommand "nix-proto-srcs" {} ''
+    export PROTO_SRCS=${src}/src/proto
+    mkdir -p $out/libproto
+    ${pkgs.protobuf}/bin/protoc -I=$PROTO_SRCS \
+      --cpp_out=$out/libproto \
+      --plugin=protoc-gen-grpc=${pkgs.grpc}/bin/grpc_cpp_plugin --grpc_out=$out/libproto \
+      $PROTO_SRCS/*.proto
+  '';
 in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
   pname = "tazjix";
   version = "2.3.4";
-  src = ./.;
+  inherit src;
 
   nativeBuildInputs = with pkgs; [
     bison
@@ -33,13 +46,16 @@ in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
     aws-s3-cpp
     brotli
     bzip2
+    c-ares
     curl
     editline
     flex
     glog
+    grpc
     libseccomp
     libsodium
     openssl
+    protobuf
     sqlite
     xz
   ];
@@ -49,6 +65,10 @@ in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
     largeBoehm
   ];
 
+  # Forward the location of the generated Protobuf / gRPC files so
+  # that they can be included by CMake.
+  NIX_PROTO_SRCS = protoSrcs;
+
   # Install the various symlinks to the Nix binary which users expect
   # to exist.
   postInstall = ''
diff --git a/third_party/nix/src/CMakeLists.txt b/third_party/nix/src/CMakeLists.txt
index 37ff3b54af..3f30b16725 100644
--- a/third_party/nix/src/CMakeLists.txt
+++ b/third_party/nix/src/CMakeLists.txt
@@ -5,6 +5,7 @@
 # this location and this setup mimics that (with the exception of the
 # various Nix libraries).
 
+add_subdirectory(proto)
 add_subdirectory(libutil)
 add_subdirectory(libstore)
 add_subdirectory(libmain)
diff --git a/third_party/nix/src/proto/CMakeLists.txt b/third_party/nix/src/proto/CMakeLists.txt
new file mode 100644
index 0000000000..726ca8742f
--- /dev/null
+++ b/third_party/nix/src/proto/CMakeLists.txt
@@ -0,0 +1,37 @@
+# -*- mode: cmake; -*-
+#
+# The proto generation happens outside of CMake and the path to the
+# generated files is passed in via the environment variable
+# $NIX_PROTO_SRCS.
+#
+# This configuration defines a library target that compiles these
+# sources and makes the headers available.
+
+add_library(nixproto SHARED)
+set_property(TARGET nixproto PROPERTY CXX_STANDARD 17)
+
+set(HEADER_FILES
+  $ENV{NIX_PROTO_SRCS}/libproto/worker.grpc.pb.h
+  $ENV{NIX_PROTO_SRCS}/libproto/worker.pb.h
+)
+
+target_sources(nixproto
+  PUBLIC
+    ${HEADER_FILES}
+
+  PRIVATE
+    $ENV{NIX_PROTO_SRCS}/libproto/worker.grpc.pb.cc
+    $ENV{NIX_PROTO_SRCS}/libproto/worker.pb.cc
+)
+
+target_link_libraries(nixproto
+  gRPC::grpc++_reflection
+  protobuf::libprotobuf
+)
+
+target_include_directories(nixproto
+  INTERFACE $ENV{NIX_PROTO_SRCS}
+)
+
+INSTALL(FILES ${HEADER_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/nix/libproto)
+INSTALL(TARGETS nixproto DESTINATION ${CMAKE_INSTALL_LIBDIR})