diff options
Diffstat (limited to 'src')
4 files changed, 36 insertions, 11 deletions
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 aecfd359bc..24c436c190 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 @@ -23,6 +23,8 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.util.Iterator; +import javax.annotation.Nullable; + /** * A factory to create middleman objects. */ @@ -82,8 +84,8 @@ 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, - String tag) { + ActionOwner owner, @Nullable Artifact owningArtifact, Iterable<Artifact> inputs, + Root middlemanDir, String tag) { if (hasExactlyOneInput(inputs)) { // Optimization: No middleman for just one input. return Iterables.getOnlyElement(inputs); } 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 0a5335686c..b657e8d1ea 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 @@ -113,7 +113,7 @@ public class RunfilesSupport { Artifact artifactsMiddleman = createArtifactsMiddleman(ruleContext, runfiles.getAllArtifacts()); runfilesInputManifest = createRunfilesInputManifestArtifact(ruleContext); - this.runfilesManifest = createRunfilesAction(ruleContext, runfiles); + this.runfilesManifest = createRunfilesAction(ruleContext, runfiles, artifactsMiddleman); this.runfilesMiddleman = createRunfilesMiddleman( ruleContext, artifactsMiddleman, runfilesManifest); sourcesManifest = createSourceManifest(ruleContext, runfiles); @@ -272,7 +272,8 @@ public class RunfilesSupport { * generated files, etc.) into a single tree, so that programs can access them * using the workspace-relative name. */ - private Artifact createRunfilesAction(ActionConstructionContext context, Runfiles runfiles) { + private Artifact createRunfilesAction(ActionConstructionContext context, Runfiles runfiles, + Artifact artifactsMiddleman) { // Compute the names of the runfiles directory and its MANIFEST file. Artifact inputManifest = getRunfilesInputManifest(); context.getAnalysisEnvironment().registerAction( @@ -292,7 +293,8 @@ public class RunfilesSupport { Artifact outputManifest = context.getDerivedArtifact( outputManifestPath, config.getBinDirectory()); context.getAnalysisEnvironment().registerAction(new SymlinkTreeAction( - context.getActionOwner(), inputManifest, outputManifest, /*filesetTree=*/false)); + context.getActionOwner(), inputManifest, artifactsMiddleman, outputManifest, + /*filesetTree=*/false)); return outputManifest; } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/SymlinkTreeAction.java b/src/main/java/com/google/devtools/build/lib/analysis/SymlinkTreeAction.java index 7b38198cad..7501f09189 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/SymlinkTreeAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/SymlinkTreeAction.java @@ -24,6 +24,8 @@ import com.google.devtools.build.lib.actions.ResourceSet; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.Preconditions; +import javax.annotation.Nullable; + /** * Action responsible for the symlink tree creation. * Used to generate runfiles and fileset symlink farms. @@ -40,22 +42,36 @@ public class SymlinkTreeAction extends AbstractAction { * Creates SymlinkTreeAction instance. * * @param owner action owner - * @param inputManifest exec path to the input runfiles manifest - * @param outputManifest exec path to the generated symlink tree manifest + * @param inputManifest the input runfiles manifest + * @param artifactMiddleman the middleman artifact representing all the files the symlinks + * point to (on Windows we need to know if the target of a "symlink" is + * a directory or a file so we need to build it before) + * @param outputManifest the generated symlink tree manifest * (must have "MANIFEST" base name). Symlink tree root * will be set to the artifact's parent directory. * @param filesetTree true if this is fileset symlink tree, * false if this is a runfiles symlink tree. */ - public SymlinkTreeAction(ActionOwner owner, Artifact inputManifest, Artifact outputManifest, - boolean filesetTree) { - super(owner, ImmutableList.of(inputManifest), ImmutableList.of(outputManifest)); + public SymlinkTreeAction(ActionOwner owner, Artifact inputManifest, + @Nullable Artifact artifactMiddleman, Artifact outputManifest, boolean filesetTree) { + super(owner, computeInputs(inputManifest, artifactMiddleman), ImmutableList.of(outputManifest)); Preconditions.checkArgument(outputManifest.getPath().getBaseName().equals("MANIFEST")); this.inputManifest = inputManifest; this.outputManifest = outputManifest; this.filesetTree = filesetTree; } + private static ImmutableList<Artifact> computeInputs( + Artifact inputManifest, Artifact artifactMiddleman) { + ImmutableList.Builder<Artifact> result = ImmutableList.<Artifact>builder() + .add(inputManifest); + if (artifactMiddleman != null + && !artifactMiddleman.getPath().getFileSystem().supportsSymbolicLinksNatively()) { + result.add(artifactMiddleman); + } + return result.build(); + } + public Artifact getInputManifest() { return inputManifest; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java index 032d9737ab..598b4fadbf 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/NativeLibs.java @@ -151,8 +151,13 @@ public final class NativeLibs { .addRootSymlinks(symlinks) .build()); Artifact outputManifest = AndroidBinary.getDxArtifact(ruleContext, "native_symlinks/MANIFEST"); + Artifact nativeLibsMiddleman = + ruleContext.getAnalysisEnvironment().getMiddlemanFactory().createRunfilesMiddleman( + ruleContext.getActionOwner(), null, symlinks.values(), + ruleContext.getConfiguration().getMiddlemanDirectory(), "android_native_libs"); + ruleContext.registerAction(new SymlinkTreeAction( - ruleContext.getActionOwner(), inputManifest, outputManifest, false)); + ruleContext.getActionOwner(), inputManifest, nativeLibsMiddleman, outputManifest, false)); return outputManifest; } |