/*
 * 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 enables using Support Library in a Composite Build. More information about Composite
// Builds can be found at https://docs.gradle.org/current/userguide/composite_builds.html .
// This file is a workaround for https://github.com/gradle/gradle/issues/1909 .

// Projects that want to include the build of Support Library should apply this file to their
// settings.gradle . For example, if Support Library is at the file path ~/support-library, then
// to include Support Library in your build, add this line to the bottom of your settings.gradle:
//
//   apply(from:"~/support-library/frameworks/support/include-support-library.gradle")

String buildScriptDir = buildscript.sourceFile.parent

// include any builds required by Support Library
apply(from:new File(buildScriptDir, "include-composite-deps.gradle"))

// include Support Library itself
includeBuild(buildScriptDir)

