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

// 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) {
  String buildScriptDir = buildscript.sourceFile.parent
  File externalRoot = new File(buildScriptDir, "../../external")

  includeBuild(new File(externalRoot, "doclava"))
}


