diff --git a/android/bazel.go b/android/bazel.go index 11fc2b6b5..e330681c0 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -205,7 +205,6 @@ var ( // Linker error "libc_malloc_hooks", // jingwen@, cc_library, undefined symbol: __malloc_hook, etc. - "libdl", // jingwen@, cc_library, clang failed "libstdc++", // jingwen@, cc_library, undefined symbol: free // Includes not found diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index d9cd22dab..aa8200b96 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -50,6 +50,7 @@ func TestCcLibraryBp2Build(t *testing.T) { expectedBazelTargets []string filesystem map[string]string dir string + depsMutators []android.RegisterMutatorFunc }{ { description: "cc_library - simple example", @@ -246,6 +247,34 @@ cc_library { "//conditions:default": [], }), srcs = ["math/cosf.c"], +)`}, + }, + { + description: "cc_library shared/static props", + moduleTypeUnderTest: "cc_library", + moduleTypeUnderTestFactory: cc.LibraryFactory, + moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build, + depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build}, + dir: "foo/bar", + filesystem: map[string]string{ + "foo/bar/a.cpp": "", + "foo/bar/Android.bp": ` +cc_library { + name: "a", + shared: { whole_static_libs: ["b"] }, + static: { srcs: ["a.cpp"] }, + bazel_module: { bp2build_available: true }, +} + +cc_library_static { name: "b" } +`, + }, + bp: soongCcLibraryPreamble, + expectedBazelTargets: []string{`cc_library( + name = "a", + copts = ["-Ifoo/bar"], + srcs = ["a.cpp"], + static_deps_for_shared = [":b"], )`}, }, } @@ -266,11 +295,15 @@ cc_library { ctx := android.NewTestContext(config) cc.RegisterCCBuildComponents(ctx) + ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory) ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory) ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory) ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory) ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator) ctx.RegisterBp2BuildConfig(bp2buildConfig) // TODO(jingwen): make this the default for all tests + for _, m := range testCase.depsMutators { + ctx.DepsBp2BuildMutators(m) + } ctx.RegisterForBazelConversion() _, errs := ctx.ParseFileList(dir, toParse) diff --git a/cc/bp2build.go b/cc/bp2build.go index 9c4bf6e54..a4db79ff0 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -68,9 +68,61 @@ func depsBp2BuildMutator(ctx android.BottomUpMutatorContext) { } } + // Deps in the static: { .. } and shared: { .. } props of a cc_library. + if lib, ok := module.compiler.(*libraryDecorator); ok { + allDeps = append(allDeps, lib.SharedProperties.Shared.Static_libs...) + allDeps = append(allDeps, lib.SharedProperties.Shared.Whole_static_libs...) + allDeps = append(allDeps, lib.SharedProperties.Shared.Shared_libs...) + allDeps = append(allDeps, lib.SharedProperties.Shared.System_shared_libs...) + + allDeps = append(allDeps, lib.StaticProperties.Static.Static_libs...) + allDeps = append(allDeps, lib.StaticProperties.Static.Whole_static_libs...) + allDeps = append(allDeps, lib.StaticProperties.Static.Shared_libs...) + allDeps = append(allDeps, lib.StaticProperties.Static.System_shared_libs...) + } + ctx.AddDependency(module, nil, android.SortedUniqueStrings(allDeps)...) } +type sharedAttributes struct { + staticDeps bazel.LabelListAttribute +} + +// bp2buildParseSharedProps returns the attributes for the shared variant of a cc_library. +func bp2BuildParseSharedProps(ctx android.TopDownMutatorContext, module *Module) sharedAttributes { + lib, ok := module.compiler.(*libraryDecorator) + if !ok { + return sharedAttributes{} + } + + var staticDeps bazel.LabelListAttribute + + staticDeps.Value = android.BazelLabelForModuleDeps(ctx, lib.SharedProperties.Shared.Whole_static_libs) + + return sharedAttributes{ + staticDeps: staticDeps, + } +} + +type staticAttributes struct { + srcs bazel.LabelListAttribute +} + +// bp2buildParseStaticProps returns the attributes for the static variant of a cc_library. +func bp2BuildParseStaticProps(ctx android.TopDownMutatorContext, module *Module) staticAttributes { + lib, ok := module.compiler.(*libraryDecorator) + if !ok { + return staticAttributes{} + } + + var srcs bazel.LabelListAttribute + srcs.Value = android.BazelLabelForModuleSrc(ctx, lib.StaticProperties.Static.Srcs) + + return staticAttributes{ + srcs: srcs, + } +} + // Convenience struct to hold all attributes parsed from compiler properties. type compilerAttributes struct { copts bazel.StringListAttribute diff --git a/cc/library.go b/cc/library.go index 3a70765da..4cd1b0924 100644 --- a/cc/library.go +++ b/cc/library.go @@ -217,13 +217,14 @@ func RegisterLibraryBuildComponents(ctx android.RegistrationContext) { // For bp2build conversion. type bazelCcLibraryAttributes struct { - Srcs bazel.LabelListAttribute - Hdrs bazel.LabelListAttribute - Copts bazel.StringListAttribute - Linkopts bazel.StringListAttribute - Deps bazel.LabelListAttribute - User_link_flags bazel.StringListAttribute - Includes bazel.StringListAttribute + Srcs bazel.LabelListAttribute + Hdrs bazel.LabelListAttribute + Copts bazel.StringListAttribute + Linkopts bazel.StringListAttribute + Deps bazel.LabelListAttribute + User_link_flags bazel.StringListAttribute + Includes bazel.StringListAttribute + Static_deps_for_shared bazel.LabelListAttribute } type bazelCcLibrary struct { @@ -254,16 +255,23 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) { return } + sharedAttrs := bp2BuildParseSharedProps(ctx, m) + staticAttrs := bp2BuildParseStaticProps(ctx, m) compilerAttrs := bp2BuildParseCompilerProps(ctx, m) linkerAttrs := bp2BuildParseLinkerProps(ctx, m) exportedIncludes := bp2BuildParseExportedIncludes(ctx, m) + var srcs bazel.LabelListAttribute + srcs.Append(compilerAttrs.srcs) + srcs.Append(staticAttrs.srcs) + attrs := &bazelCcLibraryAttributes{ - Srcs: compilerAttrs.srcs, - Copts: compilerAttrs.copts, - Linkopts: linkerAttrs.linkopts, - Deps: linkerAttrs.deps, - Includes: exportedIncludes, + Srcs: srcs, + Copts: compilerAttrs.copts, + Linkopts: linkerAttrs.linkopts, + Deps: linkerAttrs.deps, + Static_deps_for_shared: sharedAttrs.staticDeps, + Includes: exportedIncludes, } props := bazel.BazelTargetModuleProperties{