load("@rules_pkg//:pkg.bzl", "pkg_tar", "pkg_zip")
load(
    "@rules_pkg//:mappings.bzl",
    "pkg_attributes",
    "pkg_filegroup",
    "pkg_files",
    "strip_prefix",
)
load("//:protobuf_release.bzl", "package_naming")
load(":build_systems.bzl", "gen_automake_file_lists", "gen_file_lists")
load(":cc_dist_library.bzl", "cc_dist_library")

package_naming(
    name = "protobuf_pkg_naming",
)

pkg_files(
    name = "wkt_protos_files",
    srcs = [
        "//:src/google/protobuf/any.proto",
        "//:src/google/protobuf/api.proto",
        "//:src/google/protobuf/descriptor.proto",
        "//:src/google/protobuf/duration.proto",
        "//:src/google/protobuf/empty.proto",
        "//:src/google/protobuf/field_mask.proto",
        "//:src/google/protobuf/source_context.proto",
        "//:src/google/protobuf/struct.proto",
        "//:src/google/protobuf/timestamp.proto",
        "//:src/google/protobuf/type.proto",
        "//:src/google/protobuf/wrappers.proto",
    ],
    prefix = "include/google/protobuf",
    visibility = ["//visibility:private"],
)

pkg_files(
    name = "compiler_plugin_protos_files",
    srcs = ["//:src/google/protobuf/compiler/plugin.proto"],
    prefix = "include/google/protobuf/compiler",
    visibility = ["//visibility:private"],
)

################################################################################
# Generates protoc release artifacts.
################################################################################

genrule(
    name = "protoc_readme",
    outs = ["readme.txt"],
    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" > $@
    """,
    visibility = ["//visibility:private"],
)

pkg_files(
    name = "protoc_files",
    srcs = ["//:protoc"],
    attributes = pkg_attributes(mode = "0555"),
    prefix = "bin/",
    visibility = ["//visibility:private"],
)

pkg_zip(
    name = "protoc_release",
    srcs = [
        ":compiler_plugin_protos_files",
        ":protoc_files",
        ":protoc_readme",
        ":wkt_protos_files",
    ],
    package_file_name = "protoc-{version}-{platform}.zip",
    package_variables = ":protobuf_pkg_naming",
)

################################################################################
# Source distribution packaging
#
# TODO: these will eventually replace autotools for release artifact packaging.
################################################################################

pkg_filegroup(
    name = "dist_common",
    srcs = [
        ":dist_files",
        "//:common_dist_files",
        "//:cpp_dist_files",  # to build protoc
        "//benchmarks:all_dist_files",
        "//build_defs:dist_files",
        "//conformance:all_dist_files",
        "@com_google_protobuf_examples//:dist_files",
    ],
)

pkg_filegroup(
    name = "cpp_srcs",
    srcs = [
        ":dist_common",
        "//:cpp_dist_files",
    ],
)

pkg_tar(
    name = "dist_cpp_tar",
    srcs = [":cpp_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-cpp-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_cpp_zip",
    srcs = [":cpp_srcs"],
    package_file_name = "protobuf-cpp-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "csharp_srcs",
    srcs = [
        ":dist_common",
        "//:csharp_dist_files",
        "//csharp:dist_files",
    ],
)

pkg_tar(
    name = "dist_csharp_tar",
    srcs = [":csharp_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-csharp-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_csharp_zip",
    srcs = [":csharp_srcs"],
    package_file_name = "protobuf-csharp-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "java_srcs",
    srcs = [
        ":dist_common",
        "//java:all_dist_files",
    ],
)

pkg_tar(
    name = "dist_java_tar",
    srcs = [":java_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-java-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_java_zip",
    srcs = [":java_srcs"],
    package_file_name = "protobuf-java-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "objectivec_srcs",
    srcs = [
        ":dist_common",
        "//:objectivec_dist_files",
        "//objectivec:dist_files",
    ],
)

pkg_tar(
    name = "dist_objectivec_tar",
    srcs = [":objectivec_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-objectivec-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_objectivec_zip",
    srcs = [":objectivec_srcs"],
    package_file_name = "protobuf-objectivec-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "php_srcs",
    srcs = [
        ":dist_common",
        "//php:dist_files",
    ],
)

pkg_tar(
    name = "dist_php_tar",
    srcs = [":php_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-php-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_php_zip",
    srcs = [":php_srcs"],
    package_file_name = "protobuf-php-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "python_srcs",
    srcs = [
        ":dist_common",
        "//:python_dist_files",
    ],
)

pkg_tar(
    name = "dist_python_tar",
    srcs = [":python_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-python-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_python_zip",
    srcs = [":python_srcs"],
    package_file_name = "protobuf-python-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "ruby_srcs",
    srcs = [
        ":dist_common",
        "//ruby:dist_files",
    ],
)

pkg_tar(
    name = "dist_ruby_tar",
    srcs = [":ruby_srcs"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-ruby-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_ruby_zip",
    srcs = [":ruby_srcs"],
    package_file_name = "protobuf-ruby-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

pkg_filegroup(
    name = "dist_all",
    srcs = [
        ":cpp_srcs",
        ":csharp_srcs",
        ":java_srcs",
        ":objectivec_srcs",
        ":php_srcs",
        ":python_srcs",
        ":ruby_srcs",
    ],
)

pkg_tar(
    name = "dist_all_tar",
    srcs = [":dist_all"],
    extension = "tar.gz",
    package_dir = "protobuf-{version}",
    package_file_name = "protobuf-all-{version}.tar.gz",
    package_variables = ":protobuf_pkg_naming",
)

pkg_zip(
    name = "dist_all_zip",
    srcs = [":dist_all"],
    package_file_name = "protobuf-all-{version}.zip",
    package_variables = ":protobuf_pkg_naming",
)

################################################################################
# Generated file lists for build systems
################################################################################

gen_file_lists(
    name = "gen_src_file_lists",
    testonly = 1,
    out_stem = "src_file_lists",
    src_libs = {
        # source rule: name in generated file
        "//:protobuf": "libprotobuf",
        "//:protoc_lib": "libprotoc",
        "//:protobuf_lite": "libprotobuf_lite",
    },
)

gen_automake_file_lists(
    name = "gen_automake_extra_dist_lists",
    testonly = 1,
    out = "extra_dist_file_lists.am",
    src_libs = {
        # source rule: name in generated file
        "//:common_dist_files": "dist_common",
        "//conformance:dist_files": "dist_conformance",
        "//benchmarks:all_dist_files": "dist_benchmark",
        "@com_google_protobuf_examples//:dist_files": "dist_example",
        "//:csharp_dist_files": "dist_csharp",
        "//csharp:dist_files": "dist_csharp2",
        "//:objectivec_dist_files": "dist_objectivec",
        "//objectivec:dist_files": "dist_objectivec2",
        "//php:dist_files": "dist_php",
        "//:python_dist_files": "dist_python",
        "//ruby:dist_files": "dist_ruby",
    },
)

################################################################################
# Protobuf runtime libraries.
################################################################################

cc_dist_library(
    name = "protobuf_lite",
    linkopts = select({
        "//build_defs:config_msvc": [],
        "//conditions:default": ["-lpthread"],
    }),
    deps = [
        "//:protobuf_lite",
    ],
)

cc_dist_library(
    name = "protobuf",
    linkopts = select({
        "//build_defs:config_msvc": [],
        "//conditions:default": [
            "-lz",
            "-lpthread",
        ],
    }),
    deps = [
        "//:protobuf",
        "//:protobuf_lite",
    ],
)

################################################################################
# Distribution sources
################################################################################

pkg_files(
    name = "dist_files",
    srcs = glob(["*"]),
    strip_prefix = strip_prefix.from_root(""),
)
