build.gradle revision 6c15046f2b744978bb3b03a0697d7865d132fe6e
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 */
31181c04c839c38d6f2b9ef6214c2ec858307a70eeBen 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
809382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruvertask generateAntlrSource(type: JavaExec) {
81480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    inputs.dir file(antlrSource)
82480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    outputs.dir file(antlrOutput)
83480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
849382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    mkdir(antlrOutput)
859382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    def grammars = fileTree(antlrSource).include('**/*.g')
86480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
87de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.antlr3
889382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    main = 'org.antlr.Tool'
893079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args '-fo', relativePath("${antlrOutput}/org/jf/smali")
909382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args grammars.files
91480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
92480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
939382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruvertask generateTestAntlrSource(type: JavaExec) {
94480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    inputs.dir file(testAntlrSource)
95480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    outputs.dir file(testAntlrOutput)
96480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
979382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    mkdir(testAntlrOutput)
989382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    def grammars = fileTree(testAntlrSource).include('**/*.g')
99480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
100de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.antlr3
1019382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    main = 'org.antlr.Tool'
1023079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args '-fo', relativePath("${testAntlrOutput}/org/jf/smali")
1039382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args grammars.files.join(' ')
104480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
105480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
1069382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruvertask generateJflexSource(type: JavaExec) {
107480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    inputs.dir file(jflexSource)
108480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver    outputs.dir file(jflexOutput)
109480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
1109382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    mkdir(jflexOutput)
1119382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    def grammars = fileTree(jflexSource).include('**/*.flex')
112480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
113de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.jflex
1149382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    main = 'JFlex.Main'
1159382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args '-q'
1163079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args '-d', relativePath("${jflexOutput}/org/jf/smali")
1179382ba8591366ae767d99f4f79aa9f80062a70d1Ben Gruver    args grammars.files.join(' ')
118480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver}
119480c79aeeaf53d196965481e9cabc2d270f0d497Ben Gruver
120480c79aeeaf53d196965481e9cabc2d270f0d497Ben GruvercompileJava.dependsOn generateAntlrSource, generateJflexSource
121480c79aeeaf53d196965481e9cabc2d270f0d497Ben GruvercompileTestJava.dependsOn generateTestAntlrSource
1227d1263a4ff78ce92b2008e4664fb855f7d03da87Ben Gruver
1233a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver// build a jar containing all dependencies
1243a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruverjar {
1253a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
126c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver
1273a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    manifest {
1283a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver        attributes("Main-Class": "org.jf.smali.main")
129c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    }
13050ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver
13150ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver    doLast {
13250ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver        ant.symlink(link: file("${destinationDir}/smali.jar"), resource: archivePath, overwrite: true)
13350ef7eda3f8d72854950ea774c66a28df7af7f9dBen Gruver    }
1345cf9fe7c0af588670265a5804dfae9ab8bb5c391Ben Gruver}
135c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver
1363a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen GruverprocessResources.inputs.property('version', version)
1373a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen GruverprocessResources.expand('version': version)
1383a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver
139c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruvertask proguard(type: JavaExec, dependsOn: jar) {
1403a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    def outFile = jar.destinationDir.getPath() + '/' + jar.baseName + '-' + jar.version + '-small' + '.' + jar.extension
1413a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    inputs.file jar.archivePath
1423a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    outputs.file outFile
1433a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver
144de3a5f95ae35478159786155474a95c744b2cbc4Ben Gruver    classpath = configurations.proguard
145c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    main = 'proguard.ProGuard'
1463a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    args "-injars ${jar.archivePath}(!**/TestStringTemplate*.class)"
1473a96d5d432ed10f94ddf2a9a9d5af9c5593e9b0dBen Gruver    args "-outjars ${outFile}"
1483079b05e9ad6a847e80f3afad8a77a96b0a7f17bBen Gruver    args "-libraryjars ${System.properties['java.home']}/lib/rt.jar"
149c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-dontobfuscate'
150c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-dontoptimize'
151c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-keep public class org.jf.smali.main { public static void main(java.lang.String[]); }'
152c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'
153c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-dontwarn com.google.common.base.**'
154c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver    args '-dontnote com.google.common.base.**'
155c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver}
156c9afead1a95863a28f58df4a46d9395c2a918ad5Ben Gruver
1578b5490919cf83050ce01adeb174037a140120fd8Ben Gruvertasks.getByPath(':release').dependsOn(proguard)
158