private Task <SandboxedProcessResult> ExecuteCMakeRunner(AbsolutePath argumentsFile, IEnumerable <AbsolutePath> searchLocations) { string rootString = ProjectRoot.ToString(m_context.PathTable); AbsolutePath outputDirectory = argumentsFile.GetParent(m_context.PathTable); FileUtilities.CreateDirectory(outputDirectory.ToString(m_context.PathTable)); // Ensure it exists SerializeToolArguments(argumentsFile, searchLocations); void CleanUpOnResult() { try { FileUtilities.DeleteFile(argumentsFile.ToString(m_context.PathTable)); } catch (BuildXLException e) { Tracing.Logger.Log.CouldNotDeleteToolArgumentsFile( m_context.LoggingContext, m_resolverSettings.Location(m_context.PathTable), argumentsFile.ToString(m_context.PathTable), e.Message); } } var environment = FrontEndUtilities.GetEngineEnvironment(m_host.Engine, CMakeFrontEnd.Name); // TODO: This manual configuration is temporary. Remove after the cloud builders have the correct configuration var pathToManuallyDroppedTools = m_configuration.Layout.BuildEngineDirectory.Combine(m_context.PathTable, RelativePath.Create(m_context.StringTable, @"tools\CmakeNinjaPipEnvironment")); if (FileUtilities.Exists(pathToManuallyDroppedTools.ToString(m_context.PathTable))) { environment = SpecialCloudConfiguration.OverrideEnvironmentForCloud(environment, pathToManuallyDroppedTools, m_context); } var buildParameters = BuildParameters.GetFactory().PopulateFromDictionary(new ReadOnlyDictionary <string, string>(environment)); return(FrontEndUtilities.RunSandboxedToolAsync( m_context, m_pathToTool.ToString(m_context.PathTable), buildStorageDirectory: outputDirectory.ToString(m_context.PathTable), fileAccessManifest: GenerateFileAccessManifest(m_pathToTool.GetParent(m_context.PathTable)), arguments: I($@"""{argumentsFile.ToString(m_context.PathTable)}"""), workingDirectory: rootString, description: "CMakeRunner", buildParameters, onResult: CleanUpOnResult)); }
private Task <SandboxedProcessResult> RunMsBuildGraphBuilderAsync( AbsolutePath responseFile, IEnumerable <AbsolutePath> projectEntryPoints, AbsolutePath outputFile, IEnumerable <AbsolutePath> searchLocations, BuildParameters.IBuildParameters buildParameters) { AbsolutePath toolDirectory = m_configuration.Layout.BuildEngineDirectory.Combine(m_context.PathTable, RelativePathToGraphConstructionTool).GetParent(m_context.PathTable); string pathToTool = m_configuration.Layout.BuildEngineDirectory.Combine(m_context.PathTable, RelativePathToGraphConstructionTool).ToString(m_context.PathTable); string outputDirectory = outputFile.GetParent(m_context.PathTable).ToString(m_context.PathTable); string outputFileString = outputFile.ToString(m_context.PathTable); string enlistmentRoot = m_resolverSettings.Root.ToString(m_context.PathTable); IReadOnlyCollection <string> entryPointTargets = m_resolverSettings.InitialTargets ?? CollectionUtilities.EmptyArray <string>(); var requestedQualifiers = m_requestedQualifiers.Select(qualifierId => MsBuildResolverUtils.CreateQualifierAsGlobalProperties(qualifierId, m_context)).ToList(); var arguments = new MSBuildGraphBuilderArguments( enlistmentRoot, projectEntryPoints.Select(entryPoint => entryPoint.ToString(m_context.PathTable)).ToList(), outputFileString, new GlobalProperties(m_resolverSettings.GlobalProperties ?? CollectionUtilities.EmptyDictionary <string, string>()), searchLocations.Select(location => location.ToString(m_context.PathTable)).ToList(), entryPointTargets, requestedQualifiers, m_resolverSettings.AllowProjectsToNotSpecifyTargetProtocol == true); var responseFilePath = responseFile.ToString(m_context.PathTable); SerializeResponseFile(responseFilePath, arguments); Tracing.Logger.Log.LaunchingGraphConstructionTool(m_context.LoggingContext, m_resolverSettings.Location(m_context.PathTable), arguments.ToString(), pathToTool); // Just being defensive, make sure there is not an old output file lingering around File.Delete(outputFileString); return(FrontEndUtilities.RunSandboxedToolAsync( m_context, pathToTool, buildStorageDirectory: outputDirectory, fileAccessManifest: GenerateFileAccessManifest(toolDirectory, outputFile), arguments: I($"\"{responseFilePath}\""), workingDirectory: outputDirectory, description: "MsBuild graph builder", buildParameters, beforeLaunch: () => ConnectToServerPipeAndLogProgress(outputFileString))); }
private Task <SandboxedProcessResult> RunNinjaGraphBuilderAsync(AbsolutePath outputFile) { AbsolutePath pathToTool = Configuration.Layout.BuildEngineDirectory.Combine(Context.PathTable, m_relativePathToGraphConstructionTool); string rootString = ProjectRoot.ToString(Context.PathTable); AbsolutePath outputDirectory = outputFile.GetParent(Context.PathTable); FileUtilities.CreateDirectory(outputDirectory.ToString(Context.PathTable)); // Ensure it exists AbsolutePath argumentsFile = outputDirectory.Combine(Context.PathTable, Guid.NewGuid().ToString()); SerializeToolArguments(outputFile, argumentsFile); // After running the tool we'd like to remove some files void CleanUpOnResult() { try { var shouldKeepArgs = m_resolverSettings.KeepToolFiles ?? false; if (!shouldKeepArgs) { FileUtilities.DeleteFile(argumentsFile.ToString(Context.PathTable)); } } catch (BuildXLException e) { Tracing.Logger.Log.CouldNotDeleteToolArgumentsFile( Context.LoggingContext, m_resolverSettings.Location(Context.PathTable), argumentsFile.ToString(Context.PathTable), e.Message); } } return(FrontEndUtilities.RunSandboxedToolAsync( Context, pathToTool.ToString(Context.PathTable), buildStorageDirectory: outputDirectory.ToString(Context.PathTable), fileAccessManifest: GenerateFileAccessManifest(pathToTool.GetParent(Context.PathTable), outputFile), arguments: I($@"""{argumentsFile.ToString(Context.PathTable)}"""), workingDirectory: SpecFile.GetParent(Context.PathTable).ToString(Context.PathTable), description: "Ninja graph builder", BuildParameters.GetFactory().PopulateFromEnvironment(), onResult: CleanUpOnResult)); }
private Task <SandboxedProcessResult> RunNinjaGraphBuilderAsync(AbsolutePath outputFile) { AbsolutePath outputDirectory = outputFile.GetParent(m_context.PathTable); FileUtilities.CreateDirectory(outputDirectory.ToString(m_context.PathTable)); // Ensure it exists AbsolutePath argumentsFile = outputDirectory.Combine(m_context.PathTable, Guid.NewGuid().ToString()); SerializeToolArguments(outputFile, argumentsFile); // After running the tool we'd like to remove some files void cleanUpOnResult() { try { var shouldKeepArgs = m_resolverSettings.KeepProjectGraphFile ?? false; if (!shouldKeepArgs) { FileUtilities.DeleteFile(argumentsFile.ToString(m_context.PathTable)); } } catch (BuildXLException e) { Tracing.Logger.Log.CouldNotDeleteToolArgumentsFile( m_context.LoggingContext, m_resolverSettings.Location(m_context.PathTable), argumentsFile.ToString(m_context.PathTable), e.Message); } } return(FrontEndUtilities.RunSandboxedToolAsync( m_context, m_pathToTool.ToString(m_context.PathTable), buildStorageDirectory: outputDirectory.ToString(m_context.PathTable), fileAccessManifest: GenerateFileAccessManifest(m_pathToTool.GetParent(m_context.PathTable), outputFile), arguments: I($@"""{argumentsFile.ToString(m_context.PathTable)}"""), workingDirectory: SpecFile.GetParent(m_context.PathTable).ToString(m_context.PathTable), description: "Ninja graph builder", RetrieveBuildParameters(), onResult: cleanUpOnResult)); }
private Task <SandboxedProcessResult> RunMsBuildGraphBuilderAsync( AbsolutePath responseFile, IEnumerable <AbsolutePath> projectEntryPoints, AbsolutePath outputFile, IEnumerable <AbsolutePath> msBuildSearchLocations, AbsolutePath dotnetExeLocation, BuildParameters.IBuildParameters buildParameters) { Contract.Assert(!m_resolverSettings.ShouldRunDotNetCoreMSBuild() || dotnetExeLocation.IsValid); AbsolutePath toolDirectory = m_configuration.Layout.BuildEngineDirectory.Combine(m_context.PathTable, RelativePathToGraphConstructionTool).GetParent(m_context.PathTable); string outputDirectory = outputFile.GetParent(m_context.PathTable).ToString(m_context.PathTable); string outputFileString = outputFile.ToString(m_context.PathTable); IReadOnlyCollection <string> entryPointTargets = m_resolverSettings.InitialTargets ?? CollectionUtilities.EmptyArray <string>(); var requestedQualifiers = m_host.QualifiersToEvaluate.Select(qualifierId => MsBuildResolverUtils.CreateQualifierAsGlobalProperties(qualifierId, m_context)).ToList(); var arguments = new MSBuildGraphBuilderArguments( projectEntryPoints.Select(entryPoint => entryPoint.ToString(m_context.PathTable)).ToList(), outputFileString, new GlobalProperties(m_resolverSettings.GlobalProperties ?? CollectionUtilities.EmptyDictionary <string, string>()), msBuildSearchLocations.Select(location => location.ToString(m_context.PathTable)).ToList(), entryPointTargets, requestedQualifiers, m_resolverSettings.AllowProjectsToNotSpecifyTargetProtocol == true, m_resolverSettings.ShouldRunDotNetCoreMSBuild()); var responseFilePath = responseFile.ToString(m_context.PathTable); SerializeResponseFile(responseFilePath, arguments); string graphConstructionToolPath = m_configuration.Layout.BuildEngineDirectory.Combine(m_context.PathTable, RelativePathToGraphConstructionTool).ToString(m_context.PathTable); string pathToTool; string toolArguments; // if we should call the dotnet core version of MSBuild, we need to actually call dotnet.exe and pass the tool itself as its first argument if (m_resolverSettings.ShouldRunDotNetCoreMSBuild()) { pathToTool = dotnetExeLocation.ToString(m_context.PathTable); toolArguments = I($"\"{graphConstructionToolPath}\" \"{responseFilePath}\""); } else { pathToTool = graphConstructionToolPath; toolArguments = I($"\"{responseFilePath}\""); } Tracing.Logger.Log.LaunchingGraphConstructionTool(m_context.LoggingContext, m_resolverSettings.Location(m_context.PathTable), arguments.ToString(), pathToTool); // Just being defensive, make sure there is not an old output file lingering around File.Delete(outputFileString); return(FrontEndUtilities.RunSandboxedToolAsync( m_context, pathToTool, buildStorageDirectory: outputDirectory, fileAccessManifest: GenerateFileAccessManifest(toolDirectory, outputFile), arguments: toolArguments, workingDirectory: outputDirectory, description: "MsBuild graph builder", buildParameters, beforeLaunch: () => ConnectToServerPipeAndLogProgress(outputFileString))); }