From df4e74e41c00b2f054821bcadd1f6ce1c45f362a Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 14 Feb 2016 12:16:24 -0800 Subject: [PATCH] Make smalidea a separate gradle/idea project --- .gitignore | 1 + build.gradle | 3 +- settings.gradle | 2 +- smalidea/build.gradle | 181 +++++++++++++++--- .../main/{antlr3 => antlr}/smalideaParser.g | 0 .../main}/resources/META-INF/plugin.xml | 0 6 files changed, 155 insertions(+), 32 deletions(-) rename smalidea/src/main/{antlr3 => antlr}/smalideaParser.g (100%) rename smalidea/{ => src/main}/resources/META-INF/plugin.xml (100%) diff --git a/.gitignore b/.gitignore index 45e097ee..f5cd3998 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ *.ipr *.iws .idea +/smalidea/.gradle diff --git a/build.gradle b/build.gradle index eb236bb1..fc03985b 100644 --- a/build.gradle +++ b/build.gradle @@ -110,8 +110,7 @@ subprojects { jflex: 'de.jflex:jflex:1.4.3', jflex_plugin: 'co.tomlee.gradle.plugins:gradle-jflex-plugin:0.0.2', proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1', - dx: 'com.google.android.tools:dx:1.7', - gson: 'com.google.code.gson:gson:2.3.1' + dx: 'com.google.android.tools:dx:1.7' ] } diff --git a/settings.gradle b/settings.gradle index bf274344..6c4f08cf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'util', 'dexlib2', 'baksmali', 'smali', 'dexlib2:accessorTestGenerator', 'smalidea' \ No newline at end of file +include 'util', 'dexlib2', 'baksmali', 'smali', 'dexlib2:accessorTestGenerator' \ No newline at end of file diff --git a/smalidea/build.gradle b/smalidea/build.gradle index 5195c638..cb7c7084 100644 --- a/smalidea/build.gradle +++ b/smalidea/build.gradle @@ -29,26 +29,139 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -configurations { - antlr3 +buildscript { + repositories { + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath 'gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.0.40' + classpath 'org.eclipse.jgit:org.eclipse.jgit:2.0.0.201206130900-r' + } } -ext.antlrSource = 'src/main/antlr3' -ext.antlrOutput = file("${buildDir}/generated-sources/antlr3") +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'antlr' -sourceSets.main.java.srcDir antlrOutput +version = '0.03' + +if (!('release' in gradle.startParameter.taskNames)) { + def versionSuffix + try { + def git = org.eclipse.jgit.api.Git.open(file('..')) + def head = git.getRepository().getRef('HEAD') + versionSuffix = head.getObjectId().abbreviate(8).name() + + if (!git.status().call().clean) { + versionSuffix += '-dirty' + } + } catch (Exception ex) { + // In case we can't get the commit for some reason, + // just use -dev + versionSuffix = 'dev' + } + + def baseVersion = version + version = baseVersion + '-' + versionSuffix +} else { + if (System.env.JDK7_HOME == null && !JavaVersion.current().isJava7()) { + throw new InvalidUserDataException("bzzzzzzzt. Release builds must be performed with java 7. " + + "Either run gradle with java 7, or define the JDK7_HOME environment variable.") + } +} + +if (System.env.JDK7_HOME != null) { + sourceCompatibility = 1.7 + targetCompatibility = 1.7 + + tasks.withType(JavaCompile) { + doFirst { + options.fork = true + options.bootClasspath = "$System.env.JDK7_HOME/jre/lib/rt.jar" + options.bootClasspath += "$File.pathSeparator$System.env.JDK7_HOME/jre/lib/jsse.jar" + } + } +} + +// We don't want to use the org.jetbrains.intellij plugin when generating the idea project files, +// so that idea classes aren't included as project dependencies, since they will already exist +// in the plugin sdk defined for the project +if (!('idea' in gradle.startParameter.taskNames)) { + apply plugin: 'org.jetbrains.intellij' + + intellij { + version 'IC-14.1.4' + pluginName 'smalidea' + + sandboxDirectory "${buildDir}/sandbox" + } +} else { + // If we're running the idea task, let's make sure nothing else is being run, since + // we have to use a special configuration for the idea task + if (gradle.startParameter.taskNames.size() > 1) { + throw new InvalidUserDataException("The idea task must be run by itself.") + } +} + +repositories { + mavenLocal() + mavenCentral() +} dependencies { - compile project(':smali') - compile depends.antlr_runtime - compile depends.gson + compile 'org.smali:smali:2.1.2' + compile files("${System.properties['java.home']}/../lib/tools.jar") + compile 'org.antlr:antlr-runtime:3.5.2' + compile 'com.google.code.gson:gson:2.3.1' - antlr3 depends.antlr + antlr 'org.antlr:antlr:3.5.2' } idea { - module { + project { jdkName = 'IDEA Plugin jdk' + languageLevel 1.7 + + vcs = 'Git' + + ipr { + withXml { + def node = it.asNode() + + node.find { it.@name == 'ProjectRootManager' } + .@'project-jdk-type' = 'IDEA JDK' + + node.find { it.@name == 'VcsDirectoryMappings' } + .mapping.@directory = '$PROJECT_DIR$/..' + + def componentNode = node.find { it.@name == 'ProjectRunConfigurationManager' } + + if (componentNode == null) { + componentNode = it.node.appendNode 'component', [name: 'ProjectRunConfigurationManager'] + } + + if (componentNode.find { it.@name == 'All tests' } == null) { + componentNode.append(new XmlParser().parseText(""" + + + + + + """)) + } + } + } + } + + module { excludeDirs -= buildDir if (buildDir.exists()) { excludeDirs.addAll(buildDir.listFiles()) @@ -63,33 +176,43 @@ idea { iml { withXml { - it.node.@type = "PLUGIN_MODULE" + def node = it.node + + node.@type = 'PLUGIN_MODULE' + + def pluginUrl = 'file://$MODULE_DIR$/src/main/resources/META-INF/plugin.xml' + + def pluginNode = node.find { it.@name == 'DevKit.ModuleBuildProperties' } + if (pluginNode == null) { + node.appendNode 'component', [name: 'DevKit.ModuleBuildProperties', + url: pluginUrl] + } else { + pluginNode.@url = pluginUrl + } } } } } -// We can't actually compile the plugin with gradle, so we just disable everything -// except the tasks related to generating the IDEA module and ANTLR parser -tasks.all { - if (!(name in ['idea', 'ideaModule', 'generateParserAntlrSource', 'clean'])) { - enabled = false +task extractTokens(type: org.gradle.api.tasks.Copy) { + def allArtifacts = configurations.default.resolvedConfiguration.resolvedArtifacts + def smaliArtifact = allArtifacts.find { it.moduleVersion.id.name.equals('smali') } + + from(zipTree(smaliArtifact.file)) { + include '**/*.tokens' } + into "${buildDir}/tokens" } -task generateParserAntlrSource(type: JavaExec, dependsOn: ":smali:generateGrammarSource") { - def smaliOutputDir = file(relativePath(project.parent.childProjects.get('smali') - .generateGrammarSource.outputDirectory)) +generateGrammarSource { + def tokensDir = file("${buildDir}/tokens/org/jf/smali") + inputs.file new File(tokensDir, 'smaliParser.tokens') + setArguments(['-lib', tokensDir.path]) + outputDirectory(file("${buildDir}/generated-src/antlr/main/org/jf/smalidea")) +} +generateGrammarSource.dependsOn(extractTokens) - inputs.file new File(smaliOutputDir, "smaliParser.tokens") - inputs.dir file(antlrSource) - outputs.dir file(antlrOutput) +ideaModule.dependsOn(generateGrammarSource) - file(antlrOutput).mkdirs() - - classpath = configurations.antlr3 - main = 'org.antlr.Tool' - args '-fo', relativePath("${antlrOutput}/org/jf/smalidea") - args '-lib', smaliOutputDir - args new File(antlrSource, "smalideaParser.g") +task release(dependsOn: ':buildPlugin') { } \ No newline at end of file diff --git a/smalidea/src/main/antlr3/smalideaParser.g b/smalidea/src/main/antlr/smalideaParser.g similarity index 100% rename from smalidea/src/main/antlr3/smalideaParser.g rename to smalidea/src/main/antlr/smalideaParser.g diff --git a/smalidea/resources/META-INF/plugin.xml b/smalidea/src/main/resources/META-INF/plugin.xml similarity index 100% rename from smalidea/resources/META-INF/plugin.xml rename to smalidea/src/main/resources/META-INF/plugin.xml