/* ### * 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-library' 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 } processResources { duplicatesStrategy = 'exclude' } processTestResources { duplicatesStrategy = 'exclude' } 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' compileClasspath += main.output } } } configurations { integrationTestImplementation.extendsFrom testImplementation integrationTestRuntimeOnly.extendsFrom testRuntimeOnly, integrationTestImplementation pcodeTestImplementation.extendsFrom implementation scriptsImplementation.extendsFrom implementation testArtifacts.extendsFrom testRuntimeOnly integrationTestArtifacts.extendsFrom integrationTestRuntimeOnly screenShotsImplementation.extendsFrom integrationTestImplementation } task testJar(type: Jar) { archiveClassifier.set("test") // value part of file name from sourceSets.test.output } task integrationTestJar(type: Jar) { archiveClassifier.set("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 { integrationTestImplementation "org.hamcrest:hamcrest:2.2" testImplementation "org.hamcrest:hamcrest:2.2" testImplementation "junit:junit:4.12" pcodeTestImplementation "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(':')); } } } } // Customize generated Eclipse projects apply plugin: 'eclipse' eclipse { classpath { // Expose test classes to dependent projects containsTestFixtures = true // Customizing which Eclipse source directories should be marked as test. // Only screenShots must be added...test and integrationTest are automatically picked up. // NOTE: When we upgrade to Gradle 7.5+, we can just set the "testSourceSets" property file { whenMerged { classpath -> classpath.entries.findAll { it.kind == 'src' && it.path.startsWith('src/screen/') }.each { it.entryAttributes['test'] = 'true' } } } } }