diff options
author | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-25 16:45:20 +0100 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-02-25 16:45:20 +0100 |
commit | d08b27fa9701fecfdb69e1b0d1ac2459efc2129b (patch) | |
tree | 5d50963026239ca5aebfb47ea5b8db7e814e57c8 /src/main/java/com/google/devtools/build/lib/rules/filegroup |
Update from Google.
--
MOE_MIGRATED_REVID=85702957
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 | 103 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/filegroup/FilegroupPathProvider.java | 38 |
2 files changed, 141 insertions, 0 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 new file mode 100644 index 0000000000..cb297d8d0e --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java @@ -0,0 +1,103 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.filegroup; + +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.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.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.Type; +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; +import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; +import com.google.devtools.build.lib.rules.test.InstrumentedFilesProviderImpl; +import com.google.devtools.build.lib.util.FileTypeSet; +import com.google.devtools.build.lib.vfs.PathFragment; + +import java.util.Iterator; + +/** + * ConfiguredTarget for "filegroup". + */ +public class Filegroup implements RuleConfiguredTargetFactory { + + @Override + public ConfiguredTarget create(RuleContext ruleContext) { + 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); + + InstrumentedFilesCollector instrumentedFilesCollector = + new InstrumentedFilesCollector(ruleContext, + // what do *we* know about whether this is a source file or not + new InstrumentationSpec(FileTypeSet.ANY_FILE, "srcs", "deps", "data"), + InstrumentedFilesCollector.NO_METADATA_COLLECTOR, filesToBuild); + + RunfilesProvider runfilesProvider = RunfilesProvider.withData( + new Runfiles.Builder() + .addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES) + .build(), + // If you're visiting a filegroup as data, then we also visit its data as data. + new Runfiles.Builder().addTransitiveArtifacts(filesToBuild) + .addDataDeps(ruleContext).build()); + + return new RuleConfiguredTargetBuilder(ruleContext) + .add(RunfilesProvider.class, runfilesProvider) + .setFilesToBuild(filesToBuild) + .setRunfilesSupport(null, getExecutable(filesToBuild)) + .add(InstrumentedFilesProvider.class, new InstrumentedFilesProviderImpl( + instrumentedFilesCollector)) + .add(MiddlemanProvider.class, new MiddlemanProvider(middleman)) + .add(FilegroupPathProvider.class, + new FilegroupPathProvider(getFilegroupPath(ruleContext))) + .build(); + } + + /* + * Returns the single executable output of this filegroup. Returns + * {@code null} if there are multiple outputs or the single output is not + * considered an executable. + */ + private Artifact getExecutable(NestedSet<Artifact> filesToBuild) { + Iterator<Artifact> it = filesToBuild.iterator(); + if (it.hasNext()) { + Artifact out = it.next(); + if (!it.hasNext()) { + return out; + } + } + return null; + } + + private PathFragment getFilegroupPath(RuleContext ruleContext) { + String attr = ruleContext.attributes().get("path", Type.STRING); + if (attr.isEmpty()) { + return PathFragment.EMPTY_FRAGMENT; + } else { + return ruleContext.getLabel().getPackageFragment().getRelative(attr); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/filegroup/FilegroupPathProvider.java b/src/main/java/com/google/devtools/build/lib/rules/filegroup/FilegroupPathProvider.java new file mode 100644 index 0000000000..370be07cae --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/FilegroupPathProvider.java @@ -0,0 +1,38 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.filegroup; + +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.vfs.PathFragment; + +/** + * A transitive info provider for dependent targets to query {@code path} attributes. + */ +@Immutable +public final class FilegroupPathProvider implements TransitiveInfoProvider { + private final PathFragment pathFragment; + + public FilegroupPathProvider(PathFragment pathFragment) { + this.pathFragment = pathFragment; + } + + /** + * Returns the value of the {@code path} attribute or the empty fragment if it is not present. + */ + public PathFragment getFilegroupPath() { + return pathFragment; + } +} |