2019-03-06 14:56:59 +01:00
|
|
|
// Builds a Ghidra Extension for a given Ghidra installation.
|
|
|
|
//
|
|
|
|
// An absolute path to the Ghidra installation directory must be supplied either by setting the
|
|
|
|
// GHIDRA_INSTALL_DIR environment variable or Gradle project property:
|
|
|
|
//
|
|
|
|
// > export GHIDRA_INSTALL_DIR=<Absolute path to Ghidra>
|
|
|
|
// > gradle
|
|
|
|
//
|
|
|
|
// or
|
|
|
|
//
|
|
|
|
// > gradle -PGHIDRA_INSTALL_DIR=<Absolute path to Ghidra>
|
|
|
|
//
|
|
|
|
// Gradle should be invoked from the directory of the project to build. Please see the
|
|
|
|
// application.gradle.version property in <GHIDRA_INSTALL_DIR>/Ghidra/application.properties
|
|
|
|
// for the correction version of Gradle to use for the Ghidra installation you specify.
|
|
|
|
|
|
|
|
//----------------------START "DO NOT MODIFY" SECTION------------------------------
|
|
|
|
def ghidraInstallDir
|
|
|
|
|
|
|
|
if (System.env.GHIDRA_INSTALL_DIR) {
|
|
|
|
ghidraInstallDir = System.env.GHIDRA_INSTALL_DIR
|
|
|
|
}
|
|
|
|
else if (project.hasProperty("GHIDRA_INSTALL_DIR")) {
|
|
|
|
ghidraInstallDir = project.getProperty("GHIDRA_INSTALL_DIR")
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ghidraInstallDir) {
|
|
|
|
apply from: new File(ghidraInstallDir).getCanonicalPath() + "/support/buildExtension.gradle"
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
throw new GradleException("GHIDRA_INSTALL_DIR is not defined!")
|
|
|
|
}
|
|
|
|
//----------------------END "DO NOT MODIFY" SECTION-------------------------------
|
2023-07-26 12:11:06 +02:00
|
|
|
|
|
|
|
def DISTRIBUTION_DIR = file("dist")
|
|
|
|
def PATH_IN_ZIP = "${project.name}"
|
|
|
|
|
|
|
|
def getGitHash = {
|
|
|
|
def stdout = new ByteArrayOutputStream()
|
|
|
|
exec {
|
|
|
|
commandLine 'git', 'rev-parse', '--short', 'HEAD'
|
|
|
|
standardOutput = stdout
|
|
|
|
}
|
|
|
|
return stdout.toString().trim()
|
2022-11-12 14:04:14 +01:00
|
|
|
}
|
2023-07-26 12:11:06 +02:00
|
|
|
|
|
|
|
wrapper {
|
|
|
|
gradleVersion = '7.5.1'
|
|
|
|
distributionType = Wrapper.DistributionType.BIN
|
|
|
|
}
|
|
|
|
|
2022-11-12 14:04:14 +01:00
|
|
|
repositories {
|
2023-07-26 12:11:06 +02:00
|
|
|
mavenCentral()
|
|
|
|
}
|
|
|
|
|
|
|
|
configurations {
|
|
|
|
localDeps
|
2022-11-12 14:04:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
dependencies {
|
2023-07-26 12:11:06 +02:00
|
|
|
implementation fileTree(dir: ghidraInstallDir + '/Ghidra/Processors', include: "**/*.jar")
|
|
|
|
localDeps group: 'org.lz4', name: 'lz4-java', version: '1.5.1'
|
|
|
|
implementation configurations.localDeps
|
|
|
|
}
|
|
|
|
|
|
|
|
buildExtension {
|
|
|
|
baseName "${project.name}-${project.version}-${getGitHash()}-Ghidra_${ghidra_version}".replace(' ', '_')
|
|
|
|
extension 'zip'
|
|
|
|
destinationDir DISTRIBUTION_DIR
|
|
|
|
version ''
|
|
|
|
|
|
|
|
// Make sure that we don't try to copy the same file with the same path into the
|
|
|
|
// zip (this can happen!)
|
|
|
|
duplicatesStrategy 'exclude'
|
|
|
|
|
|
|
|
// This filtered property file copy must appear before the general
|
|
|
|
// copy to ensure that it is prefered over the unmodified file
|
|
|
|
File propFile = new File(project.projectDir, "extension.properties")
|
|
|
|
from (propFile) {
|
|
|
|
String version = "${ghidra_version}"
|
|
|
|
String name = "${project.name}"
|
|
|
|
filter (org.apache.tools.ant.filters.ReplaceTokens, tokens: [extversion: version])
|
|
|
|
filter (org.apache.tools.ant.filters.ReplaceTokens, tokens: [extname: name])
|
|
|
|
into PATH_IN_ZIP
|
|
|
|
}
|
|
|
|
|
|
|
|
from (project.jar) {
|
|
|
|
into PATH_IN_ZIP + "/lib"
|
|
|
|
}
|
|
|
|
|
|
|
|
// Copy lz4 and any other dependencies that only we rely on
|
|
|
|
from (configurations.localDeps) {
|
|
|
|
into PATH_IN_ZIP + "/lib"
|
|
|
|
}
|
|
|
|
|
|
|
|
from (project.projectDir) {
|
|
|
|
exclude 'build/**'
|
|
|
|
exclude '*.gradle'
|
|
|
|
exclude 'certification.manifest'
|
|
|
|
exclude 'dist/**'
|
|
|
|
exclude 'bin/**'
|
2023-10-31 23:11:14 +01:00
|
|
|
exclude 'lib/**'
|
|
|
|
exclude 'gradle/**'
|
2023-07-26 12:11:06 +02:00
|
|
|
exclude 'src/**'
|
2023-10-31 23:11:14 +01:00
|
|
|
exclude '.git/**'
|
|
|
|
exclude '.idea/**'
|
|
|
|
exclude '.github/**'
|
2023-07-26 12:11:06 +02:00
|
|
|
exclude '.gradle/**'
|
|
|
|
exclude 'gradle/**'
|
|
|
|
exclude 'gradlew'
|
|
|
|
exclude 'gradlew.bat'
|
|
|
|
exclude '.classpath'
|
|
|
|
exclude '.project'
|
|
|
|
exclude '.settings/**'
|
|
|
|
exclude 'developer_scripts'
|
|
|
|
exclude '.antProperties.xml'
|
|
|
|
exclude 'eclipse/**'
|
|
|
|
|
|
|
|
into PATH_IN_ZIP
|
|
|
|
}
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
println "\nCreated " + baseName + "." + extension + " in " + destinationDir
|
|
|
|
}
|
2022-11-12 14:04:14 +01:00
|
|
|
}
|
|
|
|
|
2023-10-31 23:11:14 +01:00
|
|
|
tasks.withType(Copy).all { duplicatesStrategy 'exclude' }
|
|
|
|
|
2023-07-26 12:11:06 +02:00
|
|
|
jar {
|
|
|
|
duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
|
|
|
|
}
|