diff --git a/.gitignore b/.gitignore index 04e661f556..c3fb9d3ddc 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ ghidra.repos.config **/dist repositories/ *.sla +**/data/build.xml # Misc files *.setting diff --git a/Ghidra/Features/FileFormats/data/build.xml b/Ghidra/Features/FileFormats/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Features/FileFormats/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Application.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Application.java index e6f02965f7..09572b2b80 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Application.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/Application.java @@ -460,18 +460,19 @@ public class Application { if (module == null) { return null; } - - File file = getModuleFile(module, "build/os/" + Platform.CURRENT_PLATFORM.getDirectoryName(), - exactFilename); + + File file = getModuleFile(module, + "build/os/" + Platform.CURRENT_PLATFORM.getDirectoryName(), exactFilename); if (file == null) { file = getModuleFile(module, "os/" + Platform.CURRENT_PLATFORM.getDirectoryName(), exactFilename); } - + // Allow win32 to be used for win64 as fallback if (file == null && Platform.CURRENT_PLATFORM == Platform.WIN_64) { - file = getModuleFile(module, "build/os/" + Platform.WIN_32.getDirectoryName(), exactFilename); + file = getModuleFile(module, "build/os/" + Platform.WIN_32.getDirectoryName(), + exactFilename); } if (file == null && Platform.CURRENT_PLATFORM == Platform.WIN_64) { file = getModuleFile(module, "os/" + Platform.WIN_32.getDirectoryName(), exactFilename); @@ -492,12 +493,13 @@ public class Application { private File getOSFileInAnyModule(String path) throws FileNotFoundException { - File file = findModuleFile("build/os/" + Platform.CURRENT_PLATFORM.getDirectoryName(), path); - + File file = + findModuleFile("build/os/" + Platform.CURRENT_PLATFORM.getDirectoryName(), path); + if (file == null) { file = findModuleFile("os/" + Platform.CURRENT_PLATFORM.getDirectoryName(), path); } - + // Allow win32 to be used for win64 as fallback if (file == null && Platform.CURRENT_PLATFORM == Platform.WIN_64) { file = findModuleFile("build/os/" + Platform.WIN_32.getDirectoryName(), path); @@ -657,7 +659,7 @@ public class Application { /** * Return the module root directory for the module with the given name. * @param moduleName the name of the module. - * @return the module root directory for the module with the given name. + * @return the module root directory for the module with the given name or null if not found. */ public static ResourceFile getModuleRootDir(String moduleName) { checkAppInitialized(); diff --git a/Ghidra/Framework/SoftwareModeling/Sleigh.launch b/Ghidra/Framework/SoftwareModeling/Sleigh.launch index b4f8e30e41..b8273f84bc 100644 --- a/Ghidra/Framework/SoftwareModeling/Sleigh.launch +++ b/Ghidra/Framework/SoftwareModeling/Sleigh.launch @@ -1,19 +1,27 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Framework/SoftwareModeling/build.gradle b/Ghidra/Framework/SoftwareModeling/build.gradle index ea5e731db3..afcc62f929 100644 --- a/Ghidra/Framework/SoftwareModeling/build.gradle +++ b/Ghidra/Framework/SoftwareModeling/build.gradle @@ -23,6 +23,10 @@ dependencies { antlr "org.antlr:antlr:3.5.2" } +// Define classpath needed to execute sleigh compiler during development +// (see gradleScripts/processorUtils.gradle) +ext.sleighDevClasspath = project.sourceSets.main.runtimeClasspath.collect { it.absolutePath }.join(':') + def genSrcDir = 'generated-src/antlr/main' generateGrammarSource { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java index a0cf138fdb..8c12ac945a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java @@ -412,11 +412,39 @@ public class SleighLanguage implements Language { String languageName = specName + ".slaspec"; ResourceFile languageFile = new ResourceFile(slaFile.getParentFile(), languageName); + // see gradleScripts/processorUtils.gradle for sleighArgs.txt generation + ResourceFile sleighArgsFile = null; + ResourceFile languageModule = Application.getModuleContainingResourceFile(languageFile); + if (languageModule != null) { + if (SystemUtilities.isInReleaseMode()) { + sleighArgsFile = new ResourceFile(languageModule, "data/sleighArgs.txt"); + } + else { + sleighArgsFile = new ResourceFile(languageModule, "build/data/sleighArgs.txt"); + } + } + + Map defineMap; + String[] args; + if (sleighArgsFile != null && sleighArgsFile.isFile()) { + args = new String[] { "-i", sleighArgsFile.getAbsolutePath(), + languageFile.getAbsolutePath(), description.getSlaFile().getAbsolutePath() }; + defineMap = new HashMap<>(); + } + else { + args = new String[] { languageFile.getAbsolutePath(), + description.getSlaFile().getAbsolutePath() }; + defineMap = ModuleDefinitionsMap.getModuleMap(); + } + try { - int returnCode = SleighCompileLauncher.runMain( - new String[] { languageFile.getAbsolutePath(), - description.getSlaFile().getAbsolutePath() }, - ModuleDefinitionsMap.getModuleMap()); + StringBuilder buf = new StringBuilder(); + for (String str : args) { + buf.append(str); + buf.append(" "); + } + Msg.debug(this, "Sleigh compile: " + buf); + int returnCode = SleighCompileLauncher.runMain(args, defineMap); if (returnCode != 0) { throw new SleighException("Errors compiling " + languageFile.getAbsolutePath() + " -- please check log messages for details"); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java index cd3f56fad9..895c894be6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompile.java @@ -963,10 +963,9 @@ public class SleighCompile extends SleighBase { continue; } if (firstContextField != null && sym.getId() == firstContextField) { - reportError(location, - sym.getName() + - " cannot be used to attach variables because it occurs at the lowest bit position in context at " + - sym.getLocation()); + reportError(location, sym.getName() + + " cannot be used to attach variables because it occurs at the lowest bit position in context at " + + sym.getLocation()); continue; } PatternValue patval = sym.getPatternValue(); @@ -1569,7 +1568,9 @@ public class SleighCompile extends SleighBase { } /** - * Run the sleigh compiler. + * Run the sleigh compiler. This provides a direct means of invoking the + * compiler without using the launcher. The full SoftwareModeling classpath + * must be established including any dependencies. * @param args compiler command line arguments * @throws JDOMException * @throws IOException @@ -1578,5 +1579,4 @@ public class SleighCompile extends SleighBase { public static void main(String[] args) throws JDOMException, IOException, RecognitionException { System.exit(SleighCompileLauncher.runMain(args, new HashMap())); } - } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompileLauncher.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompileLauncher.java index 299ffdc938..c678b37ef7 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompileLauncher.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/SleighCompileLauncher.java @@ -21,17 +21,18 @@ import java.util.Map.Entry; import org.antlr.runtime.*; import org.antlr.runtime.tree.CommonTreeNodeStream; -import org.jdom.*; -import org.jdom.input.SAXBuilder; +import org.jdom.JDOMException; +import generic.jar.ResourceFile; import generic.stl.IteratorSTL; import ghidra.GhidraApplicationLayout; import ghidra.GhidraLaunchable; +import ghidra.framework.Application; +import ghidra.framework.ApplicationConfiguration; import ghidra.pcodeCPort.context.SleighError; -import ghidra.pcodeCPort.translate.XmlError; import ghidra.sleigh.grammar.*; import ghidra.util.Msg; -import ghidra.util.xml.XmlUtilities; +import ghidra.util.SystemUtilities; import utilities.util.FileResolutionResult; import utilities.util.FileUtilities; @@ -63,6 +64,11 @@ public class SleighCompileLauncher implements GhidraLaunchable { @Override public void launch(GhidraApplicationLayout layout, String[] args) throws JDOMException, IOException, RecognitionException { + + // Initialize the application + ApplicationConfiguration configuration = new ApplicationConfiguration(); + Application.initializeApplication(layout, configuration); + System.exit(runMain(args, new HashMap())); } @@ -87,17 +93,24 @@ public class SleighCompileLauncher implements GhidraLaunchable { if (args.length < 1) { // @formatter:off - Msg.info(SleighCompile.class, "USAGE: sleigh [-x] [-dNAME=VALUE] inputfile outputfile"); - Msg.info(SleighCompile.class, " -x turns on parser debugging"); - Msg.info(SleighCompile.class, " -u print warnings for unnecessary pcode instructions"); - Msg.info(SleighCompile.class, " -l report pattern conflicts"); - Msg.info(SleighCompile.class, " -n print warnings for all NOP constructors"); - Msg.info(SleighCompile.class, " -t print warnings for dead temporaries"); - Msg.info(SleighCompile.class, " -e enforce use of 'local' keyword for temporaries"); - Msg.info(SleighCompile.class, " -f print warnings for unused token fields"); - Msg.info(SleighCompile.class, " -DNAME=VALUE defines a preprocessor macro NAME with value VALUE"); - Msg.info(SleighCompile.class, " OR sleigh -a directory-root"); - Msg.info(SleighCompile.class, " compiles all .slaspec files to .sla files anywhere under directory-root"); + Msg.info(SleighCompile.class, "Usage: sleigh [options...] [ [] | -a ]"); + Msg.info(SleighCompile.class, " sleigh [options...] []"); + Msg.info(SleighCompile.class, " source slaspec file to be compiled"); + Msg.info(SleighCompile.class, " optional output sla file (infile.sla assumed)"); + Msg.info(SleighCompile.class, " or"); + Msg.info(SleighCompile.class, " sleigh [options...] -a "); + Msg.info(SleighCompile.class, " directory to have all slaspec files compiled"); + Msg.info(SleighCompile.class, " options:"); + Msg.info(SleighCompile.class, " -x turns on parser debugging"); + Msg.info(SleighCompile.class, " -u print warnings for unnecessary pcode instructions"); + Msg.info(SleighCompile.class, " -l report pattern conflicts"); + Msg.info(SleighCompile.class, " -n print warnings for all NOP constructors"); + Msg.info(SleighCompile.class, " -t print warnings for dead temporaries"); + Msg.info(SleighCompile.class, " -e enforce use of 'local' keyword for temporaries"); + Msg.info(SleighCompile.class, " -f print warnings for unused token fields"); + Msg.info(SleighCompile.class, " -DNAME=VALUE defines a preprocessor macro NAME with value VALUE (option may be repeated)"); + Msg.info(SleighCompile.class, " -dMODULE defines a preprocessor macro MODULE with a value of its module path (option may be repeated)"); + Msg.info(SleighCompile.class, " -i inject options from specified file"); // @formatter:on return 2; } @@ -114,6 +127,13 @@ public class SleighCompileLauncher implements GhidraLaunchable { if (args[i].charAt(0) != '-') { break; } + else if (args[i].charAt(1) == 'i') { + // inject options from file specified by next argument + args = injectOptionsFromFile(args, ++i); + if (args == null) { + return 1; + } + } else if (args[i].charAt(1) == 'D') { String preproc = args[i].substring(2); int pos = preproc.indexOf('='); @@ -125,6 +145,18 @@ public class SleighCompileLauncher implements GhidraLaunchable { String value = preproc.substring(pos + 1); preprocs.put(name, value); // Preprocessor macro definitions } + else if (args[i].charAt(1) == 'd') { + String moduleName = args[i].substring(2); + ResourceFile module = Application.getModuleRootDir(moduleName); + if (module == null || !module.isDirectory()) { + Msg.error(SleighCompile.class, + "Failed to resolve module reference: " + args[i]); + return 1; + } + Msg.debug(SleighCompile.class, + "Sleigh resolved module: " + moduleName + "=" + module.getAbsolutePath()); + preprocs.put(moduleName, module.getAbsolutePath()); // Preprocessor macro definitions + } else if (args[i].charAt(1) == 'u') { unnecessaryPcodeWarning = true; } @@ -155,7 +187,16 @@ public class SleighCompileLauncher implements GhidraLaunchable { } } + if (i < args.length - 2) { + Msg.error(SleighCompile.class, "Too many parameters"); + return 1; + } + if (allMode) { + if (i == args.length) { + Msg.error(SleighCompile.class, "Missing input directory path"); + return 1; + } String directory = args[i]; File dir = new File(directory); if (!dir.exists() || !dir.isDirectory()) { @@ -195,6 +236,7 @@ public class SleighCompileLauncher implements GhidraLaunchable { return -totalFailures; } + // single file compile SleighCompile compiler = new SleighCompile(); initCompiler(compiler, preprocs, unnecessaryPcodeWarning, lenientConflict, allNopWarning, deadTempWarning, unusedFieldWarning, enforceLocalKeyWord); @@ -202,60 +244,71 @@ public class SleighCompileLauncher implements GhidraLaunchable { Msg.error(SleighCompile.class, "Missing input file name"); return 1; } - if (i < args.length - 2) { - Msg.error(SleighCompile.class, "Too many parameters"); - return 1; - } filein = args[i]; if (i < args.length - 1) { fileout = args[i + 1]; } - String fileinExamine = filein; - int extInPos = fileinExamine.indexOf(FILE_IN_DEFAULT_EXT); - boolean autoExtInSet = false; - String fileinPreExt = ""; - if (extInPos == -1) {// No Extension Given... - // cout << "No Ext Given" << endl; - fileinPreExt = fileinExamine; - fileinExamine += FILE_IN_DEFAULT_EXT; - filein = fileinExamine; - // cout << "filein = " << filein << endl; - autoExtInSet = true; + String baseName = filein; + if (filein.toLowerCase().endsWith(FILE_IN_DEFAULT_EXT)) { + baseName = filein.substring(0, filein.length() - FILE_IN_DEFAULT_EXT.length()); } - else { - fileinPreExt = fileinExamine.substring(0, extInPos); - } - // cout << "fileinPreExt = " << fileinPreExt << endl; + filein = baseName + FILE_IN_DEFAULT_EXT; - if (fileout != null) { - String fileoutExamine = fileout; - int extOutPos = fileoutExamine.indexOf(FILE_OUT_DEFAULT_EXT); - if (extOutPos == -1) {// No Extension Given... - // cout << "No Ext Given" << endl; - fileoutExamine += FILE_OUT_DEFAULT_EXT; - fileout = fileoutExamine; - // cout << "fileout = " << fileout << endl; - } - retval = run_compilation(filein, fileout, compiler); + String baseOutName = fileout; + if (fileout == null) { + baseOutName = baseName; } - else { - // First determine whether or not to use Run_XML... - if (autoExtInSet) {// Assumed format of at least "sleigh file" . - // "sleigh file.slaspec file.sla" - String fileoutSTR = fileinPreExt; - fileoutSTR += FILE_OUT_DEFAULT_EXT; - fileout = fileoutSTR; - // cout << "generated fileout = " << fileout << endl; - retval = run_compilation(filein, fileout, compiler); - } - else { - retval = run_xml(filein, compiler); - } + else if (fileout.toLowerCase().endsWith(FILE_OUT_DEFAULT_EXT)) { + baseOutName = fileout.substring(0, fileout.length() - FILE_OUT_DEFAULT_EXT.length()); + } + fileout = baseOutName + FILE_OUT_DEFAULT_EXT; + return run_compilation(filein, fileout, compiler); + } + + private static String[] injectOptionsFromFile(String[] args, int index) { + if (index >= args.length) { + Msg.error(SleighCompile.class, "Missing options input file name"); + return null; } - return retval; + + File optionsFile = new File(args[index]); + if (!optionsFile.isFile()) { + Msg.error(SleighCompile.class, + "Options file not found: " + optionsFile.getAbsolutePath()); + if (SystemUtilities.isInDevelopmentMode()) { + Msg.error(SleighCompile.class, + "Eclipse language module must be selected and 'gradle prepdev' prevously run"); + } + return null; + } + ArrayList list = new ArrayList<>(); + for (int i = 0; i <= index; i++) { + list.add(args[i]); + } + + try (BufferedReader r = new BufferedReader(new FileReader(optionsFile))) { + String option = r.readLine(); + while (option != null) { + option = option.trim(); + if (option.length() != 0 && !option.startsWith("#")) { + list.add(option); + } + option = r.readLine(); + } + } + catch (IOException e) { + Msg.error(SleighCompile.class, + "Reading options file failed (" + optionsFile.getName() + "): " + e.getMessage()); + return null; + } + + for (int i = index + 1; i < args.length; i++) { + list.add(args[i]); + } + return list.toArray(new String[list.size()]); } private static int run_compilation(String filein, String fileout, SleighCompile compiler) @@ -384,64 +437,4 @@ public class SleighCompileLauncher implements GhidraLaunchable { return 0; } - private static int run_xml(String filein, SleighCompile compiler) - throws JDOMException, IOException, RecognitionException { - FileInputStream s = new FileInputStream(new File(filein)); - Document doc = null; - String specfileout = ""; - String specfilein = ""; - - try { - SAXBuilder builder = XmlUtilities.createSecureSAXBuilder(false, false); - doc = builder.build(s); - } - catch (XmlError err) { - Msg.error(SleighCompile.class, - "Unable to parse single input file as XML spec: " + filein, err); - return 1; - } - s.close(); - - Element el = doc.getRootElement(); - for (;;) { - List list = el.getChildren(); - Iterator iter = list.iterator(); - while (iter.hasNext()) { - el = (Element) iter.next(); - if (el.getName().equals("processorfile")) { - specfileout = el.getText(); - List atts = el.getAttributes(); - Iterator i = atts.iterator(); - while (i.hasNext()) { - Attribute att = (Attribute) i.next(); - if (att.getName().equals("slaspec")) { - specfilein = att.getValue(); - } - else { - compiler.setPreprocValue(att.getName(), att.getValue()); - } - } - } - else if (el.getName().equals("language_spec")) { - break; - } - else if (el.getName().equals("language_description")) { - break; - } - } - if (!iter.hasNext()) { - break; - } - } - - if (specfilein.length() == 0) { - Msg.error(SleighCompile.class, "Input slaspec file was not specified in " + filein); - return 1; - } - if (specfileout.length() == 0) { - Msg.error(SleighCompile.class, "Output sla file was not specified in " + filein); - return 1; - } - return run_compilation(specfilein, specfileout, compiler); - } } diff --git a/Ghidra/Processors/6502/data/build.xml b/Ghidra/Processors/6502/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/6502/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/68000/data/build.xml b/Ghidra/Processors/68000/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/68000/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/6805/data/build.xml b/Ghidra/Processors/6805/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/6805/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/8051/data/build.xml b/Ghidra/Processors/8051/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/8051/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/8085/data/build.xml b/Ghidra/Processors/8085/data/build.xml deleted file mode 100644 index 2164d961ae..0000000000 --- a/Ghidra/Processors/8085/data/build.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/AARCH64/data/build.xml b/Ghidra/Processors/AARCH64/data/build.xml deleted file mode 100644 index 7c1d69306c..0000000000 --- a/Ghidra/Processors/AARCH64/data/build.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/ARM/data/build.xml b/Ghidra/Processors/ARM/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/ARM/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/Atmel/data/build.xml b/Ghidra/Processors/Atmel/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/Atmel/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/CR16/data/build.xml b/Ghidra/Processors/CR16/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/CR16/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/DATA/data/build.xml b/Ghidra/Processors/DATA/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/DATA/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/JVM/data/build.xml b/Ghidra/Processors/JVM/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/JVM/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/MIPS/data/build.xml b/Ghidra/Processors/MIPS/data/build.xml deleted file mode 100644 index a6301d23ca..0000000000 --- a/Ghidra/Processors/MIPS/data/build.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/PA-RISC/data/build.xml b/Ghidra/Processors/PA-RISC/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/PA-RISC/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/PIC/data/build.xml b/Ghidra/Processors/PIC/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/PIC/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/PowerPC/data/build.xml b/Ghidra/Processors/PowerPC/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/PowerPC/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/Sparc/data/build.xml b/Ghidra/Processors/Sparc/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/Sparc/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/TI_MSP430/data/build.xml b/Ghidra/Processors/TI_MSP430/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/TI_MSP430/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/Toy/data/build.xml b/Ghidra/Processors/Toy/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/Toy/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/Z80/data/build.xml b/Ghidra/Processors/Z80/data/build.xml deleted file mode 100644 index 8f72019712..0000000000 --- a/Ghidra/Processors/Z80/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ghidra/Processors/x86/data/build.xml b/Ghidra/Processors/x86/data/build.xml deleted file mode 100644 index b80b6d91fa..0000000000 --- a/Ghidra/Processors/x86/data/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GhidraBuild/BuildFiles/certification.manifest b/GhidraBuild/BuildFiles/certification.manifest index 40d82f7a77..95930675a6 100644 --- a/GhidraBuild/BuildFiles/certification.manifest +++ b/GhidraBuild/BuildFiles/certification.manifest @@ -6,3 +6,5 @@ JsonDoclet/.project||GHIDRA||||END| JsonDoclet/Module.manifest||GHIDRA||||END| JsonDoclet/build.gradle||GHIDRA||||END| build.gradle||GHIDRA||||END| +sleighDevBuild.template||GHIDRA||||END| +sleighDistBuild.template||GHIDRA||||END| diff --git a/GhidraBuild/BuildFiles/sleighDevBuild.template b/GhidraBuild/BuildFiles/sleighDevBuild.template new file mode 100644 index 0000000000..d81928bd61 --- /dev/null +++ b/GhidraBuild/BuildFiles/sleighDevBuild.template @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GhidraBuild/BuildFiles/sleighDistBuild.template b/GhidraBuild/BuildFiles/sleighDistBuild.template new file mode 100644 index 0000000000..ec9976b7c3 --- /dev/null +++ b/GhidraBuild/BuildFiles/sleighDistBuild.template @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GhidraBuild/Skeleton/certification.manifest b/GhidraBuild/Skeleton/certification.manifest index 25a6ffeb28..89c984df68 100644 --- a/GhidraBuild/Skeleton/certification.manifest +++ b/GhidraBuild/Skeleton/certification.manifest @@ -12,6 +12,7 @@ data/languages/skel.opinion||GHIDRA||||END| data/languages/skel.pspec||GHIDRA||||END| data/languages/skel.sinc||GHIDRA||||END| data/languages/skel.slaspec||GHIDRA||||END| +data/sleighArgs.txt||GHIDRA||||END| extension.properties||GHIDRA||||END| ghidra_scripts/README.txt||GHIDRA||||END| lib/README.txt||GHIDRA||||END| diff --git a/GhidraBuild/Skeleton/data/build.xml b/GhidraBuild/Skeleton/data/build.xml deleted file mode 100644 index b83278c5e4..0000000000 --- a/GhidraBuild/Skeleton/data/build.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GhidraBuild/Skeleton/data/sleighArgs.txt b/GhidraBuild/Skeleton/data/sleighArgs.txt new file mode 100644 index 0000000000..ce06926358 --- /dev/null +++ b/GhidraBuild/Skeleton/data/sleighArgs.txt @@ -0,0 +1,6 @@ +# Add sleigh compiler options to this file (one per line) which will +# be used when compiling each language within this module. +# All options should start with a '-' character. +# +# IMPORTANT: The -a option should NOT be specified +# \ No newline at end of file diff --git a/gradleScripts/distribution.gradle b/gradleScripts/distribution.gradle index 69df51a986..7aaf03b2f4 100644 --- a/gradleScripts/distribution.gradle +++ b/gradleScripts/distribution.gradle @@ -223,6 +223,7 @@ task assembleCommon (type: Copy) { from (p.projectDir.toString() + "/data") { into { getZipPath(p) + "/data" } + exclude 'build.xml' // associated with language modules (dev use only) } from (BIN_REPO + '/' + getZipPath(p) + "/data") { @@ -697,6 +698,7 @@ subprojects { p -> exclude 'bin/**' exclude 'src/**' exclude 'test/**' + exclude 'data/build.xml' exclude 'developer_scripts' // general place where extension modules can put files that won't get diff --git a/gradleScripts/ip.gradle b/gradleScripts/ip.gradle index 16b0c91b08..18a778c275 100644 --- a/gradleScripts/ip.gradle +++ b/gradleScripts/ip.gradle @@ -120,6 +120,7 @@ def Map> getIpForModule(Project p) { exclude "build.gradle" exclude "**/Misc/Tips.htm" exclude "**/*.sla" + exclude "**/data/build.xml" // language build file (generated for dev only) exclude "**/.gradle/**" exclude "**/.settings/**" exclude "**/.vs/**" diff --git a/gradleScripts/processorUtils.gradle b/gradleScripts/processorUtils.gradle index 99bb843875..7d83c68ccc 100644 --- a/gradleScripts/processorUtils.gradle +++ b/gradleScripts/processorUtils.gradle @@ -1,4 +1,3 @@ - /***************************************************************************************** * * Create a configuration so the a dependency can be declared on the the software modeling @@ -14,6 +13,64 @@ dependencies { sleighConfig project(':SoftwareModeling') } +/***************************************************************************************** + * + * Task to write sleigh compiler args to build/data/sleighArgs.txt for use with sleigh + * external sleigh compiler. + * + *****************************************************************************************/ +task saveSleighArgs { + def sleighArgsFile = file("build/data/sleighArgs.txt") + outputs.files sleighArgsFile + outputs.upToDateWhen { false } + doLast { + sleighArgsFile.withWriter { out-> + project.sleighCompile.args.each { a-> + // don't save -a option + if (!"-a".equals(a)) { + out.println a + } + } + } + } +} + +prepDev.dependsOn(saveSleighArgs) + +/***************************************************************************************** + * + * Task to write sleigh build.xml file for use is development mode only. + * + *****************************************************************************************/ +task writeSleighDevBuild { + def templateFilePath = project(':BuildFiles').projectDir.toString() + "/sleighDevBuild.template" + doLast { + // Generate build.xml with injected classpath for running sleigh compiler + copy { + into "data" + from (templateFilePath) { + rename { "build.xml" } + expand ( [ 'gradleSleighDevClasspath': project(':SoftwareModeling').sleighDevClasspath ] ) + } + } + } +} + +prepDev.dependsOn(writeSleighDevBuild) + +/***************************************************************************************** + * + * Write sleigh build.xml file for each language module into assembleCommon + * + *****************************************************************************************/ +rootProject.assembleCommon { + into (getZipPath(this.project) + "/data") { + from (rootProject.projectDir.toString() + "/GhidraBuild/BuildFiles/sleighDistBuild.template") { + rename { "build.xml" } + } + } +} + /***************************************************************************************** * * Task to compile language files using the sleigh compiler. @@ -22,17 +79,16 @@ dependencies { task sleighCompile (type: JavaExec) { group = rootProject.GHIDRA_GROUP description " Compiles all the sleigh languages. [processorUtils.gradle]\n" - + // define standard parameters for JavaExec classpath configurations.sleighConfig main = 'ghidra.pcodeCPort.slgh_compile.SleighCompile' - args '-a' - // Delay adding the directory argument until the first part of the execution phase, so // that any extra args added by a project override will be added to the arg list before - // this argument. + // these arguments. doFirst { + args '-a' args './data/languages' } @@ -40,8 +96,9 @@ task sleighCompile (type: JavaExec) { } // The task that copies the common files to the distribution folder must depend on -// this sleigh task before executing. +// the sleigh tasks before executing. rootProject.assembleCommon.dependsOn(sleighCompile) +rootProject.assembleCommon.dependsOn(saveSleighArgs) // For all tasks of type:Test (i.e., integrationTest, cunitTest, etc.), add a task dependency to // sleighCompile. The sleighCompile task inputs and outputs are defined such that the *.slaspec @@ -52,8 +109,9 @@ rootProject.assembleCommon.dependsOn(sleighCompile) // modules as seen in the use of ghidra.test.ToyProgramBuilder. // The tasks of type:Test do not know about sleighCompile during their configuration phase, so the // dependency must be done in this gradle file. -rootProject.subprojects.findAll { subproject -> - if (!isSupportModule(subproject)) { +rootProject.subprojects.findAll { subproject -> + boolean isSupporProject = subproject.findProperty("isSupportProject") ?: false; + if (!isSupporProject) { subproject.tasks.withType(Test).all { it.dependsOn(sleighCompile) } @@ -91,26 +149,9 @@ def taskOutputs = fileTree(dir: 'data/languages', include: '**/*.sla') sleighCompile.inputs.files (taskInputs) sleighCompile.outputs.files (taskOutputs) -task eclipseSleighLauncher(type: WriteEclipseLauncher) { - dest = forName("Sleigh $project.name") - isRunFave = true - isDbgFave = false - - classpath = configurations.sleighConfig - main 'ghidra.pcodeCPort.slgh_compile.SleighCompile' - - args '-a' - - // Delay adding the directory argument until the first part of the execution phase, so - // that any extra args added by a project override will be added to the arg list before - // this argument. - doFirst { - args './data/languages' - } - - jvmArgs '-Xmx2048M' -} +// define the sleigh compile inputs to saveSleighArgs to limit task creation to language modules +saveSleighArgs.inputs.files (taskInputs) def isSupportModule(Project p) { return p.findProperty("isSupportProject") ?: false -} \ No newline at end of file +}