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


// This file is part of a a workaround for https://github.com/gradle/gradle/issues/1909 to enable
// including this Support Library build as an included build. See include-support-library.gradle
// for usage instructions.

boolean currentBuildIsRootBuild = (gradle.parent == null)

File getExternalProjectPath() {
    def scriptDir = file(buildscript.sourceFile.parent)
    if (System.getenv("COMPOSE_DESKTOP_GITHUB_BUILD") != null) {
        def path = new File(System.env.OUT_DIR)
        if (!(new File(path, "doclava").isDirectory())) {
            throw new GradleException("Please checkout doclava to $path")
        }
        return path.getCanonicalFile()
    } else {
        return new File(scriptDir, "../../external").getCanonicalFile()
    }
}

// Add included builds. This only works if this is currently the root build, so this script should
// be applied to several builds and will only enable itself when part of the root build.
if (currentBuildIsRootBuild) {
  includeBuild(new File(getExternalProjectPath(), "doclava"))
}
