Creates a protoc release zip (#9188)
* Creates a protoc release zip
Mimics what we're doing manually today but powered by Bazel.
* don't special case this.
* Addressing feedback.
* adding comment about _cc_toolchain
diff --git a/BUILD b/BUILD
index 1690d42..87bd219 100644
--- a/BUILD
+++ b/BUILD
@@ -2,11 +2,13 @@
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test", "objc_library", native_cc_proto_library = "cc_proto_library")
+load("@rules_pkg//:pkg.bzl", "pkg_zip")
+load("@rules_pkg//:mappings.bzl", "pkg_files")
load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain", "proto_library")
load("@rules_python//python:defs.bzl", "py_library")
load("@rules_java//java:defs.bzl", "java_binary", "java_lite_proto_library", "java_proto_library")
load(":cc_proto_blacklist_test.bzl", "cc_proto_blacklist_test")
-
+load(":protobuf_release.bzl", "package_naming")
licenses(["notice"])
exports_files(["LICENSE"])
@@ -518,6 +520,69 @@
deps = [":protoc_lib"],
)
+
+################################################################################
+# Generates protoc release artifacts.
+################################################################################
+
+genrule(
+ name = "protoc_readme",
+ visibility = ["//visibility:private"],
+ cmd = """
+echo "Protocol Buffers - Google's data interchange format
+Copyright 2008 Google Inc.
+https://developers.google.com/protocol-buffers/
+This package contains a precompiled binary version of the protocol buffer
+compiler (protoc). This binary is intended for users who want to use Protocol
+Buffers in languages other than C++ but do not want to compile protoc
+themselves. To install, simply place this binary somewhere in your PATH.
+If you intend to use the included well known types then don't forget to
+copy the contents of the 'include' directory somewhere as well, for example
+into '/usr/local/include/'.
+Please refer to our official github site for more installation instructions:
+ https://github.com/protocolbuffers/protobuf" > $@
+ """,
+ outs = ["readme.txt"],
+)
+
+# plugin.proto is excluded from this list because it belongs in a nested folder (protobuf/compiler/plugin.proto)
+pkg_files(
+ name = "wkt_protos_files",
+ srcs = [value[0] for value in WELL_KNOWN_PROTO_MAP.values() if not value[0].endswith("plugin.proto")],
+ visibility = ["//visibility:private"],
+ prefix = "include/google/protobuf",
+)
+
+pkg_files(
+ name = "compiler_plugin_protos_files",
+ srcs = ["src/google/protobuf/compiler/plugin.proto"],
+ visibility = ["//visibility:private"],
+ prefix = "include/google/protobuf/compiler",
+)
+
+pkg_files(
+ name = "protoc_files",
+ srcs = [":protoc"],
+ visibility = ["//visibility:private"],
+ prefix = "bin/",
+)
+
+package_naming(
+ name = "protoc_pkg_naming",
+)
+
+pkg_zip(
+ name = "protoc_release",
+ package_file_name = "protoc-{version}-{cpu}.zip",
+ package_variables = ":protoc_pkg_naming",
+ srcs = [
+ ":protoc_files",
+ ":wkt_protos_files",
+ ":compiler_plugin_protos_files",
+ "readme.txt",
+ ],
+)
+
################################################################################
# Tests
################################################################################
diff --git a/Makefile.am b/Makefile.am
index 8e9f1bf..ae86b8f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1429,6 +1429,7 @@
maven_install.json \
protobuf.bzl \
protobuf_deps.bzl \
+ protobuf_release.bzl \
protobuf_version.bzl \
third_party/zlib.BUILD \
util/python/BUILD \
diff --git a/WORKSPACE b/WORKSPACE
index e500967..8104dcc 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -56,3 +56,6 @@
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
bazel_skylib_workspace()
+
+load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies")
+rules_pkg_dependencies()
diff --git a/protobuf_deps.bzl b/protobuf_deps.bzl
index 45e413d..2e62886 100644
--- a/protobuf_deps.bzl
+++ b/protobuf_deps.bzl
@@ -73,3 +73,13 @@
strip_prefix = "rules_jvm_external-4.1",
urls = ["https://github.com/bazelbuild/rules_jvm_external/archive/4.1.zip"],
)
+
+ if not native.existing_rule("rules_pkg"):
+ http_archive(
+ name = "rules_pkg",
+ urls = [
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.5.1/rules_pkg-0.5.1.tar.gz",
+ "https://github.com/bazelbuild/rules_pkg/releases/download/0.5.1/rules_pkg-0.5.1.tar.gz",
+ ],
+ sha256 = "a89e203d3cf264e564fcb96b6e06dd70bc0557356eb48400ce4b5d97c2c3720d",
+ )
diff --git a/protobuf_release.bzl b/protobuf_release.bzl
new file mode 100644
index 0000000..e007e00
--- /dev/null
+++ b/protobuf_release.bzl
@@ -0,0 +1,28 @@
+"""
+Generates package naming variables for use with rules_pkg.
+"""
+
+load("@rules_pkg//:providers.bzl", "PackageVariablesInfo")
+load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
+load(":protobuf_version.bzl", "PROTOBUF_VERSION")
+
+def _package_naming_impl(ctx):
+ values = {}
+ values["version"] = PROTOBUF_VERSION
+
+ # infer from the current cpp toolchain.
+ toolchain = find_cpp_toolchain(ctx)
+ values["cpu"] = toolchain.cpu
+
+ return PackageVariablesInfo(values = values)
+
+
+package_naming = rule(
+ implementation = _package_naming_impl,
+ attrs = {
+ # Necessary data dependency for find_cpp_toolchain.
+ "_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")),
+ },
+ toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
+ incompatible_use_toolchain_transition = True,
+)
diff --git a/toolchain/cc_toolchain_config.bzl b/toolchain/cc_toolchain_config.bzl
index 4478a11..568b056 100644
--- a/toolchain/cc_toolchain_config.bzl
+++ b/toolchain/cc_toolchain_config.bzl
@@ -4,7 +4,6 @@
"feature",
"flag_group",
"flag_set",
- "tool",
"tool_path",
)