Add source distribution packaging rules (#9835)

This change adds `rules_pkg`-based targets that will produce source distribution archives, similar to `make dist`.

These rules produce nearly the same outputs as `make dist`. However, there are some differences and caveats:

1. The outputs do not contain vendored googletest sources.
2. You have to run `autogen.sh` before `blaze build pkg:all`. This produces several autotools-related files directly into the source tree.
3. The output .zip files do not have a directory prefix like `protobuf-3.20.1-rc-1` (this will be addressed after [Substitute package variables in `pkg_zip#package_dir`. bazelbuild/rules_pkg#577](https://github.com/bazelbuild/rules_pkg/pull/577); the tar files do have this prefix, though.)
4. One file is missing from the archives, which is produced during the `make` build: benchmarks/gogo/cpp_no_group/cpp_benchmark.cc
5. In several places, I have explicitly excluded some files that are not in the autotools distribution outputs. I think most of those files should probably be included, but for now, I'm aiming for parity with `make dist`. These are marked with comments, so it should be easy to clean them up later.
diff --git a/java/BUILD b/java/BUILD
index 4a1cdc2..c084db6 100644
--- a/java/BUILD
+++ b/java/BUILD
@@ -1,3 +1,5 @@
+load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
+
 test_suite(
     name = "tests",
     tests = [
@@ -12,9 +14,40 @@
 filegroup(
     name = "release",
     srcs = [
-        "//java/core:release", # contains lite.
+        "//java/core:release",  # contains lite.
         "//java/kotlin:release",
         "//java/kotlin-lite:release",
         "//java/util:release",
-    ]
+    ],
+)
+
+################################################################################
+# Packaging rules
+################################################################################
+
+pkg_files(
+    name = "dist_files",
+    srcs = [
+        "BUILD",
+        "README.md",
+        "bom/pom.xml",
+        "lite.md",
+        "pom.xml",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//pkg:__pkg__"],
+)
+
+pkg_filegroup(
+    name = "all_dist_files",
+    srcs = [
+        ":dist_files",
+        "//java/core:dist_files",
+        "//java/internal:dist_files",
+        "//java/kotlin:dist_files",
+        "//java/kotlin-lite:dist_files",
+        "//java/lite:dist_files",
+        "//java/util:dist_files",
+    ],
+    visibility = ["//pkg:__pkg__"],
 )
diff --git a/java/core/BUILD b/java/core/BUILD
index 011fb1c..685ebd0 100644
--- a/java/core/BUILD
+++ b/java/core/BUILD
@@ -1,6 +1,7 @@
 load("@bazel_skylib//rules:build_test.bzl", "build_test")
 load("@rules_java//java:defs.bzl", "java_library", "java_lite_proto_library", "java_proto_library")
 load("@rules_jvm_external//:defs.bzl", "java_export")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain", "proto_library")
 load("//:internal.bzl", "conformance_test")
 load("//:protobuf_version.bzl", "PROTOBUF_VERSION")
@@ -175,9 +176,6 @@
 
 proto_lang_toolchain(
     name = "toolchain",
-    command_line = "--java_out=$(OUT)",
-    runtime = ":core",
-    visibility = ["//visibility:public"],
     # keep this in sync w/ WELL_KNOWN_PROTO_MAP in //:BUILD
     blacklisted_protos = [
         "//:any_proto",
@@ -193,6 +191,9 @@
         "//:type_proto",
         "//:wrappers_proto",
     ],
+    command_line = "--java_out=$(OUT)",
+    runtime = ":core",
+    visibility = ["//visibility:public"],
 )
 
 proto_library(
@@ -226,6 +227,7 @@
         "src/test/java/com/google/protobuf/TestUtil.java",
         "src/test/java/com/google/protobuf/TestUtilLite.java",
     ],
+    visibility = ["//java:__subpackages__"],
     deps = [
         ":core",
         ":generic_test_protos_java_proto",
@@ -233,7 +235,6 @@
         "@maven//:com_google_guava_guava",
         "@maven//:junit_junit",
     ],
-    visibility = ["//java:__subpackages__"],
 )
 
 test_suite(
@@ -336,8 +337,8 @@
         ":rewrite_javalite_test_util",
     ],
     visibility = [
-        "//java/lite:__pkg__",
         "//java/kotlin-lite:__pkg__",
+        "//java/lite:__pkg__",
     ],
     deps = [
         ":generic_test_protos_java_proto_lite",
@@ -411,3 +412,20 @@
         "@maven//:org_mockito_mockito_core",
     ],
 )
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob([
+        "src/main/java/com/google/protobuf/*.java",
+        "src/test/java/**/*.java",
+        "src/test/proto/**/*.proto",
+    ]) + [
+        "BUILD",
+        "generate-sources-build.xml",
+        "generate-test-sources-build.xml",
+        "pom.xml",
+        "pom_template.xml",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//java:__pkg__"],
+)
diff --git a/java/internal/BUILD b/java/internal/BUILD
index 4f542ec..d2e0b53 100644
--- a/java/internal/BUILD
+++ b/java/internal/BUILD
@@ -1 +1,13 @@
-package(default_visibility = ["//java:__subpackages__"])
\ No newline at end of file
+package(default_visibility = ["//java:__subpackages__"])
+
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+
+pkg_files(
+    name = "dist_files",
+    srcs = [
+        "BUILD",
+        "testing.bzl",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//java:__pkg__"],
+)
diff --git a/java/kotlin-lite/BUILD b/java/kotlin-lite/BUILD
index fd0c103..1891444 100644
--- a/java/kotlin-lite/BUILD
+++ b/java/kotlin-lite/BUILD
@@ -1,6 +1,7 @@
 load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library")
 load("@rules_java//java:defs.bzl", "java_lite_proto_library")
 load("@rules_jvm_external//:kt_defs.bzl", "kt_jvm_export")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("//:protobuf_version.bzl", "PROTOBUF_VERSION")
 load("//:protobuf.bzl", "internal_gen_kt_protos")
 
@@ -21,14 +22,18 @@
         "//:gen_well_known_protos_kotlinlite",
     ],
     deps = [
-        "//java/lite",
         "//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
         "//java/kotlin:shared_runtime",
+        "//java/lite",
     ],
 )
 
 kt_jvm_export(
     name = "kotlin-lite_mvn",
+    deploy_env = [
+        "@com_github_jetbrains_kotlin//:kotlin-stdlib",
+        "//java/lite",
+    ],
     maven_coordinates = "com.google.protobuf:protobuf-kotlin-lite:%s" % PROTOBUF_VERSION,
     pom_template = "//java/kotlin-lite:pom_template.xml",
     resources = ["//:well_known_protos"],
@@ -39,10 +44,6 @@
         "//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
         "//java/kotlin:shared_runtime",
     ],
-    deploy_env = [
-        "@com_github_jetbrains_kotlin//:kotlin-stdlib",
-        "//java/lite",
-    ],
 )
 
 filegroup(
@@ -59,9 +60,9 @@
 test_suite(
     name = "tests",
     tests = [
-        "test_lite_extensions",
         "proto2_test_lite",
         "proto3_test_lite",
+        "test_lite_extensions",
     ],
 )
 
@@ -71,9 +72,9 @@
     deps = [
         ":example_extensible_message_java_proto_lite",
         ":lite_extensions",
-        "//java/lite",
         "//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
         "//java/kotlin:shared_runtime",
+        "//java/lite",
         "@com_github_jetbrains_kotlin//:kotlin-test",
         "@maven//:com_google_truth_truth",
         "@maven//:junit_junit",
@@ -82,8 +83,8 @@
 
 java_test(
     name = "test_lite_extensions",
-    runtime_deps = [":test_lite_extensions_library"],
     test_class = "com.google.protobuf.kotlin.ExtendableMessageLiteExtensionsTest",
+    runtime_deps = [":test_lite_extensions_library"],
 )
 
 java_lite_proto_library(
@@ -93,8 +94,8 @@
 
 internal_gen_kt_protos(
     name = "gen_evil_names_proto2_lite",
-    deps = ["//java/kotlin:evil_names_proto2"],
     lite = True,
+    deps = ["//java/kotlin:evil_names_proto2"],
 )
 
 java_lite_proto_library(
@@ -104,8 +105,8 @@
 
 internal_gen_kt_protos(
     name = "gen_evil_names_proto3_lite",
-    deps = ["//java/kotlin:evil_names_proto3"],
     lite = True,
+    deps = ["//java/kotlin:evil_names_proto3"],
 )
 
 java_lite_proto_library(
@@ -126,10 +127,10 @@
     ],
     deps = [
         ":evil_names_proto2_java_proto_lite",
-        "//java/lite:lite",
+        "//:java_lite_test_protos",
         "//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
         "//java/kotlin:shared_runtime",
-        "//:java_lite_test_protos",
+        "//java/lite",
     ],
 )
 
@@ -143,10 +144,10 @@
     deps = [
         ":evil_names_proto3_java_proto_lite",
         ":multiple_files_proto3_java_proto_lite",
-        "//java/lite:lite",
+        "//:java_lite_test_protos",
         "//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
         "//java/kotlin:shared_runtime",
-        "//:java_lite_test_protos",
+        "//java/lite",
     ],
 )
 
@@ -163,8 +164,8 @@
 
 java_test(
     name = "proto2_test_lite",
-    runtime_deps = [":proto2_test_lite_library"],
     test_class = "com.google.protobuf.kotlin.Proto2LiteTest",
+    runtime_deps = [":proto2_test_lite_library"],
 )
 
 kt_jvm_library(
@@ -180,6 +181,24 @@
 
 java_test(
     name = "proto3_test_lite",
-    runtime_deps = [":proto3_test_lite_library"],
     test_class = "com.google.protobuf.kotlin.Proto3Test",
+    runtime_deps = [":proto3_test_lite_library"],
+)
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob([
+        "src/main/kotlin/com/google/protobuf/*.kt",
+        "src/test/kotlin/**/*.kt",
+    ]) + [
+        "BUILD",
+        "generate-sources-build.xml",
+        "generate-test-sources-build.xml",
+        "lite.awk",
+        "pom.xml",
+        "pom_template.xml",
+        "process-lite-sources-build.xml",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//java:__pkg__"],
 )
diff --git a/java/kotlin/BUILD b/java/kotlin/BUILD
index 1da4de5..c8aae0a 100644
--- a/java/kotlin/BUILD
+++ b/java/kotlin/BUILD
@@ -1,12 +1,13 @@
 load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library")
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_jvm_external//:kt_defs.bzl", "kt_jvm_export")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
 load("//:protobuf_version.bzl", "PROTOBUF_VERSION")
 load("//:protobuf.bzl", "internal_gen_kt_protos")
 
 exports_files([
-  "src/test/kotlin/com/google/protobuf/Proto3Test.kt",
+    "src/test/kotlin/com/google/protobuf/Proto3Test.kt",
 ])
 
 # Kotlin generated protos depend on this and only this.
@@ -36,34 +37,34 @@
 kt_jvm_library(
     name = "bytestring_lib",
     srcs = ["src/main/kotlin/com/google/protobuf/ByteStrings.kt"],
-    deps = ["//java/lite"],
     visibility = ["//java:__subpackages__"],
+    deps = ["//java/lite"],
 )
 
 kt_jvm_library(
     name = "full_extensions",
     srcs = [
-      "src/main/kotlin/com/google/protobuf/Anies.kt",
-      "src/main/kotlin/com/google/protobuf/ExtendableMessageExtensions.kt",
+        "src/main/kotlin/com/google/protobuf/Anies.kt",
+        "src/main/kotlin/com/google/protobuf/ExtendableMessageExtensions.kt",
     ],
     deps = ["//java/core"],
 )
 
 kt_jvm_export(
     name = "kotlin_mvn",
+    deploy_env = [
+        "@com_github_jetbrains_kotlin//:kotlin-stdlib",
+        "//java/core",
+    ],
     maven_coordinates = "com.google.protobuf:protobuf-kotlin:%s" % PROTOBUF_VERSION,
     pom_template = "//java/kotlin:pom_template.xml",
     resources = ["//:well_known_protos"],
     runtime_deps = [
-      ":bytestring_lib",
-      ":full_extensions",
-      ":only_for_use_in_proto_generated_code_its_generator_and_tests",
-      ":shared_runtime",
-      ":well_known_protos_kotlin",
-    ],
-    deploy_env = [
-        "@com_github_jetbrains_kotlin//:kotlin-stdlib",
-        "//java/core",
+        ":bytestring_lib",
+        ":full_extensions",
+        ":only_for_use_in_proto_generated_code_its_generator_and_tests",
+        ":shared_runtime",
+        ":well_known_protos_kotlin",
     ],
 )
 
@@ -82,10 +83,10 @@
     name = "tests",
     tests = [
         "bytestring_test",
-        "shared_tests",
-        "test_extensions",
         "proto2_test",
         "proto3_test",
+        "shared_tests",
+        "test_extensions",
     ],
 )
 
@@ -103,8 +104,8 @@
 
 java_test(
     name = "bytestring_test",
-    runtime_deps = [":bytestring_test_library"],
     test_class = "com.google.protobuf.kotlin.ByteStringsTest",
+    runtime_deps = [":bytestring_test_library"],
 )
 
 proto_library(
@@ -131,31 +132,31 @@
         ":only_for_use_in_proto_generated_code_its_generator_and_tests",
         ":shared_runtime",
         "@com_github_jetbrains_kotlin//:kotlin-test",
-        "@maven//:com_google_truth_truth",
         "@maven//:com_google_guava_guava_testlib",
+        "@maven//:com_google_truth_truth",
         "@maven//:junit_junit",
     ],
 )
 
 java_test(
     name = "shared_tests",
-    runtime_deps = [":shared_tests_library"],
     test_class = "com.google.protobuf.kotlin.DslListTest",
+    runtime_deps = [":shared_tests_library"],
 )
 
 kt_jvm_library(
     name = "test_extensions_library",
     srcs = [
-      "src/test/kotlin/com/google/protobuf/AniesTest.kt",
-      "src/test/kotlin/com/google/protobuf/ExtendableMessageExtensionsTest.kt",
+        "src/test/kotlin/com/google/protobuf/AniesTest.kt",
+        "src/test/kotlin/com/google/protobuf/ExtendableMessageExtensionsTest.kt",
     ],
     deps = [
         ":example_extensible_message_java_proto",
         ":full_extensions",
-        "//java/core:core",
         ":kotlin_unittest",
         ":only_for_use_in_proto_generated_code_its_generator_and_tests",
         ":shared_runtime",
+        "//java/core",
         "@com_github_jetbrains_kotlin//:kotlin-test",
         "@maven//:com_google_truth_truth",
         "@maven//:junit_junit",
@@ -164,8 +165,8 @@
 
 java_test(
     name = "test_extensions",
-    runtime_deps = [":test_extensions_library"],
     test_class = "com.google.protobuf.kotlin.ExtendableMessageExtensionsTest",
+    runtime_deps = [":test_extensions_library"],
 )
 
 proto_library(
@@ -224,11 +225,11 @@
     ],
     deps = [
         ":evil_names_proto2_java_proto",
-        "//java/core:core",
         ":only_for_use_in_proto_generated_code_its_generator_and_tests",
         ":shared_runtime",
         ":well_known_protos_kotlin",
         "//:java_test_protos",
+        "//java/core",
     ],
 )
 
@@ -242,10 +243,10 @@
     deps = [
         ":evil_names_proto3_java_proto",
         ":multiple_files_proto3_java_proto",
-        "//java/core:core",
         ":only_for_use_in_proto_generated_code_its_generator_and_tests",
         ":shared_runtime",
         "//:java_test_protos",
+        "//java/core",
     ],
 )
 
@@ -262,8 +263,8 @@
 
 java_test(
     name = "proto2_test",
-    runtime_deps = [":proto2_test_library"],
     test_class = "com.google.protobuf.kotlin.Proto2Test",
+    runtime_deps = [":proto2_test_library"],
 )
 
 kt_jvm_library(
@@ -279,8 +280,8 @@
 
 java_test(
     name = "proto3_test",
-    runtime_deps = [":proto3_test_library"],
     test_class = "com.google.protobuf.kotlin.Proto3Test",
+    runtime_deps = [":proto3_test_library"],
 )
 
 kt_jvm_library(
@@ -289,8 +290,25 @@
         "//:gen_well_known_protos_kotlin",
     ],
     deps = [
-         "//java/core",
-         ":only_for_use_in_proto_generated_code_its_generator_and_tests",
-         ":shared_runtime",
+        ":only_for_use_in_proto_generated_code_its_generator_and_tests",
+        ":shared_runtime",
+        "//java/core",
     ],
 )
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob([
+        "src/main/kotlin/com/google/protobuf/*.kt",
+        "src/test/kotlin/**/*.kt",
+        "src/test/proto/**/*.proto",
+    ]) + [
+        "BUILD",
+        "generate-sources-build.xml",
+        "generate-test-sources-build.xml",
+        "pom.xml",
+        "pom_template.xml",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//java:__pkg__"],
+)
diff --git a/java/lite/BUILD b/java/lite/BUILD
index fac19f6..6ff858e 100644
--- a/java/lite/BUILD
+++ b/java/lite/BUILD
@@ -1,4 +1,5 @@
 load("@bazel_skylib//rules:build_test.bzl", "build_test")
+load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain")
 load("//:internal.bzl", "conformance_test")
 load("//java/internal:testing.bzl", "junit_tests")
@@ -21,9 +22,6 @@
 
 proto_lang_toolchain(
     name = "toolchain",
-    command_line = "--java_out=lite:$(OUT)",
-    runtime = ":lite",
-    visibility = ["//visibility:public"],
     # keep this in sync w/ LITE_WELL_KNOWN_PROTO_MAP in //:BUILD
     blacklisted_protos = [
         "//:any_proto",
@@ -37,6 +35,9 @@
         "//:type_proto",
         "//:wrappers_proto",
     ],
+    command_line = "--java_out=lite:$(OUT)",
+    runtime = ":lite",
+    visibility = ["//visibility:public"],
 )
 
 test_suite(
@@ -76,3 +77,20 @@
         "@maven//:junit_junit",
     ],
 )
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob([
+        "**/*.java",
+    ]) + [
+        "BUILD",
+        "generate-sources-build.xml",
+        "generate-test-sources-build.xml",
+        "lite.awk",
+        "pom.xml",
+        "pom_template.xml",
+        "process-lite-sources-build.xml",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//java:__pkg__"],
+)
diff --git a/java/util/BUILD b/java/util/BUILD
index 753fabb..820adb9 100644
--- a/java/util/BUILD
+++ b/java/util/BUILD
@@ -1,5 +1,6 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_jvm_external//:defs.bzl", "java_export")
+load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
 load("//:protobuf_version.bzl", "PROTOBUF_VERSION")
 load("//java/internal:testing.bzl", "junit_tests")
@@ -23,11 +24,11 @@
 # Bazel users, don't depend on this target, use :util.
 java_export(
     name = "util_mvn",
+    deploy_env = ["//java/core"],
     maven_coordinates = "com.google.protobuf:protobuf-java-util:%s" % PROTOBUF_VERSION,
     pom_template = "pom_template.xml",
     visibility = ["//java:__pkg__"],
     runtime_deps = [":util"],
-    deploy_env = ["//java/core"],
 )
 
 filegroup(
@@ -74,3 +75,18 @@
         "@maven//:junit_junit",
     ],
 )
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob([
+        "src/main/**/*.java",
+        "src/test/**/*.java",
+        "src/test/**/*.proto",
+    ]) + [
+        "BUILD",
+        "pom.xml",
+        "pom_template.xml",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//java:__pkg__"],
+)