@Override public List<Label> resolve( Rule rule, AttributeMap attributes, BuildConfiguration configuration) { // action_listeners are special rules; they tell the build system to add extra_actions to // existing rules. As such they need an edge to every ConfiguredTarget with the limitation // that they only run on the target configuration and should not operate on // action_listeners // and extra_actions themselves (to avoid cycles). return configuration.getActionListeners(); }
/** * Scans {@code action_listeners} associated with this build to see if any {@code extra_actions} * should be added to this configured target. If any action_listeners are present, a partial visit * of the artifact/action graph is performed (for as long as actions found are owned by this * {@link ConfiguredTarget}). Any actions that match the {@code action_listener} get an {@code * extra_action} associated. The output artifacts of the extra_action are reported to the {@link * AnalysisEnvironment} for bookkeeping. */ private ExtraActionArtifactsProvider initializeExtraActions() { BuildConfiguration configuration = ruleContext.getConfiguration(); if (configuration.isHostConfiguration()) { return ExtraActionArtifactsProvider.EMPTY; } ImmutableList<Artifact> extraActionArtifacts = ImmutableList.of(); NestedSetBuilder<ExtraArtifactSet> builder = NestedSetBuilder.stableOrder(); List<Label> actionListenerLabels = configuration.getActionListeners(); if (!actionListenerLabels.isEmpty() && ruleContext.getRule().getAttributeDefinition(":action_listener") != null) { ExtraActionsVisitor visitor = new ExtraActionsVisitor(ruleContext, computeMnemonicsToExtraActionMap()); // The action list is modified within the body of the loop by the addExtraAction() call, // thus the copy for (Action action : ImmutableList.copyOf(ruleContext.getAnalysisEnvironment().getRegisteredActions())) { if (!actionsWithoutExtraAction.contains(action)) { visitor.addExtraAction(action); } } extraActionArtifacts = visitor.getAndResetExtraArtifacts(); if (!extraActionArtifacts.isEmpty()) { builder.add(ExtraArtifactSet.of(ruleContext.getLabel(), extraActionArtifacts)); } } // Add extra action artifacts from dependencies for (TransitiveInfoCollection dep : ruleContext.getConfiguredTargetMap().values()) { ExtraActionArtifactsProvider provider = dep.getProvider(ExtraActionArtifactsProvider.class); if (provider != null) { builder.addTransitive(provider.getTransitiveExtraActionArtifacts()); } } if (mandatoryStampFiles != null && !mandatoryStampFiles.isEmpty()) { builder.add(ExtraArtifactSet.of(ruleContext.getLabel(), mandatoryStampFiles)); } if (extraActionArtifacts.isEmpty() && builder.isEmpty()) { return ExtraActionArtifactsProvider.EMPTY; } return new ExtraActionArtifactsProvider(extraActionArtifacts, builder.build()); }