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

@ -492,6 +492,11 @@ type linkerAttributes struct {
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() {