cc_defaults {
    name: "debuggerd_defaults",
    cflags: [
        "-Wall",
        "-Wextra",
        "-Werror",
        "-Wno-unused-argument",
        "-Wno-unused-function",
        "-Wno-nullability-completeness",
        "-Os",
    ],

    local_include_dirs: ["include"],
}

cc_library_headers {
    name: "libdebuggerd_common_headers",
    export_include_dirs: ["common/include"],
    recovery_available: true,
}

cc_library_shared {
    name: "libtombstoned_client",
    defaults: ["debuggerd_defaults"],
    srcs: [
        "tombstoned/tombstoned_client.cpp",
        "util.cpp",
    ],

    header_libs: ["libdebuggerd_common_headers"],

    static_libs: [
        "libasync_safe",
    ],

    shared_libs: [
        "libbase",
        "libcutils",
    ],

    export_header_lib_headers: ["libdebuggerd_common_headers"],
    export_include_dirs: ["tombstoned/include"],
}

// Utility library to talk to tombstoned and get an output fd.
cc_library_static {
    name: "libtombstoned_client_static",
    defaults: ["debuggerd_defaults"],
    recovery_available: true,
    srcs: [
        "tombstoned/tombstoned_client.cpp",
        "util.cpp",
    ],

    header_libs: ["libdebuggerd_common_headers"],

    whole_static_libs: [
        "libasync_safe",
        "libcutils",
        "libbase",
    ],

    export_header_lib_headers: ["libdebuggerd_common_headers"],
    export_include_dirs: ["tombstoned/include"],
}

// Core implementation, linked into libdebuggerd_handler and the dynamic linker.
cc_library_static {
    name: "libdebuggerd_handler_core",
    defaults: ["debuggerd_defaults"],
    recovery_available: true,
    srcs: ["handler/debuggerd_handler.cpp"],

    header_libs: [
        "libbase_headers",
        "libdebuggerd_common_headers",
    ],

    whole_static_libs: [
        "libasync_safe",
        "libcutils",
        "libdebuggerd",
    ],

    export_header_lib_headers: ["libdebuggerd_common_headers"],
    export_include_dirs: ["include"],
}

// Implementation with a no-op fallback.
cc_library_static {
    name: "libdebuggerd_handler",
    defaults: ["debuggerd_defaults"],
    srcs: ["handler/debuggerd_fallback_nop.cpp"],

    whole_static_libs: [
        "libdebuggerd_handler_core",
    ],

    export_include_dirs: ["include"],
}

// Fallback implementation.
cc_library_static {
    name: "libdebuggerd_handler_fallback",
    defaults: ["debuggerd_defaults"],
    recovery_available: true,
    srcs: [
        "handler/debuggerd_fallback.cpp",
    ],

    whole_static_libs: [
        "libdebuggerd_handler_core",
        "libtombstoned_client_static",
        "libasync_safe",
        "libbase",
        "libdebuggerd",
        "libunwindstack",
        "libdexfile_support_static",  // libunwindstack dependency
        "liblzma",
        "libcutils",
    ],
    target: {
        recovery: {
            exclude_static_libs: [
                "libdexfile_support_static",
            ],
        },
    },

    export_include_dirs: ["include"],
}

cc_library {
    name: "libdebuggerd_client",
    defaults: ["debuggerd_defaults"],
    srcs: [
        "client/debuggerd_client.cpp",
        "util.cpp",
    ],

    header_libs: ["libdebuggerd_common_headers"],

    shared_libs: [
        "libbase",
        "libcutils",
        "libprocinfo",
    ],

    export_header_lib_headers: ["libdebuggerd_common_headers"],
    export_include_dirs: ["include"],
}

cc_library_static {
    name: "libdebuggerd",
    defaults: ["debuggerd_defaults"],
    recovery_available: true,

    srcs: [
        "libdebuggerd/backtrace.cpp",
        "libdebuggerd/open_files_list.cpp",
        "libdebuggerd/tombstone.cpp",
        "libdebuggerd/utility.cpp",
    ],

    local_include_dirs: ["libdebuggerd/include"],
    export_include_dirs: ["libdebuggerd/include"],

    // Needed for private/bionic_fdsan.h
    include_dirs: ["bionic/libc"],

    static_libs: [
        "libdexfile_support_static",  // libunwindstack dependency
        "libunwindstack",
        "liblzma",
        "libbase",
        "libcutils",
        "liblog",
    ],
    target: {
        recovery: {
            exclude_static_libs: [
                "libdexfile_support_static",
            ],
        },
    },

    product_variables: {
        debuggable: {
            cflags: ["-DROOT_POSSIBLE"],
        },
    },
}

cc_test {
    name: "debuggerd_test",
    defaults: ["debuggerd_defaults"],

    cflags: ["-Wno-missing-field-initializers"],
    srcs: [
        "libdebuggerd/test/dump_memory_test.cpp",
        "libdebuggerd/test/elf_fake.cpp",
        "libdebuggerd/test/log_fake.cpp",
        "libdebuggerd/test/open_files_list_test.cpp",
        "libdebuggerd/test/tombstone_test.cpp",
    ],

    target: {
        android: {
            srcs: [
                "client/debuggerd_client_test.cpp",
                "debuggerd_test.cpp",
            ],
            static_libs: [
                "libasync_safe",
                "libtombstoned_client_static",
            ],
        },
    },

    shared_libs: [
        "libbase",
        "libcutils",
        "libdebuggerd_client",
        "liblog",
        "libminijail",
        "libnativehelper",
        "libunwindstack",
    ],

    static_libs: [
        "libdebuggerd",
    ],

    local_include_dirs: [
        "libdebuggerd",
    ],

    compile_multilib: "both",
    multilib: {
        lib32: {
            stem: "debuggerd_test32",
        },
        lib64: {
            stem: "debuggerd_test64",
        },
    },

    test_suites: ["device-tests"],
}

cc_benchmark {
    name: "debuggerd_benchmark",
    defaults: ["debuggerd_defaults"],
    srcs: ["debuggerd_benchmark.cpp"],
    shared_libs: [
        "libbase",
        "libdebuggerd_client",
    ],
}

cc_binary {
    name: "crash_dump",
    srcs: [
        "crash_dump.cpp",
        "util.cpp",
    ],
    defaults: ["debuggerd_defaults"],

    compile_multilib: "both",
    multilib: {
        lib32: {
            suffix: "32",
        },
        lib64: {
            suffix: "64",
        },
    },

    static_libs: [
        "libtombstoned_client_static",
        "libdebuggerd",
        "libcutils",
    ],

    shared_libs: [
        "libbase",
        "liblog",
        "libprocinfo",
        "libunwindstack",
    ],
}

cc_binary {
    name: "debuggerd",
    srcs: [
        "debuggerd.cpp",
    ],
    defaults: ["debuggerd_defaults"],

    shared_libs: [
        "libbase",
        "libdebuggerd_client",
        "liblog",
        "libprocinfo",
    ],

    local_include_dirs: ["include"],
}

cc_binary {
    name: "tombstoned",
    srcs: [
        "util.cpp",
        "tombstoned/intercept_manager.cpp",
        "tombstoned/tombstoned.cpp",
    ],
    defaults: ["debuggerd_defaults"],

    header_libs: ["libdebuggerd_common_headers"],

    static_libs: [
        "libbase",
        "libcutils",
        "libevent",
        "liblog",
    ],

    init_rc: ["tombstoned/tombstoned.rc"],
}

subdirs = [
    "crasher",
]