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:
parent
a6da980a0b
commit
0064e55486
4 changed files with 62 additions and 2 deletions
4
third_party/nix/CMakeLists.txt
vendored
4
third_party/nix/CMakeLists.txt
vendored
|
@ -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
|
||||
|
|
22
third_party/nix/default.nix
vendored
22
third_party/nix/default.nix
vendored
|
@ -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 = ''
|
||||
|
|
1
third_party/nix/src/CMakeLists.txt
vendored
1
third_party/nix/src/CMakeLists.txt
vendored
|
@ -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)
|
||||
|
|
37
third_party/nix/src/proto/CMakeLists.txt
vendored
Normal file
37
third_party/nix/src/proto/CMakeLists.txt
vendored
Normal 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})
|
Loading…
Reference in a new issue