1181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver/*
2181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * Copyright 2012, Google Inc.
3181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * All rights reserved.
4181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver *
5181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * Redistribution and use in source and binary forms, with or without
6181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * modification, are permitted provided that the following conditions are
7181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * met:
8181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver *
9181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver *     * Redistributions of source code must retain the above copyright
10181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * notice, this list of conditions and the following disclaimer.
11181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver *     * Redistributions in binary form must reproduce the above
12181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * copyright notice, this list of conditions and the following disclaimer
13181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * in the documentation and/or other materials provided with the
14181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * distribution.
15181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver *     * Neither the name of Google Inc. nor the names of its
16181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * contributors may be used to endorse or promote products derived from
17181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * this software without specific prior written permission.
18181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver *
19181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30181c04c839c38d6f2b9ef6214c2ec858307a70eeBen Gruver */
315b411f3447b1ad81152d477102303a6346e1c6edBen Gruver
32480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruverconfigurations {
33480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    antlr3
34480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    jflex
35c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    proguard
36480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
37480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
38480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruverext.antlrSource = 'src/main/antlr3'
393079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruverext.antlrOutput = file("${buildDir}/generated-sources/antlr3")
40480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
41480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruverext.jflexSource = "src/main/jflex"
423079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruverext.jflexOutput = file("${buildDir}/generated-sources/jflex")
43480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
44480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruverext.testAntlrSource = 'src/test/antlr3'
453079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruverext.testAntlrOutput = file("${buildDir}/generated-test-sources/antlr3")
46480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
47480c79aeeaf53d196965481e9cabc2d270f0d497Ben GruversourceSets.main.java.srcDir antlrOutput
48480c79aeeaf53d196965481e9cabc2d270f0d497Ben GruversourceSets.main.java.srcDir jflexOutput
49480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
50480c79aeeaf53d196965481e9cabc2d270f0d497Ben GruversourceSets.test.java.srcDir testAntlrOutput
51480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
523079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruveridea {
533079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    module {
543079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver        excludeDirs -= buildDir
556dd026a0bda42ffcdd99fb4531074c3e24f2c2d9Ben Gruver        if (buildDir.exists()) {
566dd026a0bda42ffcdd99fb4531074c3e24f2c2d9Ben Gruver            excludeDirs.addAll(buildDir.listFiles())
576dd026a0bda42ffcdd99fb4531074c3e24f2c2d9Ben Gruver        }
583079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver        for (sourceDir in (sourceDirs + testSourceDirs)) {
593079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver            excludeDirs.remove(sourceDir);
603079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver            while ((sourceDir = sourceDir.getParentFile()) != null) {
613079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver                excludeDirs.remove(sourceDir);
623079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver            }
633079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver        }
643079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    }
653079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver}
663079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver
67480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruverdependencies {
68480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    compile project(':util')
696c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver    compile project(':dexlib2')
7046cefa3d5be5a99484075cf60d1c55ca36ccffd3Ben Gruver    compile depends.antlr_runtime
7146cefa3d5be5a99484075cf60d1c55ca36ccffd3Ben Gruver    compile depends.commons_cli
72480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
7346cefa3d5be5a99484075cf60d1c55ca36ccffd3Ben Gruver    testCompile depends.junit
747d1263a4ff78ce92b2008e4664fb855f7d03da87Ben Gruver
7546cefa3d5be5a99484075cf60d1c55ca36ccffd3Ben Gruver    antlr3 depends.antlr
7646cefa3d5be5a99484075cf60d1c55ca36ccffd3Ben Gruver    jflex depends.jflex
7746cefa3d5be5a99484075cf60d1c55ca36ccffd3Ben Gruver    proguard depends.proguard
78480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
79480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
8087c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruvertask generateParserAntlrSource(type: JavaExec) {
81480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    inputs.dir file(antlrSource)
82480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    outputs.dir file(antlrOutput)
83480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
849382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    mkdir(antlrOutput)
8587c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    def grammars = fileTree(antlrSource).include('**/smaliParser.g')
8687c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver
8787c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    classpath = configurations.antlr3
8887c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    main = 'org.antlr.Tool'
8987c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    args '-fo', relativePath("${antlrOutput}/org/jf/smali")
9087c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    args grammars.files
9187c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver}
9287c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver
9387c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruvertask generateTreeWalkerAntlrSource(type: JavaExec) {
9487c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    inputs.dir file(antlrSource)
9587c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    outputs.dir file(antlrOutput)
9687c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver
9787c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    mkdir(antlrOutput)
9887c1c0e054885d80f3a40fcdbb6024876a39e88fBen Gruver    def grammars = fileTree(antlrSource).include('**/smaliTreeWalker.g')
99480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
100de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.antlr3
1019382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    main = 'org.antlr.Tool'
1023079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args '-fo', relativePath("${antlrOutput}/org/jf/smali")
1039382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args grammars.files
104480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
105480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
1069382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruvertask generateTestAntlrSource(type: JavaExec) {
107480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    inputs.dir file(testAntlrSource)
108480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    outputs.dir file(testAntlrOutput)
109480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
1109382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    mkdir(testAntlrOutput)
1119382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    def grammars = fileTree(testAntlrSource).include('**/*.g')
112480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
113de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.antlr3
1149382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    main = 'org.antlr.Tool'
1153079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args '-fo', relativePath("${testAntlrOutput}/org/jf/smali")
1169382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args grammars.files.join(' ')
117480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
118480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
1199382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruvertask generateJflexSource(type: JavaExec) {
120480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    inputs.dir file(jflexSource)
121480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    outputs.dir file(jflexOutput)
122480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
1239382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    mkdir(jflexOutput)
1249382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    def grammars = fileTree(jflexSource).include('**/*.flex')
125480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
126de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.jflex
1279382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    main = 'JFlex.Main'
1289382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args '-q'
1293079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args '-d', relativePath("${jflexOutput}/org/jf/smali")
1309382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args grammars.files.join(' ')
131532c04b27d086f342b1e579f55f2ad5d74e289c5Ben Gruver    environment LC_ALL: "en_US"
132480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
133480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
13487c1c0e054885d80f3a40fcdbb6024876a39e88fBen GruvercompileJava.dependsOn generateParserAntlrSource, generateTreeWalkerAntlrSource, generateJflexSource
135480c79aeeaf53d196965481e9cabc2d270f0d497Ben GruvercompileTestJava.dependsOn generateTestAntlrSource
1367d1263a4ff78ce92b2008e4664fb855f7d03da87Ben Gruver
1375b411f3447b1ad81152d477102303a6346e1c6edBen GruverprocessResources.inputs.property('version', version)
1385b411f3447b1ad81152d477102303a6346e1c6edBen GruverprocessResources.expand('version': version)
1395b411f3447b1ad81152d477102303a6346e1c6edBen Gruver
1405b411f3447b1ad81152d477102303a6346e1c6edBen Gruver// This is the jar that gets uploaded to maven
1413a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruverjar {
1425b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    baseName = 'maven'
1435b411f3447b1ad81152d477102303a6346e1c6edBen Gruver}
1445b411f3447b1ad81152d477102303a6346e1c6edBen Gruver
1455b411f3447b1ad81152d477102303a6346e1c6edBen Gruver// Build a separate jar that contains all dependencies
1465b411f3447b1ad81152d477102303a6346e1c6edBen Gruvertask fatJar(type: Jar, dependsOn: jar) {
1475b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    from sourceSets.main.output
1483a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
149c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver
1503a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    manifest {
1513a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver        attributes("Main-Class": "org.jf.smali.main")
152c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    }
15350ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver
15450ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver    doLast {
155318954d56b135ade53ea9f76814fbf4b630b5827Ben Gruver        if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
156318954d56b135ade53ea9f76814fbf4b630b5827Ben Gruver            ant.symlink(link: file("${destinationDir}/smali.jar"), resource: archivePath, overwrite: true)
157318954d56b135ade53ea9f76814fbf4b630b5827Ben Gruver        }
15850ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver    }
1595cf9fe7c0af588670265a5804dfae9ab8bb5c391Ben Gruver}
1605b411f3447b1ad81152d477102303a6346e1c6edBen Gruvertasks.getByPath('build').dependsOn(fatJar)
1615b411f3447b1ad81152d477102303a6346e1c6edBen Gruver
1625b411f3447b1ad81152d477102303a6346e1c6edBen GruveruploadArchives {
1635b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    repositories.mavenDeployer {
1645b411f3447b1ad81152d477102303a6346e1c6edBen Gruver        pom.project {
1655b411f3447b1ad81152d477102303a6346e1c6edBen Gruver            description 'smali is an assembler for dalvik bytecode'
1665b411f3447b1ad81152d477102303a6346e1c6edBen Gruver            scm {
1675b411f3447b1ad81152d477102303a6346e1c6edBen Gruver                url 'https://github.com/JesusFreke/smali/tree/master/smali'
1685b411f3447b1ad81152d477102303a6346e1c6edBen Gruver            }
1695b411f3447b1ad81152d477102303a6346e1c6edBen Gruver        }
1705b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    }
1715b411f3447b1ad81152d477102303a6346e1c6edBen Gruver}
172c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver
1735b411f3447b1ad81152d477102303a6346e1c6edBen Gruvertask sourcesJar(type: Jar) {
1745b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    classifier = 'sources'
1755b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    from sourceSets.main.allJava
1765b411f3447b1ad81152d477102303a6346e1c6edBen Gruver}
1775b411f3447b1ad81152d477102303a6346e1c6edBen Gruver
1785b411f3447b1ad81152d477102303a6346e1c6edBen Gruverartifacts {
1795b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    archives sourcesJar
1805b411f3447b1ad81152d477102303a6346e1c6edBen Gruver}
1813a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver
1825b411f3447b1ad81152d477102303a6346e1c6edBen Gruvertask proguard(type: JavaExec, dependsOn: fatJar) {
1835b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    def outFile = fatJar.destinationDir.getPath() + '/' + fatJar.baseName + '-' + fatJar.version + '-small' + '.' + fatJar.extension
1845b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    inputs.file fatJar.archivePath
1853a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    outputs.file outFile
1863a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver
187de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.proguard
188c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    main = 'proguard.ProGuard'
1895b411f3447b1ad81152d477102303a6346e1c6edBen Gruver    args "-injars ${fatJar.archivePath}(!**/TestStringTemplate*.class)"
1903a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    args "-outjars ${outFile}"
1913079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args "-libraryjars ${System.properties['java.home']}/lib/rt.jar"
192c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-dontobfuscate'
193c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-dontoptimize'
194c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-keep public class org.jf.smali.main { public static void main(java.lang.String[]); }'
195c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'
1962a91095e8c6d4493906e895b67f6c47f879d24e9Ben Gruver    args '-dontwarn com.google.common.**'
1972a91095e8c6d4493906e895b67f6c47f879d24e9Ben Gruver    args '-dontnote com.google.common.**'
198c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver}
199c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver
2008b5490919cf83050ce01adeb174037a140120fd8Ben Gruvertasks.getByPath(':release').dependsOn(proguard)
201