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
This commit is contained in:
parent
fb955387db
commit
179856a69d
|
@ -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()]
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue