diff options
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.java | 124 |
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(); } /** |