aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-01-26 12:20:28 +0000
committerGravatar Lukacs Berki <lberki@google.com>2016-01-26 13:07:04 +0000
commite4974e4cc6aeb437d36b3b36eb20142b7120fb16 (patch)
treecbf534a333e3803fca52cba46cb9692aaf8b4d9e /src
parentb88ef8f6af2c804a18e3b38d91bb99b293aaad3f (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/Artifact.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java23
-rw-r--r--src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java6
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);