ghidra/gradle/javaProject.gradle
2024-06-12 10:04:40 -04:00

210 lines
5.6 KiB
Groovy

/* ###
* 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'
}
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<String> 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'
}
}
}
}
}