Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }