Skip to content

Commit cac453b

Browse files
fmeumcopybara-github
authored andcommitted
Add --incompatible_filegroup_runfiles_for_data
If true, runfiles of targets listed in the srcs attribute of a filegroup are available to targets that consume the filegroup as a data dependency. Reland of #25365 behind an incompatible flag Closes #25978. PiperOrigin-RevId: 772841978 Change-Id: Ia8f126bb33e02969eafdbd6972c83f5350d58be2
1 parent 8c5b4e6 commit cac453b

File tree

6 files changed

+119
-15
lines changed

6 files changed

+119
-15
lines changed

src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@
6262
*/
6363
public class CoreOptions extends FragmentOptions implements Cloneable {
6464

65+
@Option(
66+
name = "incompatible_filegroup_runfiles_for_data",
67+
defaultValue = "false",
68+
documentationCategory = OptionDocumentationCategory.OUTPUT_SELECTION,
69+
effectTags = {OptionEffectTag.UNKNOWN},
70+
metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE},
71+
help =
72+
"If true, runfiles of targets listed in the srcs attribute are available to targets"
73+
+ " that consume the filegroup as a data dependency.")
74+
public boolean filegroupRunfilesForData;
75+
6576
@Option(
6677
name = "scl_config",
6778
defaultValue = "null",

src/main/java/com/google/devtools/build/lib/rules/BUILD

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,10 @@ java_library(
149149
"//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
150150
"//src/main/java/com/google/devtools/build/lib/analysis:test/instrumented_files_info",
151151
"//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_collection",
152-
"//src/main/java/com/google/devtools/build/lib/analysis/config:build_configuration",
152+
"//src/main/java/com/google/devtools/build/lib/analysis/config:core_options",
153153
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
154154
"//src/main/java/com/google/devtools/build/lib/packages",
155155
"//src/main/java/com/google/devtools/build/lib/util:filetype",
156-
"//third_party:guava",
157156
"//third_party:jsr305",
158157
],
159158
)

src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.devtools.build.lib.analysis.Runfiles;
2828
import com.google.devtools.build.lib.analysis.RunfilesProvider;
2929
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
30+
import com.google.devtools.build.lib.analysis.config.CoreOptions;
3031
import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
3132
import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
3233
import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
@@ -38,9 +39,7 @@
3839
import java.util.List;
3940
import javax.annotation.Nullable;
4041

41-
/**
42-
* ConfiguredTarget for "filegroup".
43-
*/
42+
/** ConfiguredTarget for "filegroup". */
4443
public class Filegroup implements RuleConfiguredTargetFactory {
4544

4645
/** Error message for output groups that are explicitly forbidden from filegroup reference. */
@@ -81,16 +80,25 @@ public ConfiguredTarget create(RuleContext ruleContext)
8180
new InstrumentationSpec(FileTypeSet.ANY_FILE).withDependencyAttributes("srcs", "data"),
8281
/* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER));
8382

83+
// If you're visiting a filegroup as data, then we also visit its data as data.
84+
var dataRunfilesBuilder =
85+
new Runfiles.Builder(ruleContext.getWorkspaceName()).addTransitiveArtifacts(filesToBuild);
86+
if (ruleContext
87+
.getConfiguration()
88+
.getOptions()
89+
.get(CoreOptions.class)
90+
.filegroupRunfilesForData) {
91+
// If you're visiting a filegroup as data, then we also visit its data as data.
92+
dataRunfilesBuilder.addRunfiles(ruleContext, RunfilesProvider.DATA_RUNFILES);
93+
} else {
94+
dataRunfilesBuilder.addDataDeps(ruleContext);
95+
}
8496
RunfilesProvider runfilesProvider =
8597
RunfilesProvider.withData(
8698
new Runfiles.Builder(ruleContext.getWorkspaceName())
8799
.addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES)
88100
.build(),
89-
// If you're visiting a filegroup as data, then we also visit its data as data.
90-
new Runfiles.Builder(ruleContext.getWorkspaceName())
91-
.addTransitiveArtifacts(filesToBuild)
92-
.addDataDeps(ruleContext)
93-
.build());
101+
dataRunfilesBuilder.build());
94102

95103
RuleConfiguredTargetBuilder builder =
96104
new RuleConfiguredTargetBuilder(ruleContext)

src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ bazel_fragments["CoreOptions"] = fragment(
273273
"//command_line_option:experimental_inprocess_symlink_creation",
274274
"//command_line_option:experimental_throttle_action_cache_check",
275275
"//command_line_option:experimental_use_platforms_in_output_dir_legacy_heuristic",
276+
"//command_line_option:incompatible_filegroup_runfiles_for_data",
276277
],
277278
inputs = ["//command_line_option:features"],
278279
outputs = [

src/test/java/com/google/devtools/build/lib/rules/filegroup/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ java_library(
2424
"//src/main/java/com/google/devtools/build/lib/util:filetype",
2525
"//src/test/java/com/google/devtools/build/lib/actions/util",
2626
"//src/test/java/com/google/devtools/build/lib/analysis/util",
27+
"//third_party:guava",
2728
"//third_party:junit4",
2829
"//third_party:truth",
30+
"@maven//:com_google_testparameterinjector_test_parameter_injector",
2931
],
3032
)
3133

src/test/java/com/google/devtools/build/lib/rules/filegroup/FilegroupConfiguredTargetTest.java

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@
1616
import static com.google.common.truth.Truth.assertThat;
1717
import static org.junit.Assert.assertThrows;
1818

19+
import com.google.common.collect.ImmutableSet;
1920
import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
2021
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
2122
import com.google.devtools.build.lib.analysis.OutputGroupInfo;
2223
import com.google.devtools.build.lib.analysis.configuredtargets.FileConfiguredTarget;
2324
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
2425
import com.google.devtools.build.lib.rules.java.JavaSemantics;
2526
import com.google.devtools.build.lib.util.FileType;
27+
import com.google.testing.junit.testparameterinjector.TestParameter;
28+
import com.google.testing.junit.testparameterinjector.TestParameterInjector;
2629
import java.io.IOException;
2730
import org.junit.Test;
2831
import org.junit.runner.RunWith;
29-
import org.junit.runners.JUnit4;
3032

31-
/**
32-
* Tests for {@link Filegroup}.
33-
*/
34-
@RunWith(JUnit4.class)
33+
/** Tests for {@link Filegroup}. */
34+
@RunWith(TestParameterInjector.class)
3535
public class FilegroupConfiguredTargetTest extends BuildViewTestCase {
3636

3737
@Test
@@ -219,4 +219,87 @@ public void testErrorForIllegalOutputGroup() throws Exception {
219219
.contains(
220220
String.format(Filegroup.ILLEGAL_OUTPUT_GROUP_ERROR, OutputGroupInfo.HIDDEN_TOP_LEVEL));
221221
}
222+
223+
@Test
224+
public void testDefaultInfo(@TestParameter boolean filegroupRunfilesForData) throws Exception {
225+
scratch.file(
226+
"x/defs.bzl",
227+
"""
228+
def _default_info_impl(ctx):
229+
files = depset(transitive = [t[DefaultInfo].files for t in ctx.attr.files])
230+
default_runfiles = ctx.runfiles(transitive_files = depset(transitive = [t[DefaultInfo].files for t in ctx.attr.default_runfiles]))
231+
data_runfiles = ctx.runfiles(transitive_files = depset(transitive = [t[DefaultInfo].files for t in ctx.attr.data_runfiles]))
232+
return [
233+
DefaultInfo(
234+
files = files,
235+
default_runfiles = default_runfiles,
236+
data_runfiles = data_runfiles,
237+
)
238+
]
239+
default_info = rule(
240+
implementation = _default_info_impl,
241+
attrs = {
242+
"files": attr.label_list(allow_files=True),
243+
"default_runfiles": attr.label_list(allow_files=True),
244+
"data_runfiles": attr.label_list(allow_files=True),
245+
},
246+
)
247+
""");
248+
scratch.file(
249+
"x/BUILD",
250+
"""
251+
load(":defs.bzl", "default_info")
252+
253+
default_info(
254+
name = "default_info_srcs",
255+
files = ["srcs_files_file"],
256+
default_runfiles = ["srcs_default_runfiles_file"],
257+
data_runfiles = ["srcs_data_runfiles_file"],
258+
)
259+
260+
default_info(
261+
name = "default_info_data",
262+
files = ["data_files"],
263+
default_runfiles = ["data_default_runfiles_file"],
264+
data_runfiles = ["data_data_runfiles_file"],
265+
)
266+
267+
filegroup(
268+
name = "filegroup",
269+
srcs = [
270+
":default_info_srcs",
271+
"srcs_file",
272+
],
273+
data = [
274+
":default_info_data",
275+
"data_file",
276+
],
277+
)
278+
""");
279+
280+
useConfiguration("--incompatible_filegroup_runfiles_for_data=" + filegroupRunfilesForData);
281+
var filegroup = getConfiguredTarget("//x:filegroup");
282+
283+
assertThat(ActionsTestUtil.prettyArtifactNames(getFilesToBuild(filegroup)))
284+
.containsExactly("x/srcs_file", "x/srcs_files_file");
285+
assertThat(ActionsTestUtil.prettyArtifactNames(getDefaultRunfiles(filegroup).getArtifacts()))
286+
.containsExactly(
287+
"x/srcs_default_runfiles_file",
288+
"x/data_file",
289+
"x/data_files",
290+
"x/data_data_runfiles_file");
291+
var expectedDataRunfiles =
292+
ImmutableSet.<String>builder()
293+
.add(
294+
"x/srcs_file",
295+
"x/srcs_files_file",
296+
"x/data_file",
297+
"x/data_files",
298+
"x/data_data_runfiles_file");
299+
if (filegroupRunfilesForData) {
300+
expectedDataRunfiles.add("x/srcs_data_runfiles_file");
301+
}
302+
assertThat(ActionsTestUtil.prettyArtifactNames(getDataRunfiles(filegroup).getArtifacts()))
303+
.containsExactlyElementsIn(expectedDataRunfiles.build());
304+
}
222305
}

0 commit comments

Comments
 (0)