private static Pip CreateCmdPip(BuildXLContext context, string tempDirectory, string outFile, bool is64Bit) { Contract.Requires(context != null); Contract.Requires(tempDirectory != null); Contract.Requires(!string.IsNullOrEmpty(outFile)); var pathTable = context.PathTable; string executable = is64Bit ? CmdHelper.CmdX64 : CmdHelper.CmdX86; FileArtifact executableArtifact = FileArtifact.CreateSourceFile(AbsolutePath.Create(pathTable, executable)); string workingDirectory = AssemblyDirectory; AbsolutePath workingDirectoryAbsolutePath = AbsolutePath.Create(pathTable, workingDirectory); AbsolutePath outFilePath = AbsolutePath.Create(pathTable, outFile); FileArtifact outFileArtifact = FileArtifact.CreateSourceFile(outFilePath).CreateNextWrittenVersion(); var pip = new BuildXL.Pips.Operations.Process( executableArtifact, workingDirectoryAbsolutePath, PipDataBuilder.CreatePipData( context.StringTable, " ", PipDataFragmentEscaping.CRuntimeArgumentRules, "/d", "/c", "echo", "hello", ">", outFileArtifact), FileArtifact.Invalid, PipData.Invalid, ReadOnlyArray <EnvironmentVariable> .Empty, FileArtifact.Invalid, FileArtifact.Invalid, FileArtifact.Invalid, AbsolutePath.Create(pathTable, tempDirectory), null, null, ReadOnlyArray <FileArtifact> .FromWithoutCopy(executableArtifact), ReadOnlyArray <FileArtifactWithAttributes> .FromWithoutCopy(outFileArtifact.WithAttributes()), ReadOnlyArray <DirectoryArtifact> .Empty, ReadOnlyArray <DirectoryArtifact> .Empty, ReadOnlyArray <PipId> .Empty, ReadOnlyArray <AbsolutePath> .From(CmdHelper.GetCmdDependencies(pathTable)), ReadOnlyArray <AbsolutePath> .From(CmdHelper.GetCmdDependencyScopes(pathTable)), ReadOnlyArray <StringId> .Empty, ReadOnlyArray <int> .Empty, ReadOnlyArray <ProcessSemaphoreInfo> .Empty, provenance: PipProvenance.CreateDummy(context), toolDescription: StringId.Invalid, additionalTempDirectories: ReadOnlyArray <AbsolutePath> .Empty); return(pip); }
/// <summary> /// Verifies that the arguments constructed in the fragment (string) matches with the one in the resulting graph. /// </summary> /// <param name="graph">Resulting graph.</param> /// <param name="fragmentOrigin">Graph fragment where the arguments are constructed.</param> /// <param name="processInFragment">Process in fragments whose arguments are to be verified.</param> private void VerifyMatchingArguments(PipGraph graph, TestPipGraphFragment fragmentOrigin, Process processInFragment) { var outputPath = processInFragment.FileOutputs.First().ToFileArtifact().Path; var pipId = graph.TryGetProducer(FileArtifact.CreateOutputFile(RemapFragmentPath(fragmentOrigin, outputPath))); XAssert.IsTrue(pipId.IsValid); Process processInGraph = graph.PipTable.HydratePip(pipId, PipQueryContext.PipGraphGetProducingPip) as Process; XAssert.IsNotNull(processInGraph); string argumentsInFragment = processInFragment.Arguments.ToString(fragmentOrigin.Context.PathTable).ToUpperInvariant(); string argumentsInGraph = processInGraph.Arguments.ToString(Context.PathTable).ToUpperInvariant(); XAssert.AreEqual(argumentsInFragment, argumentsInGraph); }
private Process[] HydrateAllProcesses() { return(Measure( "Loading all processes", () => { var pipReferences = PipGraph.RetrievePipReferencesOfType(PipType.Process).ToArray(); var processes = new Process[pipReferences.Length]; Parallel.For( 0, pipReferences.Length, i => { processes[i] = (Process)pipReferences[i].HydratePip(); }); return processes; })); }
private static Pip CreateSelfPip( BuildXLContext context, string tempDirectory, string outFile, IEnumerable <string> restInstructions, bool is64Bit) { Contract.Requires(context != null); Contract.Requires(tempDirectory != null); Contract.Requires(!string.IsNullOrEmpty(outFile)); var pathTable = context.PathTable; string workingDirectory = AssemblyDirectory; AbsolutePath workingDirectoryAbsolutePath = AbsolutePath.Create(pathTable, workingDirectory); AbsolutePath appdataPath = AbsolutePath.Create(pathTable, Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)); AbsolutePath windowsFolderPath = AbsolutePath.Create(pathTable, Environment.GetFolderPath(Environment.SpecialFolder.Windows)); string executable = is64Bit ? TestExecutableX64 : TestExecutableX86; FileArtifact executableArtifact = FileArtifact.CreateSourceFile(AbsolutePath.Create(pathTable, Path.Combine(workingDirectory, executable))); AbsolutePath outFilePath = AbsolutePath.Create(pathTable, outFile); FileArtifact outFileArtifact = FileArtifact.CreateSourceFile(outFilePath).CreateNextWrittenVersion(); var pip = new BuildXL.Pips.Operations.Process( executableArtifact, workingDirectoryAbsolutePath, PipDataBuilder.CreatePipData(pathTable.StringTable, " ", PipDataFragmentEscaping.CRuntimeArgumentRules, restInstructions.Select(ri => (PipDataAtom)ri).ToArray()), FileArtifact.Invalid, PipData.Invalid, ReadOnlyArray <EnvironmentVariable> .Empty, FileArtifact.Invalid, FileArtifact.Invalid, FileArtifact.Invalid, AbsolutePath.Create(pathTable, tempDirectory), null, null, ReadOnlyArray <FileArtifact> .FromWithoutCopy(executableArtifact), ReadOnlyArray <FileArtifactWithAttributes> .FromWithoutCopy(outFileArtifact.WithAttributes()), ReadOnlyArray <DirectoryArtifact> .Empty, ReadOnlyArray <DirectoryArtifact> .Empty, ReadOnlyArray <PipId> .Empty, ReadOnlyArray <AbsolutePath> .Empty, ReadOnlyArray <AbsolutePath> .FromWithoutCopy( new[] { workingDirectoryAbsolutePath, windowsFolderPath, // For unknown reasons, on some machines the process is accessing LOCALAPPDATA\Microsoft\Windows\Temporary Internet Files\counters.dat appdataPath, }), ReadOnlyArray <StringId> .Empty, ReadOnlyArray <int> .Empty, ReadOnlyArray <ProcessSemaphoreInfo> .Empty, provenance: PipProvenance.CreateDummy(context), toolDescription: StringId.Invalid, additionalTempDirectories: ReadOnlyArray <AbsolutePath> .Empty); return(pip); }