Return-Path: X-Original-To: apmail-cordova-commits-archive@www.apache.org Delivered-To: apmail-cordova-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1326611B25 for ; Thu, 11 Sep 2014 15:28:45 +0000 (UTC) Received: (qmail 14490 invoked by uid 500); 11 Sep 2014 15:28:44 -0000 Delivered-To: apmail-cordova-commits-archive@cordova.apache.org Received: (qmail 14417 invoked by uid 500); 11 Sep 2014 15:28:44 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cordova.apache.org Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 14034 invoked by uid 99); 11 Sep 2014 15:28:44 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 11 Sep 2014 15:28:44 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 23D16917628; Thu, 11 Sep 2014 15:28:44 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ian@apache.org To: commits@cordova.apache.org Date: Thu, 11 Sep 2014 15:29:07 -0000 Message-Id: <855c05a1030a480396ca22e3a16529df@git.apache.org> In-Reply-To: <2462d7ab6fef4e3f8915fe23cf685060@git.apache.org> References: <2462d7ab6fef4e3f8915fe23cf685060@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [25/31] android commit: CB-7512: Determine SDK and build tools version dynamcally at build time CB-7512: Determine SDK and build tools version dynamcally at build time Project: http://git-wip-us.apache.org/repos/asf/cordova-android/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-android/commit/c8bbdb23 Tree: http://git-wip-us.apache.org/repos/asf/cordova-android/tree/c8bbdb23 Diff: http://git-wip-us.apache.org/repos/asf/cordova-android/diff/c8bbdb23 Branch: refs/heads/4.0.x Commit: c8bbdb23defb4a2fc1227b7f624934df29695937 Parents: 7ee8117 Author: Ian Clelland Authored: Wed Sep 10 10:57:43 2014 -0400 Committer: Ian Clelland Committed: Wed Sep 10 10:57:43 2014 -0400 ---------------------------------------------------------------------- bin/templates/project/build.gradle | 6 +- bin/templates/project/cordova.gradle | 147 ++++++++++++++++++++++++++++++ framework/build.gradle | 4 +- 3 files changed, 153 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-android/blob/c8bbdb23/bin/templates/project/build.gradle ---------------------------------------------------------------------- diff --git a/bin/templates/project/build.gradle b/bin/templates/project/build.gradle index f56784e..e3468d8 100644 --- a/bin/templates/project/build.gradle +++ b/bin/templates/project/build.gradle @@ -19,6 +19,8 @@ import java.util.regex.Pattern +ext.cordova = {} +apply from: 'cordova.gradle', to: ext.cordova apply plugin: 'android' buildscript { @@ -57,8 +59,8 @@ android { versionCode Integer.parseInt("" + getVersionCodeFromManifest() + "0") } - compileSdkVersion 19 - buildToolsVersion "19.0.0" + compileSdkVersion cordova.cordovaSdkVersion + buildToolsVersion cordova.cordovaBuildToolsVersion if (multiarch || System.env.BUILD_MULTIPLE_APKS) { productFlavors { http://git-wip-us.apache.org/repos/asf/cordova-android/blob/c8bbdb23/bin/templates/project/cordova.gradle ---------------------------------------------------------------------- diff --git a/bin/templates/project/cordova.gradle b/bin/templates/project/cordova.gradle new file mode 100644 index 0000000..40529d3 --- /dev/null +++ b/bin/templates/project/cordova.gradle @@ -0,0 +1,147 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +int[] getAvailableSdks() { + def availableSdks = new ByteArrayOutputStream() + exec { + commandLine 'android', 'list', 'target', '--compact' + standardOutput = availableSdks + } + availableSdks + .toString() + .tokenize('\n') + .findAll { it ==~ /android-(\d+).*/ } + .collect { (it =~ /android-(\d+).*/)[0][1].toInteger() } + .sort( { a, b -> b <=> a } ) +} + +int highestSdkAvailable(int minSdkVersion) { + def availableSdks + try { + availableSdks = getAvailableSdks() + } catch (e) { + println "An exception occurred while trying to find the Android SDK." + throw e + } + if (availableSdks.length > 0) { + def highestSdk = availableSdks[0] + if (highestSdk < minSdkVersion) { + throw new RuntimeException( + "No usable Android SDK found. Highest installed version is " + + highestSdk + "; minimum version required is " + minSdkVersion + ".") + } + highestSdk + } else { + throw new RuntimeException( + "No installed SDKs found. Please install the Android SDK version " + + minSdkVersion + " or higher.") + } +} + +String[] getAvailableBuildTools() { + def buildToolsDir = new File(getAndroidSdkDir(), "build-tools") + buildToolsDir.list() + .findAll { it ==~ /[0-9.]+/ } + .sort { a, b -> compareVersions(b, a) } +} + +String latestBuildToolsAvailable(String minBuildToolsVersion) { + def availableBuildToolsVersions + try { + availableBuildToolsVersions = getAvailableBuildTools() + } catch (e) { + println "An exception occurred while trying to find the Android build tools." + throw e + } + if (availableBuildToolsVersions.length > 0) { + def highestBuildToolsVersion = availableBuildToolsVersions[0] + if (compareVersions(highestBuildToolsVersion, minBuildToolsVersion) < 0) { + throw new RuntimeException( + "No usable Android build tools found. Highest installed version is " + + highestBuildToolsVersion + "; minimum version required is " + + minBuildToolsVersion + ".") + } + highestBuildToolsVersion + } else { + throw new RuntimeException( + "No installed build tools found. Please install the Android build tools version " + + minBuildToolsVersion + " or higher.") + } +} + +// Return the first non-zero result of subtracting version list elements +// pairwise. If they are all identical, return the difference in length of +// the two lists. +int compareVersionList(Collection aParts, Collection bParts) { + def pairs = ([aParts, bParts]).transpose() + pairs.findResult(aParts.size()-bParts.size()) {it[0] - it[1] != 0 ? it[0] - it[1] : null} +} + +// Compare two version strings, such as "19.0.0" and "18.1.1.0". If all matched +// elements are identical, the longer version is the largest by this method. +// Examples: +// "19.0.0" > "19" +// "19.0.1" > "19.0.0" +// "19.1.0" > "19.0.1" +// "19" > "18.999.999" +int compareVersions(String a, String b) { + def aParts = a.tokenize('.').collect {it.toInteger()} + def bParts = b.tokenize('.').collect {it.toInteger()} + compareVersionList(aParts, bParts) +} + +String getAndroidSdkDir() { + def rootDir = project.rootDir + def localProperties = new File(rootDir, 'local.properties') + def androidSdkDir = "" + if (localProperties.exists()) { + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + def sdkDirProp = properties.getProperty('sdk.dir') + if (sdkDirProp != null) { + androidSdkDir = sdkDirProp + } else { + sdkDirProp = properties.getProperty('android.dir') + if (sdkDirProp != null) { + androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath() + } else { + throw new RuntimeException( + "No sdk.dir property defined in local.properties file.") + } + } + } else { + String envVar = System.getenv("ANDROID_HOME") + if (envVar != null) { + androidSdkDir = envVar + } else { + String property = System.getProperty("android.home") + if (property != null) { + androidSdkDir = property + } + } + } + println androidSdkDir + androidSdkDir +} + +cordovaSdkVersion = highestSdkAvailable(19) +cordovaBuildToolsVersion = latestBuildToolsAvailable("19.0.0") + http://git-wip-us.apache.org/repos/asf/cordova-android/blob/c8bbdb23/framework/build.gradle ---------------------------------------------------------------------- diff --git a/framework/build.gradle b/framework/build.gradle index 47341b3..59e1ae7 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -32,8 +32,8 @@ buildscript { apply plugin: 'android-library' android { - compileSdkVersion 19 - buildToolsVersion "19.0.0" + compileSdkVersion cordova.cordovaSdkVersion + buildToolsVersion cordova.cordovaBuildToolsVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_7