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