Handle product vars *flags props in cc* modules

Test: build/bazel/ci/bp2build.sh
Bug: 188497994
Change-Id: Ifb379e370075d6a7bc55b82d79c210c31ef377e9
This commit is contained in:
Liz Kammer
2021-05-26 08:45:30 -04:00
parent f6840284b6
commit ba7a9c5e4a
5 changed files with 56 additions and 33 deletions

View File

@@ -993,6 +993,6 @@ func TryVariableSubstitutions(slice []string, productVariable string) ([]string,
// TryVariableSubstitution, replace string substitution formatting within s with Starlark // TryVariableSubstitution, replace string substitution formatting within s with Starlark
// string.format compatible tag for productVariable. // string.format compatible tag for productVariable.
func TryVariableSubstitution(s string, productVariable string) (string, bool) { func TryVariableSubstitution(s string, productVariable string) (string, bool) {
sub := productVariableSubstitutionPattern.ReplaceAllString(s, "{"+productVariable+"}") sub := productVariableSubstitutionPattern.ReplaceAllString(s, "$("+productVariable+")")
return sub, s != sub return sub, s != sub
} }

View File

@@ -1412,3 +1412,37 @@ cc_library_static {
)`}, )`},
}) })
} }
func TestCcLibraryStaticProductVariableStringReplacement(t *testing.T) {
runCcLibraryStaticTestCase(t, bp2buildTestCase{
description: "cc_library_static product variable selects",
moduleTypeUnderTest: "cc_library_static",
moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
filesystem: map[string]string{},
blueprint: soongCcLibraryStaticPreamble + `
cc_library_static {
name: "foo_static",
srcs: ["common.c"],
product_variables: {
platform_sdk_version: {
asflags: ["-DPLATFORM_SDK_VERSION=%d"],
},
},
} `,
expectedBazelTargets: []string{`cc_library_static(
name = "foo_static",
asflags = select({
"//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
"//conditions:default": [],
}),
copts = [
"-I.",
"-I$(BINDIR)/.",
],
linkstatic = True,
srcs_c = ["common.c"],
)`},
})
}

View File

@@ -210,7 +210,7 @@ func TestCcObjectProductVariable(t *testing.T) {
expectedBazelTargets: []string{`cc_object( expectedBazelTargets: []string{`cc_object(
name = "foo", name = "foo",
asflags = select({ asflags = select({
"//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION={Platform_sdk_version}"], "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
"//conditions:default": [], "//conditions:default": [],
}), }),
copts = ["-fno-addrsig"], copts = ["-fno-addrsig"],

View File

@@ -19,6 +19,8 @@ import (
"android/soong/android" "android/soong/android"
"android/soong/bazel" "android/soong/bazel"
"github.com/google/blueprint/proptools"
) )
// bp2build functions and helpers for converting cc_* modules to Bazel. // bp2build functions and helpers for converting cc_* modules to Bazel.
@@ -444,18 +446,25 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
} }
} }
productVarPropNameToAttribute := map[string]*bazel.StringListAttribute{
"Cflags": &copts,
"Asflags": &asFlags,
"CppFlags": &cppFlags,
}
productVariableProps := android.ProductVariableProperties(ctx) productVariableProps := android.ProductVariableProperties(ctx)
if props, exists := productVariableProps["Cflags"]; exists { for propName, attr := range productVarPropNameToAttribute {
for _, prop := range props { if props, exists := productVariableProps[propName]; exists {
flags, ok := prop.Property.([]string) for _, prop := range props {
if !ok { flags, ok := prop.Property.([]string)
ctx.ModuleErrorf("Could not convert product variable cflag property") if !ok {
ctx.ModuleErrorf("Could not convert product variable %s property", proptools.PropertyNameForField(propName))
}
newFlags, _ := bazel.TryVariableSubstitutions(flags, prop.ProductConfigVariable)
attr.ProductValues = append(attr.ProductValues, bazel.ProductVariableValues{
ProductVariable: prop.ProductConfigVariable,
Values: newFlags,
})
} }
newFlags, _ := bazel.TryVariableSubstitutions(flags, prop.ProductConfigVariable)
copts.ProductValues = append(copts.ProductValues, bazel.ProductVariableValues{
ProductVariable: prop.ProductConfigVariable,
Values: newFlags,
})
} }
} }

View File

@@ -157,8 +157,6 @@ func ObjectBp2Build(ctx android.TopDownMutatorContext) {
// Set arch-specific configurable attributes // Set arch-specific configurable attributes
compilerAttrs := bp2BuildParseCompilerProps(ctx, m) compilerAttrs := bp2BuildParseCompilerProps(ctx, m)
var asFlags bazel.StringListAttribute
var deps bazel.LabelListAttribute var deps bazel.LabelListAttribute
for _, props := range m.linker.linkerProps() { for _, props := range m.linker.linkerProps() {
if objectLinkerProps, ok := props.(*ObjectLinkerProperties); ok { if objectLinkerProps, ok := props.(*ObjectLinkerProperties); ok {
@@ -167,24 +165,6 @@ func ObjectBp2Build(ctx android.TopDownMutatorContext) {
} }
} }
productVariableProps := android.ProductVariableProperties(ctx)
if props, exists := productVariableProps["Asflags"]; exists {
// TODO(b/183595873): consider deduplicating handling of product variable properties
for _, prop := range props {
flags, ok := prop.Property.([]string)
if !ok {
ctx.ModuleErrorf("Could not convert product variable asflag property")
return
}
newFlags, _ := bazel.TryVariableSubstitutions(flags, prop.ProductConfigVariable)
asFlags.ProductValues = append(asFlags.ProductValues, bazel.ProductVariableValues{
ProductVariable: prop.ProductConfigVariable,
Values: newFlags,
})
}
}
// TODO(b/183595872) warn/error if we're not handling product variables
// Don't split cc_object srcs across languages. Doing so would add complexity, // Don't split cc_object srcs across languages. Doing so would add complexity,
// and this isn't typically done for cc_object. // and this isn't typically done for cc_object.
srcs := compilerAttrs.srcs srcs := compilerAttrs.srcs
@@ -195,7 +175,7 @@ func ObjectBp2Build(ctx android.TopDownMutatorContext) {
Srcs: srcs, Srcs: srcs,
Deps: deps, Deps: deps,
Copts: compilerAttrs.copts, Copts: compilerAttrs.copts,
Asflags: asFlags, Asflags: compilerAttrs.asFlags,
} }
props := bazel.BazelTargetModuleProperties{ props := bazel.BazelTargetModuleProperties{