// Copyright (C) 2018 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: ["Android-Apache-2.0"],
}

java_library_host {
    name: "metalava-signature-reader",
    static_libs: [
        "metalava-model",
        "metalava-model-text",
    ],
}

java_binary_host {
    name: "metalava",
    srcs: [
        "src/main/java/**/*.java",
        "src/main/java/**/*.kt",
    ],
    java_resource_dirs: ["src/main/resources/"],
    static_libs: [
        "jsr305",
        "jsr330",
        "kotlin-reflect",
        "metalava-model",
        "metalava-model-psi",
        "metalava-model-source",
        "metalava-model-text",
        "metalava-model-turbine",
        "metalava-reporter",
        "metalava-tools-common-m2-deps",
        "metalava-gradle-plugin-deps",
        "gson-prebuilt-jar-2.9.1",
    ],
    main_class: "com.android.tools.metalava.Driver",
    target: {
        host: {
            dist: {
                targets: ["sdk"],
            },
        },
    },
    visibility: [
        // Metalava is linked by //vendor/xts/gts-tests/hostsidetests/api, but because it's a
        // make project, soong's visibility won't apply. Soong also won't let you specify a
        // subpackage of //vendor/ here. So let's just make it private.
        // When //vendor/xts/gts-tests/hostsidetests/api migrates to Android.bp, we need to
        // open metalava to //vendor:__subpackages__.
        "//visibility:private",
    ],
}

java_library {
    name: "stub-annotations",
    host_supported: true,
    srcs: [
        "stub-annotations/src/main/java/**/*.java",
    ],
    // Allow core_current to use stub-annotations.
    sdk_version: "28",
    target: {
        host: {
            dist: {
                targets: ["sdk"],
            },
        },
    },
}

genrule {
    name: "private-stub-annotations",
    tools: [
        "soong_zip",
        "metalava",
    ],
    srcs: [
        "stub-annotations/src/main/java/**/*.java",
    ],
    cmd: "($(location metalava) make-annotations-package-private " +
        "tools/metalava/stub-annotations/src/main/java $(genDir)/private-stub-annotations) " +
        "&& ($(location soong_zip) -o $(out) -C $(genDir) -D $(genDir))",
    out: [
        "private-stub-annotations.srcjar",
    ],
}

java_library {
    name: "private-stub-annotations-jar",
    host_supported: true,
    srcs: [
        ":private-stub-annotations",
    ],
    sdk_version: "core_current",
    // private-stub-annotations-jar ends up in android.jar in the SDK and should
    // use -target 8.
    java_version: "1.8",
}

droiddoc_exported_dir {
    name: "metalava-manual",
    path: "manual",
}
