diff options
author | Cal Peyser <cpeyser@google.com> | 2016-06-22 14:25:36 +0000 |
---|---|---|
committer | Lukacs Berki <lberki@google.com> | 2016-06-23 11:02:33 +0000 |
commit | eb856433d7949068944344352445f2068ad876cb (patch) | |
tree | 9bfa5048d073b018588fc84cf43cf454515e5d18 /src/main/java/com/google/devtools/build/lib/rules/filegroup | |
parent | 33aada27728990a302c481305c8c6c588f663043 (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.java | 47 |
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(); + } } |