/*
 * Copyright 2012, Google Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath depends.proguard_gradle
    }
}

dependencies {
    compile project(':util')
    compile project(':dexlib2')
    compile depends.guava
    compile depends.jcommander

    testCompile depends.junit
    testCompile project(':smali')
}

processResources.inputs.property('version', version)
processResources.expand('version': version)

// Build a separate jar that contains all dependencies
task fatJar(type: Jar) {
    from sourceSets.main.output
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

    classifier = 'fat'

    manifest {
        attributes('Main-Class': 'org.jf.baksmali.Main')
    }

    doLast {
        if (!System.getProperty('os.name').toLowerCase().contains('windows')) {
            ant.symlink(link: file("${destinationDir}/baksmali.jar"), resource: archivePath, overwrite: true)
        }
    }
}
tasks.getByPath('build').dependsOn(fatJar)

uploadArchives {
    repositories.mavenDeployer {
        pom.project {
            description 'baksmali is a disassembler for dalvik bytecode'
            scm {
                url 'https://github.com/JesusFreke/smali/tree/master/baksmali'
            }
        }
    }
}

task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) {
    def outFile = fatJar.destinationDir.getPath() + '/' + fatJar.baseName + '-' + fatJar.version + '-small' + '.' + fatJar.extension

    injars fatJar.archivePath
    outjars outFile

    libraryjars "${System.properties['java.home']}/lib/rt.jar"

    dontobfuscate
    dontoptimize

    keep 'public class org.jf.baksmali.Main { public static void main(java.lang.String[]); }'
    keep 'public class org.jf.util.jcommander.ColonParameterSplitter'
    keep 'class com.beust.jcommander.** { *; }'
    keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'

    dontwarn 'com.google.common.**'
    dontnote 'com.google.common.**'
}

tasks.getByPath(':release').dependsOn(proguard)

task fastbuild(dependsOn: build) {
}

task fb(dependsOn: fastbuild) {
}

tasks.getByPath('javadoc').onlyIf({
    !gradle.taskGraph.hasTask(fastbuild)
})

tasks.getByPath('test').onlyIf({
    !gradle.taskGraph.hasTask(fastbuild)
})