Make two LibraryToLinkWrapper$CcLinkingContext$LinkOptions value-equal if they have the same contents and were created by the same action owner at the same point in its analysis.
To do so, we expose an opaque SymbolGenerator in RuleContext/BazelStarlarkContext, as suggested by lberki@. The SymbolGenerator generates symbols (surprise) that will compare equal to other symbols that have the same "owner" (package, label, action lookup key, etc.) and index (order in which they were generated).
This is partially a logical rollback of https://github.com/bazelbuild/bazel/commit/830a286748f64e61dcb03c64318bc7e54cf87d88, with the symbol making things more acceptable.
PiperOrigin-RevId: 231848582
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 8bc6b82..006a75b 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -388,10 +388,12 @@
name = "starlark_context",
srcs = [
"analysis/skylark/BazelStarlarkContext.java",
+ "analysis/skylark/SymbolGenerator.java",
],
deps = [
":skylarkinterface",
"//src/main/java/com/google/devtools/build/lib/cmdline:RepositoryName",
+ "//src/main/java/com/google/devtools/build/lib/concurrent",
"//third_party:guava",
"//third_party:jsr305",
],
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 3b52ea2..92f5d63 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -36,6 +36,7 @@
import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
import com.google.devtools.build.lib.analysis.skylark.SkylarkModules;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
@@ -792,14 +793,19 @@
private Environment createSkylarkRuleClassEnvironment(
Mutability mutability,
- Environment.GlobalFrame globals,
+ GlobalFrame globals,
SkylarkSemantics skylarkSemantics,
EventHandler eventHandler,
String astFileContentHashCode,
Map<String, Extension> importMap,
- ImmutableMap<RepositoryName, RepositoryName> repoMapping) {
+ ImmutableMap<RepositoryName, RepositoryName> repoMapping,
+ Label callerLabel) {
BazelStarlarkContext context =
- new BazelStarlarkContext(toolsRepository, configurationFragmentMap, repoMapping);
+ new BazelStarlarkContext(
+ toolsRepository,
+ configurationFragmentMap,
+ repoMapping,
+ new SymbolGenerator<>(callerLabel));
Environment env =
Environment.builder(mutability)
.setGlobals(globals)
@@ -829,7 +835,8 @@
eventHandler,
astFileContentHashCode,
importMap,
- repoMapping);
+ repoMapping,
+ extensionLabel);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index c1d5519..fc740c6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -18,6 +18,7 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Artifact.SourceArtifact;
import com.google.devtools.build.lib.actions.ArtifactFactory;
@@ -192,6 +193,7 @@
Target target,
BuildConfiguration config,
BuildConfiguration hostConfig,
+ ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
@Nullable ToolchainContext toolchainContext)
@@ -204,6 +206,7 @@
(Rule) target,
config,
hostConfig,
+ configuredTargetKey,
prerequisiteMap,
configConditions,
toolchainContext);
@@ -255,6 +258,7 @@
Rule rule,
BuildConfiguration configuration,
BuildConfiguration hostConfiguration,
+ ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
@Nullable ToolchainContext toolchainContext)
@@ -269,7 +273,8 @@
configuration,
hostConfiguration,
ruleClassProvider.getPrerequisiteValidator(),
- rule.getRuleClassObject().getConfigurationFragmentPolicy())
+ rule.getRuleClassObject().getConfigurationFragmentPolicy(),
+ configuredTargetKey)
.setVisibility(convertVisibility(prerequisiteMap, env.getEventHandler(), rule, null))
.setPrerequisites(prerequisiteMap)
.setConfigConditions(configConditions)
@@ -395,7 +400,8 @@
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
@Nullable ToolchainContext toolchainContext,
BuildConfiguration aspectConfiguration,
- BuildConfiguration hostConfiguration)
+ BuildConfiguration hostConfiguration,
+ ActionLookupValue.ActionLookupKey aspectKey)
throws AspectFunctionException, InterruptedException {
RuleContext.Builder builder =
@@ -406,7 +412,8 @@
aspectConfiguration,
hostConfiguration,
ruleClassProvider.getPrerequisiteValidator(),
- aspect.getDefinition().getConfigurationFragmentPolicy());
+ aspect.getDefinition().getConfigurationFragmentPolicy(),
+ aspectKey);
Map<String, Attribute> aspectAttributes = mergeAspectAttributes(aspectPath);
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 f1306a1..4e00092 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
@@ -34,6 +34,7 @@
import com.google.common.collect.Sets;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.ActionRegistry;
import com.google.devtools.build.lib.actions.Artifact;
@@ -56,6 +57,7 @@
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.analysis.stringtemplate.TemplateContext;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.RepositoryName;
@@ -186,6 +188,7 @@
private final ConstraintSemantics constraintSemantics;
private ActionOwner actionOwner;
+ private final SymbolGenerator<ActionLookupValue.ActionLookupKey> actionOwnerSymbolGenerator;
/* lazily computed cache for Make variables, computed from the above. See get... method */
private transient ConfigurationMakeVariableContext configurationMakeVariableContext = null;
@@ -196,8 +199,9 @@
ListMultimap<String, ConfiguredTargetAndData> targetMap,
ListMultimap<String, ConfiguredFilesetEntry> filesetEntryMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
- ImmutableList<Class<? extends BuildConfiguration.Fragment>> universalFragments,
+ ImmutableList<Class<? extends Fragment>> universalFragments,
String ruleClassNameForLogging,
+ ActionLookupValue.ActionLookupKey actionLookupKey,
ImmutableMap<String, Attribute> aspectAttributes,
@Nullable ToolchainContext toolchainContext,
ConstraintSemantics constraintSemantics) {
@@ -228,6 +232,7 @@
this.disabledFeatures = ImmutableSortedSet.copyOf(allDisabledFeatures);
this.ruleClassNameForLogging = ruleClassNameForLogging;
this.hostConfiguration = builder.hostConfiguration;
+ this.actionOwnerSymbolGenerator = new SymbolGenerator<>(actionLookupKey);
reporter = builder.reporter;
this.toolchainContext = toolchainContext;
this.constraintSemantics = constraintSemantics;
@@ -409,6 +414,16 @@
}
/**
+ * An opaque symbol generator to be used when identifying objects by their action owner/index of
+ * creation. Only needed if an object needs to know whether it was created by the same action
+ * owner in the same order as another object. Each symbol must call {@link
+ * SymbolGenerator#generate} separately to obtain a unique object.
+ */
+ public SymbolGenerator<?> getSymbolGenerator() {
+ return actionOwnerSymbolGenerator;
+ }
+
+ /**
* Returns a configuration fragment for this this target.
*/
@Nullable
@@ -1447,7 +1462,6 @@
/**
* Builder class for a RuleContext.
*/
- @VisibleForTesting
public static final class Builder implements RuleErrorConsumer {
private final AnalysisEnvironment env;
private final Target target;
@@ -1455,6 +1469,7 @@
private ImmutableList<Class<? extends BuildConfiguration.Fragment>> universalFragments;
private final BuildConfiguration configuration;
private final BuildConfiguration hostConfiguration;
+ private final ActionLookupValue.ActionLookupKey actionOwnerSymbol;
private final PrerequisiteValidator prerequisiteValidator;
private final RuleErrorConsumer reporter;
private OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap;
@@ -1473,7 +1488,8 @@
BuildConfiguration configuration,
BuildConfiguration hostConfiguration,
PrerequisiteValidator prerequisiteValidator,
- ConfigurationFragmentPolicy configurationFragmentPolicy) {
+ ConfigurationFragmentPolicy configurationFragmentPolicy,
+ ActionLookupValue.ActionLookupKey actionOwnerSymbol) {
this.env = Preconditions.checkNotNull(env);
this.target = Preconditions.checkNotNull(target);
this.aspects = aspects;
@@ -1481,6 +1497,7 @@
this.configuration = Preconditions.checkNotNull(configuration);
this.hostConfiguration = Preconditions.checkNotNull(hostConfiguration);
this.prerequisiteValidator = prerequisiteValidator;
+ this.actionOwnerSymbol = Preconditions.checkNotNull(actionOwnerSymbol);
if (configuration.allowAnalysisFailures()) {
reporter = new SuppressingErrorReporter();
} else {
@@ -1508,6 +1525,7 @@
configConditions,
universalFragments,
getRuleClassNameForLogging(),
+ actionOwnerSymbol,
aspectAttributes != null ? aspectAttributes : ImmutableMap.<String, Attribute>of(),
toolchainContext,
constraintSemantics);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
index 689e57b..d19a8b9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.analysis.skylark;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
@@ -25,31 +26,38 @@
private final String toolsRepository;
@Nullable private final ImmutableMap<String, Class<?>> fragmentNameToClass;
private final ImmutableMap<RepositoryName, RepositoryName> repoMapping;
+ private final SymbolGenerator<?> symbolGenerator;
/**
* @param toolsRepository the name of the tools repository, such as "@bazel_tools"
* @param fragmentNameToClass a map from configuration fragment name to configuration fragment
* class, such as "apple" to AppleConfiguration.class
* @param repoMapping a map from RepositoryName to RepositoryName to be used for external
- * repository renaming
+ * @param symbolGenerator a {@link SymbolGenerator} to be used when creating objects to be
+ * compared using reference equality.
*/
public BazelStarlarkContext(
String toolsRepository,
ImmutableMap<String, Class<?>> fragmentNameToClass,
- ImmutableMap<RepositoryName, RepositoryName> repoMapping) {
+ ImmutableMap<RepositoryName, RepositoryName> repoMapping,
+ SymbolGenerator<?> symbolGenerator) {
this.toolsRepository = toolsRepository;
this.fragmentNameToClass = fragmentNameToClass;
this.repoMapping = repoMapping;
+ this.symbolGenerator = Preconditions.checkNotNull(symbolGenerator);
}
/**
* @param toolsRepository the name of the tools repository, such as "@bazel_tools"
* @param repoMapping a map from RepositoryName to RepositoryName to be used for external
- * repository renaming
+ * @param symbolGenerator a {@link SymbolGenerator} to be used when creating objects to be
+ * compared using reference equality.
*/
public BazelStarlarkContext(
- String toolsRepository, ImmutableMap<RepositoryName, RepositoryName> repoMapping) {
- this(toolsRepository, null, repoMapping);
+ String toolsRepository,
+ ImmutableMap<RepositoryName, RepositoryName> repoMapping,
+ SymbolGenerator<?> symbolGenerator) {
+ this(toolsRepository, null, repoMapping, symbolGenerator);
}
@Override
@@ -89,4 +97,8 @@
public ImmutableMap<RepositoryName, RepositoryName> getRepoMapping() {
return repoMapping;
}
+
+ public SymbolGenerator<?> getSymbolGenerator() {
+ return symbolGenerator;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
index 5e30d38..5e3c977 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
@@ -105,7 +105,9 @@
.setEventHandler(ruleContext.getAnalysisEnvironment().getEventHandler())
.setStarlarkContext(
new BazelStarlarkContext(
- toolsRepository, ruleContext.getTarget().getPackage().getRepositoryMapping()))
+ toolsRepository,
+ ruleContext.getTarget().getPackage().getRepositoryMapping(),
+ ruleContext.getSymbolGenerator()))
.build(); // NB: loading phase functions are not available: this is analysis already,
// so we do *not* setLoadingPhase().
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SymbolGenerator.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SymbolGenerator.java
new file mode 100644
index 0000000..c105762
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SymbolGenerator.java
@@ -0,0 +1,75 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis.skylark;
+
+import com.google.devtools.build.lib.concurrent.ThreadSafety;
+
+/**
+ * Class to be used when an object wants to be compared using reference equality. Since reference
+ * equality is not usable when comparing objects across multiple Starlark evaluations, we use a more
+ * stable method: an object identifying the {@link #owner} of the current Starlark context, and an
+ * {@link #index} indicating how many reference-equal objects have already been created (and
+ * therefore asked for a unique symbol for themselves).
+ *
+ * <p>Objects that want to use reference equality should instead call {@link #generate} on a
+ * provided {@code SymbolGenerator} instance, and compare the returned object for equality, since it
+ * will be stable across identical Starlark evaluations.
+ */
+public final class SymbolGenerator<T> {
+ private final T owner;
+ private int index = 0;
+
+ public SymbolGenerator(T owner) {
+ this.owner = owner;
+ }
+
+ @ThreadSafety.ThreadSafe
+ public synchronized Symbol<T> generate() {
+ return new Symbol<>(owner, index++);
+ }
+
+ private static final class Symbol<T> {
+ private final T owner;
+ private final int index;
+
+ private Symbol(T owner, int index) {
+ this.owner = owner;
+ this.index = index;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof Symbol<?>)) {
+ return false;
+ }
+ Symbol<?> symbol = (Symbol<?>) o;
+ return index == symbol.index && owner.equals(symbol.owner);
+ }
+
+ @Override
+ public int hashCode() {
+ // We don't expect multiple indices for the same owner, save the computation.
+ return owner.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "<symbol=" + owner + ", index=" + index + ">";
+ }
+ };
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java
index d59db93..4f8b495 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -51,7 +52,8 @@
Path outputDirectory,
BlazeDirectories directories,
Environment env,
- Map<String, String> markerData)
+ Map<String, String> markerData,
+ SkyKey key)
throws RepositoryFunctionException {
CPU hostCpu = CPU.getCurrent();
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
index 4c1e7dd..e05c78c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
@@ -33,6 +33,7 @@
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
import java.util.Map;
@@ -97,8 +98,13 @@
}
@Override
- public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
- BlazeDirectories directories, Environment env, Map<String, String> markerData)
+ public RepositoryDirectoryValue.Builder fetch(
+ Rule rule,
+ Path outputDirectory,
+ BlazeDirectories directories,
+ Environment env,
+ Map<String, String> markerData,
+ SkyKey key)
throws RepositoryFunctionException, InterruptedException {
// Deprecation in favor of the Starlark rule
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerRepositoryFunction.java
index d104415..8d72912 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerRepositoryFunction.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import com.google.devtools.build.skyframe.SkyKey;
import java.util.Map;
import javax.annotation.Nullable;
@@ -40,8 +41,13 @@
@Nullable
@Override
- public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
- BlazeDirectories directories, Environment env, Map<String, String> markerData)
+ public RepositoryDirectoryValue.Builder fetch(
+ Rule rule,
+ Path outputDirectory,
+ BlazeDirectories directories,
+ Environment env,
+ Map<String, String> markerData,
+ SkyKey key)
throws SkyFunctionException, InterruptedException {
throw new RepositoryFunctionException(new EvalException(
rule.getLocation(),
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 5958424..9be358b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -19,6 +19,7 @@
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent;
import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
import com.google.devtools.build.lib.cmdline.LabelConstants;
@@ -37,6 +38,7 @@
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunction.Environment;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
@@ -60,8 +62,13 @@
@Nullable
@Override
- public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
- BlazeDirectories directories, Environment env, Map<String, String> markerData)
+ public RepositoryDirectoryValue.Builder fetch(
+ Rule rule,
+ Path outputDirectory,
+ BlazeDirectories directories,
+ Environment env,
+ Map<String, String> markerData,
+ SkyKey key)
throws RepositoryFunctionException, InterruptedException {
BaseFunction function = rule.getRuleClassObject().getConfiguredTargetFunction();
if (declareEnvironmentDependencies(markerData, env, getEnviron(rule)) == null) {
@@ -95,7 +102,8 @@
new BazelStarlarkContext(
/* toolsRepository = */ null,
/* fragmentNameToClass = */ null,
- rule.getPackage().getRepositoryMapping()))
+ rule.getPackage().getRepositoryMapping(),
+ new SymbolGenerator<>(key)))
.build();
SkylarkRepositoryContext skylarkRepositoryContext =
new SkylarkRepositoryContext(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
index 7cae241..6bcc7c1 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
@@ -96,7 +96,8 @@
Path outputDirectory,
BlazeDirectories directories,
Environment env,
- Map<String, String> markerData)
+ Map<String, String> markerData,
+ SkyKey key)
throws InterruptedException, RepositoryFunctionException {
Map<String, String> environ =
declareEnvironmentDependencies(markerData, env, PATH_ENV_VAR_AS_LIST);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
index 46c42b6..3ac8f01 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
@@ -85,7 +85,8 @@
final Path outputDirectory,
BlazeDirectories directories,
Environment env,
- Map<String, String> markerData)
+ Map<String, String> markerData,
+ SkyKey key)
throws RepositoryFunctionException, InterruptedException {
Map<String, String> environ =
declareEnvironmentDependencies(markerData, env, PATH_ENV_VAR_AS_LIST);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index ba52ce8..43ed23a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -23,6 +23,7 @@
import com.google.common.collect.Iterables;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelConstants;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -1620,7 +1621,10 @@
try (Mutability mutability = Mutability.create("package %s", packageId)) {
BazelStarlarkContext starlarkContext =
- new BazelStarlarkContext(ruleClassProvider.getToolsRepository(), repositoryMapping);
+ new BazelStarlarkContext(
+ ruleClassProvider.getToolsRepository(),
+ repositoryMapping,
+ new SymbolGenerator<>(packageId));
Environment pkgEnv =
Environment.builder(mutability)
.setGlobals(BazelLibrary.GLOBALS)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index 083e83d..1c68f45 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -21,6 +21,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelConstants;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -54,6 +55,8 @@
import com.google.devtools.build.lib.syntax.SkylarkUtils;
import com.google.devtools.build.lib.syntax.SkylarkUtils.Phase;
import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.Root;
+import com.google.devtools.build.lib.vfs.RootedPath;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
@@ -147,30 +150,36 @@
throw new BuildFileContainsErrorsException(
LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER, "Failed to parse " + source.getPath());
}
- execute(buildFileAST, null, skylarkSemantics, localReporter);
+ execute(
+ buildFileAST,
+ null,
+ skylarkSemantics,
+ localReporter,
+ WorkspaceFileValue.key(
+ RootedPath.toRootedPath(Root.fromPath(workspaceDir), source.getPath())));
}
-
/**
- * Actually runs through the AST, calling the functions in the WORKSPACE file and adding rules
- * to the //external package.
+ * Actually runs through the AST, calling the functions in the WORKSPACE file and adding rules to
+ * the //external package.
*/
public void execute(
BuildFileAST ast,
Map<String, Extension> importedExtensions,
- SkylarkSemantics skylarkSemantics)
+ SkylarkSemantics skylarkSemantics,
+ WorkspaceFileValue.WorkspaceFileKey workspaceFileKey)
throws InterruptedException {
Preconditions.checkNotNull(ast);
Preconditions.checkNotNull(importedExtensions);
- execute(ast, importedExtensions, skylarkSemantics, new StoredEventHandler());
+ execute(ast, importedExtensions, skylarkSemantics, new StoredEventHandler(), workspaceFileKey);
}
-
private void execute(
BuildFileAST ast,
@Nullable Map<String, Extension> importedExtensions,
SkylarkSemantics skylarkSemantics,
- StoredEventHandler localReporter)
+ StoredEventHandler localReporter,
+ WorkspaceFileValue.WorkspaceFileKey workspaceFileKey)
throws InterruptedException {
if (importedExtensions != null) {
importMap = ImmutableMap.copyOf(importedExtensions);
@@ -191,7 +200,8 @@
new BazelStarlarkContext(
/* toolsRepository= */ null,
/* fragmentNameToClass= */ null,
- ImmutableMap.of()))
+ ImmutableMap.of(),
+ new SymbolGenerator<>(workspaceFileKey)))
.build();
SkylarkUtils.setPhase(workspaceEnv, Phase.WORKSPACE);
addWorkspaceFunctions(workspaceEnv, localReporter);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index fe60c45..d8fd5be 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -32,6 +32,7 @@
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
import com.google.devtools.build.lib.collect.IterablesChain;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -817,19 +818,23 @@
return asNeverLink;
}
- public CcInfo getCcInfo() {
+ CcInfo getCcInfo() {
return getCcInfo(
- javaCommon.targetsTreatedAsDeps(ClasspathType.BOTH), ImmutableList.<String>of());
+ javaCommon.targetsTreatedAsDeps(ClasspathType.BOTH),
+ ImmutableList.of(),
+ ruleContext.getSymbolGenerator());
}
- public static CcInfo getCcInfo(
- final Iterable<? extends TransitiveInfoCollection> deps, final Collection<String> linkOpts) {
+ static CcInfo getCcInfo(
+ final Iterable<? extends TransitiveInfoCollection> deps,
+ final Collection<String> linkOpts,
+ SymbolGenerator<?> symbolGenerator) {
CcLinkingContext ccLinkingContext =
CcLinkingContext.builder()
.addUserLinkFlags(
NestedSetBuilder.<LinkOptions>linkOrder()
- .add(CcLinkingContext.LinkOptions.of(linkOpts))
+ .add(LinkOptions.of(linkOpts, symbolGenerator))
.build())
.build();
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 5f2e958..3187e82 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
@@ -71,7 +71,8 @@
CcInfo ccInfo =
AndroidCommon.getCcInfo(
entry.getValue(),
- ImmutableList.of("-Wl,-soname=lib" + ruleContext.getLabel().getName()));
+ ImmutableList.of("-Wl,-soname=lib" + ruleContext.getLabel().getName()),
+ ruleContext.getSymbolGenerator());
Artifact nativeDepsLibrary =
NativeDepsHelper.linkAndroidNativeDepsIfPresent(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
index 60da9f7..04a0bbb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -23,6 +23,7 @@
),
deps = [
":cpp_interface",
+ "//src/main/java/com/google/devtools/build/lib:bug-report",
"//src/main/java/com/google/devtools/build/lib:build-base",
"//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:io",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 77f6b82..1d2331a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -730,7 +730,7 @@
.build())
.addUserLinkFlags(
NestedSetBuilder.<LinkOptions>linkOrder()
- .add(new LinkOptions(userLinkflags.build()))
+ .add(LinkOptions.of(userLinkflags.build(), ruleContext.getSymbolGenerator()))
.build());
CcInfo ccInfoWithoutExtraLinkTimeLibraries =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
index aabcb92..95775e2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -374,7 +374,9 @@
linkopts.isEmpty()
? NestedSetBuilder.emptySet(Order.LINK_ORDER)
: NestedSetBuilder.create(
- Order.LINK_ORDER, CcLinkingContext.LinkOptions.of(linkopts)))
+ Order.LINK_ORDER,
+ CcLinkingContext.LinkOptions.of(
+ linkopts, ruleContext.getSymbolGenerator())))
.addLibraries(
NestedSetBuilder.<LibraryToLinkWrapper>linkOrder()
.addAll(libraryToLinkWrappers)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index c3368ae..115a4aa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -56,6 +57,7 @@
import com.google.devtools.build.lib.skylarkinterface.Param;
import com.google.devtools.build.lib.skylarkinterface.ParamType;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
@@ -486,8 +488,8 @@
Object librariesToLinkObject,
Object userLinkFlagsObject,
Location location,
- Environment environment)
- throws EvalException, InterruptedException {
+ StarlarkContext context)
+ throws EvalException {
@SuppressWarnings("unchecked")
SkylarkList<LibraryToLinkWrapper> librariesToLink =
nullIfNone(librariesToLinkObject, SkylarkList.class);
@@ -505,7 +507,9 @@
NestedSetBuilder.wrap(
Order.LINK_ORDER,
ImmutableList.of(
- CcLinkingContext.LinkOptions.of(userLinkFlags.getImmutableList()))));
+ CcLinkingContext.LinkOptions.of(
+ userLinkFlags.getImmutableList(),
+ ((BazelStarlarkContext) context).getSymbolGenerator()))));
}
return ccLinkingContextBuilder.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java
index 1af70bc..d7e6ddb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LibraryToLinkWrapper.java
@@ -15,6 +15,7 @@
import com.google.auto.value.AutoValue;
import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -22,13 +23,13 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Streams;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
+import com.google.devtools.build.lib.bugreport.BugReport;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.SolibLibraryToLink;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
import com.google.devtools.build.lib.skylarkbuildapi.cpp.LibraryToLinkWrapperApi;
import com.google.devtools.build.lib.syntax.SkylarkList;
@@ -127,35 +128,57 @@
public static class CcLinkingContext implements CcLinkingContextApi {
public static final CcLinkingContext EMPTY = CcLinkingContext.builder().build();
- /**
- * A list of link options contributed by a single configured target.
- *
- * <p><b>WARNING:</b> Do not implement {@code #equals()} in the obvious way. This class must be
- * checked for equality by object identity because otherwise if two configured targets
- * contribute the same link options, they will be de-duplicated, which is not the desirable
- * behavior.
- */
- @AutoCodec
+ /** A list of link options contributed by a single configured target/aspect. */
@Immutable
public static final class LinkOptions {
private final ImmutableList<String> linkOptions;
+ private final Object symbolForEquality;
- @VisibleForSerialization
- LinkOptions(Iterable<String> linkOptions) {
+ private LinkOptions(Iterable<String> linkOptions, Object symbolForEquality) {
this.linkOptions = ImmutableList.copyOf(linkOptions);
+ this.symbolForEquality = Preconditions.checkNotNull(symbolForEquality);
}
public ImmutableList<String> get() {
return linkOptions;
}
- public static LinkOptions of(Iterable<String> linkOptions) {
- return new LinkOptions(linkOptions);
+ public static LinkOptions of(
+ Iterable<String> linkOptions, SymbolGenerator<?> symbolGenerator) {
+ return new LinkOptions(linkOptions, symbolGenerator.generate());
+ }
+
+ @Override
+ public int hashCode() {
+ // Symbol is sufficient for equality check.
+ return symbolForEquality.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof LinkOptions)) {
+ return false;
+ }
+ LinkOptions that = (LinkOptions) obj;
+ if (!this.symbolForEquality.equals(that.symbolForEquality)) {
+ return false;
+ }
+ if (this.linkOptions.equals(that.linkOptions)) {
+ return true;
+ }
+ BugReport.sendBugReport(
+ new IllegalStateException(
+ "Unexpected inequality with equal symbols: " + this + ", " + that),
+ ImmutableList.of());
+ return false;
}
@Override
public String toString() {
- return '[' + Joiner.on(",").join(linkOptions) + ']';
+ return '[' + Joiner.on(",").join(linkOptions) + "] (owner: " + symbolForEquality;
}
}
@@ -165,12 +188,10 @@
* <p>This object is required because linkstamp files may include other headers which will have
* to be provided during compilation.
*/
- @AutoCodec
public static final class Linkstamp {
private final Artifact artifact;
private final NestedSet<Artifact> declaredIncludeSrcs;
- @VisibleForSerialization
Linkstamp(Artifact artifact, NestedSet<Artifact> declaredIncludeSrcs) {
this.artifact = Preconditions.checkNotNull(artifact);
this.declaredIncludeSrcs = Preconditions.checkNotNull(declaredIncludeSrcs);
@@ -418,6 +439,16 @@
linkstamps.shallowHashCode(),
nonCodeInputs.shallowHashCode());
}
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("userLinkFlags", userLinkFlags)
+ .add("linkstamps", linkstamps)
+ .add("libraries", libraries)
+ .add("nonCodeInputs", nonCodeInputs)
+ .toString();
+ }
}
private LibraryToLink picStaticLibraryToLink;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 7a1f9e1..24d60ba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.skylark.SymbolGenerator;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
@@ -104,7 +105,8 @@
.addDeclaredIncludeSrcs(common.getTextualHdrs())
.build();
- CcLinkingContext ccLinkingContext = buildCcLinkingContext(common);
+ CcLinkingContext ccLinkingContext =
+ buildCcLinkingContext(common, ruleContext.getSymbolGenerator());
return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
.addNativeDeclaredProvider(common.getObjcProvider())
@@ -121,7 +123,8 @@
.build();
}
- public CcLinkingContext buildCcLinkingContext(ObjcCommon common) {
+ private CcLinkingContext buildCcLinkingContext(
+ ObjcCommon common, SymbolGenerator<?> symbolGenerator) {
ImmutableSet.Builder<LibraryToLinkWrapper> libraries = new ImmutableSet.Builder<>();
ObjcProvider objcProvider = common.getObjcProvider();
for (Artifact library : objcProvider.get(ObjcProvider.LIBRARY)) {
@@ -144,7 +147,7 @@
NestedSetBuilder<LinkOptions> userLinkFlags = NestedSetBuilder.linkOrder();
for (SdkFramework sdkFramework : objcProvider.get(ObjcProvider.SDK_FRAMEWORK)) {
userLinkFlags.add(
- CcLinkingContext.LinkOptions.of(ImmutableList.of("-framework", sdkFramework.getName())));
+ LinkOptions.of(ImmutableList.of("-framework", sdkFramework.getName()), symbolGenerator));
}
ccLinkingContext.addUserLinkFlags(userLinkFlags.build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
index 2671abc..eede8b6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
@@ -43,8 +43,13 @@
}
@Override
- public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
- BlazeDirectories directories, Environment env, Map<String, String> markerData)
+ public RepositoryDirectoryValue.Builder fetch(
+ Rule rule,
+ Path outputDirectory,
+ BlazeDirectories directories,
+ Environment env,
+ Map<String, String> markerData,
+ SkyKey key)
throws InterruptedException, RepositoryFunctionException {
PathFragment pathFragment = RepositoryFunction.getTargetPath(rule, directories.getWorkspace());
RepositoryDirectoryValue.Builder result =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
index 4c4e199..693e1f5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java
@@ -48,8 +48,13 @@
}
@Override
- public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
- BlazeDirectories directories, Environment env, Map<String, String> markerData)
+ public RepositoryDirectoryValue.Builder fetch(
+ Rule rule,
+ Path outputDirectory,
+ BlazeDirectories directories,
+ Environment env,
+ Map<String, String> markerData,
+ SkyKey key)
throws SkyFunctionException, InterruptedException {
NewRepositoryFileHandler fileHandler = new NewRepositoryFileHandler(directories.getWorkspace());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
index b4dafa4..de78dd4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
@@ -176,7 +176,7 @@
setupRepositoryRoot(repoRoot);
env.getListener().post(new RepositoryFetching(repositoryName.getName(), false));
RepositoryDirectoryValue.Builder localRepo =
- handler.fetch(rule, repoRoot, directories, env, markerData);
+ handler.fetch(rule, repoRoot, directories, env, markerData, skyKey);
if (localRepo == null) {
return null;
} else {
@@ -214,7 +214,7 @@
env.getListener().post(new RepositoryFetching(repositoryName.getName(), false));
setupRepositoryRoot(repoRoot);
RepositoryDirectoryValue.Builder result =
- handler.fetch(rule, repoRoot, directories, env, markerData);
+ handler.fetch(rule, repoRoot, directories, env, markerData, skyKey);
if (env.valuesMissing()) {
env.getListener()
.post(new RepositoryFetching(repositoryName.getName(), false, "Restarting."));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index fc89749..ee2141d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -178,7 +178,8 @@
Path outputDirectory,
BlazeDirectories directories,
Environment env,
- Map<String, String> markerData)
+ Map<String, String> markerData,
+ SkyKey key)
throws SkyFunctionException, InterruptedException;
@SuppressWarnings("unchecked")
@@ -288,14 +289,15 @@
}
/**
- * A method that can be called from a implementation of
- * {@link #fetch(Rule, Path, BlazeDirectories, Environment, Map)} to declare a list of Skyframe
- * dependencies on environment variable. It also add the information to the marker file. It
- * returns the list of environment variable on which the function depends, or null if the skyframe
- * function needs to be restarted.
+ * A method that can be called from a implementation of {@link #fetch(Rule, Path,
+ * BlazeDirectories, Environment, Map, SkyKey)} to declare a list of Skyframe dependencies on
+ * environment variable. It also add the information to the marker file. It returns the list of
+ * environment variable on which the function depends, or null if the skyframe function needs to
+ * be restarted.
*/
- protected Map<String, String> declareEnvironmentDependencies(Map<String, String> markerData,
- Environment env, Iterable<String> keys) throws InterruptedException {
+ protected Map<String, String> declareEnvironmentDependencies(
+ Map<String, String> markerData, Environment env, Iterable<String> keys)
+ throws InterruptedException {
Map<String, String> environ = ActionEnvironmentFunction.getEnvironmentView(env, keys);
// Returns true if there is a null value and we need to wait for some dependencies.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index 4f7d257..007fa9c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -630,7 +630,8 @@
configConditions,
toolchainContext,
aspectConfiguration,
- view.getHostConfiguration(aspectConfiguration));
+ view.getHostConfiguration(aspectConfiguration),
+ key);
} finally {
CurrentRuleTracker.endConfiguredAspect();
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index bebbc06..533ec1d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -340,6 +340,7 @@
env,
target,
configuration,
+ configuredTargetKey,
depValueMap,
configConditions,
toolchainContext,
@@ -771,6 +772,7 @@
Environment env,
Target target,
BuildConfiguration configuration,
+ ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<Attribute, ConfiguredTargetAndData> depValueMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
@Nullable ToolchainContext toolchainContext,
@@ -796,6 +798,7 @@
target,
configuration,
analysisEnvironment,
+ configuredTargetKey,
depValueMap,
configConditions,
toolchainContext);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index 2430786..2d9c3b9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -751,6 +751,7 @@
Target target,
BuildConfiguration configuration,
CachingAnalysisEnvironment analysisEnvironment,
+ ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
@Nullable ToolchainContext toolchainContext)
@@ -766,6 +767,7 @@
target,
configuration,
getHostConfiguration(configuration),
+ configuredTargetKey,
prerequisiteMap,
configConditions,
toolchainContext);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
index 91a8690..193e634 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
@@ -76,7 +76,9 @@
.setEventHandler(analysisEnv.getEventHandler())
.setStarlarkContext(
new BazelStarlarkContext(
- toolsRepository, ruleContext.getRule().getPackage().getRepositoryMapping()))
+ toolsRepository,
+ ruleContext.getRule().getPackage().getRepositoryMapping(),
+ ruleContext.getSymbolGenerator()))
// NB: loading phase functions are not available: this is analysis already, so we do
// *not* setLoadingPhase().
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 5b2cea5..3f31dd7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -134,7 +134,7 @@
if (importResult == null) {
return null;
}
- parser.execute(ast, importResult.importMap, skylarkSemantics);
+ parser.execute(ast, importResult.importMap, skylarkSemantics, key);
} catch (NoSuchPackageException e) {
throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
} catch (NameConflictException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
index 02cae84..701ea76 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.skylarkinterface.ParamType;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Runtime.NoneType;
@@ -565,7 +566,7 @@
name = "create_linking_context",
doc = "Creates a <code>LinkingContext</code>.",
useLocation = true,
- useEnvironment = true,
+ useContext = true,
parameters = {
@Param(
name = "libraries_to_link",
@@ -588,7 +589,7 @@
Object librariesToLinkObject,
Object userLinkFlagsObject,
Location location,
- Environment environment)
+ StarlarkContext context)
throws EvalException, InterruptedException;
@SkylarkCallable(