[Bazel] Move C++ build-related logic into //build_defs (#9921)

These are all "toolchain-y" things, like copts, link_opts, and config_settings. These are very different from what is in //toolchain, though, so I chose the somewhat common name build_defs for the package. For now, I am only using this package for purely internal things. (Most public "defs"-type things should come from rules_proto/rules_cc, anyhow.)
diff --git a/build_defs/BUILD.bazel b/build_defs/BUILD.bazel
new file mode 100644
index 0000000..29a1f12
--- /dev/null
+++ b/build_defs/BUILD.bazel
@@ -0,0 +1,159 @@
+# Internal Starlark definitions for Protobuf.
+
+load("@rules_cc//cc:defs.bzl", starlark_cc_proto_library = "cc_proto_library")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load(":cc_proto_blacklist_test.bzl", "cc_proto_blacklist_test")
+load(":compiler_config_setting.bzl", "create_compiler_config_setting")
+
+package(
+    default_visibility = [
+        # Public, but Protobuf only visibility.
+        "//:__subpackages__",
+    ],
+)
+
+create_compiler_config_setting(
+    name = "config_msvc",
+    value = "msvc-cl",
+)
+
+# Android NDK builds can specify different crosstool_top flags to choose which
+# STL they use for C++. We need these multiple variants to catch all of those
+# versions of crosstool_top and reliably detect Android.
+#
+# For more info on the various crosstool_tops used by NDK Bazel builds, see:
+# https://docs.bazel.build/versions/master/android-ndk.html#configuring-the-stl
+
+config_setting(
+    name = "config_android",
+    values = {
+        "crosstool_top": "//external:android/crosstool",
+    },
+)
+
+config_setting(
+    name = "config_android-stlport",
+    values = {
+        "crosstool_top": "@androidndk//:toolchain-stlport",
+    },
+)
+
+config_setting(
+    name = "config_android-libcpp",
+    values = {
+        "crosstool_top": "@androidndk//:toolchain-libcpp",
+    },
+)
+
+config_setting(
+    name = "config_android-gnu-libstdcpp",
+    values = {
+        "crosstool_top": "@androidndk//:toolchain-gnu-libstdcpp",
+    },
+)
+
+config_setting(
+    name = "config_android-default",
+    values = {
+        "crosstool_top": "@androidndk//:default_crosstool",
+    },
+)
+
+# Internal testing:
+
+starlark_cc_proto_library(
+    name = "any_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:any_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "api_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:api_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "compiler_plugin_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:compiler_plugin_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "descriptor_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:descriptor_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "duration_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:duration_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "empty_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:empty_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "field_mask_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:field_mask_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "source_context_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:source_context_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "struct_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:struct_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "timestamp_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:timestamp_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "type_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:type_proto"],
+)
+
+starlark_cc_proto_library(
+    name = "wrappers_cc_proto",
+    visibility = ["//visibility:private"],
+    deps = ["//:wrappers_proto"],
+)
+
+cc_proto_blacklist_test(
+    name = "cc_proto_blacklist_test",
+    deps = [
+        ":any_cc_proto",
+        ":api_cc_proto",
+        ":compiler_plugin_cc_proto",
+        ":descriptor_cc_proto",
+        ":duration_cc_proto",
+        ":empty_cc_proto",
+        ":field_mask_cc_proto",
+        ":source_context_cc_proto",
+        ":struct_cc_proto",
+        ":timestamp_cc_proto",
+        ":type_cc_proto",
+        ":wrappers_cc_proto",
+    ],
+)
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob(["*"]),
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//pkg:__pkg__"],
+)