diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index b1d6f2ff..ccbb0b3e 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -177,6 +177,7 @@ namespace Cxxi GeneratorKind = LanguageGeneratorKind.CSharp; GenerateLibraryNamespace = true; GenerateFunctionTemplates = false; + WriteOnlyWhenChanged = false; } public bool Verbose = false; @@ -200,5 +201,6 @@ namespace Cxxi public string IncludePrefix; public string WrapperSuffix; public LanguageGeneratorKind GeneratorKind; + public bool WriteOnlyWhenChanged; } } \ No newline at end of file diff --git a/src/Generator/Generators/CLI/CLIGenerator.cs b/src/Generator/Generators/CLI/CLIGenerator.cs index 357c62b6..147a91c7 100644 --- a/src/Generator/Generators/CLI/CLIGenerator.cs +++ b/src/Generator/Generators/CLI/CLIGenerator.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using Cxxi.Passes; using Cxxi.Types; namespace Cxxi.Generators.CLI @@ -8,11 +7,13 @@ namespace Cxxi.Generators.CLI public class CLIGenerator : Generator { private readonly ITypePrinter typePrinter; + private readonly FileHashes fileHashes; public CLIGenerator(Driver driver) : base(driver) { typePrinter = new CLITypePrinter(driver); Type.TypePrinter = typePrinter; + fileHashes = FileHashes.Load("hashes.ser"); } void WriteTemplate(TextTemplate template) @@ -22,11 +23,22 @@ namespace Cxxi.Generators.CLI + template.FileExtension; var path = Path.Combine(Driver.Options.OutputDir, file); + var fullPath = Path.GetFullPath(path); template.Generate(); Console.WriteLine(" Generated '" + file + "'."); - File.WriteAllText(Path.GetFullPath(path), template.ToString()); + + var str = template.ToString(); + + if(Driver.Options.WriteOnlyWhenChanged) + { + var updated = fileHashes.UpdateHash(path, str.GetHashCode()); + if(File.Exists(fullPath) && !updated) + return; + } + + File.WriteAllText(fullPath,str); } public override bool Generate(TranslationUnit unit) diff --git a/src/Generator/Utils/FileHashes.cs b/src/Generator/Utils/FileHashes.cs new file mode 100644 index 00000000..187d7dcd --- /dev/null +++ b/src/Generator/Utils/FileHashes.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +[Serializable] +class FileHashes +{ + private string serializedFile; + private Dictionary fileHashes = new Dictionary(); + + public bool UpdateHash(string file, int hash) + { + if(!fileHashes.ContainsKey(file)) + { + fileHashes.Add(file, hash); + Save(this, serializedFile); + return true; + } + + var oldHash = fileHashes[file]; + fileHashes[file] = hash; + Save(this, serializedFile); + + return oldHash != hash; + } + + public static FileHashes Load(string file) + { + var stream = File.Open(file, FileMode.OpenOrCreate); + var bformatter = new BinaryFormatter(); + + FileHashes obj; + if(stream.Length>0) + obj = (FileHashes)bformatter.Deserialize(stream); + else + obj = new FileHashes(); + obj.serializedFile = file; + stream.Close(); + + return obj; + } + + public static void Save(FileHashes obj, string file) + { + Stream stream = File.Open(file, FileMode.Create); + BinaryFormatter bformatter = new BinaryFormatter(); + + bformatter.Serialize(stream, obj); + stream.Close(); + } +} \ No newline at end of file