public BuildResult Build(GenerateResult generateResult, BuildPartition buildPartition, ILogger logger) { logger.WriteLineInfo($"BuildScript: {generateResult.ArtifactsPaths.BuildScriptFilePath}"); var syntaxTree = CSharpSyntaxTree.ParseText(File.ReadAllText(generateResult.ArtifactsPaths.ProgramCodePath)); var compilationOptions = new CSharpCompilationOptions( outputKind: OutputKind.ConsoleApplication, optimizationLevel: OptimizationLevel.Release, allowUnsafe: true, platform: GetPlatform(buildPartition.Platform), deterministic: true); compilationOptions = compilationOptions.WithIgnoreCorLibraryDuplicatedTypes(); var references = Generator .GetAllReferences(buildPartition.RepresentativeBenchmarkCase) .Select(assembly => AssemblyMetadata.CreateFromFile(assembly.Location)) .Concat(FrameworkAssembliesMetadata.Value) .Distinct() .Select(uniqueMetadata => uniqueMetadata.GetReference()) .ToList(); var(result, missingReferences) = Build(generateResult, syntaxTree, compilationOptions, references); if (result.IsBuildSuccess || !missingReferences.Any()) { return(result); } var withMissingReferences = references.Union(missingReferences.Select(assemblyMetadata => assemblyMetadata.GetReference())); return(Build(generateResult, syntaxTree, compilationOptions, withMissingReferences).result); }
private BuildResult Build(GenerateResult generateResult, BuildPartition buildPartition, ILogger logger, CancellationToken cancellationToken) { var syntaxTree = CSharpSyntaxTree.ParseText( text: File.ReadAllText(generateResult.ArtifactsPaths.ProgramCodePath), // this version is used to parse the boilerplate code generated by BDN, so th benchmark themselves can use more recent version options: new CSharpParseOptions(LanguageVersion.CSharp7_3), cancellationToken: cancellationToken); var compilationOptions = new CSharpCompilationOptions( outputKind: OutputKind.ConsoleApplication, optimizationLevel: OptimizationLevel.Release, allowUnsafe: true, platform: GetPlatform(buildPartition.Platform), deterministic: true); compilationOptions = compilationOptions.WithIgnoreCorLibraryDuplicatedTypes(); var references = Generator .GetAllReferences(buildPartition.RepresentativeBenchmarkCase) .Select(assembly => AssemblyMetadata.CreateFromFile(assembly.Location)) .Concat(FrameworkAssembliesMetadata.Value) .Distinct() .Select(uniqueMetadata => uniqueMetadata.GetReference()) .ToList(); var(result, missingReferences) = Build(generateResult, syntaxTree, compilationOptions, references, cancellationToken); if (result.IsBuildSuccess || !missingReferences.Any()) { return(result); } var withMissingReferences = references.Union(missingReferences.Select(assemblyMetadata => assemblyMetadata.GetReference())); return(Build(generateResult, syntaxTree, compilationOptions, withMissingReferences, cancellationToken).result); }