diff options
author | Dmitry Lomov <dslomov@google.com> | 2018-05-30 04:34:08 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-05-30 04:35:42 -0700 |
commit | 5b1ce4d5d7568ecacf02c63c30a9cc7ce7ef24d3 (patch) | |
tree | eee571e4bf5d2dfc304084808d449febce5f2b8a /src/main/java/com/google/devtools/build/lib/packages | |
parent | 1973be49ca38a17e5272e8af1d0ba6b00e442d1f (diff) |
Fix `equals()` and `hashCode()` for artifacts: artifacts of different classes are not equal.
Also validate that there are no tree and file artifacts with the same exec path.
Fixes #4668.
Closes #5284.
Change-Id: Id97c0407a476a5bfc697b4ca7b858e3d0c0f8c75
PiperOrigin-RevId: 198540425
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages')
3 files changed, 51 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java b/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java index 101cb1b394..90f6707d9a 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java +++ b/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java @@ -22,14 +22,35 @@ import com.google.devtools.build.lib.events.Location; */ public final class OutputFile extends FileTarget { + /** + * A kind of output file. + * + * The FILESET kind is only supported for a non-open-sourced {@code fileset} rule. + */ + public enum Kind { + FILE, + FILESET + } + private final Rule generatingRule; + private final Kind kind; /** * Constructs an output file with the given label, which must be in the given * package. */ OutputFile(Package pkg, Label label, Rule generatingRule) { + this(pkg, label, Kind.FILE, generatingRule); + } + + /** + * Constructs an output file with the given label, which must be in the given + * package. + */ + OutputFile(Package pkg, Label label, + Kind kind, Rule generatingRule) { super(pkg, label); + this.kind = kind; this.generatingRule = generatingRule; } @@ -50,6 +71,13 @@ public final class OutputFile extends FileTarget { return generatingRule; } + /** + * Returns the kind of this output file. + */ + public Kind getKind() { + return kind; + } + @Override public String getTargetKind() { return targetKind(); diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java index c7cca63e85..37c8767a1e 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java @@ -607,7 +607,7 @@ public final class Rule implements Target, DependencyFilter.AttributeInfoProvide reportWarning("target '" + getName() + "' is both a rule and a file; please choose " + "another name for the rule", eventHandler); } - OutputFile outputFile = new OutputFile(pkg, label, this); + OutputFile outputFile = new OutputFile(pkg, label, ruleClass.getOutputFileKind(), this); outputFilesBuilder.add(outputFile); return outputFile; } diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 0abecd2fdc..d83246871d 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -615,6 +615,7 @@ public class RuleClass { private final Map<String, Attribute> attributes = new LinkedHashMap<>(); private final Set<Label> requiredToolchains = new HashSet<>(); private boolean supportsPlatforms = true; + private OutputFile.Kind outputFileKind = OutputFile.Kind.FILE; /** * Constructs a new {@code RuleClassBuilder} using all attributes from all @@ -734,6 +735,7 @@ public class RuleClass { supportsConstraintChecking, requiredToolchains, supportsPlatforms, + outputFileKind, attributes.values()); } @@ -1080,6 +1082,18 @@ public class RuleClass { } /** + * Sets the kind of output files this rule creates. + * DO NOT USE! This only exists to support the non-open-sourced {@code fileset} rule. + * {@see OutputFile.Kind}. + */ + public Builder setOutputFileKind(OutputFile.Kind outputFileKind) { + this.outputFileKind = outputFileKind; + return this; + } + + + + /** * Declares that instances of this rule are compatible with the specified environments, * in addition to the defaults declared by their environment groups. This can be overridden * by rule-specific declarations. See @@ -1264,6 +1278,7 @@ public class RuleClass { @Nullable private final Label ruleDefinitionEnvironmentLabel; @Nullable private final String ruleDefinitionEnvironmentHashCode; + private final OutputFile.Kind outputFileKind; /** * The set of configuration fragments which are legal for this rule's implementation to access. @@ -1328,6 +1343,7 @@ public class RuleClass { boolean supportsConstraintChecking, Set<Label> requiredToolchains, boolean supportsPlatforms, + OutputFile.Kind outputFileKind, Collection<Attribute> attributes) { this.name = name; this.key = key; @@ -1350,6 +1366,7 @@ public class RuleClass { this.optionReferenceFunction = optionReferenceFunction; this.ruleDefinitionEnvironmentLabel = ruleDefinitionEnvironmentLabel; this.ruleDefinitionEnvironmentHashCode = ruleDefinitionEnvironmentHashCode; + this.outputFileKind = outputFileKind; validateNoClashInPublicNames(attributes); this.attributes = ImmutableList.copyOf(attributes); this.workspaceOnly = workspaceOnly; @@ -2174,6 +2191,11 @@ public class RuleClass { return supportsPlatforms; } + @Nullable + public OutputFile.Kind getOutputFileKind() { + return outputFileKind; + } + public static boolean isThirdPartyPackage(PackageIdentifier packageIdentifier) { if (!packageIdentifier.getRepository().isMain()) { return false; |