private static BuildingMod ReadProperties(string modFolder, IBuildStatus status) { if (modFolder.EndsWith("\\") || modFolder.EndsWith("/")) { modFolder = modFolder.Substring(0, modFolder.Length - 1); } var modName = Path.GetFileName(modFolder); status.SetStatus(Language.GetTextValue("tModLoader.MSReadingProperties") + modName); BuildProperties properties; try { properties = BuildProperties.ReadBuildFile(modFolder); } catch (Exception e) { ErrorLogger.LogBuildError("Failed to load " + Path.Combine(modFolder, "build.txt") + Environment.NewLine + e); return(null); } var file = Path.Combine(ModPath, modName + ".tmod"); var modFile = new TmodFile(file) { name = modName, version = properties.version }; return(new BuildingMod(modFile, properties, modFolder)); }
private BuildingMod ReadProperties(string modFolder) { if (modFolder.EndsWith("\\") || modFolder.EndsWith("/")) { modFolder = modFolder.Substring(0, modFolder.Length - 1); } var modName = Path.GetFileName(modFolder); status.SetStatus(Language.GetTextValue("tModLoader.ReadingProperties", modName)); BuildProperties properties; try { properties = BuildProperties.ReadBuildFile(modFolder); } catch (Exception e) { status.LogError(Language.GetTextValue("tModLoader.BuildErrorFailedLoadBuildTxt", Path.Combine(modFolder, "build.txt")), e); return(null); } var file = Path.Combine(ModPath, modName + ".tmod"); var modFile = new TmodFile(file) { name = modName, version = properties.version }; return(new BuildingMod(modFile, properties, modFolder)); }
private static bool Build(BuildingMod mod, IBuildStatus status) { byte[] winDLL = null; byte[] monoDLL = null; byte[] winPDB = null; if (mod.properties.noCompile) { winDLL = monoDLL = ReadIfExists(Path.Combine(mod.path, "All.dll")); winPDB = ReadIfExists(Path.Combine(mod.path, "All.pdb")); if (winDLL == null) { winDLL = ReadIfExists(Path.Combine(mod.path, "Windows.dll")); monoDLL = ReadIfExists(Path.Combine(mod.path, "Mono.dll")); winPDB = ReadIfExists(Path.Combine(mod.path, "Windows.pdb")); } if (winDLL == null || monoDLL == null) { ErrorLogger.LogDllBuildError(mod.path); return(false); } } else { var refMods = FindReferencedMods(mod.properties); if (refMods == null) { return(false); } if (Program.LaunchParameters.ContainsKey("-eac")) { if (!windows) { ErrorLogger.LogBuildError("Edit and continue is only supported on windows"); return(false); } try { status.SetStatus("Loading pre-compiled Windows.dll with edit and continue support"); var winPath = Program.LaunchParameters["-eac"]; var pdbPath = Path.ChangeExtension(winPath, "pdb"); winDLL = File.ReadAllBytes(winPath); winPDB = File.ReadAllBytes(pdbPath); mod.properties.editAndContinue = true; } catch (Exception e) { ErrorLogger.LogBuildError("Failed to load pre-compiled edit and continue dll " + e); return(false); } } else { status.SetStatus(Language.GetTextValue("tModLoader.MSCompilingWindows", mod)); status.SetProgress(0, 2); CompileMod(mod, refMods, true, ref winDLL, ref winPDB); } if (winDLL == null) { return(false); } status.SetStatus(Language.GetTextValue("tModLoader.MSCompilingMono", mod)); status.SetProgress(1, 2); CompileMod(mod, refMods, false, ref monoDLL, ref winPDB); //the pdb reference won't actually be written to if (monoDLL == null) { return(false); } } if (!VerifyName(mod.Name, winDLL) || !VerifyName(mod.Name, monoDLL)) { return(false); } status.SetStatus(Language.GetTextValue("tModLoader.MSBuilding") + mod + "..."); status.SetProgress(0, 1); mod.modFile.AddFile("Info", mod.properties.ToBytes()); if (Equal(winDLL, monoDLL)) { mod.modFile.AddFile("All.dll", winDLL); if (winPDB != null) { mod.modFile.AddFile("All.pdb", winPDB); } } else { mod.modFile.AddFile("Windows.dll", winDLL); mod.modFile.AddFile("Mono.dll", monoDLL); if (winPDB != null) { mod.modFile.AddFile("Windows.pdb", winPDB); } } foreach (var resource in Directory.GetFiles(mod.path, "*", SearchOption.AllDirectories)) { var relPath = resource.Substring(mod.path.Length + 1); if (mod.properties.ignoreFile(relPath) || relPath == "build.txt" || relPath == ".gitattributes" || relPath == ".gitignore" || relPath.StartsWith(".git" + Path.DirectorySeparatorChar) || relPath.StartsWith(".vs" + Path.DirectorySeparatorChar) || relPath.StartsWith("bin" + Path.DirectorySeparatorChar) || relPath.StartsWith("obj" + Path.DirectorySeparatorChar) || !mod.properties.includeSource && sourceExtensions.Contains(Path.GetExtension(resource)) || Path.GetFileName(resource) == "Thumbs.db") { continue; } mod.modFile.AddFile(relPath, File.ReadAllBytes(resource)); } WAVCacheIO.ClearCache(mod.Name); mod.modFile.Save(); EnableMod(mod.modFile); ActivateExceptionReporting(); ModLoader.isModder = true; return(true); }
private static bool Build(BuildingMod mod, IBuildStatus status) { byte[] winDLL = null; byte[] monoDLL = null; byte[] winPDB = null; if (mod.properties.noCompile) { winDLL = monoDLL = ReadIfExists(Path.Combine(mod.path, "All.dll")); winPDB = ReadIfExists(Path.Combine(mod.path, "All.pdb")); if (winDLL == null) { winDLL = ReadIfExists(Path.Combine(mod.path, "Windows.dll")); monoDLL = ReadIfExists(Path.Combine(mod.path, "Mono.dll")); winPDB = ReadIfExists(Path.Combine(mod.path, "Windows.pdb")); } if (winDLL == null || monoDLL == null) { ErrorLogger.LogDllBuildError(mod.path); return false; } } else { var refMods = FindReferencedMods(mod.properties); if (refMods == null) return false; if (Program.LaunchParameters.ContainsKey("-eac")) { if (!windows) { ErrorLogger.LogBuildError("Edit and continue is only supported on windows"); return false; } try { status.SetStatus("Loading pre-compiled Windows.dll with edit and continue support"); var winPath = Program.LaunchParameters["-eac"]; var pdbPath = Path.ChangeExtension(winPath, "pdb"); winDLL = File.ReadAllBytes(winPath); winPDB = File.ReadAllBytes(pdbPath); mod.properties.editAndContinue = true; } catch (Exception e) { ErrorLogger.LogBuildError("Failed to load pre-compiled edit and continue dll "+e); return false; } } else { status.SetStatus("Compiling " + mod.Name + " for Windows..."); status.SetProgress(0, 2); CompileMod(mod, refMods, true, ref winDLL, ref winPDB); } status.SetStatus("Compiling " + mod.Name + " for Mono..."); status.SetProgress(1, 2); CompileMod(mod, refMods, false, ref monoDLL, ref winPDB);//the pdb reference won't actually be written to if (winDLL == null || monoDLL == null) return false; } if (!VerifyName(mod.Name, winDLL) || !VerifyName(mod.Name, monoDLL)) return false; status.SetStatus("Building "+mod.Name+"..."); status.SetProgress(0, 1); mod.modFile.AddFile("Info", mod.properties.ToBytes()); if (Equal(winDLL, monoDLL)) { mod.modFile.AddFile("All.dll", winDLL); if (winPDB != null) mod.modFile.AddFile("All.pdb", winPDB); } else { mod.modFile.AddFile("Windows.dll", winDLL); mod.modFile.AddFile("Mono.dll", monoDLL); if (winPDB != null) mod.modFile.AddFile("Windows.pdb", winPDB); } foreach (var resource in Directory.GetFiles(mod.path, "*", SearchOption.AllDirectories)) { var relPath = resource.Substring(mod.path.Length + 1); if (mod.properties.ignoreFile(relPath) || relPath == "build.txt" || !mod.properties.includeSource && Path.GetExtension(resource) == ".cs" || Path.GetFileName(resource) == "Thumbs.db") continue; mod.modFile.AddFile(relPath, File.ReadAllBytes(resource)); } WAVCacheIO.ClearCache(mod.Name); mod.modFile.Save(); EnableMod(mod.modFile); return true; }
private static BuildingMod ReadProperties(string modFolder, IBuildStatus status) { if (modFolder.EndsWith("\\") || modFolder.EndsWith("/")) modFolder = modFolder.Substring(0, modFolder.Length - 1); var modName = Path.GetFileName(modFolder); status.SetStatus("Reading Properties: " + modName); BuildProperties properties; try { properties = BuildProperties.ReadBuildFile(modFolder); } catch (Exception e) { ErrorLogger.LogBuildError("Failed to load " + Path.Combine(modFolder, "build.txt") + Environment.NewLine + e); return null; } var file = Path.Combine(ModPath, modName + ".tmod"); var modFile = new TmodFile(file) { name = modName, version = properties.version }; return new BuildingMod(modFile, properties, modFolder); }