155 lines
4 KiB
Nix
155 lines
4 KiB
Nix
|
{
|
||
|
bazel
|
||
|
, bazelTest
|
||
|
, fetchFromGitHub
|
||
|
, fetchurl
|
||
|
, gccStdenv
|
||
|
, lib
|
||
|
, openjdk8
|
||
|
, runLocal
|
||
|
, runtimeShell
|
||
|
, writeScript
|
||
|
, writeText
|
||
|
, distDir
|
||
|
}:
|
||
|
|
||
|
let
|
||
|
com_google_protobuf = fetchFromGitHub {
|
||
|
owner = "protocolbuffers";
|
||
|
repo = "protobuf";
|
||
|
rev = "v3.7.0";
|
||
|
sha256 = "0nlxif4cajqllsj2vdh7zp14ag48fb8lsa64zmq8625q9m2lcmdh";
|
||
|
};
|
||
|
|
||
|
bazel_skylib = fetchFromGitHub {
|
||
|
owner = "bazelbuild";
|
||
|
repo = "bazel-skylib";
|
||
|
rev = "f83cb8dd6f5658bc574ccd873e25197055265d1c";
|
||
|
sha256 = "091fb0ky0956wgv8gghy9ay3yfx6497mb72qvibf0y9dllmxyn9l";
|
||
|
};
|
||
|
|
||
|
net_zlib = fetchurl rec {
|
||
|
url = "https://zlib.net/zlib-1.2.11.tar.gz";
|
||
|
sha256 = "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1";
|
||
|
|
||
|
passthru.sha256 = sha256;
|
||
|
};
|
||
|
|
||
|
WORKSPACE = writeText "WORKSPACE" ''
|
||
|
workspace(name = "our_workspace")
|
||
|
|
||
|
load("//:proto-support.bzl", "protobuf_deps")
|
||
|
protobuf_deps()
|
||
|
'';
|
||
|
|
||
|
protoSupport = writeText "proto-support.bzl" ''
|
||
|
"""Load dependencies needed to compile the protobuf library as a 3rd-party consumer."""
|
||
|
|
||
|
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||
|
|
||
|
def protobuf_deps():
|
||
|
"""Loads common dependencies needed to compile the protobuf library."""
|
||
|
|
||
|
if "zlib" not in native.existing_rules():
|
||
|
# proto_library, cc_proto_library, and java_proto_library rules implicitly
|
||
|
# depend on @com_google_protobuf for protoc and proto runtimes.
|
||
|
# This statement defines the @com_google_protobuf repo.
|
||
|
native.local_repository(
|
||
|
name = "com_google_protobuf",
|
||
|
path = "${com_google_protobuf}",
|
||
|
)
|
||
|
native.local_repository(
|
||
|
name = "bazel_skylib",
|
||
|
path = "${bazel_skylib}",
|
||
|
)
|
||
|
|
||
|
native.bind(
|
||
|
name = "zlib",
|
||
|
actual = "@net_zlib//:zlib",
|
||
|
)
|
||
|
http_archive(
|
||
|
name = "net_zlib",
|
||
|
build_file = "@com_google_protobuf//:third_party/zlib.BUILD",
|
||
|
sha256 = "${net_zlib.sha256}",
|
||
|
strip_prefix = "zlib-1.2.11",
|
||
|
urls = ["file://${net_zlib}"],
|
||
|
)
|
||
|
'';
|
||
|
|
||
|
personProto = writeText "person.proto" ''
|
||
|
syntax = "proto3";
|
||
|
|
||
|
package person;
|
||
|
|
||
|
message Person {
|
||
|
string name = 1;
|
||
|
int32 id = 2;
|
||
|
string email = 3;
|
||
|
}
|
||
|
'';
|
||
|
|
||
|
personBUILD = writeText "BUILD" ''
|
||
|
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='${gccStdenv.cc}/bin/g++'
|
||
|
export LD='${gccStdenv.cc}/bin/ld'
|
||
|
export CC='${gccStdenv.cc}/bin/gcc'
|
||
|
|
||
|
# 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
|
||
|
|
||
|
exec "$BAZEL_REAL" "$@"
|
||
|
'';
|
||
|
|
||
|
workspaceDir = runLocal "our_workspace" {} (''
|
||
|
mkdir $out
|
||
|
cp ${WORKSPACE} $out/WORKSPACE
|
||
|
touch $out/BUILD.bazel
|
||
|
cp ${protoSupport} $out/proto-support.bzl
|
||
|
mkdir $out/person
|
||
|
cp ${personProto} $out/person/person.proto
|
||
|
cp ${personBUILD} $out/person/BUILD.bazel
|
||
|
''
|
||
|
+ (lib.optionalString gccStdenv.isDarwin ''
|
||
|
mkdir $out/tools
|
||
|
cp ${toolsBazel} $out/tools/bazel
|
||
|
''));
|
||
|
|
||
|
testBazel = bazelTest {
|
||
|
name = "bazel-test-protocol-buffers";
|
||
|
inherit workspaceDir;
|
||
|
bazelPkg = bazel;
|
||
|
buildInputs = [ openjdk8 ];
|
||
|
bazelScript = ''
|
||
|
${bazel}/bin/bazel \
|
||
|
build \
|
||
|
--distdir=${distDir} \
|
||
|
--host_javabase='@local_jdk//:jdk' \
|
||
|
--java_toolchain='@bazel_tools//tools/jdk:toolchain_hostjdk8' \
|
||
|
--javabase='@local_jdk//:jdk' \
|
||
|
--verbose_failures \
|
||
|
//...
|
||
|
'';
|
||
|
};
|
||
|
|
||
|
in testBazel
|