From 179856a69de28d79fb69e514d5f7f0af37ec117b Mon Sep 17 00:00:00 2001 From: Jingwen Chen Date: Mon, 3 May 2021 09:15:48 +0000 Subject: [PATCH] bp2build: build static version of libstdc++. This CL adds the ability to filter cc_library modules to only generate their static variant of their shared variant isn't ready. For example, the libstdc++ library is buildable as a static library, which libc depends on. However, the shared variant of libstdc++ depends on libc, which has to come later. This CL introduces that abstraction to break up bp2build conversion into more atomic steps to help with conversion. Test: TH (bazel build //bionic/... incl. libstdc++'s static variant) Bug: 186489250 Bug: 186822597 Change-Id: I3e2fe748e4e3d3b656760da4807f342d67c8f45f --- android/bazel.go | 22 +++++++++++++++++++++- cc/library.go | 49 ++++++++++++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/android/bazel.go b/android/bazel.go index 22d558f95..9de016e1f 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -210,7 +210,6 @@ var ( "libc_tzcode", // http://b/186822591, cc_library_static, localtime.c:84:46: error: expected expression "libc_bionic_ndk", // http://b/186822256, cc_library_static, signal.cpp:186:52: error: ISO C++ requires field designators to be specified in declaration order "libc_malloc_hooks", // http://b/187016307, cc_library, ld.lld: error: undefined symbol: __malloc_hook - "libstdc++", // http://b/186822597, cc_library, ld.lld: error: undefined symbol: __errno "libm", // http://b/183064661, cc_library, math.h:25:16: error: unexpected token in argument list // http://b/186823769: Needs C++ STL support, includes from unconverted standard libraries in //external/libcxx @@ -237,6 +236,12 @@ var ( "libjemalloc5_unittest", } + // Per-module denylist of cc_library modules to only generate the static + // variant if their shared variant isn't ready or buildable by Bazel. + bp2buildCcLibraryStaticOnlyList = []string{ + "libstdc++", // http://b/186822597, cc_library, ld.lld: error: undefined symbol: __errno + } + // Per-module denylist to opt modules out of mixed builds. Such modules will // still be generated via bp2build. mixedBuildsDisabledList = []string{ @@ -250,6 +255,7 @@ var ( // Used for quicker lookups bp2buildDoNotWriteBuildFile = map[string]bool{} bp2buildModuleDoNotConvert = map[string]bool{} + bp2buildCcLibraryStaticOnly = map[string]bool{} mixedBuildsDisabled = map[string]bool{} ) @@ -262,11 +268,19 @@ func init() { bp2buildModuleDoNotConvert[moduleName] = true } + for _, moduleName := range bp2buildCcLibraryStaticOnlyList { + bp2buildCcLibraryStaticOnly[moduleName] = true + } + for _, moduleName := range mixedBuildsDisabledList { mixedBuildsDisabled[moduleName] = true } } +func GenerateCcLibraryStaticOnly(ctx BazelConversionPathContext) bool { + return bp2buildCcLibraryStaticOnly[ctx.Module().Name()] +} + func ShouldWriteBuildFileForDir(dir string) bool { if _, ok := bp2buildDoNotWriteBuildFile[dir]; ok { return false @@ -284,6 +298,12 @@ func (b *BazelModuleBase) MixedBuildsEnabled(ctx BazelConversionPathContext) boo if len(b.GetBazelLabel(ctx, ctx.Module())) == 0 { return false } + if GenerateCcLibraryStaticOnly(ctx) { + // Don't use partially-converted cc_library targets in mixed builds, + // since mixed builds would generally rely on both static and shared + // variants of a cc_library. + return false + } return !mixedBuildsDisabled[ctx.Module().Name()] } diff --git a/cc/library.go b/cc/library.go index 50d3f67fe..7b631fa16 100644 --- a/cc/library.go +++ b/cc/library.go @@ -259,6 +259,14 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) { return } + // For some cc_library modules, their static variants are ready to be + // converted, but not their shared variants. For these modules, delegate to + // the cc_library_static bp2build converter temporarily instead. + if android.GenerateCcLibraryStaticOnly(ctx) { + ccLibraryStaticBp2BuildInternal(ctx, m) + return + } + sharedAttrs := bp2BuildParseSharedProps(ctx, m) staticAttrs := bp2BuildParseStaticProps(ctx, m) compilerAttrs := bp2BuildParseCompilerProps(ctx, m) @@ -2205,6 +2213,28 @@ func BazelCcLibraryStaticFactory() android.Module { return module } +func ccLibraryStaticBp2BuildInternal(ctx android.TopDownMutatorContext, module *Module) { + compilerAttrs := bp2BuildParseCompilerProps(ctx, module) + linkerAttrs := bp2BuildParseLinkerProps(ctx, module) + exportedIncludes := bp2BuildParseExportedIncludes(ctx, module) + + attrs := &bazelCcLibraryStaticAttributes{ + Copts: compilerAttrs.copts, + Srcs: compilerAttrs.srcs, + Deps: linkerAttrs.deps, + Linkopts: linkerAttrs.linkopts, + Linkstatic: true, + Includes: exportedIncludes, + } + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "cc_library_static", + Bzl_load_location: "//build/bazel/rules:cc_library_static.bzl", + } + + ctx.CreateBazelTargetModule(BazelCcLibraryStaticFactory, module.Name(), props, attrs) +} + func CcLibraryStaticBp2Build(ctx android.TopDownMutatorContext) { module, ok := ctx.Module().(*Module) if !ok { @@ -2218,24 +2248,7 @@ func CcLibraryStaticBp2Build(ctx android.TopDownMutatorContext) { return } - compilerAttrs := bp2BuildParseCompilerProps(ctx, module) - linkerAttrs := bp2BuildParseLinkerProps(ctx, module) - exportedIncludes := bp2BuildParseExportedIncludes(ctx, module) - - attrs := &bazelCcLibraryStaticAttributes{ - Copts: compilerAttrs.copts, - Srcs: compilerAttrs.srcs, - Deps: linkerAttrs.deps, - Linkstatic: true, - Includes: exportedIncludes, - } - - props := bazel.BazelTargetModuleProperties{ - Rule_class: "cc_library_static", - Bzl_load_location: "//build/bazel/rules:cc_library_static.bzl", - } - - ctx.CreateBazelTargetModule(BazelCcLibraryStaticFactory, module.Name(), props, attrs) + ccLibraryStaticBp2BuildInternal(ctx, module) } func (m *bazelCcLibraryStatic) Name() string {