load("@protobuf//bazel:cc_proto_library.bzl", "cc_proto_library")
load("@protobuf//bazel:proto_library.bzl", "proto_library")
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")

load("//:build_variables.bzl", "COPTS")

package(
    default_visibility = ["//:android_cuttlefish"],
)

proto_library(
    name = "libadb_protos",
    srcs = [
        "proto/adb_host.proto",
        "proto/adb_known_hosts.proto",
        "proto/app_processes.proto",
        "proto/key_type.proto",
        "proto/pairing.proto",
    ],
    strip_import_prefix = "proto",
)

cc_proto_library(
    name = "libadb_cc_protos",
    deps = [":libadb_protos"],
)

cc_binary(
    name = "adb",
    srcs = [
        "adb.cpp",
        "adb.h",
        "adb_auth.h",
        "adb_io.cpp",
        "adb_io.h",
        "adb_listeners.cpp",
        "adb_listeners.h",
        "adb_mdns.cpp",
        "adb_mdns.h",
        "adb_trace.cpp",
        "adb_trace.h",
        "adb_unique_fd.cpp",
        "adb_unique_fd.h",
        "adb_utils.cpp",
        "adb_utils.h",
        "adb_wifi.h",
        "apacket_reader.cpp",
        "apacket_reader.h",
        "client/adb_client.cpp",
        "client/adb_client.h",
        "client/adb_install.cpp",
        "client/adb_install.h",
        "client/adb_wifi.cpp",
        "client/auth.cpp",
        "client/bugreport.cpp",
        "client/bugreport.h",
        "client/commandline.cpp",
        "client/commandline.h",
        "client/console.cpp",
        "client/detach.cpp",
        "client/detach.h",
        "client/discovered_services.cpp",
        "client/discovered_services.h",
        "client/file_sync_client.cpp",
        "client/file_sync_client.h",
        "client/host_services.h",
        "client/incremental.cpp",
        "client/incremental.h",
        "client/incremental_server.cpp",
        "client/incremental_server.h",
        "client/incremental_utils.cpp",
        "client/incremental_utils.h",
        "client/line_printer.cpp",
        "client/line_printer.h",
        "client/main.cpp",
        "client/mdns_tracker.cpp",
        "client/mdns_tracker.h",
        "client/mdns_utils.cpp",
        "client/mdns_utils.h",
        "client/openscreen/mdns_service_info.cpp",
        "client/openscreen/mdns_service_info.h",
        "client/openscreen/platform/logging.cpp",
        "client/openscreen/platform/task_runner.cpp",
        "client/openscreen/platform/task_runner.h",
        "client/openscreen/platform/udp_socket.cpp",
        "client/pairing/pairing_client.cpp",
        "client/pairing/pairing_client.h",
        "client/transport_client.h",
        "client/transport_emulator.cpp",
        "client/transport_mdns.cpp",
        "client/transport_usb.cpp",
        "client/usb.h",
        "client/usb_libusb.cpp",
        "client/usb_libusb.h",
        "client/usb_libusb_device.cpp",
        "client/usb_libusb_device.h",
        "client/usb_libusb_hotplug.cpp",
        "client/usb_libusb_hotplug.h",
        "client/usb_libusb_inhouse_hotplug.cpp",
        "client/usb_libusb_inhouse_hotplug.h",
        "client/usb_linux.cpp",
        "compression_utils.h",
        "crypto/include/adb/crypto/key.h",
        "crypto/include/adb/crypto/rsa_2048_key.h",
        "crypto/include/adb/crypto/x509_generator.h",
        "crypto/key.cpp",
        "crypto/rsa_2048_key.cpp",
        "crypto/x509_generator.cpp",
        "diagnose_usb/diagnose_usb.cpp",
        "diagnose_usb/include/diagnose_usb.h",
        "fdevent/fdevent.cpp",
        "fdevent/fdevent.h",
        "fdevent/fdevent_epoll.cpp",
        "fdevent/fdevent_epoll.h",
        "file_sync_protocol.h",
        "incfs/util/map_ptr.h",
        "libcrypto_utils/android_pubkey.cpp",
        "libcrypto_utils/include/crypto_utils/android_pubkey.h",
        "pairing_auth/aes_128_gcm.cpp",
        "pairing_auth/include/adb/pairing/aes_128_gcm.h",
        "pairing_auth/include/adb/pairing/pairing_auth.h",
        "pairing_auth/pairing_auth.cpp",
        "pairing_connection/include/adb/pairing/pairing_connection.h",
        "pairing_connection/pairing_connection.cpp",
        "services.cpp",
        "services.h",
        "shell_protocol.h",
        "shell_service_protocol.cpp",
        "socket.h",
        "socket_spec.cpp",
        "socket_spec.h",
        "sockets.cpp",
        "sysdeps.h",
        "sysdeps/chrono.h",
        "sysdeps/env.cpp",
        "sysdeps/env.h",
        "sysdeps/errno.cpp",
        "sysdeps/errno.h",
        "sysdeps/network.h",
        "sysdeps/posix/network.cpp",
        "sysdeps/stat.h",
        "sysdeps/uio.h",
        "sysdeps_unix.cpp",
        "tls/adb_ca_list.cpp",
        "tls/include/adb/tls/adb_ca_list.h",
        "tls/include/adb/tls/tls_connection.h",
        "tls/tls_connection.cpp",
        "transport.cpp",
        "transport.h",
        "transport_fd.cpp",
        "types.cpp",
        "types.h",
        "version/build/version.h",
        "version/platform_tools_version.h",
    ],
    copts = [
        "-Wno-inconsistent-missing-override",
        "-Wno-thread-safety-attributes",
        "-Wno-thread-safety-analysis",
    ],
    cxxopts = COPTS + [
        "-fno-exceptions",
        "-std=c++20",
    ],
    features = ["-layering_check"],  # Incompatible with libzip cmake build
    includes = [
        ".",
        "crypto/include",
        "diagnose_usb/include",
        "incfs",
        "libcrypto_utils/include",
        "pairing_auth/include",
        "pairing_connection/include",
        "tls/include",
        "version",
    ],
    linkopts = [
        "-llzma",
    ],
    local_defines = ["ADB_HOST=1"],
    deps = [
        ":libadb_cc_protos",
        "//libbase",
        "@android_system_core//:libcutils",
        "@boringssl//:crypto",
        "@boringssl//:ssl",
        "@brotli//:brotlidec",
        "@brotli//:brotlienc",
        "@libopenscreen",
        "@libusb",
        "@libzip",
        "@lz4//:lz4_frame",
        "@protobuf",
        "@protobuf//src/google/protobuf/io",
    ],
)
