8e57c33ab6
Apparently there's an issue where compiling grpc with -std=c++17 fails unless the clang version is at least 11. Hopefully our default clang version will be increased to that soon, but until then we need to work around this problem by setting an older C++ standard. It's unclear if using C++11 causes further issues, but compiling is better than not compiling, I suppose. Contrary to the linked bug report, the darwin stdenv doesn't exhibit this problem for some reason.
97 lines
3.3 KiB
Nix
97 lines
3.3 KiB
Nix
{ lib
|
|
, stdenv
|
|
, fetchFromGitHub
|
|
, fetchpatch
|
|
, buildPackages
|
|
, cmake
|
|
, zlib
|
|
, c-ares
|
|
, pkg-config
|
|
, re2
|
|
, openssl
|
|
, protobuf
|
|
, grpc
|
|
, abseil-cpp
|
|
, libnsl
|
|
}:
|
|
|
|
stdenv.mkDerivation rec {
|
|
pname = "grpc";
|
|
version = "1.41.0"; # N.B: if you change this, change pythonPackages.grpcio-tools to a matching version too
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "grpc";
|
|
repo = "grpc";
|
|
rev = "v${version}";
|
|
sha256 = "1mcgnzwc2mcdpcfhc1b37vff0biwyd3v0a2ack58wgf4336pzlsb";
|
|
fetchSubmodules = true;
|
|
};
|
|
|
|
patches = [
|
|
# Fix build on armv6l (https://github.com/grpc/grpc/pull/21341)
|
|
(fetchpatch {
|
|
url = "https://github.com/grpc/grpc/commit/2f4cf1d9265c8e10fb834f0794d0e4f3ec5ae10e.patch";
|
|
sha256 = "0ams3jmgh9yzwmxcg4ifb34znamr7pb4qm0609kvil9xqvkqz963";
|
|
})
|
|
|
|
# Revert gRPC C++ Mutex to be an alias of Abseil, because it breaks dependent packages
|
|
(fetchpatch {
|
|
url = "https://github.com/grpc/grpc/commit/931f91b745cd5b2864a0d1787815871d0bd844ae.patch";
|
|
sha256 = "0vc93g2i4982ys4gzyaxdv9ni25yk10sxq3n7fkz8dypy8sylck7";
|
|
revert = true;
|
|
})
|
|
];
|
|
|
|
nativeBuildInputs = [ cmake pkg-config ]
|
|
++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) grpc;
|
|
propagatedBuildInputs = [ c-ares re2 zlib abseil-cpp ];
|
|
buildInputs = [ c-ares.cmake-config openssl protobuf ]
|
|
++ lib.optionals stdenv.isLinux [ libnsl ];
|
|
|
|
cmakeFlags = [
|
|
"-DgRPC_ZLIB_PROVIDER=package"
|
|
"-DgRPC_CARES_PROVIDER=package"
|
|
"-DgRPC_RE2_PROVIDER=package"
|
|
"-DgRPC_SSL_PROVIDER=package"
|
|
"-DgRPC_PROTOBUF_PROVIDER=package"
|
|
"-DgRPC_ABSL_PROVIDER=package"
|
|
"-DBUILD_SHARED_LIBS=ON"
|
|
"-DCMAKE_SKIP_BUILD_RPATH=OFF"
|
|
# Needs to be compiled with -std=c++11 for clang < 11. Interestingly this is
|
|
# only an issue with the useLLVM stdenv, not the darwin stdenv…
|
|
# https://github.com/grpc/grpc/issues/26473#issuecomment-860885484
|
|
(if (stdenv.hostPlatform.useLLVM or false) && lib.versionOlder stdenv.cc.cc.version "11.0"
|
|
then "-DCMAKE_CXX_STANDARD=11"
|
|
else "-DCMAKE_CXX_STANDARD=17")
|
|
] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
|
|
"-D_gRPC_PROTOBUF_PROTOC_EXECUTABLE=${buildPackages.protobuf}/bin/protoc"
|
|
];
|
|
|
|
# CMake creates a build directory by default, this conflicts with the
|
|
# basel BUILD file on case-insensitive filesystems.
|
|
preConfigure = ''
|
|
rm -vf BUILD
|
|
'';
|
|
|
|
# When natively compiling, grpc_cpp_plugin is executed from the build directory,
|
|
# needing to load dynamic libraries from the build directory, so we set
|
|
# LD_LIBRARY_PATH to enable this. When cross compiling we need to avoid this,
|
|
# since it can cause the grpc_cpp_plugin executable from buildPackages to
|
|
# crash if build and host architecture are compatible (e. g. pkgsLLVM).
|
|
preBuild = lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) ''
|
|
export LD_LIBRARY_PATH=$(pwd)''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
|
|
'';
|
|
|
|
NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-error=unknown-warning-option";
|
|
|
|
enableParallelBuilds = true;
|
|
|
|
meta = with lib; {
|
|
description = "The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)";
|
|
license = licenses.asl20;
|
|
maintainers = with maintainers; [ lnl7 marsam ];
|
|
homepage = "https://grpc.io/";
|
|
platforms = platforms.all;
|
|
changelog = "https://github.com/grpc/grpc/releases/tag/v${version}";
|
|
};
|
|
}
|