load("@rules_java//java:defs.bzl", "java_library")
load("//src:release_archive.bzl", "release_archive")

# Description:
#   singlejar C++ implementation.
package(default_visibility = ["//src:__subpackages__"])

filegroup(
    name = "srcs",
    srcs = glob(["**"]),
    visibility = ["//src:__pkg__"],
)

SOURCES = [
    "combiners.cc",
    "combiners.h",
    "diag.h",
    "input_jar.cc",
    "input_jar.h",
    "mapped_file.cc",
    "mapped_file.h",
    "mapped_file_posix.inc",
    "mapped_file_windows.inc",
    "options.cc",
    "options.h",
    "output_jar.cc",
    "output_jar.h",
    "port.h",
    "singlejar_main.cc",
    "token_stream.h",
    "transient_bytes.h",
    "zip_headers.h",
    "zlib_interface.h",
]

filegroup(
    name = "embedded_java_tools",
    srcs = SOURCES + [
        "//src/main/cpp/util:embedded_java_tools",
        "//third_party/zlib:embedded_tools",
        "//src/main/protobuf:desugar_deps_filegroup",
    ],
    visibility = ["//src:__pkg__"],
)

release_archive(
    name = "singlejar_transitive_zip",
    package_dir = "java_tools",
    visibility = ["//src:__pkg__"],
    deps = [
        ":singlejar_zip",
        "//src:zlib_zip",
        "//src/main/cpp/util:cpp_util_with_deps_zip",
        "//src/main/protobuf:desugar_deps_zip",
    ],
)

release_archive(
    name = "singlejar_zip",
    srcs = SOURCES,
    package_dir = "src/tools/singlejar",
    visibility = ["//visibility:private"],
)

release_archive(
    name = "singlejar_deploy_zip",
    srcs = [":singlejar_local"],
    package_dir = "java_tools/src/tools/singlejar",
    visibility = ["//src:__pkg__"],
)

cc_binary(
    name = "singlejar",
    srcs = [
        "singlejar_main.cc",
    ],
    linkopts = select({
        "//src/conditions:freebsd": ["-lm"],
        "//src/conditions:openbsd": ["-lm"],
        "//conditions:default": [],
    }),
    linkstatic = 1,
    visibility = ["//visibility:public"],
    deps = [
        "options",
        "output_jar",
        "//third_party/zlib",
    ],
)

cc_binary(
    name = "singlejar_local",
    srcs = [
        "singlejar_local_main.cc",
    ],
    linkopts = select({
        "//src/conditions:freebsd": ["-lm"],
        "//src/conditions:openbsd": ["-lm"],
        "//conditions:default": [],
    }),
    linkstatic = 1,
    visibility = ["//visibility:public"],
    deps = [
        "combiners",
        "desugar_checking",
        "options",
        "output_jar",
        "//third_party/zlib",
    ],
)

cc_test(
    name = "combiners_test",
    size = "large",
    srcs = [
        "combiners_test.cc",
        ":zip_headers",
        ":zlib_interface",
    ],
    data = [
        "data/multi_release.jar",
    ],
    # Requires at least 5 GiB of memory
    exec_compatible_with = ["//:highcpu_machine"],
    deps = [
        ":combiners",
        ":input_jar",
        ":test_util",
        "//third_party/zlib",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "desugar_checking_test",
    srcs = [
        "desugar_checking_test.cc",
        ":zip_headers",
        ":zlib_interface",
    ],
    deps = [
        ":combiners",
        ":desugar_checking",
        ":input_jar",
        "//third_party/zlib",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "input_jar_empty_jar_test",
    srcs = [
        "input_jar_empty_jar_test.cc",
    ],
    data = [
        "data/empty.zip",
    ],
    deps = [
        ":input_jar",
        ":test_util",
        "//src/main/cpp/util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "input_jar_preambled_test",
    size = "large",
    srcs = [
        "input_jar_preambled_test.cc",
    ],
    data = [
        ":test1",
    ],
    deps = [
        ":input_jar",
        ":test_util",
        "//src/main/cpp/util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "input_jar_scan_jartool_test",
    size = "large",
    srcs = [
        "input_jar_scan_entries_test.h",
        "input_jar_scan_jartool_test.cc",
    ],
    copts = select({
        "//src/conditions:windows": ["-DJAR_TOOL_PATH=\\\"io_bazel/$(JAVABASE)/bin/jar.exe\\\""],
        "//conditions:default": ["-DJAR_TOOL_PATH=\\\"io_bazel/$(JAVABASE)/bin/jar\\\""],
    }),
    data = ["@bazel_tools//tools/jdk:current_java_runtime"],
    # Timing out, see https://github.com/bazelbuild/bazel/issues/1555
    tags = ["manual"],
    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
    deps = [
        ":input_jar",
        ":test_util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "input_jar_scan_ziptool_test",
    size = "large",
    srcs = [
        "input_jar_scan_entries_test.h",
        "input_jar_scan_ziptool_test.cc",
    ],
    # Timing out, see https://github.com/bazelbuild/bazel/issues/1555
    tags = ["manual"],
    deps = [
        ":input_jar",
        ":test_util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "input_jar_bad_jar_test",
    srcs = [
        "input_jar_bad_jar_test.cc",
    ],
    deps = [
        ":input_jar",
        ":test_util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "options_test",
    srcs = [
        "options.h",
        "options_test.cc",
    ],
    deps = [
        ":options",
        ":token_stream",
        "//src/main/cpp/util",
        "@com_google_googletest//:gtest_main",
    ],
)

sh_test(
    name = "output_jar_bash_test",
    srcs = ["output_jar_shell_test.sh"],
    data = [
        ":singlejar",
        "//src/test/shell:bashunit",
        "@bazel_tools//tools/bash/runfiles",
    ],
    deps = ["//src/test/shell:bashunit"],
)

cc_test(
    name = "output_jar_simple_test",
    srcs = [
        "output_jar_simple_test.cc",
    ],
    copts = select({
        "//src/conditions:windows": ["-DJAR_TOOL_PATH=\\\"io_bazel/$(JAVABASE)/bin/jar.exe\\\""],
        "//conditions:default": ["-DJAR_TOOL_PATH=\\\"io_bazel/$(JAVABASE)/bin/jar\\\""],
    }),
    data = [
        ":data1",
        ":data2",
        ":stored_jar",
        ":test1",
        ":test2",
        "@bazel_tools//tools/jdk:current_java_runtime",
    ],
    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
    deps = [
        ":input_jar",
        ":options",
        ":output_jar",
        ":port",
        ":test_util",
        "//src/main/cpp/util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "token_stream_test",
    srcs = [
        "token_stream_test.cc",
    ],
    deps = [
        ":test_util",
        ":token_stream",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "transient_bytes_test",
    size = "large",
    srcs = [
        "transient_bytes_test.cc",
        ":transient_bytes",
        ":zlib_interface",
    ],
    # Timing out, see https://github.com/bazelbuild/bazel/issues/1555
    tags = ["manual"],
    deps = [
        ":input_jar",
        ":test_util",
        "//third_party/zlib",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "zip_headers_test",
    size = "small",
    srcs = [
        "zip_headers_test.cc",
        ":zip_headers",
    ],
    deps = [
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "zlib_interface_test",
    srcs = [
        "zlib_interface_test.cc",
        ":zlib_interface",
    ],
    deps = [
        "//third_party/zlib",
        "@com_google_googletest//:gtest_main",
    ],
)

sh_test(
    name = "zip64_test",
    srcs = ["zip64_test.sh"],
    args = ["$(JAVABASE)"],
    data = [
        ":singlejar",
        "//src/test/shell:bashunit",
        "@bazel_tools//tools/bash/runfiles",
        "@bazel_tools//tools/jdk:current_java_runtime",
    ],
    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
    deps = ["//src/test/shell:bashunit"],
)

cc_library(
    name = "combiners",
    srcs = [
        "combiners.cc",
        ":transient_bytes",
        ":zip_headers",
    ],
    hdrs = ["combiners.h"],
    deps = [
        "//third_party/zlib",
    ],
)

cc_library(
    name = "desugar_checking",
    srcs = ["desugar_checking.cc"],
    hdrs = ["desugar_checking.h"],
    deps = [
        ":combiners",
        "//src/main/protobuf:desugar_deps_cc_proto",
    ],
)

cc_library(
    name = "diag",
    hdrs = ["diag.h"],
    visibility = ["//visibility:private"],
)

cc_library(
    name = "port",
    hdrs = ["port.h"],
    visibility = ["//visibility:private"],
)

cc_library(
    name = "mapped_file",
    srcs = ["mapped_file.cc"] + select({
        "//src:windows": ["mapped_file_windows.inc"],
        "//conditions:default": ["mapped_file_posix.inc"],
    }),
    hdrs = ["mapped_file.h"],
    visibility = ["//visibility:private"],
    deps = [
        ":diag",
        ":port",
        "//src/main/cpp/util",
    ],
)

cc_library(
    name = "input_jar",
    srcs = [
        "input_jar.cc",
    ],
    hdrs = [
        "input_jar.h",
        "zip_headers.h",
    ],
    deps = [
        ":diag",
        ":mapped_file",
    ],
)

cc_library(
    name = "options",
    srcs = [
        "options.cc",
        "options.h",
    ],
    hdrs = ["options.h"],
    deps = [
        ":diag",
        ":token_stream",
    ],
)

cc_library(
    name = "output_jar",
    srcs = [
        "output_jar.cc",
        "output_jar.h",
        ":zip_headers",
    ],
    hdrs = ["output_jar.h"],
    deps = [
        ":combiners",
        ":diag",
        ":input_jar",
        ":mapped_file",
        ":options",
        ":port",
        "//src/main/cpp/util",
        "//third_party/zlib",
    ],
)

cc_library(
    name = "test_util",
    testonly = 1,
    srcs = ["test_util.cc"],
    hdrs = ["test_util.h"],
    deps = [
        "//src/main/cpp/util",
        "@bazel_tools//tools/cpp/runfiles",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_library(
    name = "token_stream",
    hdrs = ["token_stream.h"],
    deps = [
        ":diag",
        "//src/main/cpp/util",
    ],
)

filegroup(
    name = "transient_bytes",
    srcs = [
        "diag.h",
        "transient_bytes.h",
        "zlib_interface.h",
        ":zip_headers",
    ],
)

filegroup(
    name = "zip_headers",
    srcs = ["zip_headers.h"],
)

filegroup(
    name = "zlib_interface",
    srcs = [
        "diag.h",
        "zlib_interface.h",
    ],
)

java_library(
    name = "test1",
    resources = [
        "options.cc",
        "zip_headers.h",
        "zlib_interface.h",
    ],
)

java_library(
    name = "test2",
    resources = [
        "token_stream.h",
        "transient_bytes.h",
    ],
)

java_library(
    name = "data1",
    resources = [
        "data/extra_file1",
        "data/extra_file2",
    ],
)

java_library(
    name = "data2",
    resources = [
        "data/extra_file1",
        "data/extra_file3",
    ],
)

genrule(
    name = "stored_jar",
    srcs = [
        "output_jar.cc",
        "@bazel_tools//tools/jdk:current_java_runtime",
    ],
    outs = ["stored.jar"],
    cmd = "$(JAVABASE)/bin/jar -0cf \"$@\" $(location :output_jar.cc)",
    toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"],
    tools = ["@bazel_tools//tools/jdk:current_java_runtime"],
)
