/*
 * 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.
 */

import javax.tools.ToolProvider

plugins {
    id("java")
    id("maven-publish")
}

group = 'com.android'
version = '1.0.6'

if (System.env.OUT_DIR != null) {
    buildDir = file("${System.env.OUT_DIR}/gradle/external/doclava/build").getCanonicalFile()
} else {
    buildDir = file('../../out/host/gradle/external/doclava/build')
}

repositories {
    maven { url file('../../prebuilts/androidx/external').absolutePath }
}

dependencies {
    implementation("org.antlr:antlr:3.5.2")
    implementation("com.google.jsilver:jsilver:1.0.0")
    implementation("org.ccil.cowan.tagsoup:tagsoup:1.2.1")

    // tools.jar required for com.sun.javadoc
    def toolsJar
    if (JavaVersion.current().getMajorVersion() == "8") {
        toolsJar = ((URLClassLoader) ToolProvider.getSystemToolClassLoader()).getURLs()
    } else if (System.env.JAVA_TOOLS_JAR != null) {
        toolsJar = System.env.JAVA_TOOLS_JAR
    } else {
        throw new Exception("If you are not using Java 8, JAVA_TOOLS_JAR env variable " +
                "needs to be set to tools.jar from a Java 8 installation to build Doclava")
    }
    implementation(files(toolsJar))

    testImplementation("junit:junit:4.12")
}

sourceSets {
    main {
        java.srcDirs = ['src/']
        resources.srcDirs = ['res/']
    }
    test {
        java.srcDirs = ['test/']
        resources.srcDirs = ['test/api']
    }
}

tasks.withType(JavaCompile) {
    // Suppress build warnings that we're not interested in: b/154755010
    options.warnings = false
}

tasks.withType(Jar) { task ->
    task.reproducibleFileOrder = true
    task.preserveFileTimestamps = false
}
