bp2build: support strip properties.

This CL adds support to bp2build for generating all strip-related
properties into a strip dictionary as a parameter in the cc_library
macro.

With the dictionary, it's easy to organize related attributes and
directly expand into a stripped_shared_library's attributes.

Test: //build/bazel/tests/bionic:compare_libc_stripping
Test: TH
Fixes: b/187928597
Change-Id: Ifea68d48fe295e71a43b12876cb168c475a62187
This commit is contained in:
Jingwen Chen 2021-06-09 07:18:37 +00:00
parent a4d9b86c8b
commit 3d383bbeb9
5 changed files with 238 additions and 7 deletions

View file

@ -488,6 +488,9 @@ func prettyPrint(propertyValue reflect.Value, indent int) (string, error) {
ret = "{\n"
// Sort and print the struct props by the key.
structProps := extractStructProperties(propertyValue, indent)
if len(structProps) == 0 {
return "", nil
}
for _, k := range android.SortedStringKeys(structProps) {
ret += makeIndent(indent + 1)
ret += fmt.Sprintf("%q: %s,\n", k, structProps[k])

View file

@ -1231,3 +1231,173 @@ cc_library {
}),
)`}})
}
func TestCcLibraryStrip(t *testing.T) {
runCcLibraryTestCase(t, bp2buildTestCase{
description: "cc_library strip args",
moduleTypeUnderTest: "cc_library",
moduleTypeUnderTestFactory: cc.LibraryFactory,
moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
dir: "foo/bar",
filesystem: map[string]string{
"foo/bar/Android.bp": `
cc_library {
name: "nothing",
bazel_module: { bp2build_available: true },
}
cc_library {
name: "keep_symbols",
bazel_module: { bp2build_available: true },
strip: {
keep_symbols: true,
}
}
cc_library {
name: "keep_symbols_and_debug_frame",
bazel_module: { bp2build_available: true },
strip: {
keep_symbols_and_debug_frame: true,
}
}
cc_library {
name: "none",
bazel_module: { bp2build_available: true },
strip: {
none: true,
}
}
cc_library {
name: "keep_symbols_list",
bazel_module: { bp2build_available: true },
strip: {
keep_symbols_list: ["symbol"],
}
}
cc_library {
name: "all",
bazel_module: { bp2build_available: true },
strip: {
all: true,
}
}
`,
},
blueprint: soongCcLibraryPreamble,
expectedBazelTargets: []string{`cc_library(
name = "all",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
strip = {
"all": True,
},
)`, `cc_library(
name = "keep_symbols",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
strip = {
"keep_symbols": True,
},
)`, `cc_library(
name = "keep_symbols_and_debug_frame",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
strip = {
"keep_symbols_and_debug_frame": True,
},
)`, `cc_library(
name = "keep_symbols_list",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
strip = {
"keep_symbols_list": ["symbol"],
},
)`, `cc_library(
name = "none",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
strip = {
"none": True,
},
)`, `cc_library(
name = "nothing",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
)`},
})
}
func TestCcLibraryStripWithArch(t *testing.T) {
runCcLibraryTestCase(t, bp2buildTestCase{
description: "cc_library strip args",
moduleTypeUnderTest: "cc_library",
moduleTypeUnderTestFactory: cc.LibraryFactory,
moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
dir: "foo/bar",
filesystem: map[string]string{
"foo/bar/Android.bp": `
cc_library {
name: "multi-arch",
bazel_module: { bp2build_available: true },
target: {
darwin: {
strip: {
keep_symbols_list: ["foo", "bar"]
}
},
},
arch: {
arm: {
strip: {
keep_symbols_and_debug_frame: true,
},
},
arm64: {
strip: {
keep_symbols: true,
},
},
}
}
`,
},
blueprint: soongCcLibraryPreamble,
expectedBazelTargets: []string{`cc_library(
name = "multi-arch",
copts = [
"-Ifoo/bar",
"-I$(BINDIR)/foo/bar",
],
strip = {
"keep_symbols": select({
"//build/bazel/platforms/arch:arm64": True,
"//conditions:default": None,
}),
"keep_symbols_and_debug_frame": select({
"//build/bazel/platforms/arch:arm": True,
"//conditions:default": None,
}),
"keep_symbols_list": select({
"//build/bazel/platforms/os:darwin": [
"foo",
"bar",
],
"//conditions:default": [],
}),
},
)`},
})
}

View file

@ -485,13 +485,18 @@ func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Modul
// Convenience struct to hold all attributes parsed from linker properties.
type linkerAttributes struct {
deps bazel.LabelListAttribute
dynamicDeps bazel.LabelListAttribute
wholeArchiveDeps bazel.LabelListAttribute
exportedDeps bazel.LabelListAttribute
useLibcrt bazel.BoolAttribute
linkopts bazel.StringListAttribute
versionScript bazel.LabelAttribute
deps bazel.LabelListAttribute
dynamicDeps bazel.LabelListAttribute
wholeArchiveDeps bazel.LabelListAttribute
exportedDeps bazel.LabelListAttribute
useLibcrt bazel.BoolAttribute
linkopts bazel.StringListAttribute
versionScript bazel.LabelAttribute
stripKeepSymbols bazel.BoolAttribute
stripKeepSymbolsAndDebugFrame bazel.BoolAttribute
stripKeepSymbolsList bazel.StringListAttribute
stripAll bazel.BoolAttribute
stripNone bazel.BoolAttribute
}
// FIXME(b/187655838): Use the existing linkerFlags() function instead of duplicating logic here
@ -515,6 +520,33 @@ func bp2BuildParseLinkerProps(ctx android.TopDownMutatorContext, module *Module)
var versionScript bazel.LabelAttribute
var useLibcrt bazel.BoolAttribute
var stripKeepSymbols bazel.BoolAttribute
var stripKeepSymbolsAndDebugFrame bazel.BoolAttribute
var stripKeepSymbolsList bazel.StringListAttribute
var stripAll bazel.BoolAttribute
var stripNone bazel.BoolAttribute
if libraryDecorator, ok := module.linker.(*libraryDecorator); ok {
stripProperties := libraryDecorator.stripper.StripProperties
stripKeepSymbols.Value = stripProperties.Strip.Keep_symbols
stripKeepSymbolsList.Value = stripProperties.Strip.Keep_symbols_list
stripKeepSymbolsAndDebugFrame.Value = stripProperties.Strip.Keep_symbols_and_debug_frame
stripAll.Value = stripProperties.Strip.All
stripNone.Value = stripProperties.Strip.None
}
for axis, configToProps := range module.GetArchVariantProperties(ctx, &StripProperties{}) {
for config, props := range configToProps {
if stripProperties, ok := props.(*StripProperties); ok {
stripKeepSymbols.SetSelectValue(axis, config, stripProperties.Strip.Keep_symbols)
stripKeepSymbolsList.SetSelectValue(axis, config, stripProperties.Strip.Keep_symbols_list)
stripKeepSymbolsAndDebugFrame.SetSelectValue(axis, config, stripProperties.Strip.Keep_symbols_and_debug_frame)
stripAll.SetSelectValue(axis, config, stripProperties.Strip.All)
stripNone.SetSelectValue(axis, config, stripProperties.Strip.None)
}
}
}
for _, linkerProps := range module.linker.linkerProps() {
if baseLinkerProps, ok := linkerProps.(*BaseLinkerProperties); ok {
// Excludes to parallel Soong:
@ -630,6 +662,13 @@ func bp2BuildParseLinkerProps(ctx android.TopDownMutatorContext, module *Module)
linkopts: linkopts,
useLibcrt: useLibcrt,
versionScript: versionScript,
// Strip properties
stripKeepSymbols: stripKeepSymbols,
stripKeepSymbolsAndDebugFrame: stripKeepSymbolsAndDebugFrame,
stripKeepSymbolsList: stripKeepSymbolsList,
stripAll: stripAll,
stripNone: stripNone,
}
}

View file

@ -259,6 +259,16 @@ type bazelCcLibraryAttributes struct {
Static_deps_for_static bazel.LabelListAttribute
Dynamic_deps_for_static bazel.LabelListAttribute
Whole_archive_deps_for_static bazel.LabelListAttribute
Strip stripAttributes
}
type stripAttributes struct {
Keep_symbols bazel.BoolAttribute
Keep_symbols_and_debug_frame bazel.BoolAttribute
Keep_symbols_list bazel.StringListAttribute
All bazel.BoolAttribute
None bazel.BoolAttribute
}
type bazelCcLibrary struct {
@ -323,6 +333,14 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) {
Linkopts: linkerAttrs.linkopts,
Use_libcrt: linkerAttrs.useLibcrt,
Strip: stripAttributes{
Keep_symbols: linkerAttrs.stripKeepSymbols,
Keep_symbols_and_debug_frame: linkerAttrs.stripKeepSymbolsAndDebugFrame,
Keep_symbols_list: linkerAttrs.stripKeepSymbolsList,
All: linkerAttrs.stripAll,
None: linkerAttrs.stripNone,
},
Shared_srcs: sharedAttrs.srcs,
Shared_srcs_c: sharedAttrs.srcs_c,
Shared_srcs_as: sharedAttrs.srcs_as,

View file

@ -59,6 +59,7 @@ func (stripper *Stripper) NeedsStrip(actx android.ModuleContext) bool {
return !forceDisable && (forceEnable || defaultEnable)
}
// Keep this consistent with //build/bazel/rules/stripped_shared_library.bzl.
func (stripper *Stripper) strip(actx android.ModuleContext, in android.Path, out android.ModuleOutPath,
flags StripFlags, isStaticLib bool) {
if actx.Darwin() {