/*
 * 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.commons_cli
    compile depends.guava

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

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

// This is the jar that gets uploaded to maven
jar {
    baseName = 'maven'
}

// 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) } }

    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[]); }'
    keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'

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

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