// 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= // > gradle // // or // // > gradle -PGHIDRA_INSTALL_DIR= // // Gradle should be invoked from the directory of the project to build. Please see the // application.gradle.version property in /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------------------------------- 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() } wrapper { gradleVersion = '7.5.1' gradleVersion = '8.10.2' distributionType = Wrapper.DistributionType.BIN } repositories { mavenCentral() } configurations { localDeps } dependencies { 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/**' exclude 'lib/**' exclude 'gradle/**' exclude 'src/**' exclude '.git/**' exclude '.idea/**' exclude '.github/**' 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 } } tasks.withType(Copy).all { duplicatesStrategy 'exclude' } jar { duplicatesStrategy(DuplicatesStrategy.EXCLUDE) }