aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java124
1 files changed, 81 insertions, 43 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 29cb592369..52687e2c43 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -92,6 +92,7 @@ import com.google.devtools.build.lib.packages.AstParseResult;
import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
import com.google.devtools.build.lib.packages.BuildFileName;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
+import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.NoSuchThingException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.PackageFactory;
@@ -1267,7 +1268,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
}
/**
- * Returns the {@link ConfiguredTarget}s corresponding to the given keys.
+ * Returns the {@link ConfiguredTargetAndTarget}s corresponding to the given keys.
*
* <p>For use for legacy support and tests calling through {@code BuildView} only.
*
@@ -1276,7 +1277,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
*/
@ThreadSafety.ThreadSafe
// TODO(bazel-team): rename this and below methods to something that discourages general use
- public ImmutableList<ConfiguredTarget> getConfiguredTargets(
+ public ImmutableList<ConfiguredTargetAndTarget> getConfiguredTargets(
ExtendedEventHandler eventHandler,
BuildConfiguration originalConfig,
Iterable<Dependency> keys) {
@@ -1285,8 +1286,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
}
/**
- * Returns a map from {@link Dependency} inputs to the {@link ConfiguredTarget}s corresponding to
- * those dependencies.
+ * Returns a map from {@link Dependency} inputs to the {@link ConfiguredTargetAndTarget}s
+ * corresponding to those dependencies.
*
* <p>For use for legacy support and tests calling through {@code BuildView} only.
*
@@ -1294,7 +1295,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
* returned list.
*/
@ThreadSafety.ThreadSafe
- public ImmutableMultimap<Dependency, ConfiguredTarget> getConfiguredTargetMap(
+ public ImmutableMultimap<Dependency, ConfiguredTargetAndTarget> getConfiguredTargetMap(
ExtendedEventHandler eventHandler,
BuildConfiguration originalConfig,
Iterable<Dependency> keys) {
@@ -1324,6 +1325,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
AspectValue.createAspectKey(key.getLabel(), depConfig, aspectDescriptor, depConfig));
}
}
+ skyKeys.add(PackageValue.key(key.getLabel().getPackageIdentifier()));
}
EvaluationResult<SkyValue> result = evaluateSkyKeys(eventHandler, skyKeys);
@@ -1331,45 +1333,75 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
reportCycles(eventHandler, entry.getValue().getCycleInfo(), entry.getKey());
}
- ImmutableMultimap.Builder<Dependency, ConfiguredTarget> cts =
- ImmutableMultimap.<Dependency, ConfiguredTarget>builder();
-
- DependentNodeLoop:
- for (Dependency key : keys) {
- if (!configs.containsKey(key)) {
- // If we couldn't compute a configuration for this target, the target was in error (e.g.
- // it couldn't be loaded). Exclude it from the results.
- continue;
- }
- for (BuildConfiguration depConfig : configs.get(key)) {
- SkyKey configuredTargetKey = ConfiguredTargetValue.key(
- key.getLabel(), depConfig);
- if (result.get(configuredTargetKey) == null) {
+ ImmutableMultimap.Builder<Dependency, ConfiguredTargetAndTarget> cts =
+ ImmutableMultimap.builder();
+
+ // Logic copied from ConfiguredTargetFunction#computeDependencies.
+ Set<SkyKey> aliasPackagesToFetch = new HashSet<>();
+ List<Dependency> aliasKeysToRedo = new ArrayList<>();
+ EvaluationResult<SkyValue> aliasPackageValues = null;
+ Iterable<Dependency> keysToProcess = keys;
+ for (int i = 0; i < 2; i++) {
+ DependentNodeLoop:
+ for (Dependency key : keysToProcess) {
+ if (!configs.containsKey(key)) {
+ // If we couldn't compute a configuration for this target, the target was in error (e.g.
+ // it couldn't be loaded). Exclude it from the results.
continue;
}
+ for (BuildConfiguration depConfig : configs.get(key)) {
+ SkyKey configuredTargetKey = ConfiguredTargetValue.key(key.getLabel(), depConfig);
+ if (result.get(configuredTargetKey) == null) {
+ continue;
+ }
+
+ ConfiguredTarget configuredTarget =
+ ((ConfiguredTargetValue) result.get(configuredTargetKey)).getConfiguredTarget();
+ Label label = configuredTarget.getLabel();
+ SkyKey packageKey = PackageValue.key(label.getPackageIdentifier());
+ PackageValue packageValue;
+ if (i == 0) {
+ packageValue = (PackageValue) result.get(packageKey);
+ if (packageValue == null) {
+ aliasPackagesToFetch.add(packageKey);
+ aliasKeysToRedo.add(key);
+ continue;
+ }
+ } else {
+ packageValue =
+ (PackageValue)
+ Preconditions.checkNotNull(aliasPackageValues.get(packageKey), packageKey);
+ }
+ List<ConfiguredAspect> configuredAspects = new ArrayList<>();
- ConfiguredTarget configuredTarget =
- ((ConfiguredTargetValue) result.get(configuredTargetKey)).getConfiguredTarget();
- List<ConfiguredAspect> configuredAspects = new ArrayList<>();
+ for (AspectDescriptor aspectDescriptor : key.getAspects().getAllAspects()) {
+ SkyKey aspectKey =
+ AspectValue.createAspectKey(key.getLabel(), depConfig, aspectDescriptor, depConfig);
+ if (result.get(aspectKey) == null) {
+ continue DependentNodeLoop;
+ }
- for (AspectDescriptor aspectDescriptor : key.getAspects().getAllAspects()) {
- SkyKey aspectKey =
- AspectValue.createAspectKey(key.getLabel(), depConfig, aspectDescriptor, depConfig);
- if (result.get(aspectKey) == null) {
- continue DependentNodeLoop;
+ configuredAspects.add(((AspectValue) result.get(aspectKey)).getConfiguredAspect());
}
- configuredAspects.add(((AspectValue) result.get(aspectKey)).getConfiguredAspect());
- }
+ try {
+ cts.put(
+ key,
+ new ConfiguredTargetAndTarget(
+ MergedConfiguredTarget.of(configuredTarget, configuredAspects),
+ packageValue.getPackage().getTarget(configuredTarget.getLabel().getName())));
- try {
- cts.put(key, MergedConfiguredTarget.of(configuredTarget, configuredAspects));
- } catch (DuplicateException e) {
- throw new IllegalStateException(
- String.format("Error creating %s", configuredTarget.getTarget().getLabel()),
- e);
+ } catch (DuplicateException | NoSuchTargetException e) {
+ throw new IllegalStateException(
+ String.format("Error creating %s", configuredTarget.getLabel()), e);
+ }
}
}
+ if (aliasKeysToRedo.isEmpty()) {
+ break;
+ }
+ aliasPackageValues = evaluateSkyKeys(eventHandler, aliasPackagesToFetch);
+ keysToProcess = aliasKeysToRedo;
}
return cts.build();
@@ -1611,14 +1643,20 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
Label label,
BuildConfiguration configuration,
Transition transition) {
- return Iterables.getFirst(
- getConfiguredTargets(
- eventHandler,
- configuration,
- ImmutableList.of(configuration == null
- ? Dependency.withNullConfiguration(label)
- : Dependency.withTransitionAndAspects(label, transition, AspectCollection.EMPTY))),
- null);
+ ConfiguredTargetAndTarget configuredTargetAndTarget =
+ Iterables.getFirst(
+ getConfiguredTargets(
+ eventHandler,
+ configuration,
+ ImmutableList.of(
+ configuration == null
+ ? Dependency.withNullConfiguration(label)
+ : Dependency.withTransitionAndAspects(
+ label, transition, AspectCollection.EMPTY))),
+ null);
+ return configuredTargetAndTarget == null
+ ? null
+ : configuredTargetAndTarget.getConfiguredTarget();
}
/**