diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/protobuf')
7 files changed, 215 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/protobuf/21.nix b/nixpkgs/pkgs/development/libraries/protobuf/21.nix new file mode 100644 index 000000000000..09a8c81b3d13 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/21.nix @@ -0,0 +1,6 @@ +{ callPackage, ... } @ args: + +callPackage ./generic.nix ({ + version = "21.12"; + hash = "sha256-VZQEFHq17UsTH5CZZOcJBKiScGV2xPJ/e6gkkVliRCU="; +} // args) diff --git a/nixpkgs/pkgs/development/libraries/protobuf/23.nix b/nixpkgs/pkgs/development/libraries/protobuf/23.nix new file mode 100644 index 000000000000..abb2cc2f4460 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/23.nix @@ -0,0 +1,6 @@ +{ callPackage, ... } @ args: + +callPackage ./generic.nix ({ + version = "23.4"; + hash = "sha256-eI+mrsZAOLEsdyTC3B+K+GjD3r16CmPx1KJ2KhCwFdg="; +} // args) diff --git a/nixpkgs/pkgs/development/libraries/protobuf/24.nix b/nixpkgs/pkgs/development/libraries/protobuf/24.nix new file mode 100644 index 000000000000..6741b8afe52e --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/24.nix @@ -0,0 +1,6 @@ +{ callPackage, ... } @ args: + +callPackage ./generic.nix ({ + version = "24.4"; + hash = "sha256-I+Xtq4GOs++f/RlVff9MZuolXrMLmrZ2z6mkBayqQ2s="; +} // args) diff --git a/nixpkgs/pkgs/development/libraries/protobuf/3.20.nix b/nixpkgs/pkgs/development/libraries/protobuf/3.20.nix new file mode 100644 index 000000000000..bae3550f8f05 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/3.20.nix @@ -0,0 +1,6 @@ +{ callPackage, ... } @ args: + +callPackage ./generic-v3.nix ({ + version = "3.20.3"; + sha256 = "sha256-u/1Yb8+mnDzc3OwirpGESuhjkuKPgqDAvlgo3uuzbbk="; +} // args) diff --git a/nixpkgs/pkgs/development/libraries/protobuf/generic-v3.nix b/nixpkgs/pkgs/development/libraries/protobuf/generic-v3.nix new file mode 100644 index 000000000000..9dc7f70c2fe2 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/generic-v3.nix @@ -0,0 +1,59 @@ +{ lib, stdenv +, fetchFromGitHub +, autoreconfHook, zlib, gtest, buildPackages +, version, sha256 +, ... +}: + +let +mkProtobufDerivation = buildProtobuf: stdenv: stdenv.mkDerivation { + pname = "protobuf"; + inherit version; + + # make sure you test also -A pythonPackages.protobuf + src = fetchFromGitHub { + owner = "protocolbuffers"; + repo = "protobuf"; + rev = "v${version}"; + inherit sha256; + }; + + postPatch = '' + rm -rf gmock + cp -r ${gtest.src}/googlemock gmock + cp -r ${gtest.src}/googletest googletest + chmod -R a+w gmock + chmod -R a+w googletest + ln -s ../googletest gmock/gtest + '' + lib.optionalString stdenv.isDarwin '' + substituteInPlace src/google/protobuf/testing/googletest.cc \ + --replace 'tmpnam(b)' '"'$TMPDIR'/foo"' + ''; + + nativeBuildInputs = [ autoreconfHook buildPackages.which buildPackages.stdenv.cc buildProtobuf ]; + + buildInputs = [ zlib ]; + configureFlags = lib.optional (buildProtobuf != null) "--with-protoc=${buildProtobuf}/bin/protoc"; + + enableParallelBuilding = true; + + doCheck = true; + + dontDisableStatic = true; + + meta = { + description = "Google's data interchange format"; + longDescription = + ''Protocol Buffers are a way of encoding structured data in an efficient + yet extensible format. Google uses Protocol Buffers for almost all of + its internal RPC protocols and file formats. + ''; + homepage = "https://developers.google.com/protocol-buffers/"; + license = lib.licenses.bsd3; + mainProgram = "protoc"; + platforms = lib.platforms.unix; + }; +}; +in mkProtobufDerivation(if (stdenv.buildPlatform != stdenv.hostPlatform) + then (mkProtobufDerivation null buildPackages.stdenv) + else null) stdenv diff --git a/nixpkgs/pkgs/development/libraries/protobuf/generic.nix b/nixpkgs/pkgs/development/libraries/protobuf/generic.nix new file mode 100644 index 000000000000..cf00d1d50beb --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/generic.nix @@ -0,0 +1,114 @@ +# The cmake version of this build is meant to enable both cmake and .pc being exported +# this is important because grpc exports a .cmake file which also expects for protobuf +# to have been exported through cmake as well. +{ lib +, stdenv +, abseil-cpp +, buildPackages +, cmake +, fetchFromGitHub +, fetchpatch +, gtest +, zlib +, version +, hash + + # downstream dependencies +, python3 +, grpc +, enableShared ? !stdenv.hostPlatform.isStatic + +, ... +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "protobuf"; + inherit version; + + src = fetchFromGitHub { + owner = "protocolbuffers"; + repo = "protobuf"; + rev = "v${version}"; + inherit hash; + }; + + postPatch = lib.optionalString stdenv.isDarwin '' + substituteInPlace src/google/protobuf/testing/googletest.cc \ + --replace 'tmpnam(b)' '"'$TMPDIR'/foo"' + ''; + + patches = lib.optionals (lib.versionOlder version "22") [ + # fix protobuf-targets.cmake installation paths, and allow for CMAKE_INSTALL_LIBDIR to be absolute + # https://github.com/protocolbuffers/protobuf/pull/10090 + (fetchpatch { + url = "https://github.com/protocolbuffers/protobuf/commit/a7324f88e92bc16b57f3683403b6c993bf68070b.patch"; + hash = "sha256-SmwaUjOjjZulg/wgNmR/F5b8rhYA2wkKAjHIOxjcQdQ="; + }) + ] ++ lib.optionals stdenv.hostPlatform.isStatic [ + ./static-executables-have-no-rpath.patch + ]; + + nativeBuildInputs = [ + cmake + ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + # protoc of the same version must be available for build. For non-cross builds, it's able to + # re-use the executable generated as part of the build + buildPackages."protobuf_${lib.versions.major version}" + ]; + + buildInputs = [ + gtest + zlib + ]; + + propagatedBuildInputs = [ + abseil-cpp + ]; + + strictDeps = true; + + cmakeDir = if lib.versionOlder version "22" then "../cmake" else null; + cmakeFlags = [ + "-Dprotobuf_USE_EXTERNAL_GTEST=ON" + "-Dprotobuf_ABSL_PROVIDER=package" + ] ++ lib.optionals enableShared [ + "-Dprotobuf_BUILD_SHARED_LIBS=ON" + ] + # Tests fail to build on 32-bit platforms; fixed in 22.x + # https://github.com/protocolbuffers/protobuf/issues/10418 + ++ lib.optionals (stdenv.hostPlatform.is32bit && lib.versionOlder version "22") [ + "-Dprotobuf_BUILD_TESTS=OFF" + ]; + + # FIXME: investigate. 24.x and 23.x have different errors. + # At least some of it is not reproduced on some other machine; example: + # https://hydra.nixos.org/build/235677717/nixlog/4/tail + # Also AnyTest.TestPackFromSerializationExceedsSizeLimit fails on 32-bit platforms + # https://github.com/protocolbuffers/protobuf/issues/8460 + doCheck = !(stdenv.isDarwin && lib.versionAtLeast version "23") && !stdenv.hostPlatform.is32bit; + + passthru = { + tests = { + pythonProtobuf = python3.pkgs.protobuf.override (_: { + protobuf = finalAttrs.finalPackage; + }); + inherit grpc; + }; + + inherit abseil-cpp; + }; + + meta = { + description = "Google's data interchange format"; + longDescription = '' + Protocol Buffers are a way of encoding structured data in an efficient + yet extensible format. Google uses Protocol Buffers for almost all of + its internal RPC protocols and file formats. + ''; + license = lib.licenses.bsd3; + platforms = lib.platforms.all; + homepage = "https://protobuf.dev/"; + maintainers = with lib.maintainers; [ jonringer ]; + mainProgram = "protoc"; + }; +}) diff --git a/nixpkgs/pkgs/development/libraries/protobuf/static-executables-have-no-rpath.patch b/nixpkgs/pkgs/development/libraries/protobuf/static-executables-have-no-rpath.patch new file mode 100644 index 000000000000..cd2474e14590 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/protobuf/static-executables-have-no-rpath.patch @@ -0,0 +1,18 @@ +diff --git a/cmake/install.cmake b/cmake/install.cmake +index 26a55be8b..b6823c3f9 100644 +--- a/cmake/install.cmake ++++ b/cmake/install.cmake +@@ -32,13 +32,6 @@ if (protobuf_BUILD_PROTOC_BINARIES) + install(TARGETS protoc EXPORT protobuf-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT protoc + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT protoc) +- if (UNIX AND NOT APPLE) +- set_property(TARGET protoc +- PROPERTY INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") +- elseif (APPLE) +- set_property(TARGET protoc +- PROPERTY INSTALL_RPATH "@loader_path/../lib") +- endif() + endif (protobuf_BUILD_PROTOC_BINARIES) + + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/protobuf.pc ${CMAKE_CURRENT_BINARY_DIR}/protobuf-lite.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") |