diff options
author | 2016-01-26 12:20:28 +0000 | |
---|---|---|
committer | 2016-01-26 13:07:04 +0000 | |
commit | e4974e4cc6aeb437d36b3b36eb20142b7120fb16 (patch) | |
tree | cbf534a333e3803fca52cba46cb9692aaf8b4d9e /src | |
parent | b88ef8f6af2c804a18e3b38d91bb99b293aaad3f (diff) |
Separate runfiles middlemen into two layers: one that is a middleman for the files itself, and one that contains this middleman and the runfiles output manifest.
This is in preparation for Windows symlink support in runfiles manifests: on Windows, we'll need the target files created before we can create the runfiles symlinks for them, but we can't do that by adding the current runfiles middleman to the inputs of SymlinkTreeAction because it would create a cycle (output manifest -> SymlinkTreeAction -> runfiles manifest -> MiddlemanAction -> output manifest)
The alternative is to just add the artifacts to the inputs of SymlinkTreeAction, but that would create a bunch of extra edges and, more importantly, reverse edges in the action graph which we don't want.
--
MOS_MIGRATED_REVID=113041344
Diffstat (limited to 'src')
4 files changed, 22 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java index d4de3db2ad..24bece9edd 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java @@ -633,9 +633,7 @@ public class Artifact implements FileType.HasFilename, ActionInput, SkylarkValue Preconditions.checkArgument(middleman.isMiddlemanArtifact()); List<Artifact> artifacts = new ArrayList<>(); middlemanExpander.expand(middleman, artifacts); - for (Artifact artifact : artifacts) { - output.add(outputFormatter.apply(artifact)); - } + addExpandedArtifacts(artifacts, output, outputFormatter, middlemanExpander); } /** diff --git a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java index 4f6a9baa68..aecfd359bc 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java @@ -82,14 +82,15 @@ public final class MiddlemanFactory { * @param middlemanDir the directory in which to place the middleman. */ public Artifact createRunfilesMiddleman( - ActionOwner owner, Artifact owningArtifact, Iterable<Artifact> inputs, Root middlemanDir) { + ActionOwner owner, Artifact owningArtifact, Iterable<Artifact> inputs, Root middlemanDir, + String tag) { if (hasExactlyOneInput(inputs)) { // Optimization: No middleman for just one input. return Iterables.getOnlyElement(inputs); } String middlemanPath = owningArtifact == null ? Label.print(owner.getLabel()) : owningArtifact.getRootRelativePath().getPathString(); - return createMiddleman(owner, middlemanPath, "runfiles", inputs, middlemanDir, + return createMiddleman(owner, middlemanPath, tag, inputs, middlemanDir, MiddlemanType.RUNFILES_MIDDLEMAN).getFirst(); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java index d553b28d05..0a5335686c 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java @@ -22,7 +22,6 @@ import com.google.devtools.build.lib.analysis.SourceManifestAction.ManifestType; import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.RunUnder; -import com.google.devtools.build.lib.collect.IterablesChain; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -112,9 +111,11 @@ public class RunfilesSupport { throw new IllegalStateException("main program " + executable + " not included in runfiles"); } + Artifact artifactsMiddleman = createArtifactsMiddleman(ruleContext, runfiles.getAllArtifacts()); runfilesInputManifest = createRunfilesInputManifestArtifact(ruleContext); this.runfilesManifest = createRunfilesAction(ruleContext, runfiles); - this.runfilesMiddleman = createRunfilesMiddleman(ruleContext, runfiles.getAllArtifacts()); + this.runfilesMiddleman = createRunfilesMiddleman( + ruleContext, artifactsMiddleman, runfilesManifest); sourcesManifest = createSourceManifest(ruleContext, runfiles); args = ImmutableList.<String>builder() @@ -247,15 +248,19 @@ public class RunfilesSupport { return sourcesManifest; } - private Artifact createRunfilesMiddleman(ActionConstructionContext context, + private Artifact createArtifactsMiddleman(ActionConstructionContext context, Iterable<Artifact> allRunfilesArtifacts) { - Iterable<Artifact> inputs = IterablesChain.<Artifact>builder() - .add(allRunfilesArtifacts) - .addElement(runfilesManifest) - .build(); return context.getAnalysisEnvironment().getMiddlemanFactory().createRunfilesMiddleman( - context.getActionOwner(), owningExecutable, inputs, - context.getConfiguration().getMiddlemanDirectory()); + context.getActionOwner(), owningExecutable, allRunfilesArtifacts, + context.getConfiguration().getMiddlemanDirectory(), "runfiles_artifacts"); + } + + private Artifact createRunfilesMiddleman(ActionConstructionContext context, + Artifact artifactsMiddleman, Artifact outputManifest) { + return context.getAnalysisEnvironment().getMiddlemanFactory().createRunfilesMiddleman( + context.getActionOwner(), owningExecutable, + ImmutableList.of(artifactsMiddleman, outputManifest), + context.getConfiguration().getMiddlemanDirectory(), "runfiles"); } /** diff --git a/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java b/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java index a0eca8b55b..7176669d40 100644 --- a/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java @@ -112,9 +112,11 @@ public class MiddlemanActionTest extends BuildViewTestCase { analysisEnvironment.clear(); Artifact middlemanForC = middlemanFactory.createRunfilesMiddleman( - NULL_ACTION_OWNER, c, Arrays.asList(c, common), targetConfig.getMiddlemanDirectory()); + NULL_ACTION_OWNER, c, Arrays.asList(c, common), targetConfig.getMiddlemanDirectory(), + "runfiles"); Artifact middlemanForD = middlemanFactory.createRunfilesMiddleman( - NULL_ACTION_OWNER, d, Arrays.asList(d, common), targetConfig.getMiddlemanDirectory()); + NULL_ACTION_OWNER, d, Arrays.asList(d, common), targetConfig.getMiddlemanDirectory(), + "runfiles"); analysisEnvironment.registerWith(getMutableActionGraph()); MiddlemanAction middlemanActionForC = (MiddlemanAction) getGeneratingAction(middlemanForC); |