private async Task <Possible <ProjectGraphResult> > TryComputeBuildGraphAsync(IEnumerable <AbsolutePath> msBuildSearchLocations, IEnumerable <AbsolutePath> dotnetSearchLocations, IEnumerable <AbsolutePath> parsingEntryPoints, BuildParameters.IBuildParameters buildParameters) { // We create a unique output file on the obj folder associated with the current front end, and using a GUID as the file name AbsolutePath outputDirectory = m_host.GetFolderForFrontEnd(MsBuildFrontEnd.Name); AbsolutePath outputFile = outputDirectory.Combine(m_context.PathTable, Guid.NewGuid().ToString()); // We create a unique response file that will contain the tool arguments AbsolutePath responseFile = outputDirectory.Combine(m_context.PathTable, Guid.NewGuid().ToString()); // Make sure the directories are there FileUtilities.CreateDirectory(outputDirectory.ToString(m_context.PathTable)); Possible <ProjectGraphWithPredictionsResult <AbsolutePath> > maybeProjectGraphResult = await ComputeBuildGraphAsync(responseFile, parsingEntryPoints, outputFile, msBuildSearchLocations, dotnetSearchLocations, buildParameters); if (!maybeProjectGraphResult.Succeeded) { // A more specific error has been logged already return(maybeProjectGraphResult.Failure); } var projectGraphResult = maybeProjectGraphResult.Result; if (m_resolverSettings.KeepProjectGraphFile != true) { DeleteGraphBuilderRelatedFiles(outputFile, responseFile); } else { // Graph-related files are requested to be left on disk. Let's print a message with their location. Tracing.Logger.Log.GraphBuilderFilesAreNotRemoved(m_context.LoggingContext, outputFile.ToString(m_context.PathTable), responseFile.ToString(m_context.PathTable)); } if (!projectGraphResult.Succeeded) { var failure = projectGraphResult.Failure; Tracing.Logger.Log.ProjectGraphConstructionError(m_context.LoggingContext, failure.HasLocation ? failure.Location : m_resolverSettings.Location(m_context.PathTable), failure.Message); return(new MsBuildGraphConstructionFailure(m_resolverSettings, m_context.PathTable)); } ProjectGraphWithPredictions <AbsolutePath> projectGraph = projectGraphResult.Result; // The module contains all project files that are part of the graph var projectFiles = new HashSet <AbsolutePath>(); foreach (ProjectWithPredictions <AbsolutePath> node in projectGraph.ProjectNodes) { projectFiles.Add(node.FullPath); } var moduleDescriptor = ModuleDescriptor.CreateWithUniqueId(m_context.StringTable, m_resolverSettings.ModuleName, this); var moduleDefinition = ModuleDefinition.CreateModuleDefinitionWithImplicitReferences( moduleDescriptor, m_resolverSettings.RootTraversal, m_resolverSettings.File, projectFiles, allowedModuleDependencies: null, // no module policies cyclicalFriendModules: null); // no whitelist of cycles return(new ProjectGraphResult(projectGraph, moduleDefinition, projectGraphResult.PathToMsBuild, projectGraphResult.PathToDotNetExe)); }
private async Task <Possible <RushGraphResult> > TryComputeBuildGraphAsync(BuildParameters.IBuildParameters buildParameters) { // We create a unique output file on the obj folder associated with the current front end, and using a GUID as the file name AbsolutePath outputDirectory = m_host.GetFolderForFrontEnd(Name); AbsolutePath outputFile = outputDirectory.Combine(m_context.PathTable, Guid.NewGuid().ToString()); // Make sure the directories are there FileUtilities.CreateDirectory(outputDirectory.ToString(m_context.PathTable)); Possible <RushGraph> maybeRushGraph = await ComputeBuildGraphAsync(outputFile, buildParameters); if (!maybeRushGraph.Succeeded) { // A more specific error has been logged already return(maybeRushGraph.Failure); } var rushGraph = maybeRushGraph.Result; if (m_resolverSettings.KeepProjectGraphFile != true) { DeleteGraphBuilderRelatedFiles(outputFile); } else { // Graph-related files are requested to be left on disk. Let's print a message with their location. Tracing.Logger.Log.GraphBuilderFilesAreNotRemoved(m_context.LoggingContext, outputFile.ToString(m_context.PathTable)); } // The module contains all project files that are part of the graph var projectFiles = new HashSet <AbsolutePath>(); foreach (RushProject project in rushGraph.Projects) { projectFiles.Add(project.ProjectPath(m_context.PathTable)); } var moduleDescriptor = ModuleDescriptor.CreateWithUniqueId(m_context.StringTable, m_resolverSettings.ModuleName, this); var moduleDefinition = ModuleDefinition.CreateModuleDefinitionWithImplicitReferences( moduleDescriptor, m_resolverSettings.Root, m_resolverSettings.File, projectFiles, allowedModuleDependencies: null, // no module policies cyclicalFriendModules: null); // no whitelist of cycles return(new RushGraphResult(rushGraph, moduleDefinition)); }
private async Task <Possible <NinjaGraphWithModuleDefinition> > TryComputeBuildGraphAsync() { Possible <NinjaGraphResult> maybeGraph = await ComputeBuildGraphAsync(); var result = maybeGraph.Result; var specFileConfig = SpecFile.ChangeExtension(m_context.PathTable, PathAtom.Create(m_context.StringTable, ".ninja.dsc")); // It needs to be a .dsc for the parsing to work var moduleDescriptor = ModuleDescriptor.CreateWithUniqueId(m_context.StringTable, m_resolverSettings.ModuleName, this); var moduleDefinition = ModuleDefinition.CreateModuleDefinitionWithImplicitReferences( moduleDescriptor, ProjectRoot, m_resolverSettings.File, new List <AbsolutePath>() { specFileConfig }, allowedModuleDependencies: null, // no module policies cyclicalFriendModules: null); // no whitelist of cycles return(new NinjaGraphWithModuleDefinition(result.Graph, moduleDefinition)); }