Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53681ef5 authored by Jingwen Chen's avatar Jingwen Chen
Browse files

bp2build: make libdl build.

This CL adds support for the static and shared props, forwarding
whole_static_libs and srcs to the underlying shared library's
static_deps and static library's srcs respectively.

Test: TH
Fixes: 186609667
Change-Id: I84f838361c7758b256b2a163af894c502de03109
parent af44591f
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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
+33 −0
Original line number Diff line number Diff line
@@ -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)
+52 −0
Original line number Diff line number Diff line
@@ -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
+20 −12
Original line number Diff line number Diff line
@@ -224,6 +224,7 @@ type bazelCcLibraryAttributes struct {
	Deps                   bazel.LabelListAttribute
	User_link_flags        bazel.StringListAttribute
	Includes               bazel.StringListAttribute
	Static_deps_for_shared bazel.LabelListAttribute
}

type bazelCcLibrary struct {
@@ -254,15 +255,22 @@ 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,
		Srcs:                   srcs,
		Copts:                  compilerAttrs.copts,
		Linkopts:               linkerAttrs.linkopts,
		Deps:                   linkerAttrs.deps,
		Static_deps_for_shared: sharedAttrs.staticDeps,
		Includes:               exportedIncludes,
	}