bp2build include generated hdrs in all src splits

Currently generated headers are only included in the srcs split;
however, if c or assembly sources depend on the headers, the
dependendency is lacking and can cause non-deterministic failures.

Test: build/bazel/ci/bp2build.sh
Change-Id: Ic354c88300a5fb1b85241f68889e904c33a81488
This commit is contained in:
Liz Kammer
2021-10-19 09:45:48 -04:00
parent 9579f08f22
commit ae3994ed4c
2 changed files with 75 additions and 22 deletions

View File

@@ -986,6 +986,41 @@ cc_library_static {
}) })
} }
func TestCcLibraryStaticGeneratedHeadersAllPartitions(t *testing.T) {
runCcLibraryStaticTestCase(t, bp2buildTestCase{
moduleTypeUnderTest: "cc_library_static",
moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
blueprint: soongCcLibraryStaticPreamble + `
genrule {
name: "generated_hdr",
cmd: "nothing to see here",
}
cc_library_static {
name: "foo_static",
srcs: ["cpp_src.cpp", "as_src.S", "c_src.c"],
generated_headers: ["generated_hdr"],
include_build_directory: false,
}`,
expectedBazelTargets: []string{`cc_library_static(
name = "foo_static",
srcs = [
"cpp_src.cpp",
":generated_hdr",
],
srcs_as = [
"as_src.S",
":generated_hdr",
],
srcs_c = [
"c_src.c",
":generated_hdr",
],
)`},
})
}
func TestCcLibraryStaticArchSrcsExcludeSrcsGeneratedFiles(t *testing.T) { func TestCcLibraryStaticArchSrcsExcludeSrcsGeneratedFiles(t *testing.T) {
runCcLibraryStaticTestCase(t, bp2buildTestCase{ runCcLibraryStaticTestCase(t, bp2buildTestCase{
description: "cc_library_static arch srcs/exclude_srcs with generated files", description: "cc_library_static arch srcs/exclude_srcs with generated files",
@@ -1067,10 +1102,10 @@ cc_library_static {
name = "foo_static3", name = "foo_static3",
srcs = [ srcs = [
"common.cpp", "common.cpp",
":generated_hdr",
"//dep:generated_hdr_other_pkg",
":generated_src", ":generated_src",
"//dep:generated_src_other_pkg", "//dep:generated_src_other_pkg",
":generated_hdr",
"//dep:generated_hdr_other_pkg",
] + select({ ] + select({
"//build/bazel/platforms/arch:x86": [ "//build/bazel/platforms/arch:x86": [
"for-x86.cpp", "for-x86.cpp",
@@ -1082,8 +1117,8 @@ cc_library_static {
], ],
}) + select({ }) + select({
"//build/bazel/platforms/os:android": [ "//build/bazel/platforms/os:android": [
"//dep:generated_hdr_other_pkg_android",
":generated_src_android", ":generated_src_android",
"//dep:generated_hdr_other_pkg_android",
], ],
"//conditions:default": [], "//conditions:default": [],
}), }),

View File

@@ -26,6 +26,12 @@ import (
"github.com/google/blueprint/proptools" "github.com/google/blueprint/proptools"
) )
const (
cSrcPartition = "c"
asSrcPartition = "as"
cppSrcPartition = "cpp"
)
// staticOrSharedAttributes are the Bazel-ified versions of StaticOrSharedProperties -- // staticOrSharedAttributes are the Bazel-ified versions of StaticOrSharedProperties --
// properties which apply to either the shared or static version of a cc_library module. // properties which apply to either the shared or static version of a cc_library module.
type staticOrSharedAttributes struct { type staticOrSharedAttributes struct {
@@ -43,7 +49,7 @@ type staticOrSharedAttributes struct {
System_dynamic_deps bazel.LabelListAttribute System_dynamic_deps bazel.LabelListAttribute
} }
func groupSrcsByExtension(ctx android.TopDownMutatorContext, srcs bazel.LabelListAttribute) (cppSrcs, cSrcs, asSrcs bazel.LabelListAttribute) { func groupSrcsByExtension(ctx android.TopDownMutatorContext, srcs bazel.LabelListAttribute) bazel.PartitionToLabelListAttribute {
// Check that a module is a filegroup type named <label>. // Check that a module is a filegroup type named <label>.
isFilegroupNamed := func(m android.Module, fullLabel string) bool { isFilegroupNamed := func(m android.Module, fullLabel string) bool {
if ctx.OtherModuleType(m) != "filegroup" { if ctx.OtherModuleType(m) != "filegroup" {
@@ -75,17 +81,14 @@ func groupSrcsByExtension(ctx android.TopDownMutatorContext, srcs bazel.LabelLis
// TODO(b/190006308): Handle language detection of sources in a Bazel rule. // TODO(b/190006308): Handle language detection of sources in a Bazel rule.
partitioned := bazel.PartitionLabelListAttribute(ctx, &srcs, bazel.LabelPartitions{ partitioned := bazel.PartitionLabelListAttribute(ctx, &srcs, bazel.LabelPartitions{
"c": bazel.LabelPartition{Extensions: []string{".c"}, LabelMapper: addSuffixForFilegroup("_c_srcs")}, cSrcPartition: bazel.LabelPartition{Extensions: []string{".c"}, LabelMapper: addSuffixForFilegroup("_c_srcs")},
"as": bazel.LabelPartition{Extensions: []string{".s", ".S"}, LabelMapper: addSuffixForFilegroup("_as_srcs")}, asSrcPartition: bazel.LabelPartition{Extensions: []string{".s", ".S"}, LabelMapper: addSuffixForFilegroup("_as_srcs")},
// C++ is the "catch-all" group, and comprises generated sources because we don't // C++ is the "catch-all" group, and comprises generated sources because we don't
// know the language of these sources until the genrule is executed. // know the language of these sources until the genrule is executed.
"cpp": bazel.LabelPartition{Extensions: []string{".cpp", ".cc", ".cxx", ".mm"}, LabelMapper: addSuffixForFilegroup("_cpp_srcs"), Keep_remainder: true}, cppSrcPartition: bazel.LabelPartition{Extensions: []string{".cpp", ".cc", ".cxx", ".mm"}, LabelMapper: addSuffixForFilegroup("_cpp_srcs"), Keep_remainder: true},
}) })
cSrcs = partitioned["c"] return partitioned
asSrcs = partitioned["as"]
cppSrcs = partitioned["cpp"]
return
} }
// bp2BuildParseLibProps returns the attributes for a variant of a cc_library. // bp2BuildParseLibProps returns the attributes for a variant of a cc_library.
@@ -175,10 +178,10 @@ func bp2buildParseStaticOrSharedProps(ctx android.TopDownMutatorContext, module
} }
} }
cppSrcs, cSrcs, asSrcs := groupSrcsByExtension(ctx, attrs.Srcs) partitionedSrcs := groupSrcsByExtension(ctx, attrs.Srcs)
attrs.Srcs = cppSrcs attrs.Srcs = partitionedSrcs[cppSrcPartition]
attrs.Srcs_c = cSrcs attrs.Srcs_c = partitionedSrcs[cSrcPartition]
attrs.Srcs_as = asSrcs attrs.Srcs_as = partitionedSrcs[asSrcPartition]
return attrs return attrs
} }
@@ -239,6 +242,7 @@ type compilerAttributes struct {
// bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes. // bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes.
func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes { func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes {
var srcs bazel.LabelListAttribute var srcs bazel.LabelListAttribute
var implementationHdrs bazel.LabelListAttribute
var copts bazel.StringListAttribute var copts bazel.StringListAttribute
var asFlags bazel.StringListAttribute var asFlags bazel.StringListAttribute
var conlyFlags bazel.StringListAttribute var conlyFlags bazel.StringListAttribute
@@ -265,10 +269,8 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
anySrcs := false anySrcs := false
// Add srcs-like dependencies such as generated files. // Add srcs-like dependencies such as generated files.
// First create a LabelList containing these dependencies, then merge the values with srcs. // First create a LabelList containing these dependencies, then merge the values with srcs.
generatedHdrsAndSrcs := props.Generated_headers generatedSrcsLabelList := android.BazelLabelForModuleDepsExcludes(ctx, props.Generated_sources, props.Exclude_generated_sources)
generatedHdrsAndSrcs = append(generatedHdrsAndSrcs, props.Generated_sources...) if len(props.Generated_sources) > 0 || len(props.Exclude_generated_sources) > 0 {
generatedHdrsAndSrcsLabelList := android.BazelLabelForModuleDepsExcludes(ctx, generatedHdrsAndSrcs, props.Exclude_generated_sources)
if len(generatedHdrsAndSrcs) > 0 || len(props.Exclude_generated_sources) > 0 {
anySrcs = true anySrcs = true
} }
@@ -276,7 +278,7 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
if len(props.Srcs) > 0 || len(props.Exclude_srcs) > 0 { if len(props.Srcs) > 0 || len(props.Exclude_srcs) > 0 {
anySrcs = true anySrcs = true
} }
return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedHdrsAndSrcsLabelList), anySrcs return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedSrcsLabelList), anySrcs
} }
archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{}) archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{})
@@ -288,6 +290,9 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
if srcsList, ok := parseSrcs(baseCompilerProps); ok { if srcsList, ok := parseSrcs(baseCompilerProps); ok {
srcs.SetSelectValue(axis, config, srcsList) srcs.SetSelectValue(axis, config, srcsList)
} }
if len(baseCompilerProps.Generated_headers) > 0 {
implementationHdrs.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, baseCompilerProps.Generated_headers))
}
if axis == bazel.NoConfigAxis { if axis == bazel.NoConfigAxis {
// If cpp_std is not specified, don't generate it in the // If cpp_std is not specified, don't generate it in the
@@ -329,6 +334,21 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
} }
srcs.ResolveExcludes() srcs.ResolveExcludes()
partitionedSrcs := groupSrcsByExtension(ctx, srcs)
for p, lla := range partitionedSrcs {
// if there are no sources, there is no need for headers
if lla.IsEmpty() {
continue
}
lla.Append(implementationHdrs)
partitionedSrcs[p] = lla
}
srcs = partitionedSrcs[cppSrcPartition]
cSrcs := partitionedSrcs[cSrcPartition]
asSrcs := partitionedSrcs[asSrcPartition]
absoluteIncludes.DeduplicateAxesFromBase() absoluteIncludes.DeduplicateAxesFromBase()
localIncludes.DeduplicateAxesFromBase() localIncludes.DeduplicateAxesFromBase()
@@ -351,8 +371,6 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
} }
} }
srcs, cSrcs, asSrcs := groupSrcsByExtension(ctx, srcs)
stlPropsByArch := module.GetArchVariantProperties(ctx, &StlProperties{}) stlPropsByArch := module.GetArchVariantProperties(ctx, &StlProperties{})
for _, configToProps := range stlPropsByArch { for _, configToProps := range stlPropsByArch {
for _, props := range configToProps { for _, props := range configToProps {