Skip to content

Commit 596653d

Browse files
googlewaltcopybara-github
authored andcommitted
Allow tree artifacts to be source or header inputs to cc_common.compile()
This is already supported in cc_library, and would make the behavior more consistent. PiperOrigin-RevId: 362295588
1 parent d2f93fd commit 596653d

File tree

3 files changed

+69
-7
lines changed

3 files changed

+69
-7
lines changed

src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,9 @@ public CcCompilationHelper addPrivateHeaders(Iterable<Pair<Artifact, Label>> pri
463463
}
464464

465465
private CcCompilationHelper addPrivateHeader(Artifact privateHeader, Label label) {
466-
boolean isHeader = CppFileTypes.CPP_HEADER.matches(privateHeader.getExecPath());
466+
boolean isHeader =
467+
CppFileTypes.CPP_HEADER.matches(privateHeader.getExecPath())
468+
|| privateHeader.isTreeArtifact();
467469
boolean isTextualInclude =
468470
CppFileTypes.CPP_TEXTUAL_INCLUDE.matches(privateHeader.getExecPath());
469471
Preconditions.checkState(isHeader || isTextualInclude);

src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,17 +1985,20 @@ protected Tuple compile(
19851985
CppFileTypes.CPP_SOURCE,
19861986
CppFileTypes.C_SOURCE,
19871987
CppFileTypes.ASSEMBLER_WITH_C_PREPROCESSOR,
1988-
CppFileTypes.ASSEMBLER));
1988+
CppFileTypes.ASSEMBLER),
1989+
/* allowAnyTreeArtifacts= */ true);
19891990
validateExtensions(
19901991
"public_hdrs",
19911992
publicHeaders,
19921993
FileTypeSet.of(CppFileTypes.CPP_HEADER),
1993-
FileTypeSet.of(CppFileTypes.CPP_HEADER));
1994+
FileTypeSet.of(CppFileTypes.CPP_HEADER),
1995+
/* allowAnyTreeArtifacts= */ true);
19941996
validateExtensions(
19951997
"private_hdrs",
19961998
privateHeaders,
19971999
FileTypeSet.of(CppFileTypes.CPP_HEADER),
1998-
FileTypeSet.of(CppFileTypes.CPP_HEADER));
2000+
FileTypeSet.of(CppFileTypes.CPP_HEADER),
2001+
/* allowAnyTreeArtifacts= */ true);
19992002

20002003
if (disallowNopicOutputs && disallowPicOutputs) {
20012004
throw Starlark.errorf("Either PIC or no PIC actions have to be created.");
@@ -2244,11 +2247,20 @@ protected CcCompilationOutputs createCompilationOutputsFromStarlark(
22442247
Object objectsObject, Object picObjectsObject) throws EvalException {
22452248
CcCompilationOutputs.Builder ccCompilationOutputsBuilder = CcCompilationOutputs.builder();
22462249
NestedSet<Artifact> objects = convertToNestedSet(objectsObject, Artifact.class, "objects");
2247-
validateExtensions("objects", objects.toList(), Link.OBJECT_FILETYPES, Link.OBJECT_FILETYPES);
2250+
validateExtensions(
2251+
"objects",
2252+
objects.toList(),
2253+
Link.OBJECT_FILETYPES,
2254+
Link.OBJECT_FILETYPES,
2255+
/* allowAnyTreeArtifacts= */ false);
22482256
NestedSet<Artifact> picObjects =
22492257
convertToNestedSet(picObjectsObject, Artifact.class, "pic_objects");
22502258
validateExtensions(
2251-
"pic_objects", picObjects.toList(), Link.OBJECT_FILETYPES, Link.OBJECT_FILETYPES);
2259+
"pic_objects",
2260+
picObjects.toList(),
2261+
Link.OBJECT_FILETYPES,
2262+
Link.OBJECT_FILETYPES,
2263+
/* allowAnyTreeArtifacts= */ false);
22522264
ccCompilationOutputsBuilder.addObjectFiles(objects.toList());
22532265
ccCompilationOutputsBuilder.addPicObjectFiles(picObjects.toList());
22542266
return ccCompilationOutputsBuilder.build();
@@ -2258,9 +2270,13 @@ private static void validateExtensions(
22582270
String paramName,
22592271
List<Artifact> files,
22602272
FileTypeSet validFileTypeSet,
2261-
FileTypeSet fileTypeForErrorMessage)
2273+
FileTypeSet fileTypeForErrorMessage,
2274+
boolean allowAnyTreeArtifacts)
22622275
throws EvalException {
22632276
for (Artifact file : files) {
2277+
if (allowAnyTreeArtifacts && file.isTreeArtifact()) {
2278+
continue;
2279+
}
22642280
if (!validFileTypeSet.matches(file.getFilename())) {
22652281
throw Starlark.errorf(
22662282
"'%s' has wrong extension. The list of possible extensions for '%s' is: %s",

src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5586,6 +5586,21 @@ public void testPossiblePublicHdrExtensions() throws Exception {
55865586
doTestPossibleExtensionsOfSrcsAndHdrs("public_hdrs", CppFileTypes.CPP_HEADER.getExtensions());
55875587
}
55885588

5589+
@Test
5590+
public void testTreeArtifactSrcs() throws Exception {
5591+
doTestTreeAtrifactInSrcsAndHdrs("srcs");
5592+
}
5593+
5594+
@Test
5595+
public void testTreeArtifactPrivateHdrs() throws Exception {
5596+
doTestTreeAtrifactInSrcsAndHdrs("private_hdrs");
5597+
}
5598+
5599+
@Test
5600+
public void testTreeArtifactPublicHdrs() throws Exception {
5601+
doTestTreeAtrifactInSrcsAndHdrs("public_hdrs");
5602+
}
5603+
55895604
@Test
55905605
public void testWrongSrcsExtensionGivesError() throws Exception {
55915606
doTestWrongExtensionOfSrcsAndHdrs("srcs");
@@ -6120,6 +6135,35 @@ private void doTestPossibleExtensionsOfSrcsAndHdrs(String attrName, List<String>
61206135
}
61216136
}
61226137

6138+
private void doTestTreeAtrifactInSrcsAndHdrs(String attrName) throws Exception {
6139+
createFiles(scratch, "tools/build_defs/foo");
6140+
reporter.removeHandler(failFastHandler);
6141+
6142+
scratch.file(
6143+
"bar/create_tree_artifact.bzl",
6144+
"def _impl(ctx):",
6145+
" tree = ctx.actions.declare_directory('dir')",
6146+
" ctx.actions.run_shell(",
6147+
" outputs = [tree],",
6148+
" inputs = [],",
6149+
" arguments = [tree.path],",
6150+
" command = 'mkdir $1',",
6151+
" )",
6152+
" return [DefaultInfo(files = depset([tree]))]",
6153+
"create_tree_artifact = rule(implementation = _impl)");
6154+
scratch.file(
6155+
"bar/BUILD",
6156+
"load('//tools/build_defs/foo:extension.bzl', 'cc_starlark_library')",
6157+
"load(':create_tree_artifact.bzl', 'create_tree_artifact')",
6158+
"create_tree_artifact(name = 'tree_artifact')",
6159+
"cc_starlark_library(",
6160+
" name = 'starlark_lib',",
6161+
" " + attrName + " = [':tree_artifact'],",
6162+
")");
6163+
getConfiguredTarget("//bar:starlark_lib");
6164+
assertNoEvents();
6165+
}
6166+
61236167
private void doTestCcOutputsWrongExtension(String attrName, String paramName) throws Exception {
61246168
setupCcOutputsTest();
61256169
scratch.file(

0 commit comments

Comments
 (0)