From baced71cd2cb645bbca3cd557022a46193c84126 Mon Sep 17 00:00:00 2001 From: Liz Kammer Date: Fri, 16 Sep 2022 09:01:29 -0400 Subject: [PATCH] Add libbuildversion in converion instead of macro Test: bp2build.sh Change-Id: I96fa6e4dda7d54224a20bcb35414d61c6f70cf7e --- bp2build/cc_binary_conversion_test.go | 13 +++++++--- bp2build/cc_library_conversion_test.go | 26 ++++++++++++++----- bp2build/cc_library_shared_conversion_test.go | 6 ++++- bp2build/cc_library_static_conversion_test.go | 25 +++++++++++++++++- cc/bp2build.go | 26 ++++++++++++++----- cc/library.go | 4 +-- 6 files changed, 79 insertions(+), 21 deletions(-) diff --git a/bp2build/cc_binary_conversion_test.go b/bp2build/cc_binary_conversion_test.go index 67d4a1c96..1c9fba20f 100644 --- a/bp2build/cc_binary_conversion_test.go +++ b/bp2build/cc_binary_conversion_test.go @@ -45,6 +45,7 @@ func generateBazelTargetsForTest(targets []testBazelTarget, hod android.HostOrDe type ccBinaryBp2buildTestCase struct { description string + filesystem map[string]string blueprint string targets []testBazelTarget } @@ -79,6 +80,7 @@ func runCcBinaryTestCase(t *testing.T, testCase ccBinaryBp2buildTestCase) { ModuleTypeUnderTestFactory: cc.BinaryFactory, Description: description, Blueprint: binaryReplacer.Replace(testCase.blueprint), + Filesystem: testCase.filesystem, }) }) } @@ -94,6 +96,7 @@ func runCcHostBinaryTestCase(t *testing.T, testCase ccBinaryBp2buildTestCase) { ModuleTypeUnderTestFactory: cc.BinaryHostFactory, Description: description, Blueprint: hostBinaryReplacer.Replace(testCase.blueprint), + Filesystem: testCase.filesystem, }) }) } @@ -101,6 +104,9 @@ func runCcHostBinaryTestCase(t *testing.T, testCase ccBinaryBp2buildTestCase) { func TestBasicCcBinary(t *testing.T) { runCcBinaryTests(t, ccBinaryBp2buildTestCase{ description: "basic -- properties -> attrs with little/no transformation", + filesystem: map[string]string{ + soongCcVersionLibBpPath: soongCcVersionLibBp, + }, blueprint: ` {rule_name} { name: "foo", @@ -146,9 +152,10 @@ func TestBasicCcBinary(t *testing.T) { "keep_symbols_list": ["symbol"], "none": True, }`, - "sdk_version": `"current"`, - "min_sdk_version": `"29"`, - "use_version_lib": `True`, + "sdk_version": `"current"`, + "min_sdk_version": `"29"`, + "use_version_lib": `True`, + "whole_archive_deps": `["//build/soong/cc/libbuildversion:libbuildversion"]`, }, }, }, diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 1949f4d7d..f581706a1 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -27,7 +27,16 @@ const ( soongCcLibraryPreamble = ` cc_defaults { name: "linux_bionic_supported", -}` +} +` + + soongCcVersionLibBpPath = "build/soong/cc/libbuildversion/Android.bp" + soongCcVersionLibBp = ` +cc_library_static { + name: "libbuildversion", + bazel_module: { bp2build_available: false }, +} +` soongCcProtoLibraries = ` cc_library { @@ -62,9 +71,10 @@ func TestCcLibrarySimple(t *testing.T) { ModuleTypeUnderTest: "cc_library", ModuleTypeUnderTestFactory: cc.LibraryFactory, Filesystem: map[string]string{ - "android.cpp": "", - "bionic.cpp": "", - "darwin.cpp": "", + soongCcVersionLibBpPath: soongCcVersionLibBp, + "android.cpp": "", + "bionic.cpp": "", + "darwin.cpp": "", // Refer to cc.headerExts for the supported header extensions in Soong. "header.h": "", "header.hh": "", @@ -143,9 +153,10 @@ cc_library { "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"], "//conditions:default": [], })`, - "sdk_version": `"current"`, - "min_sdk_version": `"29"`, - "use_version_lib": `True`, + "sdk_version": `"current"`, + "min_sdk_version": `"29"`, + "use_version_lib": `True`, + "implementation_whole_archive_deps": `["//build/soong/cc/libbuildversion:libbuildversion"]`, }), }) } @@ -1337,6 +1348,7 @@ func makeCcLibraryTargets(name string, attrs AttrNameToString) []string { "strip": true, "inject_bssl_hash": true, "has_stubs": true, + "use_version_lib": true, } sharedAttrs := AttrNameToString{} diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go index 4d8e59b30..6aa8ebe8d 100644 --- a/bp2build/cc_library_shared_conversion_test.go +++ b/bp2build/cc_library_shared_conversion_test.go @@ -454,6 +454,9 @@ func TestCcLibrarySharedProto(t *testing.T) { func TestCcLibrarySharedUseVersionLib(t *testing.T) { runCcLibrarySharedTestCase(t, Bp2buildTestCase{ + Filesystem: map[string]string{ + soongCcVersionLibBpPath: soongCcVersionLibBp, + }, Blueprint: soongCcProtoPreamble + `cc_library_shared { name: "foo", use_version_lib: true, @@ -461,7 +464,8 @@ func TestCcLibrarySharedUseVersionLib(t *testing.T) { }`, ExpectedBazelTargets: []string{ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{ - "use_version_lib": "True", + "use_version_lib": "True", + "implementation_whole_archive_deps": `["//build/soong/cc/libbuildversion:libbuildversion"]`, }), }, }) diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go index 316fa3e4c..37722ed04 100644 --- a/bp2build/cc_library_static_conversion_test.go +++ b/bp2build/cc_library_static_conversion_test.go @@ -1485,14 +1485,37 @@ func TestCcLibraryStaticProto(t *testing.T) { func TestCcLibraryStaticUseVersionLib(t *testing.T) { runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Filesystem: map[string]string{ + soongCcVersionLibBpPath: soongCcVersionLibBp, + }, Blueprint: soongCcProtoPreamble + `cc_library_static { name: "foo", use_version_lib: true, + static_libs: ["libbuildversion"], include_build_directory: false, }`, ExpectedBazelTargets: []string{ MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ - "use_version_lib": "True", + "implementation_whole_archive_deps": `["//build/soong/cc/libbuildversion:libbuildversion"]`, + }), + }, + }) +} + +func TestCcLibraryStaticUseVersionLibHasDep(t *testing.T) { + runCcLibraryStaticTestCase(t, Bp2buildTestCase{ + Filesystem: map[string]string{ + soongCcVersionLibBpPath: soongCcVersionLibBp, + }, + Blueprint: soongCcProtoPreamble + `cc_library_static { + name: "foo", + use_version_lib: true, + whole_static_libs: ["libbuildversion"], + include_build_directory: false, +}`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "whole_archive_deps": `["//build/soong/cc/libbuildversion:libbuildversion"]`, }), }, }) diff --git a/cc/bp2build.go b/cc/bp2build.go index 7a5657a81..95ac598af 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -838,6 +838,7 @@ type linkerAttributes struct { var ( soongSystemSharedLibs = []string{"libc", "libm", "libdl"} + versionLib = "libbuildversion" ) // resolveTargetApex re-adds the shared and static libs in target.apex.exclude_shared|static_libs props to non-apex variant @@ -877,10 +878,27 @@ func (la *linkerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversion var axisFeatures []string wholeStaticLibs := android.FirstUniqueStrings(props.Whole_static_libs) - la.wholeArchiveDeps.SetSelectValue(axis, config, bazelLabelForWholeDepsExcludes(ctx, wholeStaticLibs, props.Exclude_static_libs)) + staticLibs := android.FirstUniqueStrings(android.RemoveListFromList(props.Static_libs, wholeStaticLibs)) + if axis == bazel.NoConfigAxis { + la.useVersionLib.SetSelectValue(axis, config, props.Use_version_lib) + if proptools.Bool(props.Use_version_lib) { + versionLibAlreadyInDeps := android.InList(versionLib, wholeStaticLibs) + // remove from static libs so there is no duplicate dependency + _, staticLibs = android.RemoveFromList(versionLib, staticLibs) + // only add the dep if it is not in progress + if !versionLibAlreadyInDeps { + if isBinary { + wholeStaticLibs = append(wholeStaticLibs, versionLib) + } else { + la.implementationWholeArchiveDeps.SetSelectValue(axis, config, bazelLabelForWholeDepsExcludes(ctx, []string{versionLib}, props.Exclude_static_libs)) + } + } + } + } + // Excludes to parallel Soong: // https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/linker.go;l=247-249;drc=088b53577dde6e40085ffd737a1ae96ad82fc4b0 - staticLibs := android.FirstUniqueStrings(android.RemoveListFromList(props.Static_libs, wholeStaticLibs)) + la.wholeArchiveDeps.SetSelectValue(axis, config, bazelLabelForWholeDepsExcludes(ctx, wholeStaticLibs, props.Exclude_static_libs)) staticDeps := maybePartitionExportedAndImplementationsDepsExcludes( ctx, @@ -1006,10 +1024,6 @@ func (la *linkerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversion la.linkopts.SetSelectValue(axis, config, parseCommandLineFlags(linkerFlags, false, filterOutClangUnknownCflags)) la.useLibcrt.SetSelectValue(axis, config, props.libCrt()) - if axis == bazel.NoConfigAxis { - la.useVersionLib.SetSelectValue(axis, config, props.Use_version_lib) - } - // it's very unlikely for nocrt to be arch variant, so bp2build doesn't support it. if props.crt() != nil { if axis == bazel.NoConfigAxis { diff --git a/cc/library.go b/cc/library.go index 93bb26a04..a8653a0a9 100644 --- a/cc/library.go +++ b/cc/library.go @@ -367,7 +367,6 @@ func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) { Stl: compilerAttrs.stl, Cpp_std: compilerAttrs.cppStd, C_std: compilerAttrs.cStd, - Use_version_lib: linkerAttrs.useVersionLib, Features: baseAttributes.features, } @@ -2631,8 +2630,7 @@ func sharedOrStaticLibraryBp2Build(ctx android.TopDownMutatorContext, module *Mo attrs = &bazelCcLibraryStaticAttributes{ staticOrSharedAttributes: commonAttrs, - Use_libcrt: linkerAttrs.useLibcrt, - Use_version_lib: linkerAttrs.useVersionLib, + Use_libcrt: linkerAttrs.useLibcrt, Rtti: compilerAttrs.rtti, Stl: compilerAttrs.stl,