aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java31
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java2
2 files changed, 32 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 1a7814a0e1..c4689c90f2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -85,6 +85,7 @@ import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Queue;
import java.util.Set;
import java.util.TreeMap;
@@ -1080,6 +1081,8 @@ public final class BuildConfiguration {
private final ImmutableMap<String, String> testEnvironment;
private final ImmutableMap<String, String> commandLineBuildVariables;
+ private final int hashCode; // We can precompute the hash code as all its inputs are immutable.
+
/**
* Helper container for {@link #transitiveOptionsMap} below.
*/
@@ -1140,6 +1143,33 @@ public final class BuildConfiguration {
}
/**
+ * Returns {@code true} if this configuration is semantically equal to the other, including
+ * checking that both have the same sets of fragments and options.
+ */
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof BuildConfiguration)) {
+ return false;
+ }
+ BuildConfiguration otherConfig = (BuildConfiguration) other;
+ return actionsEnabled == otherConfig.actionsEnabled
+ && fragments.values().equals(otherConfig.fragments.values())
+ && buildOptions.getOptions().equals(otherConfig.buildOptions.getOptions());
+ }
+
+ private int computeHashCode() {
+ return Objects.hash(actionsEnabled, fragments, buildOptions.getOptions());
+ }
+
+ @Override
+ public int hashCode() {
+ return hashCode;
+ }
+
+ /**
* Returns map of all the fragments for this configuration.
*/
public ImmutableMap<Class<? extends Fragment>, Fragment> getAllFragments() {
@@ -1295,6 +1325,7 @@ public final class BuildConfiguration {
globalMakeEnv = globalMakeEnvBuilder.build();
checksum = Fingerprint.md5Digest(buildOptions.computeCacheKey());
+ hashCode = computeHashCode();
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 9cf952c200..d9dd9ae4ae 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -426,7 +426,7 @@ public abstract class BuildViewTestCase extends FoundationTestCase {
*/
protected final void createBuildView() throws Exception {
Preconditions.checkNotNull(masterConfig);
- Preconditions.checkState(getHostConfiguration() == getTargetConfiguration()
+ Preconditions.checkState(getHostConfiguration().equals(getTargetConfiguration())
|| getHostConfiguration().isHostConfiguration(),
"Host configuration %s is not a host configuration' "
+ "and does not match target configuration %s",