mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2024-11-24 13:11:47 +00:00
150 lines
4.2 KiB
Groovy
150 lines
4.2 KiB
Groovy
import org.gradle.api.*;
|
|
import org.gradle.artifacts.*;
|
|
import org.gradle.process.JavaExecSpec;
|
|
import org.gradle.api.file.*;
|
|
import org.gradle.api.tasks.*;
|
|
import org.gradle.api.internal.file.UnionFileCollection;
|
|
|
|
import groovy.xml.MarkupBuilder;
|
|
|
|
public class WriteEclipseLauncher extends JavaExec {
|
|
@OutputFile
|
|
File dest;
|
|
|
|
@Input
|
|
boolean isRunFave = false;
|
|
|
|
@Input
|
|
boolean isDbgFave = false;
|
|
|
|
@Input
|
|
boolean useEclipseDefaultClasspath = false
|
|
|
|
public <E> E one(Collection<E> col) {
|
|
assert col.size() == 1;
|
|
return col.iterator().next();
|
|
}
|
|
|
|
void walkFileCollection(UnionFileCollection col, Set gathered) {
|
|
col.sources.each {
|
|
walkFileCollection(it, gathered);
|
|
}
|
|
}
|
|
|
|
void walkFileCollection(ConfigurableFileCollection col, Set gathered) {
|
|
col.from.each {
|
|
walkFileCollection(it, gathered);
|
|
}
|
|
}
|
|
|
|
void walkFileCollection(SourceSetOutput col, Set gathered) {
|
|
gathered.add(col);
|
|
}
|
|
|
|
void walkFileCollection(Configuration col, Set gathered) {
|
|
col.allDependencies.each {
|
|
walkDependency(it, gathered)
|
|
}
|
|
}
|
|
|
|
void walkDependency(ExternalModuleDependency dep, Set gathered) {
|
|
gathered.add(dep)
|
|
}
|
|
|
|
void walkDependency(ProjectDependency dep, Set gathered) {
|
|
gathered.add(dep)
|
|
Project project = dep.dependencyProject
|
|
String confName = dep.targetConfiguration ?: 'default'
|
|
Configuration configuration = project.configurations."$confName"
|
|
walkFileCollection(configuration, gathered)
|
|
}
|
|
|
|
String makeEntryXml(ExternalModuleDependency dep, FileCollection cp) {
|
|
def writer = new StringWriter();
|
|
def xml = new MarkupBuilder(writer);
|
|
def file = cp.find { it.name.contains(dep.name) }
|
|
xml.mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8', standalone: 'no')
|
|
xml.runtimeClasspathEntry(
|
|
externalArchive: file,
|
|
path: 5,
|
|
// TODO: Figure out source jar
|
|
type: 2
|
|
);
|
|
return writer
|
|
}
|
|
|
|
String makeEntryXml(Project proj) {
|
|
def writer = new StringWriter();
|
|
def xml = new MarkupBuilder(writer);
|
|
xml.mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8', standalone: 'no')
|
|
xml.runtimeClasspathEntry(
|
|
path: 5,
|
|
projectName: proj.eclipse.project.name,
|
|
type: 1
|
|
)
|
|
return writer
|
|
}
|
|
|
|
String makeEntryXml(ProjectDependency dep, FileCollection cp) {
|
|
return makeEntryXml(dep.dependencyProject);
|
|
}
|
|
|
|
String makeEntryXml(SourceSetOutput out, FileCollection cp) {
|
|
Task task = one(out.buildDependencies.getDependencies(null))
|
|
return makeEntryXml(task.project)
|
|
}
|
|
|
|
public File forName(String name) {
|
|
return project.file(".launch/${name}.launch")
|
|
}
|
|
|
|
List<String> getJvmArgumentsForEclipse() {
|
|
List<String> all = allJvmArgs;
|
|
int index = all.indexOf('-cp');
|
|
if (index == -1) {
|
|
return all;
|
|
}
|
|
all.remove(index);
|
|
all.remove(index);
|
|
return all;
|
|
}
|
|
|
|
@TaskAction
|
|
void exec() { // Override exec. Instead write launcher
|
|
dest.parentFile.mkdirs();
|
|
def launcher = new MarkupBuilder(new FileWriter(dest));
|
|
Set gathered = new LinkedHashSet();
|
|
if (!useEclipseDefaultClasspath) {
|
|
walkFileCollection(classpath, gathered);
|
|
}
|
|
launcher.mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8', standalone: 'no')
|
|
launcher.launchConfiguration(type: 'org.eclipse.jdt.launching.localJavaApplication') {
|
|
listAttribute(key: 'org.eclipse.debug.ui.favoriteGroups') {
|
|
if (isRunFave) {
|
|
listEntry(value: 'org.eclipse.debug.ui.launchGroup.run');
|
|
}
|
|
if (isDbgFave) {
|
|
listEntry(value: 'org.eclipse.debug.ui.launchGroup.debug');
|
|
}
|
|
}
|
|
if (!useEclipseDefaultClasspath) {
|
|
listAttribute(key: 'org.eclipse.jdt.launching.CLASSPATH') {
|
|
gathered.each {
|
|
listEntry(value: makeEntryXml(it, classpath))
|
|
}
|
|
}
|
|
}
|
|
booleanAttribute(key: 'org.eclipse.jdt.launching.DEFAULT_CLASSPATH', value: useEclipseDefaultClasspath);
|
|
stringAttribute(key: 'org.eclipse.jdt.launching.MAIN_TYPE', value: main);
|
|
// TODO: Proper escaping of program and JVM arguments.
|
|
stringAttribute(key: 'org.eclipse.jdt.launching.PROGRAM_ARGUMENTS', value: args.join(' '));
|
|
stringAttribute(key: 'org.eclipse.jdt.launching.PROJECT_ATTR', value: project.eclipse.project.name);
|
|
stringAttribute(key: 'org.eclipse.jdt.launching.VM_ARGUMENTS', value: jvmArgumentsForEclipse.join(' '));
|
|
}
|
|
}
|
|
}
|
|
|
|
allprojects {
|
|
ext.WriteEclipseLauncher = WriteEclipseLauncher
|
|
}
|