/* ### * IP: GHIDRA * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /***************************************************************************************** This file is a "mix-in" gradle script that individual gradle projects should include if they have java code. A gradle project can add java support by including the following to its build.gradle file: apply from: "$rootProject.projectDir/gradle/support/distributableGhidraModule.gradle" *****************************************************************************************/ import org.gradle.plugins.ide.eclipse.model.Container; import org.gradle.plugins.ide.eclipse.model.Library; /********************************************************************************* * Subproject configuration * - all subs will have access to these properties. *********************************************************************************/ apply plugin: 'java' compileJava { options.compilerArgs << '-Xlint:none' options.compilerArgs << '-XDignore.symbol.file' options.fork = true options.warnings = false } compileTestJava { options.compilerArgs << '-Xlint:none' options.compilerArgs << '-XDignore.symbol.file' options.fork = true options.warnings = false } plugins.withId('java') { sourceCompatibility = "${rootProject.JAVA_COMPILER}" targetCompatibility = "${rootProject.JAVA_COMPILER}" } jar { manifest { attributes ( "Specification-Title": "${project.name}", "Specification-Version": "${rootProject.RELEASE_VERSION}", "Specification-Vendor": "Ghidra" ) } } sourceSets { main { java { srcDir 'src/main/java' } resources { srcDir 'src/main/resources' } } test { java { srcDir 'src/test/java' } resources { srcDir 'src/test/resources' } } integrationTest { java { srcDirs = ['src/test.slow/java'] // overwrite srcDir with new path compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output } resources { srcDirs = ['src/test.slow/resources'] } } screenShots { java { srcDir 'src/screen/java' // Screenshots are essentially tests, and depend on classes in several other // test directories so they must be included here compileClasspath += main.output + test.output + integrationTest.output runtimeClasspath += main.output + test.output + integrationTest.output } } pcodeTest { java { srcDir 'src/test.processors/java' compileClasspath += main.output runtimeClasspath += main.output } resources { srcDir 'src/test.processors/resources' } } scripts { java { srcDir 'developer_scripts' srcDir 'ghidra_scripts' } } } configurations { integrationTestCompile.extendsFrom testCompile integrationTestRuntime.extendsFrom testRuntime, integrationTestCompile pcodeTestCompile.extendsFrom compile testArtifacts.extendsFrom testRuntime integrationTestArtifacts.extendsFrom integrationTestRuntime screenShotsCompile.extendsFrom integrationTestCompile } task testJar(type: Jar) { classifier "test" // value part of file name from sourceSets.test.output } task integrationTestJar(type: Jar) { classifier "integrationTest" // value part of file name from sourceSets.integrationTest.output } artifacts { testArtifacts testJar integrationTestArtifacts integrationTestJar } /* Provide test dependencies here so each build file does not have to. */ dependencies { integrationTestCompile "org.hamcrest:hamcrest-all:1.3" integrationTestCompile "org.jmockit:jmockit:1.44" testCompile "org.hamcrest:hamcrest-all:1.3" testCompile "org.jmockit:jmockit:1.44" testCompile "junit:junit:4.12" pcodeTestCompile "junit:junit:4.12" } // For Java 9, we must explicitly export references to the internal classes we are using. // We export them to all "unnamed" modules, which are modules that don't define themselves // as a new Java 9 style module. Ghidra is currently using unnamed modules everywhere. ext.addExports = { List exports -> tasks.withType(JavaCompile) { exports.each { options.compilerArgs.addAll(['--add-exports', it]) } } eclipse.classpath.file.whenMerged { classpath -> classpath.entries.each { ent -> if (ent instanceof Container && ent.path.contains('JRE_CONTAINER')) { ent.entryAttributes.put('module', true); ent.entryAttributes.put('add-exports', exports.join(':')); } } } } // Fixup generated Eclipse projects apply plugin: 'eclipse' eclipse.classpath.file.whenMerged { classpath -> // Gradle 5.6 has a bug that creates duplicate classpath entries, so we must dedupe them. // https://github.com/gradle/gradle/issues/10393 classpath.entries.unique(true) { (it instanceof org.gradle.plugins.ide.eclipse.model.ProjectDependency) ? it.path : it } // Prevent Gradle 5.6 from setting the 'test' attribute on our test source folders and jars. // If we don't do this, things that we have outside of test directories that depend on test // libraries (like junit) will not compile in Eclipse. classpath.entries.findAll { it.kind == 'src' || it.kind == 'lib' }.each { it.entryAttributes['test'] = 'false' } }