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
|
# 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
|
||||||
|
|
22
third_party/nix/default.nix
vendored
22
third_party/nix/default.nix
vendored
|
@ -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 = ''
|
||||||
|
|
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
|
# 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)
|
||||||
|
|
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