public static ResourceDatabase PrepareResources( BuildContext buildContext, ByteBuffer nullableByteCode) // CBX files will not have this in the resources { using (new PerformanceSection("Program.PrepareResources")) { // This really needs to go in a separate helper file. ResourceDatabase resourceDatabase = ResourceDatabaseBuilder.CreateResourceDatabase(buildContext); if (nullableByteCode != null) { resourceDatabase.ByteCodeFile = new FileOutput() { Type = FileOutputType.Text, TextContent = ByteCodeEncoder.Encode(nullableByteCode), }; } using (new PerformanceSection("Program.PrepareResources/ImageSheetStuff")) { Common.ImageSheets.ImageSheetBuilder imageSheetBuilder = new Common.ImageSheets.ImageSheetBuilder(); if (buildContext.ImageSheetIds != null) { foreach (string imageSheetId in buildContext.ImageSheetIds) { imageSheetBuilder.PrefixMatcher.RegisterId(imageSheetId); foreach (string fileMatcher in buildContext.ImageSheetPrefixesById[imageSheetId]) { imageSheetBuilder.PrefixMatcher.RegisterPrefix(imageSheetId, fileMatcher); } } } Common.ImageSheets.Sheet[] imageSheets = imageSheetBuilder.Generate(resourceDatabase); resourceDatabase.AddImageSheets(imageSheets); } resourceDatabase.GenerateResourceMapping(); return(resourceDatabase); } }
public void Compile( BuildContext buildContext, string inputFolder, string baseOutputFolder) { Parser.IsTranslateMode_STATIC_HACK = false; this.VerifyProjectId(buildContext.ProjectID); inputFolder = inputFolder.Replace('/', '\\'); if (inputFolder.EndsWith("\\")) { inputFolder = inputFolder.Substring(0, inputFolder.Length - 1); } string[] allFiles = FileUtil.GetAllFilePathsRelativeToRoot(inputFolder); ResourceDatabase resourceDatabase = new ResourceDatabase(allFiles, inputFolder); ImageSheets.ImageSheetBuilder imageSheetBuilder = new ImageSheets.ImageSheetBuilder(); if (buildContext.ImageSheetIds != null) { foreach (string imageSheetId in buildContext.ImageSheetIds) { imageSheetBuilder.PrefixMatcher.RegisterId(imageSheetId); foreach (string fileMatcher in buildContext.ImageSheetPrefixesById[imageSheetId]) { imageSheetBuilder.PrefixMatcher.RegisterPrefix(imageSheetId, fileMatcher); } } } ImageSheets.Sheet[] imageSheets = imageSheetBuilder.Generate(resourceDatabase); resourceDatabase.AddImageSheets(imageSheets); resourceDatabase.GenerateResourceMapping(); ByteBuffer byteCodeBuffer = GenerateByteCode(buildContext, inputFolder); resourceDatabase.ByteCodeRawData = byteCodeBuffer; resourceDatabase.ByteCodeFile = new FileOutput() { Type = FileOutputType.Text, TextContent = ByteCodeEncoder.Encode(byteCodeBuffer), }; Parser.IsTranslateMode_STATIC_HACK = true; Dictionary <string, Executable[]> executablesByFile = this.InterpreterCompiler.Compile(); Parser.IsTranslateMode_STATIC_HACK = false; StructDefinition[] structs = this.InterpreterCompiler.GetStructDefinitions(); Dictionary <string, FileOutput> files = this.Package( buildContext, buildContext.ProjectID, executablesByFile, structs, inputFolder, resourceDatabase, this.LibraryManager); if (buildContext.ReadableByteCode) { files["readable_byte_code.txt"] = new FileOutput() { Type = FileOutputType.Text, TextContent = this.GenerateReadableByteCode(byteCodeBuffer), }; } string outputFolder = baseOutputFolder; FileUtil.EnsureParentFolderExists(outputFolder); // TODO: delete all files and directories in the output folder that are not in the new output // which is better than deleting everything and re-exporting because the user may have command // lines and windows open viewing the previous content, which will prevent a full delete from // working, but won't stop a simple overwrite of old content. this.GenerateFiles(buildContext, files, outputFolder, inputFolder); }
public CbxExporter Export() { using (new PerformanceSection("ExportCbx")) { if (!this.args.ContainsKey(FlagParser.BUILD_FILE)) { throw new InvalidOperationException("No build path was provided."); } BuildContext buildContext = GetBuildContextCbx(this.args[FlagParser.BUILD_FILE]); CompilationBundle compilationResult = CompilationBundle.Compile(buildContext); ResourceDatabase resDb = Program.PrepareResources(buildContext, null); string byteCode = ByteCodeEncoder.Encode(compilationResult.ByteCode); List <byte> cbxOutput = new List <byte>() { 0 }; cbxOutput.AddRange("CBX".ToCharArray().Select(c => (byte)c)); cbxOutput.AddRange(GetBigEndian4Byte(0)); cbxOutput.AddRange(GetBigEndian4Byte(2)); cbxOutput.AddRange(GetBigEndian4Byte(0)); byte[] code = StringToBytes(byteCode); cbxOutput.AddRange("CODE".ToCharArray().Select(c => (byte)c)); cbxOutput.AddRange(GetBigEndian4Byte(code.Length)); cbxOutput.AddRange(code); List <string> libraries = new List <string>(); foreach (Library library in compilationResult.LibrariesUsed.Where(lib => lib.IsMoreThanJustEmbedCode)) { libraries.Add(library.Name); libraries.Add(library.Version); } string libsData = string.Join(",", libraries); byte[] libsDataBytes = StringToBytes(libsData); cbxOutput.AddRange("LIBS".ToCharArray().Select(c => (byte)c)); cbxOutput.AddRange(GetBigEndian4Byte(libsDataBytes.Length)); cbxOutput.AddRange(libsDataBytes); byte[] resourceManifest = StringToBytes(resDb.ResourceManifestFile.TextContent); cbxOutput.AddRange("RSRC".ToCharArray().Select(c => (byte)c)); cbxOutput.AddRange(GetBigEndian4Byte(resourceManifest.Length)); cbxOutput.AddRange(resourceManifest); if (resDb.ImageSheetManifestFile != null) { byte[] imageSheetManifest = StringToBytes(resDb.ImageSheetManifestFile.TextContent); cbxOutput.AddRange("IMSH".ToCharArray().Select(c => (byte)c)); cbxOutput.AddRange(GetBigEndian4Byte(imageSheetManifest.Length)); cbxOutput.AddRange(imageSheetManifest); } string outputFolder = buildContext.OutputFolder.Replace("%TARGET_NAME%", "cbx"); string fullyQualifiedOutputFolder = FileUtil.JoinPath(buildContext.ProjectDirectory, outputFolder); string cbxPath = FileUtil.JoinPath(fullyQualifiedOutputFolder, buildContext.ProjectID + ".cbx"); cbxPath = FileUtil.GetCanonicalizeUniversalPath(cbxPath); FileUtil.EnsureParentFolderExists(fullyQualifiedOutputFolder); Dictionary <string, FileOutput> output = new Dictionary <string, FileOutput>(); output[buildContext.ProjectID + ".cbx"] = new FileOutput() { Type = FileOutputType.Binary, BinaryContent = cbxOutput.ToArray(), }; // Resource manifest and image sheet manifest is embedded into the CBX file foreach (FileOutput txtResource in resDb.TextResources) { output["res/txt/" + txtResource.CanonicalFileName] = txtResource; } foreach (FileOutput sndResource in resDb.AudioResources) { output["res/snd/" + sndResource.CanonicalFileName] = sndResource; } foreach (FileOutput fontResource in resDb.FontResources) { output["res/ttf/" + fontResource.CanonicalFileName] = fontResource; } foreach (FileOutput binResource in resDb.BinaryResources) { output["res/bin/" + binResource.CanonicalFileName] = binResource; } foreach (FileOutput imgResource in resDb.ImageResources) { output["res/img/" + imgResource.CanonicalFileName] = imgResource; } foreach (string key in resDb.ImageSheetFiles.Keys) { output["res/img/" + key] = resDb.ImageSheetFiles[key]; } new FileOutputExporter(fullyQualifiedOutputFolder).ExportFiles(output); this.finalCbxPath = cbxPath; } return(this); }