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 <isomer@tvl.fyi>
This commit is contained in:
Vincent Ambo 2020-07-05 20:02:10 +01:00 committed by tazjin
parent a6da980a0b
commit 0064e55486
4 changed files with 62 additions and 2 deletions

View file

@ -15,12 +15,14 @@ set(PKGCONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
# contain useful definitions. Other dependencies are not treated # contain useful definitions. Other dependencies are not treated
# specially by CMake and are only linked into the resulting binary. # specially by CMake and are only linked into the resulting binary.
find_package(BZip2) find_package(BZip2)
find_package(Boost COMPONENTS context) # probably coroutine + ::headers, lets find out find_package(Boost COMPONENTS context)
find_package(CURL) find_package(CURL)
find_package(LibLZMA) find_package(LibLZMA)
find_package(Protobuf REQUIRED)
find_package(SQLite3) find_package(SQLite3)
find_package(Threads) find_package(Threads)
find_package(absl REQUIRED) find_package(absl REQUIRED)
find_package(gRPC REQUIRED)
find_package(glog REQUIRED) find_package(glog REQUIRED)
# generate a configuration file (autoheader-style) to configure # generate a configuration file (autoheader-style) to configure

View file

@ -12,10 +12,23 @@ let
largeBoehm = pkgs.boehmgc.override { largeBoehm = pkgs.boehmgc.override {
enableLargeConfig = true; 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 { in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
pname = "tazjix"; pname = "tazjix";
version = "2.3.4"; version = "2.3.4";
src = ./.; inherit src;
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
bison bison
@ -33,13 +46,16 @@ in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
aws-s3-cpp aws-s3-cpp
brotli brotli
bzip2 bzip2
c-ares
curl curl
editline editline
flex flex
glog glog
grpc
libseccomp libseccomp
libsodium libsodium
openssl openssl
protobuf
sqlite sqlite
xz xz
]; ];
@ -49,6 +65,10 @@ in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
largeBoehm 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 # Install the various symlinks to the Nix binary which users expect
# to exist. # to exist.
postInstall = '' postInstall = ''

View file

@ -5,6 +5,7 @@
# this location and this setup mimics that (with the exception of the # this location and this setup mimics that (with the exception of the
# various Nix libraries). # various Nix libraries).
add_subdirectory(proto)
add_subdirectory(libutil) add_subdirectory(libutil)
add_subdirectory(libstore) add_subdirectory(libstore)
add_subdirectory(libmain) add_subdirectory(libmain)

View file

@ -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})