示例#1
0
        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.");
            }
        }
示例#2
0
        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();
        }
示例#3
0
        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;
                }
            }
        }