diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index 656ca2595f..4efcf035ac 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java @@ -87,6 +87,7 @@ import com.google.devtools.build.lib.util.OrderedSetMultimap; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.util.StringUtil; import com.google.devtools.build.lib.vfs.FileSystemUtils; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; import java.util.Collection; @@ -592,6 +593,19 @@ public final class RuleContext extends TargetContext * thus guaranteeing that it never clashes with artifacts created by rules in other packages. */ public Artifact getPackageRelativeArtifact(PathFragment relative, Root root) { + // TODO: other root types, is this never a main repo? + if (relative.startsWith(new PathFragment(Label.EXTERNAL_PATH_PREFIX))) { + // This is an external path, use a different root. + if (root.isSourceRoot()) { + root = Root.asSourceRoot(root.getPath().getRelative(relative.subFragment(0, 2))); + } else { + boolean isMainRepo = false; + Path newExecRoot = root.getExecRoot().getRelative(relative.subFragment(0, 2)); + root = Root.asDerivedRoot( + newExecRoot, newExecRoot.getRelative(root.getExecPath()), isMainRepo); + } + relative = relative.subFragment(2, relative.segmentCount()); + } return getDerivedArtifact(getPackageDirectory().getRelative(relative), root); } @@ -610,7 +624,7 @@ public final class RuleContext extends TargetContext * {@link #getUniqueDirectoryArtifact(String, PathFragment, Root)}) ensures that this is the case. */ public PathFragment getPackageDirectory() { - return getLabel().getPackageIdentifier().getSourceRoot(); + return getLabel().getPackageIdentifier().getPackageFragment(); } /** |