//
// Copyright (C) 2017 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.
//

package {
    default_applicable_licenses: ["prebuilts_clang_host_linux-x86_license"],
}

// See: http://go/android-license-faq
// SPDX-license-identifier-GPL and SPDX-license-identifier-LGPL removed
// those files are dual-licensed 'OR PSF'
license {
    name: "prebuilts_clang_host_linux-x86_license",
    visibility: [":__subpackages__"],
    license_kinds: [
        "SPDX-license-identifier-Apache-2.0",
        "SPDX-license-identifier-BSD",
        "SPDX-license-identifier-MIT",
        "SPDX-license-identifier-NCSA",
        "SPDX-license-identifier-PSF-2.0",
        "SPDX-license-identifier-Zlib",
        "legacy_unencumbered",
    ],
    // large-scale-change unable to identify any license_text files
}

llvm_prebuilt_library_static {
    name: "libFuzzer",
    vendor_available: true,
    sdk_version: "minimum",
    sanitize: {
        never: true,
    },
}

llvm_prebuilt_library_static {
    name: "libomp",
    sdk_version: "minimum",
    vendor_available: true,
    product_available: true,
    sanitize: {
        never: true,
    },
}

// All libclang_rt.* modules are available to the platform except
// hwasan, which is distributed as part of the runtime apex.
cc_defaults {
    name: "libclang_rt-prebuilt-non-platform-default",
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    apex_available: [
        "//apex_available:anyapex",
    ],
}

cc_defaults {
    name: "libclang_rt-prebuilt-default",
    defaults: ["libclang_rt-prebuilt-non-platform-default"],
    apex_available: [
        "//apex_available:platform",
    ],
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.builtins",
    defaults: ["libclang_rt-prebuilt-default"],
    sdk_version: "minimum",
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    native_bridge_supported: true,
    host_supported: true,
    sanitize: {
        never: true,
    },
    stl: "none",
}

libclang_rt_prebuilt_library_static {
    name: "libclang_rt.builtins-exported",
    lib_name: "libclang_rt.builtins",
    suffix: "-exported",
    defaults: ["libclang_rt-prebuilt-default"],
    sdk_version: "minimum",
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    native_bridge_supported: true,
    sanitize: {
        never: true,
    },
    enabled: false,
    target: {
        android_arm: {
            enabled: true,
        },
        android_x86: {
            enabled: true,
        },
    },
    stl: "none",
    // This exported variant of the builtins library is only intended for use in
    // libc.so and libm.so, which exports some builtins symbols for backwards
    // compatibility.
    visibility: [
        "//bionic:__subpackages__",
        "//frameworks/libs/native_bridge_support/libc:__subpackages__",
        "//frameworks/libs/native_bridge_support/android_api/libc:__subpackages__",
    ],
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_shared {
    name: "libclang_rt.asan",
    defaults: ["libclang_rt-prebuilt-default"],
    host_supported: true,
    recovery_available: true,
    native_bridge_supported: true,
    sdk_version: "24",
    check_elf_files: false, // Bypass circular dependency between libc++
    is_llndk: true,
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.asan.static",
    defaults: ["libclang_rt-prebuilt-default"],
    host_supported: true,
    recovery_available: true,
    native_bridge_supported: true,
    sdk_version: "24",
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.asan_cxx.static",
    defaults: ["libclang_rt-prebuilt-default"],
    host_supported: true,
    recovery_available: true,
    native_bridge_supported: true,
    sdk_version: "24",
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_shared {
    name: "libclang_rt.ubsan_standalone",
    defaults: ["libclang_rt-prebuilt-default"],
    host_supported: true,
    vendor_available: true,
    product_available: true,
    recovery_available: true,
    double_loadable: true,
    stl: "c++_shared",
    sdk_version: "24",
    check_elf_files: false, // Bypass circular dependency between libc++
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.ubsan_standalone.static",
    defaults: ["libclang_rt-prebuilt-default"],
    sdk_version: "24",
    vendor_available: true,
    product_available: true,
    recovery_available: true,
    double_loadable: true,
    host_supported: true,
    stl: "c++_static",
    check_elf_files: false, // Bypass circular dependency between libc++
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.ubsan_minimal",
    defaults: ["libclang_rt-prebuilt-default"],
    sdk_version: "24",
    vendor_available: true,
    product_available: true,
    recovery_available: true,
    double_loadable: true,
    host_supported: true,
    native_bridge_supported: true,
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.hwasan_static",
    sdk_version: "minimum",
    enabled: false,
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    host_supported: true,
    target: {
        bionic_arm64: {
            enabled: true,
        },
    },
    defaults: [
        "libclang_rt-prebuilt-default",
    ],
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_shared {
    name: "libclang_rt.hwasan",
    sdk_version: "minimum",
    enabled: false,
    recovery_available: true,
    host_supported: true,
    target: {
        bionic_arm64: {
            enabled: true,
        },
    },
    check_elf_files: false, // Bypass circular dependency between libc++
    is_llndk: true,
    llndk_moved_to_apex: true,
    defaults: [
        "libclang_rt-prebuilt-non-platform-default",
    ],
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.profile",
    defaults: ["libclang_rt-prebuilt-default"],
    host_supported: true,
    sdk_version: "minimum",
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    check_elf_files: false, // Bypass circular dependency between libc++
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.fuzzer",
    defaults: ["libclang_rt-prebuilt-default"],
    sdk_version: "minimum",
    host_supported: true,
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    ramdisk_available: false,
    vendor_ramdisk_available: false,
    sanitize: {
        never: true,
    },
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_library_static {
    name: "libclang_rt.fuzzer_interceptors",
    defaults: ["libclang_rt-prebuilt-default"],
    sdk_version: "minimum",
    host_supported: true,
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    ramdisk_available: false,
    vendor_ramdisk_available: false,
}

///////////////////////////////////////////////////////////////////////////////
libclang_rt_prebuilt_object {
    name: "clang_rt.crtbegin",
    host_supported: true,
    defaults: ["libclang_rt-prebuilt-default"],
}

libclang_rt_prebuilt_object {
    name: "clang_rt.crtend",
    host_supported: true,
    defaults: ["libclang_rt-prebuilt-default"],
}

///////////////////////////////////////////////////////////////////////////////
cc_defaults {
    name: "libunwind-android-default",
    defaults: [
        "libclang_rt-prebuilt-default",
        "linux_bionic_supported",
    ],
    sdk_version: "minimum",
    recovery_available: true,
    vendor_available: true,
    product_available: true,
    native_bridge_supported: true,
    sanitize: {
        never: true,
    },
    stl: "none",
    // The unwinder needs functions from libc (and libdl), but libc.so links
    // against libunwind*.a. Clear the system_shared_libs property so that Soong
    // doesn't complain about the cyclic dependency.
    system_shared_libs: [],
}

llvm_prebuilt_library_static {
    name: "libunwind",
    defaults: ["libunwind-android-default"],
    target: {
        musl: {
            enabled: true,
        },
    },
}

llvm_prebuilt_library_static {
    name: "libunwind-exported",
    defaults: ["libunwind-android-default"],

    // The libunwind-exported.a library is only intended for use with libc.so,
    // which needs to export the unwinder API.
    visibility: [
        "//bionic:__subpackages__",
        "//frameworks/libs/native_bridge_support/libc:__subpackages__",
        "//frameworks/libs/native_bridge_support/android_api/libc:__subpackages__",
    ],
}

llvm_prebuilt_library_static {
    name: "libsimpleperf_readelf",
    host_supported: true,
    sdk_version: "minimum",
    sanitize: {
        never: true,
    },
    target: {
        windows: {
            enabled: true,
        },
    },
    visibility: [
        "//cts/tests/tests/simpleperf",
        "//system/extras/simpleperf",
    ],
}

// -----------------------------------------------------------------------------
// Export libc++ and libclang-cpp.so.
// -----------------------------------------------------------------------------

llvm_host_defaults {
    name: "llvm-build-host-tools-defaults",
    target: {
        // We don't have a musl build of libclang-cpp.so, so disable the host
        // tools for musl.
        musl: {
            enabled: false,
        },
    },
}

// Export libclang-cpp shared library
llvm_prebuilt_library_shared {
    name: "libclang-cpp_host",
    host_supported: true,
    device_supported: false,
    sanitize: {
        never: true,
    },
    shared_libs: ["libc++"],
    target: {
        darwin: {
            strip: {
                none: true,
            },
        },
    },
}

cc_defaults {
    name: "libc++-device-base-default",
    device_supported: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,
    sdk_version: "minimum",
}

cc_defaults {
    name: "libc++-device-default",
    defaults: ["libc++-device-base-default"],
    vendor_available: true,
    product_available: true,
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
}

// The "noexcept" variants of libc++_static and libc++demangle are intended for
// use in the dynamic linker. The linker doesn't implement ELF TLS for itself,
// so it needs to avoid using the per-thread EH globals pointer.
cc_defaults {
    name: "libc++-noexcept-default",
    defaults: [
        "libc++-device-base-default",
        "linux_bionic_supported",
    ],
    apex_available: [
        "com.android.runtime",
    ],
    visibility: [
        "//bionic:__subpackages__",
        "//frameworks/libs/native_bridge_support:__subpackages__",
    ],
}

llvm_prebuilt_library_shared {
    name: "libc++",
    host_supported: true,
    defaults: ["libc++-device-default"],
    double_loadable: true,
    // TODO(b/298326651): Soong doesn't output a shared library module for
    // libc.native_bridge, so when check_elf_file.py checks
    // libc++.native_bridge, it's missing a --shared-lib argument for libc.so.
    check_elf_files: false,
}

llvm_prebuilt_library_shared {
    name: "libc++abi_shared",
    host_supported: true,
    device_supported: false,
}

llvm_prebuilt_library_static {
    name: "libc++_static",
    host_supported: true,
    defaults: ["libc++-device-default"],
    target: {
        windows: {
            enabled: true,
        },
    },
    stl: "none",
}

llvm_prebuilt_library_static {
    name: "libc++abi_static",
    host_supported: true,
    device_supported: false,
    target: {
        windows: {
            enabled: true,
        },
    },
    stl: "none",
}

llvm_prebuilt_library_static {
    name: "libc++demangle",
    host_supported: false,
    defaults: ["libc++-device-default"],
    stl: "none",
}

llvm_prebuilt_library_static {
    name: "libc++_static_noexcept",
    defaults: ["libc++-noexcept-default"],
    stl: "none",
}

llvm_prebuilt_library_static {
    name: "libc++demangle_noexcept",
    defaults: ["libc++-noexcept-default"],
    stl: "none",
}

cc_defaults {
    name: "libc++-ndk-default",
    sdk_version: "minimum",
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
}

ndk_prebuilt_shared_stl {
    name: "ndk_libc++_shared",
    defaults: ["libc++-ndk-default"],
    stem: "libc++_shared",
}

ndk_prebuilt_static_stl {
    name: "ndk_libc++_static",
    defaults: ["libc++-ndk-default"],
    stl: "none",
}

ndk_prebuilt_static_stl {
    name: "ndk_libc++abi",
    defaults: ["libc++-ndk-default"],
    stl: "none",
}

clang_builtin_headers {
    name: "clang_builtin_headers_resources",
    tool_files: ["soong/generate_clang_builtin_headers_resources.sh"],
    out: ["clang_builtin_headers_resources.inc"],
}

// Export llvm tools as a filegroup which is packaged and available for CI
// tests.
llvm_tools_filegroup {
    name: "llvm-tools",
    visibility: [
        "//development/scripts:__subpackages__",
        "//external/deqp/android/cts:__subpackages__",
    ],
    // The tools and libs in the filegroup are in
    // ./soong/clangprebuilts.go:llvmToolsFiles
}

llvm_prebuilt_build_tool {
    name: "llvm-dwarfdump",
}

llvm_prebuilt_build_tool {
    name: "llvm-objcopy",
}

llvm_prebuilt_build_tool {
    name: "llvm-objdump",
}

llvm_prebuilt_build_tool {
    name: "llvm-strings",
}

subdirs = [
    "soong",
]

filegroup {
    name: "py-clang-srcs",
    srcs: [
        "clang-stable/lib/python3/site-packages/clang/*.py",
    ],
    path: "clang-stable/lib/python3/site-packages/clang",
}

python_library {
    name: "py-clang",
    pkg_path: "clang",
    host_supported: true,
    srcs: [
        ":py-clang-srcs",
    ],
}

filegroup {
    name: "libclang",
    srcs: [
        "clang-stable/lib/libclang.so",
    ],
}

dirgroup {
    name: "trusty_dirgroup_prebuilts_clang_host_linux-x86",
    dirs: [
        "clang-r547379",
        "clang-r563880",
    ],
    visibility: ["//trusty/vendor/google/aosp/scripts"],
}
