aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/filegroup
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-06-22 14:25:36 +0000
committerGravatar Lukacs Berki <lberki@google.com>2016-06-23 11:02:33 +0000
commiteb856433d7949068944344352445f2068ad876cb (patch)
tree9bfa5048d073b018588fc84cf43cf454515e5d18 /src/main/java/com/google/devtools/build/lib/rules/filegroup
parent33aada27728990a302c481305c8c6c588f663043 (diff)
Filegroups can optionally export sources from a given output group.
-- MOS_MIGRATED_REVID=125562946
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/filegroup')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java47
1 files changed, 42 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
index cbbc0fccd6..92aac6f623 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
@@ -14,20 +14,23 @@
package com.google.devtools.build.lib.rules.filegroup;
+import static com.google.devtools.build.lib.analysis.OutputGroupProvider.INTERNAL_SUFFIX;
+
import com.google.devtools.build.lib.actions.Actions;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.CompilationHelper;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.MiddlemanProvider;
+import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec;
@@ -37,18 +40,37 @@ import com.google.devtools.build.lib.util.FileTypeSet;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.Iterator;
+import java.util.List;
/**
* ConfiguredTarget for "filegroup".
*/
public class Filegroup implements RuleConfiguredTargetFactory {
+ /** Error message for output groups that are explicitly blacklisted for filegroup reference. */
+ public static final String ILLEGAL_OUTPUT_GROUP_ERROR =
+ "Output group %s is not permitted for " + "reference in filegroups.";
+
@Override
public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException {
- NestedSet<Artifact> filesToBuild = NestedSetBuilder.wrap(Order.STABLE_ORDER,
- ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list());
- NestedSet<Artifact> middleman = CompilationHelper.getAggregatingMiddleman(
- ruleContext, Actions.escapeLabel(ruleContext.getLabel()), filesToBuild);
+ String outputGroupName = ruleContext.attributes().get("output_group", Type.STRING);
+
+ if (outputGroupName.endsWith(INTERNAL_SUFFIX)) {
+ ruleContext.throwWithAttributeError(
+ "output_group", String.format(ILLEGAL_OUTPUT_GROUP_ERROR, outputGroupName));
+ }
+
+ NestedSet<Artifact> filesToBuild =
+ outputGroupName.isEmpty()
+ ? NestedSetBuilder.wrap(
+ Order.STABLE_ORDER,
+ ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list())
+ : getArtifactsForOutputGroup(
+ outputGroupName, ruleContext.getPrerequisites("srcs", Mode.TARGET));
+
+ NestedSet<Artifact> middleman =
+ CompilationHelper.getAggregatingMiddleman(
+ ruleContext, Actions.escapeLabel(ruleContext.getLabel()), filesToBuild);
InstrumentedFilesProvider instrumentedFilesProvider =
InstrumentedFilesCollector.collect(ruleContext,
@@ -102,4 +124,19 @@ public class Filegroup implements RuleConfiguredTargetFactory {
return ruleContext.getLabel().getPackageIdentifier().getPathFragment().getRelative(attr);
}
}
+
+ /** Returns the artifacts from the given targets that are members of the given output group. */
+ private static NestedSet<Artifact> getArtifactsForOutputGroup(
+ String outputGroupName, List<? extends TransitiveInfoCollection> deps) {
+ NestedSetBuilder<Artifact> result = NestedSetBuilder.stableOrder();
+
+ for (TransitiveInfoCollection dep : deps) {
+ OutputGroupProvider outputGroupProvider = dep.getProvider(OutputGroupProvider.class);
+ if (outputGroupProvider != null) {
+ result.addTransitive(outputGroupProvider.getOutputGroup(outputGroupName));
+ }
+ }
+
+ return result.build();
+ }
}