From 0064e554863f454137a85370595bda9e7c4b692a Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 5 Jul 2020 20:02:10 +0100 Subject: feat(3p/nix): Add protobuf & gRPC dependencies and generate sources 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 --- third_party/nix/CMakeLists.txt | 4 +++- third_party/nix/default.nix | 22 ++++++++++++++++++- third_party/nix/src/CMakeLists.txt | 1 + third_party/nix/src/proto/CMakeLists.txt | 37 ++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 third_party/nix/src/proto/CMakeLists.txt 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}) -- cgit 1.4.1