From b12ff59f0b581142cebd62153a4953dc2665e621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20M=C3=A1rquez=20P=C3=A9rez=20Mu=C3=B1=C3=ADz=20D?= =?UTF-8?q?=C3=ADaz=20P=C3=BAras=20Thaureaux?= Date: Thu, 1 Sep 2022 15:04:04 +0000 Subject: [PATCH] Support cc_prebuilt_binary building with Bazel Bp2build-enable cc_prebuilt_binary -> cc_prebuilt_binary Bug: 241415823 Test: cc_prebuilt_binary_conversion_test.go Change-Id: I007deef8d44f68993012f2114314d1cb52cfbb0e --- android/allowlists/allowlists.go | 7 +- .../cc_prebuilt_binary_conversion_test.go | 125 ++++++++++++++++++ cc/bp2build.go | 63 +++++---- cc/cc.go | 4 +- cc/library.go | 26 ++-- cc/prebuilt.go | 30 ++++- 6 files changed, 208 insertions(+), 47 deletions(-) create mode 100644 bp2build/cc_prebuilt_binary_conversion_test.go diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 4ab94c30e..03ce0f16b 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -190,7 +190,7 @@ var ( "frameworks/native/opengl/tests/testPauseResume": Bp2BuildDefaultTrue, "frameworks/native/opengl/tests/testViewport": Bp2BuildDefaultTrue, "frameworks/native/services/batteryservice": Bp2BuildDefaultTrue, - "frameworks/proto_logging/stats/stats_log_api_gen": Bp2BuildDefaultTrueRecursively, + "frameworks/proto_logging/stats": Bp2BuildDefaultTrueRecursively, "hardware/interfaces": Bp2BuildDefaultTrue, "hardware/interfaces/common/aidl": Bp2BuildDefaultTrue, @@ -317,8 +317,6 @@ var ( "system/tools/sysprop": Bp2BuildDefaultTrue, "system/unwinding/libunwindstack": Bp2BuildDefaultTrueRecursively, - "frameworks/proto_logging/stats": Bp2BuildDefaultTrueRecursively, - "tools/apksig": Bp2BuildDefaultTrue, "tools/platform-compat/java/android/compat": Bp2BuildDefaultTrueRecursively, "tools/tradefederation/prebuilts/filegroups": Bp2BuildDefaultTrueRecursively, @@ -471,6 +469,9 @@ var ( "libstagefright_bufferpool@2.0.1", "libSurfaceFlingerProp", + // prebuilts + "prebuilt_stats-log-api-gen", + // fastboot "bootimg_headers", "fastboot", diff --git a/bp2build/cc_prebuilt_binary_conversion_test.go b/bp2build/cc_prebuilt_binary_conversion_test.go new file mode 100644 index 000000000..0e8048c27 --- /dev/null +++ b/bp2build/cc_prebuilt_binary_conversion_test.go @@ -0,0 +1,125 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package bp2build + +import ( + "fmt" + "testing" + + "android/soong/cc" +) + +func runCcPrebuiltBinaryTestCase(t *testing.T, testCase Bp2buildTestCase) { + t.Helper() + description := fmt.Sprintf("cc_prebuilt_binary: %s", testCase.Description) + testCase.ModuleTypeUnderTest = "cc_prebuilt_binary" + testCase.ModuleTypeUnderTestFactory = cc.PrebuiltBinaryFactory + testCase.Description = description + t.Run(description, func(t *testing.T) { + t.Helper() + RunBp2BuildTestCaseSimple(t, testCase) + }) +} + +func TestPrebuiltBinary(t *testing.T) { + runCcPrebuiltBinaryTestCase(t, + Bp2buildTestCase{ + Description: "simple", + Filesystem: map[string]string{ + "bin": "", + }, + Blueprint: ` +cc_prebuilt_binary { + name: "bintest", + srcs: ["bin"], + bazel_module: { bp2build_available: true }, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_prebuilt_binary", "bintest", AttrNameToString{ + "src": `"bin"`, + })}, + }) +} + +func TestPrebuiltBinaryWithStrip(t *testing.T) { + runCcPrebuiltBinaryTestCase(t, + Bp2buildTestCase{ + Description: "with strip", + Filesystem: map[string]string{ + "bin": "", + }, + Blueprint: ` +cc_prebuilt_binary { + name: "bintest", + srcs: ["bin"], + strip: { all: true }, + bazel_module: { bp2build_available: true }, +}`, ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_prebuilt_binary", "bintest", AttrNameToString{ + "src": `"bin"`, + "strip": `{ + "all": True, + }`, + }), + }, + }) +} + +func TestPrebuiltBinaryWithArchVariance(t *testing.T) { + runCcPrebuiltBinaryTestCase(t, + Bp2buildTestCase{ + Description: "with arch variance", + Filesystem: map[string]string{ + "bina": "", + "binb": "", + }, + Blueprint: ` +cc_prebuilt_binary { + name: "bintest", + arch: { + arm64: { srcs: ["bina"], }, + arm: { srcs: ["binb"], }, + }, + bazel_module: { bp2build_available: true }, +}`, ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_prebuilt_binary", "bintest", AttrNameToString{ + "src": `select({ + "//build/bazel/platforms/arch:arm": "binb", + "//build/bazel/platforms/arch:arm64": "bina", + "//conditions:default": None, + })`, + }), + }, + }) +} + +func TestPrebuiltBinaryMultipleSrcsFails(t *testing.T) { + runCcPrebuiltBinaryTestCase(t, + Bp2buildTestCase{ + Description: "fails because multiple sources", + Filesystem: map[string]string{ + "bina": "", + "binb": "", + }, + Blueprint: ` +cc_prebuilt_binary { + name: "bintest", + srcs: ["bina", "binb"], + bazel_module: { bp2build_available: true }, +}`, + ExpectedErr: fmt.Errorf("Expected at most one source file"), + }) +} + +// TODO: nosrcs test diff --git a/cc/bp2build.go b/cc/bp2build.go index 83368a392..0861a51b8 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -169,6 +169,14 @@ func maybePartitionExportedAndImplementationsDepsExcludes(ctx android.BazelConve } } +func bp2BuildPropParseHelper(ctx android.ArchVariantContext, module *Module, propsType interface{}, parseFunc func(axis bazel.ConfigurationAxis, config string, props interface{})) { + for axis, configToProps := range module.GetArchVariantProperties(ctx, propsType) { + for config, props := range configToProps { + parseFunc(axis, config, props) + } + } +} + // Parses properties common to static and shared libraries. Also used for prebuilt libraries. func bp2buildParseStaticOrSharedProps(ctx android.BazelConversionPathContext, module *Module, lib *libraryDecorator, isStatic bool) staticOrSharedAttributes { attrs := staticOrSharedAttributes{} @@ -227,32 +235,30 @@ type prebuiltAttributes struct { Enabled bazel.BoolAttribute } +func parseSrc(ctx android.BazelConversionPathContext, srcLabelAttribute *bazel.LabelAttribute, axis bazel.ConfigurationAxis, config string, srcs []string) { + srcFileError := func() { + ctx.ModuleErrorf("parseSrc: Expected at most one source file for %s %s\n", axis, config) + } + if len(srcs) > 1 { + srcFileError() + return + } else if len(srcs) == 0 { + return + } + if srcLabelAttribute.SelectValue(axis, config) != nil { + srcFileError() + return + } + srcLabelAttribute.SetSelectValue(axis, config, android.BazelLabelForModuleSrcSingle(ctx, srcs[0])) +} + // NOTE: Used outside of Soong repo project, in the clangprebuilts.go bootstrap_go_package func Bp2BuildParsePrebuiltLibraryProps(ctx android.BazelConversionPathContext, module *Module, isStatic bool) prebuiltAttributes { - manySourceFileError := func(axis bazel.ConfigurationAxis, config string) { - ctx.ModuleErrorf("Bp2BuildParsePrebuiltLibraryProps: Expected at most one source file for %s %s\n", axis, config) - } + var srcLabelAttribute bazel.LabelAttribute - - parseSrcs := func(ctx android.BazelConversionPathContext, axis bazel.ConfigurationAxis, config string, srcs []string) { - if len(srcs) > 1 { - manySourceFileError(axis, config) - return - } else if len(srcs) == 0 { - return - } - if srcLabelAttribute.SelectValue(axis, config) != nil { - manySourceFileError(axis, config) - return - } - - src := android.BazelLabelForModuleSrcSingle(ctx, srcs[0]) - srcLabelAttribute.SetSelectValue(axis, config, src) - } - bp2BuildPropParseHelper(ctx, module, &prebuiltLinkerProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) { if prebuiltLinkerProperties, ok := props.(*prebuiltLinkerProperties); ok { - parseSrcs(ctx, axis, config, prebuiltLinkerProperties.Srcs) + parseSrc(ctx, &srcLabelAttribute, axis, config, prebuiltLinkerProperties.Srcs) } }) @@ -261,7 +267,7 @@ func Bp2BuildParsePrebuiltLibraryProps(ctx android.BazelConversionPathContext, m if props.Enabled != nil { enabledLabelAttribute.SetSelectValue(axis, config, props.Enabled) } - parseSrcs(ctx, axis, config, props.Srcs) + parseSrc(ctx, &srcLabelAttribute, axis, config, props.Srcs) } if isStatic { @@ -284,11 +290,16 @@ func Bp2BuildParsePrebuiltLibraryProps(ctx android.BazelConversionPathContext, m } } -func bp2BuildPropParseHelper(ctx android.ArchVariantContext, module *Module, propsType interface{}, parseFunc func(axis bazel.ConfigurationAxis, config string, props interface{})) { - for axis, configToProps := range module.GetArchVariantProperties(ctx, propsType) { - for config, props := range configToProps { - parseFunc(axis, config, props) +func bp2BuildParsePrebuiltBinaryProps(ctx android.BazelConversionPathContext, module *Module) prebuiltAttributes { + var srcLabelAttribute bazel.LabelAttribute + bp2BuildPropParseHelper(ctx, module, &prebuiltLinkerProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) { + if props, ok := props.(*prebuiltLinkerProperties); ok { + parseSrc(ctx, &srcLabelAttribute, axis, config, props.Srcs) } + }) + + return prebuiltAttributes{ + Src: srcLabelAttribute, } } diff --git a/cc/cc.go b/cc/cc.go index d4eaa5364..faa8571c3 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -3714,7 +3714,9 @@ func (c *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) { prebuilt := c.IsPrebuilt() switch c.typ() { case binary: - if !prebuilt { + if prebuilt { + prebuiltBinaryBp2Build(ctx, c) + } else { binaryBp2build(ctx, c) } case testBin: diff --git a/cc/library.go b/cc/library.go index 13a7a3eb1..8e262eb37 100644 --- a/cc/library.go +++ b/cc/library.go @@ -288,6 +288,16 @@ type stripAttributes struct { None bazel.BoolAttribute } +func stripAttrsFromLinkerAttrs(la *linkerAttributes) stripAttributes { + return stripAttributes{ + Keep_symbols: la.stripKeepSymbols, + Keep_symbols_and_debug_frame: la.stripKeepSymbolsAndDebugFrame, + Keep_symbols_list: la.stripKeepSymbolsList, + All: la.stripAll, + None: la.stripNone, + } +} + func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) { // For some cc_library modules, their static variants are ready to be // converted, but not their shared variants. For these modules, delegate to @@ -394,13 +404,7 @@ func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) { Additional_linker_inputs: linkerAttrs.additionalLinkerInputs, - Strip: stripAttributes{ - Keep_symbols: linkerAttrs.stripKeepSymbols, - Keep_symbols_and_debug_frame: linkerAttrs.stripKeepSymbolsAndDebugFrame, - Keep_symbols_list: linkerAttrs.stripKeepSymbolsList, - All: linkerAttrs.stripAll, - None: linkerAttrs.stripNone, - }, + Strip: stripAttrsFromLinkerAttrs(&linkerAttrs), Features: baseAttributes.features, } @@ -2697,13 +2701,7 @@ func sharedOrStaticLibraryBp2Build(ctx android.TopDownMutatorContext, module *Mo Absolute_includes: compilerAttrs.absoluteIncludes, Additional_linker_inputs: linkerAttrs.additionalLinkerInputs, - Strip: stripAttributes{ - Keep_symbols: linkerAttrs.stripKeepSymbols, - Keep_symbols_and_debug_frame: linkerAttrs.stripKeepSymbolsAndDebugFrame, - Keep_symbols_list: linkerAttrs.stripKeepSymbolsList, - All: linkerAttrs.stripAll, - None: linkerAttrs.stripNone, - }, + Strip: stripAttrsFromLinkerAttrs(&linkerAttrs), Features: baseAttributes.features, diff --git a/cc/prebuilt.go b/cc/prebuilt.go index 867c36cf4..68df87981 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -33,7 +33,7 @@ func RegisterPrebuiltBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("cc_prebuilt_library_static", PrebuiltStaticLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_test_library_shared", PrebuiltSharedTestLibraryFactory) ctx.RegisterModuleType("cc_prebuilt_object", prebuiltObjectFactory) - ctx.RegisterModuleType("cc_prebuilt_binary", prebuiltBinaryFactory) + ctx.RegisterModuleType("cc_prebuilt_binary", PrebuiltBinaryFactory) } type prebuiltLinkerInterface interface { @@ -668,8 +668,8 @@ func (p *prebuiltBinaryLinker) binary() bool { } // cc_prebuilt_binary installs a precompiled executable in srcs property in the -// device's directory. -func prebuiltBinaryFactory() android.Module { +// device's directory, for both the host and device +func PrebuiltBinaryFactory() android.Module { module, _ := NewPrebuiltBinary(android.HostAndDeviceSupported) return module.Init() } @@ -690,6 +690,30 @@ func NewPrebuiltBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecor return module, binary } +type bazelPrebuiltBinaryAttributes struct { + Src bazel.LabelAttribute + Strip stripAttributes +} + +func prebuiltBinaryBp2Build(ctx android.TopDownMutatorContext, module *Module) { + prebuiltAttrs := bp2BuildParsePrebuiltBinaryProps(ctx, module) + + var la linkerAttributes + la.convertStripProps(ctx, module) + attrs := &bazelPrebuiltBinaryAttributes{ + Src: prebuiltAttrs.Src, + Strip: stripAttrsFromLinkerAttrs(&la), + } + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "cc_prebuilt_binary", + Bzl_load_location: "//build/bazel/rules/cc:cc_prebuilt_binary.bzl", + } + + name := android.RemoveOptionalPrebuiltPrefix(module.Name()) + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: name}, attrs) +} + type Sanitized struct { None struct { Srcs []string `android:"path,arch_variant"`