From 7da56fc0829b6402837b253ab206e88aa52605e6 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Mon, 15 Jun 2015 00:49:02 +0300 Subject: [PATCH] Added automatic adding of references between dependent modules. Signed-off-by: Dimitar Dobrev --- src/Generator/Driver.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index bcfe4766..153923e9 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -32,6 +32,8 @@ namespace CppSharp public ASTContext ASTContext { get; private set; } public SymbolContext Symbols { get; private set; } + private static readonly Dictionary libraryMappings = new Dictionary(); + public Driver(DriverOptions options, IDiagnosticConsumer diagnostics) { Options = options; @@ -363,10 +365,16 @@ namespace CppSharp compilerParameters.ReferencedAssemblies.Add(typeof (object).Assembly.Location); var location = Assembly.GetExecutingAssembly().Location; - var locationRuntime = Path.Combine(Path.GetDirectoryName(location), - "CppSharp.Runtime.dll"); + var outputDir = Path.GetDirectoryName(location); + var locationRuntime = Path.Combine(outputDir, "CppSharp.Runtime.dll"); compilerParameters.ReferencedAssemblies.Add(locationRuntime); + compilerParameters.ReferencedAssemblies.AddRange(Symbols.Libraries.SelectMany( + lib => lib.Dependencies.Where( + d => libraryMappings.ContainsKey(d) && + !compilerParameters.ReferencedAssemblies.Contains(libraryMappings[d])) + .Select(l => libraryMappings[l])).ToArray()); + var codeProvider = new CSharpCodeProvider( new Dictionary {{"CompilerVersion", "v4.0"}}); var compilerResults = codeProvider.CompileAssemblyFromFile( @@ -375,6 +383,13 @@ namespace CppSharp var errors = compilerResults.Errors.Cast(); foreach (var error in errors.Where(error => !error.IsWarning)) Diagnostics.EmitError(error.ToString()); + + if (compilerResults.Errors.Count == 0) + { + var wrapper = Path.Combine(outputDir, assemblyFile); + foreach (var library in Options.Libraries) + libraryMappings[library] = wrapper; + } } public void AddTranslationUnitPass(TranslationUnitPass pass)