public void CompileCode(Module module) { var assemblyFile = Path.Combine(Options.OutputDir, module.LibraryName + ".dll"); var docFile = Path.ChangeExtension(assemblyFile, ".xml"); var compilerOptions = new StringBuilder(); compilerOptions.Append($" /doc:\"{docFile}\""); compilerOptions.Append(" /debug:pdbonly"); compilerOptions.Append(" /unsafe"); var compilerParameters = new CompilerParameters { GenerateExecutable = false, TreatWarningsAsErrors = false, OutputAssembly = assemblyFile, GenerateInMemory = false, CompilerOptions = compilerOptions.ToString() }; if (module != Options.SystemModule) { compilerParameters.ReferencedAssemblies.Add( Path.Combine(Options.OutputDir, $"{Options.SystemModule.LibraryName}.dll")); } // add a reference to System.Core compilerParameters.ReferencedAssemblies.Add(typeof(Enumerable).Assembly.Location); var location = System.Reflection.Assembly.GetExecutingAssembly().Location; var outputDir = Path.GetDirectoryName(location); var locationRuntime = Path.Combine(outputDir, "CppSharp.Runtime.dll"); compilerParameters.ReferencedAssemblies.Add(locationRuntime); compilerParameters.ReferencedAssemblies.AddRange( (from dependency in module.Dependencies where libraryMappings.ContainsKey(dependency) select libraryMappings[dependency]).ToArray()); compilerParameters.ReferencedAssemblies.AddRange(module.ReferencedAssemblies.ToArray()); Diagnostics.Message($"Compiling {module.LibraryName}..."); CompilerResults compilerResults; using (var codeProvider = new CSharpCodeProvider( new Dictionary <string, string> { { "CompilerDirectoryPath", ManagedToolchain.FindCSharpCompilerDir() } })) { compilerResults = codeProvider.CompileAssemblyFromFile( compilerParameters, module.CodeFiles.ToArray()); } var errors = compilerResults.Errors.Cast <CompilerError>().Where(e => !e.IsWarning && // HACK: auto-compiling on OS X produces "errors" which do not affect compilation so we ignore them (!Platform.IsMacOS || !e.ErrorText.EndsWith("(Location of the symbol related to previous warning)", StringComparison.Ordinal))).ToList(); foreach (var error in errors) { Diagnostics.Error(error.ToString()); } HasCompilationErrors = errors.Count > 0; if (!HasCompilationErrors) { libraryMappings[module] = Path.Combine(outputDir, assemblyFile); Diagnostics.Message("Compilation succeeded."); } }
public static void Run(ILibrary library) { var options = new DriverOptions(); var driver = new Driver(options); library.Setup(driver); driver.Setup(); if (driver.Options.Verbose) { Diagnostics.Level = DiagnosticKind.Debug; } if (!options.Quiet) { Diagnostics.Message("Parsing libraries..."); } if (!driver.ParseLibraries()) { return; } if (!options.Quiet) { Diagnostics.Message("Parsing code..."); } if (!driver.ParseCode()) { Diagnostics.Error("CppSharp has encountered an error while parsing code."); return; } new CleanUnitPass { Context = driver.Context }.VisitASTContext(driver.Context.ASTContext); options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any()); if (!options.Quiet) { Diagnostics.Message("Processing code..."); } driver.SetupPasses(library); library.Preprocess(driver, driver.Context.ASTContext); driver.ProcessCode(); library.Postprocess(driver, driver.Context.ASTContext); if (!options.Quiet) { Diagnostics.Message("Generating code..."); } var outputs = driver.GenerateCode(); foreach (var output in outputs) { foreach (var pass in driver.Context.GeneratorOutputPasses.Passes) { pass.VisitGeneratorOutput(output); } } if (!driver.Options.DryRun) { driver.SaveCode(outputs); if (driver.Options.IsCSharpGenerator && driver.Options.CompileCode) { foreach (var module in driver.Options.Modules) { driver.CompileCode(module); if (driver.HasCompilationErrors) { break; } } } } driver.Generator.Dispose(); driver.Context.TargetInfo.Dispose(); driver.ParserOptions.Dispose(); }
public void CompileCode() { if (!Options.CompileCode) { return; } var assemblyFile = string.IsNullOrEmpty(Options.LibraryName) ? "out.dll" : Options.LibraryName + ".dll"; var docFile = Path.ChangeExtension(Path.GetFileName(assemblyFile), ".xml"); var compilerOptions = new StringBuilder(); compilerOptions.Append(" /doc:" + docFile); compilerOptions.Append(" /debug:pdbonly"); compilerOptions.Append(" /unsafe"); var compilerParameters = new CompilerParameters { GenerateExecutable = false, TreatWarningsAsErrors = false, OutputAssembly = assemblyFile, GenerateInMemory = false, CompilerOptions = compilerOptions.ToString() }; // add a reference to System.Core compilerParameters.ReferencedAssemblies.Add(typeof(Enumerable).Assembly.Location); var location = Assembly.GetExecutingAssembly().Location; 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 <string, string> { { "CompilerVersion", "v4.0" } }); var compilerResults = codeProvider.CompileAssemblyFromFile( compilerParameters, Options.CodeFiles.ToArray()); var errors = compilerResults.Errors.Cast <CompilerError>(); foreach (var error in errors.Where(error => !error.IsWarning)) { Diagnostics.Error(error.ToString()); } if (compilerResults.Errors.Count == 0) { var wrapper = Path.Combine(outputDir, assemblyFile); foreach (var library in Options.Libraries) { libraryMappings[library] = wrapper; } } }