diff options
Diffstat (limited to 'nixpkgs/pkgs/development/tools/build-managers/bazel/bazel_7/protobuf-test.nix')
-rw-r--r-- | nixpkgs/pkgs/development/tools/build-managers/bazel/bazel_7/protobuf-test.nix | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/build-managers/bazel/bazel_7/protobuf-test.nix b/nixpkgs/pkgs/development/tools/build-managers/bazel/bazel_7/protobuf-test.nix new file mode 100644 index 000000000000..d50de32d4a3e --- /dev/null +++ b/nixpkgs/pkgs/development/tools/build-managers/bazel/bazel_7/protobuf-test.nix @@ -0,0 +1,171 @@ +{ bazel +, Foundation +, bazelTest +, callPackage +, darwin +, distDir +, extraBazelArgs ? "" +, fetchFromGitHub +, fetchurl +, jdk11_headless +, lib +, libtool +, lndir +, openjdk8 +, repoCache +, runLocal +, runtimeShell +, stdenv +, symlinkJoin +, tree +, writeScript +, writeText +}: + +# This test uses bzlmod because I could not make it work without it. +# This is good, because we have at least one test with bzlmod enabled. +# However, we have to create our own lockfile, wich is quite a big file by +# itself. + +let + # To update the lockfile, run + # $ nix-shell -A bazel_7.tests.vanilla.protobuf + # [nix-shell]$ genericBuild # (wait a bit for failure, or kill it) + # [nix-shell]$ rm -f MODULE.bazel.lock + # [nix-shell]$ bazel mod deps --lockfile_mode=update + # [nix-shell]$ cp MODULE.bazel.lock $HERE/protobuf-test.MODULE.bazel.lock + lockfile = ./protobuf-test.MODULE.bazel.lock; + + protobufRepoCache = callPackage ./bazel-repository-cache.nix { + # We are somewhat lucky that bazel's own lockfile works for our tests. + # Use extraDeps if the tests need things that are not in that lockfile. + # But most test dependencies are bazel's builtin deps, so that at least aligns. + inherit lockfile; + + # Remove platform-specific binaries, as they are large and useless. + requiredDepNamePredicate = name: + null == builtins.match ".*(macos|osx|linux|win|android|maven).*" name; + }; + + mergedRepoCache = symlinkJoin { + name = "mergedDistDir"; + paths = [ protobufRepoCache distDir ]; + }; + + MODULE = writeText "MODULE.bazel" '' + bazel_dep(name = "rules_proto", version = "5.3.0-21.7") + bazel_dep(name = "protobuf", version = "21.7") + bazel_dep(name = "zlib", version = "1.3") + ''; + + WORKSPACE = writeText "WORKSPACE" '' + # Empty, we use bzlmod instead + ''; + + personProto = writeText "person.proto" '' + syntax = "proto3"; + + package person; + + message Person { + string name = 1; + int32 id = 2; + string email = 3; + } + ''; + + personBUILD = writeText "BUILD" '' + load("@rules_proto//proto:defs.bzl", "proto_library") + + proto_library( + name = "person_proto", + srcs = ["person.proto"], + visibility = ["//visibility:public"], + ) + + java_proto_library( + name = "person_java_proto", + deps = [":person_proto"], + ) + + cc_proto_library( + name = "person_cc_proto", + deps = [":person_proto"], + ) + ''; + + toolsBazel = writeScript "bazel" '' + #! ${runtimeShell} + + export CXX='${stdenv.cc}/bin/clang++' + export LD='${darwin.cctools}/bin/ld' + export LIBTOOL='${darwin.cctools}/bin/libtool' + export CC='${stdenv.cc}/bin/clang' + + # XXX: hack for macosX, this flags disable bazel usage of xcode + # See: https://github.com/bazelbuild/bazel/issues/4231 + export BAZEL_USE_CPP_ONLY_TOOLCHAIN=1 + + export HOMEBREW_RUBY_PATH="foo" + + exec "$BAZEL_REAL" "$@" + ''; + + workspaceDir = runLocal "our_workspace" { } ('' + mkdir $out + cp ${MODULE} $out/MODULE.bazel + cp ${./protobuf-test.MODULE.bazel.lock} $out/MODULE.bazel.lock + #cp ${WORKSPACE} $out/WORKSPACE + touch $out/WORKSPACE + touch $out/BUILD.bazel + mkdir $out/person + cp ${personProto} $out/person/person.proto + cp ${personBUILD} $out/person/BUILD.bazel + '' + + (lib.optionalString stdenv.isDarwin '' + echo 'tools bazel created' + mkdir $out/tools + install ${toolsBazel} $out/tools/bazel + '')); + + testBazel = bazelTest { + name = "bazel-test-protocol-buffers"; + inherit workspaceDir; + bazelPkg = bazel; + buildInputs = [ + (if lib.strings.versionOlder bazel.version "5.0.0" then openjdk8 else jdk11_headless) + tree + bazel + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + Foundation + darwin.objc4 + ]; + + bazelScript = '' + ${bazel}/bin/bazel \ + build \ + --repository_cache=${mergedRepoCache} \ + ${extraBazelArgs} \ + --enable_bzlmod \ + --lockfile_mode=error \ + --verbose_failures \ + //... \ + '' + lib.optionalString (lib.strings.versionOlder bazel.version "5.0.0") '' + --host_javabase='@local_jdk//:jdk' \ + --java_toolchain='@bazel_tools//tools/jdk:toolchain_hostjdk8' \ + --javabase='@local_jdk//:jdk' \ + '' + lib.optionalString (stdenv.isDarwin) '' + --cxxopt=-x --cxxopt=c++ --host_cxxopt=-x --host_cxxopt=c++ \ + '' + lib.optionalString (stdenv.cc.isClang && stdenv ? cc.libcxx.cxxabi.libName) '' + --linkopt=-Wl,-l${stdenv.cc.libcxx.cxxabi.libName} \ + --linkopt=-L${stdenv.cc.libcxx.cxxabi}/lib \ + --host_linkopt=-Wl,-l${stdenv.cc.libcxx.cxxabi.libName} \ + --host_linkopt=-L${stdenv.cc.libcxx.cxxabi}/lib \ + '' + '' + + ''; + }; + +in +testBazel |