// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

cc_library_headers {
    name: "libutils_headers",
    vendor_available: true,
    recovery_available: true,
    host_supported: true,

    header_libs: [
        "liblog_headers",
        "libsystem_headers",
        "libcutils_headers",
        "libprocessgroup_headers",
    ],
    export_header_lib_headers: [
        "liblog_headers",
        "libsystem_headers",
        "libcutils_headers",
        "libprocessgroup_headers",
    ],
    export_include_dirs: ["include"],

    target: {
        android: {
            header_libs: ["libbacktrace_headers"],
            export_header_lib_headers: ["libbacktrace_headers"],
        },
        linux_bionic: {
            enabled: true,
        },
        windows: {
            enabled: true,
        },
    },
}

cc_defaults {
    name: "libutils_defaults",
    vendor_available: true,
    recovery_available: true,
    vndk: {
        enabled: true,
        support_system_process: true,
    },
    host_supported: true,

    cflags: [
        "-Wall",
        "-Werror",
    ],
    header_libs: [
        "libbase_headers",
        "libutils_headers",
    ],
    export_header_lib_headers: [
        "libutils_headers",
    ],

    shared_libs: [
        "libcutils",
        "liblog",
    ],

    arch: {
        mips: {
            cflags: ["-DALIGN_DOUBLE"],
        },
    },

    target: {
        android: {
            cflags: ["-fvisibility=protected"],

            shared_libs: [
                "libprocessgroup",
                "libdl",
                "libvndksupport",
            ],

            sanitize: {
                misc_undefined: ["integer"],
            },
        },

        recovery: {
            exclude_shared_libs: ["libvndksupport"],
        },

        linux_bionic: {
            enabled: true,
        },

        darwin: {
            cflags: ["-Wno-unused-parameter"],
        },

        windows: {
            cflags: [
                // Under MinGW, ctype.h doesn't need multi-byte support
                "-DMB_CUR_MAX=1",
                "-Wno-unused-private-field",
            ],

            enabled: true,
        },
    },
}

cc_library {
    name: "libutils",
    defaults: ["libutils_defaults"],

    srcs: [
        "FileMap.cpp",
        "JenkinsHash.cpp",
        "NativeHandle.cpp",
        "Printer.cpp",
        "PropertyMap.cpp",
        "RefBase.cpp",
        "SharedBuffer.cpp",
        "StopWatch.cpp",
        "String8.cpp",
        "String16.cpp",
        "StrongPointer.cpp",
        "SystemClock.cpp",
        "Threads.cpp",
        "Timers.cpp",
        "Tokenizer.cpp",
        "Unicode.cpp",
        "VectorImpl.cpp",
        "misc.cpp",
    ],

    target: {
        android: {
            srcs: [
                "Trace.cpp",
            ],
        },
        linux: {
            header_libs: ["libbase_headers"],
            srcs: [
                "Looper.cpp",
            ],
        },
    },
}

cc_library {
    name: "libutilscallstack",
    defaults: ["libutils_defaults"],

    srcs: [
        "CallStack.cpp",
    ],

    arch: {
        mips: {
            cflags: ["-DALIGN_DOUBLE"],
        },
    },

    shared_libs: [
         "libutils",
         "libbacktrace",
    ],

    target: {
        linux: {
            srcs: [
                "ProcessCallStack.cpp",
            ],
        },
        darwin: {
            enabled: false,
        },
        windows: {
            enabled: false,
        },
    },
}

cc_test {
    name: "libutils_test",
    host_supported: true,

    srcs: [
        "BitSet_test.cpp",
        "FileMap_test.cpp",
        "LruCache_test.cpp",
        "Mutex_test.cpp",
        "SharedBuffer_test.cpp",
        "String8_test.cpp",
        "StrongPointer_test.cpp",
        "Unicode_test.cpp",
        "Vector_test.cpp",
    ],

    target: {
        android: {
            srcs: [
                "SystemClock_test.cpp",
            ],
            shared_libs: [
                "libz",
                "liblog",
                "libcutils",
                "libutils",
                "libbase",
            ],
        },
        linux: {
            srcs: [
                "Looper_test.cpp",
                "RefBase_test.cpp",
            ],
        },
        host: {
            static_libs: [
                "libutils",
                "liblog",
                "libbase",
            ],
        },
    },

    cflags: [
        "-Wall",
        "-Wextra",
        "-Werror",
        "-Wthread-safety",
    ],

    test_suites: ["device-tests"],
}

// TODO: the test infrastructure isn't yet capable of running this,
// so it's broken out into its own test so that the main libutils_tests
// can be in presubmit even if this can't.

cc_test {
    name: "libutils_singleton_test",
    srcs: ["Singleton_test.cpp"],
    cflags: [
        "-Wall",
        "-Werror",
    ],
    shared_libs: ["libbase"],

    required: [
        ":libutils_test_singleton1",
        ":libutils_test_singleton2",
    ],
}

cc_test_library {
    name: "libutils_test_singleton1",
    host_supported: true,
    relative_install_path: "libutils_test",
    srcs: ["Singleton_test1.cpp"],
    cflags: [
        "-Wall",
        "-Werror",
    ],
}

cc_test_library {
    name: "libutils_test_singleton2",
    host_supported: true,
    relative_install_path: "libutils_test",
    srcs: ["Singleton_test2.cpp"],
    cflags: [
        "-Wall",
        "-Werror",
    ],
    shared_libs: ["libutils_test_singleton1"],
}