/* * Copyright 2018 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. */ package androidx.build import java.io.File import java.util.Properties import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.file.FileTree /** Writes the appropriate SDK path to local.properties file in specified location. */ fun Project.writeSdkPathToLocalPropertiesFile() { val sdkPath = project.getSdkPath() if (sdkPath.exists()) { val props = File(project.rootDir, "local.properties") // Gradle always separates directories with '/' regardless of the OS, so convert here. val gradlePath = sdkPath.absolutePath.replace(File.separator, "/") val contents = "sdk.dir=$gradlePath\ncmake.dir=$gradlePath/native-build-tools" props.printWriter().use { out -> out.println(contents) } } else { throw Exception( "Unable to find SDK prebuilts at $sdkPath. If you are not using a " + "standard repo-based checkout, please follow the checkout instructions at " + "go/androidx-onboarding." ) } } /** Returns a file tree representing the platform SDK suitable for use as a dependency. */ fun Project.getSdkDependency(): FileTree = fileTree("${getSdkPath()}/platforms/android-${project.defaultAndroidConfig.compileSdk}/") { it.include("android.jar") } /** Returns the root project's platform-specific SDK path as a file. */ fun Project.getSdkPath(): File { if ( ProjectLayoutType.from(project) == ProjectLayoutType.PLAYGROUND || System.getenv("COMPOSE_DESKTOP_GITHUB_BUILD") != null ) { // This is not full checkout, use local settings instead. // https://developer.android.com/studio/command-line/variables // check for local.properties first val localPropsFile = rootProject.projectDir.resolve("local.properties") if (localPropsFile.exists()) { val localProps = Properties() localPropsFile.inputStream().use { localProps.load(it) } val localSdkDir = localProps["sdk.dir"]?.toString() if (localSdkDir != null) { val sdkDirectory = File(localSdkDir) if (sdkDirectory.isDirectory) { return sdkDirectory } } } return getSdkPathFromEnvironmentVariable() } val os = getOperatingSystem() return if (os == OperatingSystem.WINDOWS) { getSdkPathFromEnvironmentVariable() } else { val platform = if (os == OperatingSystem.MAC) "darwin" else "linux" // By convention, the SDK prebuilts live under the root checkout directory. File(project.getCheckoutRoot(), "prebuilts/fullsdk-$platform") } } private fun getSdkPathFromEnvironmentVariable(): File { // check for environment variables, in the order AGP checks listOf("ANDROID_HOME", "ANDROID_SDK_ROOT").forEach { val envValue = System.getenv(it) if (envValue != null) { val sdkDirectory = File(envValue) if (sdkDirectory.isDirectory) { return sdkDirectory } } } // only print the error for SDK ROOT since ANDROID_HOME is deprecated but we first check // it because it is prioritized according to the documentation throw GradleException("ANDROID_SDK_ROOT environment variable is not set") } /** Sets the path to the canonical root project directory, e.g. {@code frameworks/support}. */ fun Project.setSupportRootFolder(rootDir: File?) { val extension = project.extensions.extraProperties return extension.set("supportRootFolder", rootDir) } /** * Returns the path to the canonical root project directory, e.g. {@code frameworks/support}. * * Note: This method of accessing the frameworks/support path is preferred over Project.rootDir * because it is generalized to also work for the "ui" project and playground projects. */ fun Project.getSupportRootFolder(): File { val extension = project.extensions.extraProperties return extension.get("supportRootFolder") as File } /** * Returns the path to the checkout's root directory, e.g. where {@code repo init} was run. * *

* This method assumes that the canonical root project directory is {@code frameworks/support}. */ fun Project.getCheckoutRoot(): File { return project.getSupportRootFolder().parentFile.parentFile } /** Returns the path to the konan prebuilts folder (e.g. /prebuilts/androidx/konan). */ fun Project.getKonanPrebuiltsFolder(): File { return getPrebuiltsRoot().resolve("androidx/konan") }