BobStore/build.gradle
Peter Serwylo d39ca46953 Clean up build scripts to make it harder to fail.
* Don't apply android plugin in root project

This results in the root project being treated like and Android project.
That is, gradle will expect an AndroidManifest, a targetSdk property, and
all sorts of stuff that is not relevant to the root project.

Perhaps more importantly, this breaks integration with Android Studio,
which is the tool that many potential contributors will be using.

Finally, it also allows runing gradle tasks in the root project, rather
than having to cd into the F-Droid directory, which is a minor nicety.

The reason it was there in the first place was to make it so that we could
find the location of the Android SDK using the same mechanism that the
plugin used. To deal with this, this commit adapts the SDK finding code
from the gradle plugin.

 * Make gradle error out when missing depenencies.

The support v4 library requires some obsolte SDKs that are likely
not installed. It caused non-intuitive errors to come up for me,
so I've made gradle tell the user when this occurs.

 * Documented the main build.gradle file

This is primarily to explain the hacks we use in order to build the
Android support libraries.
2014-12-29 01:38:51 +11:00

167 lines
5.5 KiB
Groovy

/**
* This is *NOT* the main build script for F-Droid. The main build.gradle
* is in F-Droid/build.gradle. Usually multi-project builds don't have a
* build.gradle in the top level directory (http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup).
*
* This build script contains miscellaneous hacks to ensure that all of
* F-Droids dependencies can be built from source.
* Each hack should be documented, and in the future, may need to be changed
* in order to ensure that we keep pace with any changes upstream makes to
* their build processes.
*
* - Some subprojects don't have gradle build scripts, so they are setup here.
*
* - The android support libraries make a lot of dependencies about the project
* two folders up from themselves, which we will have to provide for them.
*/
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.14.2'
}
}
project(':extern:UniversalImageLoader:library') {
apply plugin: 'android-library'
android {
compileSdkVersion 16
buildToolsVersion '21.1.2'
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
}
// The support-annotations build.gradle uses the mavenDeployer method, which requires
// this plugin. Even though no artifacts are being deployed, this is still required
// for the build script to work.
project(':support-annotations') {
apply plugin: 'maven'
}
project(':extern:zipsigner') {
apply plugin: 'java'
dependencies {
compile project(':extern:spongycastle:core')
compile project(':extern:spongycastle:pkix')
compile project(':extern:spongycastle:prov')
}
}
project(':support-v4') {
apply plugin: 'maven'
// The support-v4 library assumes certain things are defined in the
// root project (which is usually the android-support project, but
// this time it is the F-Droid project.
rootProject.ext.supportRepoOut = ""
}
/**
* Finds a reference to the prefered Android SDK directory.
* Ideally we'd use "android.plugin.sdkFolder" to find this, however this is
* only possible if we apply the android application plugin. This is not ideal,
* because it will add a bunch of tasks to do with building an android app,
* even tnough this build.gradle is not here to build F-Droid, it is here to
* apply hacks to play nicely with various upstream projects.
*
* Adapted from https://android.googlesource.com/platform/tools/base/+/c8b776289ace4189406b59a9a9c8c9de63271cb0/build-system/gradle/src/main/groovy/com/android/build/gradle/internal/SdkHandler.java
* Copyright (C) 2014 The Android Open Source Project
* Licensed under the Apache License, Version 2.0
* http://www.apache.org/licenses/LICENSE-2.0i
*/
def findSdkPath() {
Properties properties = new Properties()
File propFile = file("local.properties")
if (propFile.exists()) {
propFile.withReader { properties.load(it) }
}
String sdkDirProp = properties.getProperty("sdk.dir");
if (sdkDirProp != null) {
return new File(sdkDirProp)
}
String envVar = System.getenv("ANDROID_HOME");
if (envVar != null) {
return new File(envVar);
}
String property = System.getProperty("android.home");
if (property != null) {
return new File(property);
}
def error = """
Couldn't find Android SDK. Looked for (in order of precedence):
* sdk.dir in $propFile
* ANDROID_HOME environment variable
* android.home Java property
"""
throw new RuntimeException(error)
}
// Used by the support-v4 libraries build script.
FileCollection getAndroidPrebuilt(String apiLevel) {
def file = new File("${findSdkPath()}/platforms/android-$apiLevel/android.jar")
if (!file.exists()) {
def msg = """
Android SDK for android-$apiLevel not found (required for building support library).
Expected to find it at $file.
Do you have that SDK installed?
(If it is not visible in the Android SDK Manager, "Packages -> Show Obsolete Packages")
"""
throw new RuntimeException(msg)
}
return files(file)
}
subprojects {
// This is the hacky way which we force the subprojects to use the same build tools:
// http://stackoverflow.com/a/21032272
afterEvaluate {
if ( it.hasProperty( 'android' ) ) {
android {
// The android build task only lets you configure the buildToolsVersion once, so if
// we execute the closure below to configure our subprojects, it will fail when it
// hits the second subproject. Therefore, we will only do it once, and I guess the
// android plugin will re-use the existing value I set.
// https://android.googlesource.com/platform/tools/build/+/master/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy
try {
buildToolsVersion '21.1.2'
logger.info("Set buildToolsVersion to '21.1.2'")
} catch (GradleException e) {
logger.info("Tried to set the buildToolsVersion, however we were not allowed to: $e.message")
}
}
}
}
}