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:
parent
a4d9b86c8b
commit
3d383bbeb9
5 changed files with 238 additions and 7 deletions
|
@ -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])
|
||||
|
|
|
@ -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": [],
|
||||
}),
|
||||
},
|
||||
)`},
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in a new issue