/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.
 */

// Define a GroovyDoc task which depends on the generated groovydoc tool
allprojects {
    groovydoc {
        dependsOn( { project(':groovy-groovydoc').classes })
        dependsOn( { project(':groovy-docgenerator').classes })
        groovyClasspath = files(
                rootProject.compileJava.classpath,
                rootProject.bootstrapJar.archivePath,
                { project(':groovy-docgenerator').compileJava.destinationDir },
                { project(':groovy-groovydoc').compileJava.destinationDir },
                { project(':groovy-groovydoc').sourceSets.main.runtimeClasspath },
                { project(':groovy-ant').sourceSets.main.runtimeClasspath },
                { project(':groovy-templates').sourceSets.main.runtimeClasspath },
        )
    }
}