build.gradle 18.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright (C) 2016 CZ.NIC, z.s.p.o. (http://www.nic.cz/)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

18
import com.badlogic.gdx.graphics.Texture
19 20
import com.badlogic.gdx.tools.texturepacker.TexturePacker

21 22
buildscript {
    repositories {
23 24 25
        maven   { url "http://repo1.maven.org/maven2" }
        maven   { url "https://jitpack.io" }
        jcenter { url "http://jcenter.bintray.com/" }
26 27
    }
    dependencies {
28
        classpath 'com.android.tools.build:gradle:2.2.3'
29 30
        classpath 'org.robovm:robovm-gradle-plugin:1.12.0'
        classpath 'com.github.JakeWharton:sdk-manager-plugin:220bf7a88a7072df3ed16dc8466fb144f2817070'
31
        classpath 'com.novoda:gradle-android-command-plugin:1.3.0'
32
        classpath 'com.badlogicgames.gdx:gdx-tools:1.6.1'
33 34 35
    }
}

36
final assetsDirName = "assets"
37 38
final assetsSourceDirName = "src"
final assetsDestinationDirName = "dest"
39

40 41 42
final assetsGameDirectory = "game"
final assetsGameGlobalDirectory = "_global"
final assetsGameCommonDifficultyDirectory = "common"
43
final assetsGameExcludedDirectory = "excluded"
44

45 46 47
final String TABLEXIA_GIT_PATH  = './'
final String MODEL_GIT_PATH     = 'core/external/'

48 49 50
System.setProperty("javax.net.ssl.trustStore", new File("${project(":android").projectDir.absolutePath}/assets/keystore/tablexiaTrustKeystore").getAbsolutePath());
System.setProperty("javax.net.ssl.trustStorePassword", "tablexia");

51
ext {
Matyáš Latner's avatar
Matyáš Latner committed
52
    assetsChecksumPattern = "\"=======ASSETS_CHECKSUM=======\""
53
    assetsChecksum = [:]
54 55

    assetsPackDir = new File("${rootProject.buildDir}/${assetsDirName}/pack/")
56 57
}

58 59 60 61 62
allprojects {
    apply plugin: "eclipse"
    apply plugin: "idea"

    ext {
63
        appName = 'Tablexia'
64 65 66
        masterBranch = 'master'
        applicationBaseId = 'cz.nic.tablexia'
        tablexiaAppName = getTablexiaAppName()
67 68 69
        assetsDebugURLPart = onMaster() ? '' : 'debug/'
        assetsDownloadUrl = project.hasProperty("TABLEXIA_ASSETS_DOWNLOAD_URL") ? ("${TABLEXIA_ASSETS_DOWNLOAD_URL}/${assetsDebugURLPart}") : "<NO_URL_CONFIGURED>/"
        assetsUploadURL = (project.hasProperty("TABLEXIA_ASSETS_UPLOAD_USER") && project.hasProperty("TABLEXIA_ASSETS_UPLOAD_URL")) ? "${TABLEXIA_ASSETS_UPLOAD_USER}@${TABLEXIA_ASSETS_UPLOAD_URL}/${assetsDebugURLPart}" : "<NO_URL_CONFIGURED>/"
70 71
        serverFallbackHost = "<NO_SERVER_HOST>"
        serverHost = onMaster() ? getPropertyValueOrFallbackValue("TABLEXIA_SERVER_HOST_PRODUCTION", serverFallbackHost) : getPropertyValueOrFallbackValue("TABLEXIA_SERVER_HOST_DEBUG", serverFallbackHost)
72 73
        serverSecretFallback = "";
        serverSecret = onMaster() ? getPropertyValueOrFallbackValue("TABLEXIA_SERVER_SECRET_PRODUCTION", serverSecretFallback) : getPropertyValueOrFallbackValue("TABLEXIA_SERVER_SECRET_DEBUG", serverSecretFallback);
74 75 76 77
        tablexiaVersionName = getVersionNameFromGit(TABLEXIA_GIT_PATH)
        tablexiaVersionCode = getVersionCodeFromGit(TABLEXIA_GIT_PATH)
        tablexiaModelVersionName = getVersionNameFromGit(MODEL_GIT_PATH)
        tablexiaModelVersionCode = getVersionCodeFromGit(MODEL_GIT_PATH)
78 79
        applicationIdBranch = getTablexiaAppId()
        applicationIdRelease = applicationBaseId + applicationIdBranch
80 81
        applicationIdDebugSuffix = '.debug'
        applicationIdDebug = applicationIdRelease + applicationIdDebugSuffix
82 83
        applicationIdITestSuffix = '.itest'
        applicationIdITest = applicationIdRelease + applicationIdITestSuffix
84
        applicationIdDevelSuffix = '.devel'
85
        applicationIdDevel = applicationBaseId + applicationIdDevelSuffix
86

87 88
        //Fallback value if sentry DSN is not defined (gradle parameter SENTRY_DSN_DEBUG or SENTRY_DSN_RELEASE)
        sentryDSNFallbackValue = "None"
89
        sentryDSN = onMaster() ? getPropertyValueOrFallbackValue("TABLEXIA_SENTRY_DSN_RELEASE", sentryDSNFallbackValue) : getPropertyValueOrFallbackValue("TABLEXIA_SENTRY_DSN_DEBUG", sentryDSNFallbackValue)
90

91
        gdxVersion = '1.9.6'
92
		gdxUtilsVersion = '0.13.2'
93
	    mbassadorVersion = '1.2.0'
94
        roboVMVersion = '1.12.0'
95 96
        sqlDroidVersion = '1.0.3'
        sqlLiteJdbcVersion = '3.8.10.1'
97
        guavaVersion = '18.0'
98
        roboPodsVersion = '1.13.0'
99 100
        androidSupportV4Version = '22.0.0'
        googlePlayServicesVersion = '8.3.+'
101
        zxingVersion = '3.2.1'
102 103 104

        servletApiVersion = '5.5.23'
        ravenVersion = '7.5.0'
105 106
    }

107
    version = getVersionNameFromGit(TABLEXIA_GIT_PATH)
108

109
    repositories {
110 111 112 113
        maven   { url "http://repo1.maven.org/maven2" }
        jcenter { url "http://jcenter.bintray.com/" }
        maven   { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven   { url "https://oss.sonatype.org/content/repositories/releases/" }
114 115 116
    }
}

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
task clean << {
    delete "${buildDir}"
}

task prepareAssets {
    def sourceDir = new File(project(":core").projectDir.absolutePath + "/${assetsDirName}")

    inputs.dir(sourceDir.absolutePath)
    outputs.dir("${buildDir}/${assetsDirName}/${assetsSourceDirName}/")

    doLast {
        sourceDir.eachDir() { dir ->

            if (!dir.name.equals('common')) {
                String dirName = dir.getName()
                String destDir = "${buildDir}/${assetsDirName}/${assetsSourceDirName}/${dirName}"
                task("${name}_${dirName}", type: Copy) {
                    from sourceDir.absolutePath + "/common"
                    from dir.absolutePath
                    into destDir
                }.execute()
            }
        }
    }
}
142

143 144 145 146 147 148 149 150 151 152
task prepareSoundAssets(dependsOn: prepareAssets) {
    def assetsDir = new File("${buildDir}/${assetsDirName}/")

    inputs.dir("${assetsDir.absolutePath}/${assetsSourceDirName}/")
    outputs.dir("${assetsDir.absolutePath}/${assetsDestinationDirName}/")

    doLast {
        new File("${assetsDir}/${assetsSourceDirName}/").eachDir() { langDir ->
            langDir.eachDir() { sectionDir ->
                sectionDir.eachDir() { atlasDir ->
153
                    task("${name}_" + sectionDir.name + "_" + atlasDir.name + "_" + langDir.name, type: Copy) {
154 155 156 157 158
                        from atlasDir
                        into "${buildDir}/${assetsDirName}/${assetsDestinationDirName}/${langDir.name}/${sectionDir.name}/${atlasDir.name}/"
                        include '**/*.mp3'
                        includeEmptyDirs false
                        eachFile { FileCopyDetails fcd ->
159
                            fcd.setPath(fcd.getRelativePath().toString().replace('/', '.'))
160
                        }
161
                        outputs.upToDateWhen { false }
162 163 164 165 166 167 168
                    }.execute()
                }
            }
        }
    }
}

169 170 171 172 173 174 175 176 177 178
task prepareJsonAssets(dependsOn: prepareAssets) {
    def assetsDir = new File("${buildDir}/${assetsDirName}/")

    inputs.dir("${assetsDir.absolutePath}/${assetsSourceDirName}/")
    outputs.dir("${assetsDir.absolutePath}/${assetsDestinationDirName}/")

    doLast {
        new File("${assetsDir}/${assetsSourceDirName}/").eachDir() { langDir ->
            langDir.eachDir() { sectionDir ->
                sectionDir.eachDir() { atlasDir ->
179
                    task("${name}_" + sectionDir.name + "_" + atlasDir.name + "_" + langDir.name, type: Copy) {
180 181 182 183 184
                        from atlasDir
                        into "${buildDir}/${assetsDirName}/${assetsDestinationDirName}/${langDir.name}/${sectionDir.name}/${atlasDir.name}/"
                        include '**/*.json'
                        includeEmptyDirs false
                        eachFile { FileCopyDetails fcd ->
185
                            fcd.setPath(fcd.getRelativePath().toString().replace('/', '.'))
186
                        }
187
                        outputs.upToDateWhen { false }
188 189 190 191 192 193 194
                    }.execute()
                }
            }
        }
    }
}

195 196 197 198 199 200 201 202 203
task prepareGraphicAssets(dependsOn: prepareAssets) {
    def assetsDir = new File("${buildDir}/${assetsDirName}/")

    inputs.dir("${assetsDir.absolutePath}/${assetsSourceDirName}/")
    outputs.dir("${assetsDir.absolutePath}/${assetsDestinationDirName}/")

    doLast {
        TexturePacker.Settings settings = new TexturePacker.Settings();
        settings.pot = false;
204 205
        settings.maxWidth = 1024;
        settings.maxHeight = 1024;
206 207 208 209 210 211 212
        settings.combineSubdirectories = true;
        settings.filterMin = Texture.TextureFilter.Linear;
        settings.filterMag = Texture.TextureFilter.Linear;

        new File("${assetsDir.absolutePath}/${assetsSourceDirName}/").eachDir() { langDir ->
            langDir.eachDir() { sectionDir ->
                sectionDir.eachDir() { atlasDir ->
213 214
                    if (assetsGameDirectory.equals(sectionDir.name) && !assetsGameGlobalDirectory.equals(atlasDir.name)) {
                        atlasDir.eachDir() { difficultyDir ->
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
                            if (!assetsGameExcludedDirectory.equals(difficultyDir.name)) {
                                String packFileName = assetsGameCommonDifficultyDirectory.equals(difficultyDir.name) ? atlasDir.name : difficultyDir.name;
                                TexturePacker.process(settings,
                                        "${difficultyDir}",
                                        "${assetsDir.absolutePath}/${assetsDestinationDirName}/${langDir.name}/${sectionDir.name}/${atlasDir.name}/",
                                        "${packFileName}")
                            } else {
                                task("${name}_" + sectionDir.name + "_" + langDir.name + "_" + atlasDir.name + "_" + difficultyDir.name, type: Copy) {
                                    from difficultyDir
                                    into "${buildDir}/${assetsDirName}/${assetsDestinationDirName}/${langDir.name}/${sectionDir.name}/${atlasDir.name}/${difficultyDir.name}"
                                    include '**/*'
                                    includeEmptyDirs false
                                    outputs.upToDateWhen { false }
                                }.execute()
                            }
230 231 232 233 234 235 236
                        }
                    } else {
                        TexturePacker.process(settings,
                                "${atlasDir}",
                                "${assetsDir.absolutePath}/${assetsDestinationDirName}/${langDir.name}/${sectionDir.name}/${atlasDir.name}/",
                                "${atlasDir.name}")
                    }
237 238 239 240 241 242
                }
            }
        }
    }
}

243
task zipAssets(dependsOn: [prepareSoundAssets, prepareGraphicAssets, prepareJsonAssets]) {
244 245 246 247 248
    doLast {
        new File(project(":core").projectDir.absolutePath + "/${assetsDirName}").eachDir() { dir ->

            if (!dir.name.equals('common')) {
                task("${name}_${dir.name}", type: Zip) {
249
                    archiveName = dir.getName() + "_SNAPSHOT.zip"
250
                    destinationDir = rootProject.ext.assetsPackDir
251 252
                    from "${buildDir}/${assetsDirName}/${assetsDestinationDirName}/${dir.name}"
                }.execute()
253 254 255 256 257
            }
        }
    }
}

258
task processAssets(dependsOn: [':util:checksum:runChecksum', ':util:checksum:runAssetsArchivesChecksum']) {
259
    doLast {
260 261
        if (project.hasProperty('TABLEXIA_ASSETS_UPLOAD_USER') && project.hasProperty('TABLEXIA_ASSETS_UPLOAD_URL') && project.hasProperty('TABLEXIA_ASSETS_UPLOAD') && Boolean.valueOf(TABLEXIA_ASSETS_UPLOAD).booleanValue()) {
            def data = new URL(project.assetsDownloadUrl).getText()
262 263 264 265 266
            rootProject.ext.assetsPackDir.eachFile() { file ->
                String fileName = file.getName()
                String[] fileNameParts = fileName.split("_SNAPSHOT\\.");
                String packageName = "${fileNameParts[0]}_${assetsChecksum[fileNameParts[0]]}.${fileNameParts[1]}";

267 268 269
                if (!data.contains(packageName)) {
                    String assetsUploadPath = "${project.assetsUploadURL}${packageName}"
                    println "AssetsUploader: UPLOADING FILE: ${project.assetsDebugURLPart}${packageName}"
270 271
                    task ("${name}_${packageName}", type:Exec) {
                        workingDir "${rootProject.projectDir}"
272
                        commandLine 'scp', file.getAbsolutePath(), assetsUploadPath
273 274 275 276 277 278
                        standardOutput = new ByteArrayOutputStream()
                        ext.output = {
                            return standardOutput.toString()
                        }
                    }.execute()
                } else {
279
                    println "AssetsUploader: FILE: ${project.assetsDebugURLPart}${packageName} EXISTS ON SERVER -> SKIPPING UPLOAD"
280
                }
281
            }
282 283
        } else {
            println "ASSETS UPLOAD NOT CONFIGURED -> SKIPPING UPLOAD"
284 285 286 287
        }
    }
}

288 289 290 291 292 293 294 295 296 297
task unlockIOSKeyChain() << {
    if (project.hasProperty('TABLEXIA_KEYCHAIN_USER') && project.hasProperty('TABLEXIA_KEYCHAIN_PATH')) {
        exec {
            commandLine  'security', 'unlock-keychain', '-p', TABLEXIA_KEYCHAIN_USER, TABLEXIA_KEYCHAIN_PATH
        }
    } else {
        println "CANNOT UNLOCK KEYCHAIN -> TABLEXIA_KEYCHAIN_USER OR TABLEXIA_KEYCHAIN_PATH BUILD VARIABLE IS NOT SET!"
    }
}

298 299 300 301
def getPropertyValueOrFallbackValue(String key, String fallbackValue) {
    return project.hasProperty(key) ? project.getProperties().get(key) : fallbackValue
}

302
def getTablexiaAppName() {
303
    if (onMaster()) {
304 305
        return "${project.appName}"
    } else {
306
        return "${project.appName} (${getBranchNameFromGit()})"
307 308 309 310
    }
}

def getTablexiaAppId() {
311
    if (onMaster()) {
312 313
        return ""
    } else {
314
        return ".${getBranchNameFromGit().trim().replaceAll('-', '').replaceAll('\\.', '').toLowerCase()}"
315 316 317
    }
}

318
def getVersionNameFromGit(String relativePath) {
319
    def stdout = new ByteArrayOutputStream()
320 321

    // get last tag in current branch
322
    exec {
323
        workingDir relativePath
Matyáš Latner's avatar
Matyáš Latner committed
324
        commandLine 'git', 'describe', '--abbrev=0', '--tags', '--always'
325 326
        standardOutput = stdout
    }
327 328 329
    String result = stdout.toString().trim();

    // for non release branches add number of commits and branch name
330
    if (!onMaster()) {
331 332
        stdout = new ByteArrayOutputStream()
        exec {
333
            workingDir relativePath
334
            commandLine 'git', 'rev-list', "${result}..HEAD", '--count'
335 336 337 338
            standardOutput = stdout
        }
        String numberOfCommits = stdout.toString().trim()

339
        if (!"0".equals(numberOfCommits)) {
340
            // add branch name and number of commits
341
            result = "${result}-${numberOfCommits}"
342 343 344
        }
    }
    return result
345 346
}

347
def getVersionCodeFromGit(String relativePath) {
348 349
    def stdout = new ByteArrayOutputStream()
    exec {
350
        workingDir relativePath
351 352 353 354 355 356
        commandLine 'git', 'log', '-1', '--format=%at'
        standardOutput = stdout
    }
    return stdout.toString().trim().toInteger()
}

357
def getBranchNameFromGit() {
358 359
    def stdout = new ByteArrayOutputStream()
    exec {
Matyáš Latner's avatar
Matyáš Latner committed
360
        commandLine  'git', 'describe', '--contains', '--all', 'HEAD', '--always'
361 362
        standardOutput = stdout
    }
363 364
    String branchString = stdout.toString().trim()
    return branchString.contains("/") ? branchString.substring(branchString.lastIndexOf("/") + 1) : branchString
365 366
}

367 368 369 370
boolean onMaster() {
    return project.masterBranch.equals(getBranchNameFromGit());
}

371 372 373 374 375 376 377 378 379
def getMapConvertedToString(Map map) {
    String result = "";
    map.each { key, value ->
        if (result.size() > 0) result = result + ","
        result = result + "$key:$value"
    }
    return result;
}

380 381 382 383 384 385 386 387 388
project(":desktop") {
    apply plugin: "java"


    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
        compile "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
389 390
	    compile "net.engio:mbassador:$mbassadorVersion"
        compile "com.jcabi:jcabi-manifests:1.1"
391
        compile "org.xerial:sqlite-jdbc:$sqlLiteJdbcVersion"
392 393 394 395
    }
}

project(":android") {
396
    apply plugin: 'android-sdk-manager'
397
    apply plugin: 'com.android.application'
398
    apply plugin: 'android-command'
399 400 401 402 403

    configurations { natives }

    dependencies {
        compile project(":core")
404

405
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
406
	    compile "net.engio:mbassador:$mbassadorVersion"
407
        compile "org.sqldroid:sqldroid:$sqlDroidVersion"
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
    }
}

project(":ios") {
    apply plugin: "java"
    apply plugin: "robovm"

    configurations { natives }

    dependencies {
        compile project(":core")
        compile "org.robovm:robovm-rt:${roboVMVersion}"
        compile "org.robovm:robovm-cocoatouch:${roboVMVersion}"
424
	    compile "net.engio:mbassador:$mbassadorVersion"
425
        compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
Matyáš Latner's avatar
Matyáš Latner committed
426
        compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
427 428 429 430 431 432
    }
}

project(":core") {
    apply plugin: "java"

433
    sourceSets.test.java.srcDirs = ["test/"]
434
	tasks.processResources.dependsOn processAssets
435 436

    dependencies {
437
        compile project(":util:checksum")
438
        compile "com.badlogicgames.gdx:gdx:$gdxVersion"
439
		compile "net.dermetfan.libgdx-utils:libgdx-utils:$gdxUtilsVersion"
440
	    compile "net.engio:mbassador:$mbassadorVersion"
441
        compile "com.google.guava:guava:$guavaVersion"
Vitaliy Vashchenko's avatar
Vitaliy Vashchenko committed
442
        compile "com.google.zxing:core:$zxingVersion"
443

444

445 446
        compile "tomcat:servlet-api:$servletApiVersion"
        compile "com.getsentry.raven:raven:$ravenVersion"
447

448
        testCompile "junit:junit:4.11"
449 450 451
		testCompile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"               
        testCompile "com.badlogicgames.gdx:gdx:$gdxVersion"                                
        testCompile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
452 453 454
    }
}

Matyáš Latner's avatar
Matyáš Latner committed
455 456 457 458 459 460 461 462
project(":itest") {
    apply plugin: "java"

    dependencies {
        compile project(':core')
    }
}

463 464
tasks.eclipse.doLast {
    delete ".project"
465
}