diff --git a/bazel/properties.go b/bazel/properties.go index bbaa33e2f..76be0581b 100644 --- a/bazel/properties.go +++ b/bazel/properties.go @@ -385,9 +385,12 @@ func (ll labelListSelectValues) addSelects(label labelSelectValues) { } } -func (ll labelListSelectValues) appendSelects(other labelListSelectValues) { +func (ll labelListSelectValues) appendSelects(other labelListSelectValues, forceSpecifyEmptyList bool) { for k, v := range other { l := ll[k] + if forceSpecifyEmptyList && l.IsNil() && !v.IsNil() { + l.Includes = []Label{} + } (&l).Append(v) ll[k] = l } @@ -443,17 +446,22 @@ func (cll configurableLabelLists) setValueForAxis(axis ConfigurationAxis, config cll[axis][config] = list } -func (cll configurableLabelLists) Append(other configurableLabelLists) { +func (cll configurableLabelLists) Append(other configurableLabelLists, forceSpecifyEmptyList bool) { for axis, otherSelects := range other { selects := cll[axis] if selects == nil { selects = make(labelListSelectValues, len(otherSelects)) } - selects.appendSelects(otherSelects) + selects.appendSelects(otherSelects, forceSpecifyEmptyList) cll[axis] = selects } } +func (lla *LabelListAttribute) Clone() *LabelListAttribute { + result := &LabelListAttribute{ForceSpecifyEmptyList: lla.ForceSpecifyEmptyList} + return result.Append(*lla) +} + // MakeLabelListAttribute initializes a LabelListAttribute with the non-arch specific value. func MakeLabelListAttribute(value LabelList) LabelListAttribute { return LabelListAttribute{ @@ -507,16 +515,18 @@ func (lla *LabelListAttribute) SortedConfigurationAxes() []ConfigurationAxis { } // Append all values, including os and arch specific ones, from another -// LabelListAttribute to this LabelListAttribute. -func (lla *LabelListAttribute) Append(other LabelListAttribute) { - if lla.ForceSpecifyEmptyList && !other.Value.IsNil() { +// LabelListAttribute to this LabelListAttribute. Returns this LabelListAttribute. +func (lla *LabelListAttribute) Append(other LabelListAttribute) *LabelListAttribute { + forceSpecifyEmptyList := lla.ForceSpecifyEmptyList || other.ForceSpecifyEmptyList + if forceSpecifyEmptyList && lla.Value.IsNil() && !other.Value.IsNil() { lla.Value.Includes = []Label{} } lla.Value.Append(other.Value) if lla.ConfigurableValues == nil { lla.ConfigurableValues = make(configurableLabelLists) } - lla.ConfigurableValues.Append(other.ConfigurableValues) + lla.ConfigurableValues.Append(other.ConfigurableValues, forceSpecifyEmptyList) + return lla } // Add inserts the labels for each axis of LabelAttribute at the end of corresponding axis's @@ -795,12 +805,18 @@ func (sla StringListAttribute) HasConfigurableValues() bool { // Append appends all values, including os and arch specific ones, from another // StringListAttribute to this StringListAttribute -func (sla *StringListAttribute) Append(other StringListAttribute) { +func (sla *StringListAttribute) Append(other StringListAttribute) *StringListAttribute { sla.Value = append(sla.Value, other.Value...) if sla.ConfigurableValues == nil { sla.ConfigurableValues = make(configurableStringLists) } sla.ConfigurableValues.Append(other.ConfigurableValues) + return sla +} + +func (sla *StringListAttribute) Clone() *StringListAttribute { + result := &StringListAttribute{} + return result.Append(*sla) } // SetSelectValue set a value for a bazel select for the given axis, config and value. diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 8c8898e3e..dcbe326e9 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -130,17 +130,16 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "copts": `["-Wall"]`, - "export_includes": `["foo-dir"]`, - "implementation_deps": `[":some-headers"]`, - "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({ + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "copts": `["-Wall"]`, + "export_includes": `["foo-dir"]`, + "implementation_deps": `[":some-headers"]`, + "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({ "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"], "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"], "//conditions:default": [], })`, - "srcs": `["impl.cpp"] + select({ + "srcs": `["impl.cpp"] + select({ "//build/bazel/platforms/arch:x86": ["x86.cpp"], "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"], "//conditions:default": [], @@ -154,8 +153,7 @@ cc_library { "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"], "//conditions:default": [], })`, - }), - }, + }), }) } @@ -203,17 +201,16 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "fake-ld-android", attrNameToString{ - "srcs": `["ld_android.cpp"]`, - "copts": `[ + expectedBazelTargets: makeCcLibraryTargets("fake-ld-android", attrNameToString{ + "srcs": `["ld_android.cpp"]`, + "copts": `[ "-Wall", "-Wextra", "-Wunused", "-Werror", ]`, - "implementation_deps": `[":libc_headers"]`, - "linkopts": `[ + "implementation_deps": `[":libc_headers"]`, + "linkopts": `[ "-Wl,--exclude-libs=libgcc.a", "-Wl,--exclude-libs=libgcc_stripped.a", "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a", @@ -225,8 +222,7 @@ cc_library { "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"], "//conditions:default": [], })`, - }), - }, + }), }) } @@ -271,16 +267,14 @@ cc_library { `, }, blueprint: soongCcLibraryPreamble, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "fake-libarm-optimized-routines-math", attrNameToString{ - "copts": `select({ + expectedBazelTargets: makeCcLibraryTargets("fake-libarm-optimized-routines-math", attrNameToString{ + "copts": `select({ "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"], "//conditions:default": [], })`, - "local_includes": `["."]`, - "srcs_c": `["math/cosf.c"]`, - }), - }, + "local_includes": `["."]`, + "srcs_c": `["math/cosf.c"]`, + }), }) } @@ -366,26 +360,48 @@ cc_library { } `, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "copts": `["bothflag"]`, - "implementation_deps": `[":static_dep_for_both"]`, - "implementation_dynamic_deps": `[":shared_dep_for_both"]`, - "shared": `{ - "copts": ["sharedflag"], - "implementation_deps": [":static_dep_for_shared"], - "implementation_dynamic_deps": [":shared_dep_for_shared"], - "srcs": ["sharedonly.cpp"], - "whole_archive_deps": [":whole_static_lib_for_shared"], - }`, - "srcs": `["both.cpp"]`, - "static": `{ - "copts": ["staticflag"], - "implementation_deps": [":static_dep_for_static"], - "implementation_dynamic_deps": [":shared_dep_for_static"], - "srcs": ["staticonly.cpp"], - "whole_archive_deps": [":whole_static_lib_for_static"], - }`, - "whole_archive_deps": `[":whole_static_lib_for_both"]`, + makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{ + "copts": `[ + "bothflag", + "staticflag", + ]`, + "implementation_deps": `[ + ":static_dep_for_both", + ":static_dep_for_static", + ]`, + "implementation_dynamic_deps": `[ + ":shared_dep_for_both", + ":shared_dep_for_static", + ]`, + "srcs": `[ + "both.cpp", + "staticonly.cpp", + ]`, + "whole_archive_deps": `[ + ":whole_static_lib_for_both", + ":whole_static_lib_for_static", + ]`}), + makeBazelTarget("cc_library_shared", "a", attrNameToString{ + "copts": `[ + "bothflag", + "sharedflag", + ]`, + "implementation_deps": `[ + ":static_dep_for_both", + ":static_dep_for_shared", + ]`, + "implementation_dynamic_deps": `[ + ":shared_dep_for_both", + ":shared_dep_for_shared", + ]`, + "srcs": `[ + "both.cpp", + "sharedonly.cpp", + ]`, + "whole_archive_deps": `[ + ":whole_static_lib_for_both", + ":whole_static_lib_for_shared", + ]`, }), }, }) @@ -451,44 +467,72 @@ cc_library { simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") + simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"), expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "copts": `["bothflag"]`, - "deps": `[":static_dep_for_both"]`, - "dynamic_deps": `[":shared_dep_for_both"]`, - "implementation_deps": `[":implementation_static_dep_for_both"]`, - "implementation_dynamic_deps": `[":implementation_shared_dep_for_both"]`, - "shared": `{ - "copts": ["sharedflag"], - "deps": [":static_dep_for_shared"], - "dynamic_deps": [":shared_dep_for_shared"], - "implementation_deps": [":implementation_static_dep_for_shared"], - "implementation_dynamic_deps": [":implementation_shared_dep_for_shared"], - "srcs": ["sharedonly.cpp"], - "whole_archive_deps": [ - ":not_explicitly_exported_whole_static_dep_for_shared", - ":whole_static_dep_for_shared", - ], - }`, - "srcs": `["both.cpp"]`, - "static": `{ - "copts": ["staticflag"], - "deps": [":static_dep_for_static"], - "dynamic_deps": [":shared_dep_for_static"], - "implementation_deps": [":implementation_static_dep_for_static"], - "implementation_dynamic_deps": [":implementation_shared_dep_for_static"], - "srcs": ["staticonly.cpp"], - "whole_archive_deps": [ - ":not_explicitly_exported_whole_static_dep_for_static", - ":whole_static_dep_for_static", - ], - }`, + makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{ + "copts": `[ + "bothflag", + "staticflag", + ]`, + "deps": `[ + ":static_dep_for_both", + ":static_dep_for_static", + ]`, + "dynamic_deps": `[ + ":shared_dep_for_both", + ":shared_dep_for_static", + ]`, + "implementation_deps": `[ + ":implementation_static_dep_for_both", + ":implementation_static_dep_for_static", + ]`, + "implementation_dynamic_deps": `[ + ":implementation_shared_dep_for_both", + ":implementation_shared_dep_for_static", + ]`, + "srcs": `[ + "both.cpp", + "staticonly.cpp", + ]`, "whole_archive_deps": `[ ":not_explicitly_exported_whole_static_dep_for_both", ":whole_static_dep_for_both", + ":not_explicitly_exported_whole_static_dep_for_static", + ":whole_static_dep_for_static", ]`, }), - }, - }) + makeBazelTarget("cc_library_shared", "a", attrNameToString{ + "copts": `[ + "bothflag", + "sharedflag", + ]`, + "deps": `[ + ":static_dep_for_both", + ":static_dep_for_shared", + ]`, + "dynamic_deps": `[ + ":shared_dep_for_both", + ":shared_dep_for_shared", + ]`, + "implementation_deps": `[ + ":implementation_static_dep_for_both", + ":implementation_static_dep_for_shared", + ]`, + "implementation_dynamic_deps": `[ + ":implementation_shared_dep_for_both", + ":implementation_shared_dep_for_shared", + ]`, + "srcs": `[ + "both.cpp", + "sharedonly.cpp", + ]`, + "whole_archive_deps": `[ + ":not_explicitly_exported_whole_static_dep_for_both", + ":whole_static_dep_for_both", + ":not_explicitly_exported_whole_static_dep_for_shared", + ":whole_static_dep_for_shared", + ]`, + })}, + }, + ) } func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) { @@ -521,17 +565,21 @@ cc_prebuilt_library_static { name: "whole_static_lib_for_both" } }, blueprint: soongCcLibraryPreamble, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "shared": `{ - "whole_archive_deps": [":whole_static_lib_for_shared_alwayslink"], - }`, - "static": `{ - "whole_archive_deps": [":whole_static_lib_for_static_alwayslink"], - }`, - "whole_archive_deps": `[":whole_static_lib_for_both_alwayslink"]`, + makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{ + "whole_archive_deps": `[ + ":whole_static_lib_for_both_alwayslink", + ":whole_static_lib_for_static_alwayslink", + ]`, + }), + makeBazelTarget("cc_library_shared", "a", attrNameToString{ + "whole_archive_deps": `[ + ":whole_static_lib_for_both_alwayslink", + ":whole_static_lib_for_shared_alwayslink", + ]`, }), }, - }) + }, + ) } func TestCcLibrarySharedStaticPropsInArch(t *testing.T) { @@ -612,62 +660,77 @@ cc_library_static { name: "android_dep_for_shared" } }, blueprint: soongCcLibraryPreamble, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "copts": `["bothflag"]`, - "implementation_deps": `[":static_dep_for_both"]`, - "local_includes": `["."]`, - "shared": `{ - "copts": ["sharedflag"] + select({ - "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"], - "//conditions:default": [], - }) + select({ - "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"], - "//conditions:default": [], - }) + select({ - "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"], - "//conditions:default": [], - }), - "implementation_deps": [":static_dep_for_shared"] + select({ - "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"], - "//conditions:default": [], - }) + select({ - "//build/bazel/platforms/os:android": [":android_dep_for_shared"], - "//conditions:default": [], - }), - "implementation_dynamic_deps": select({ - "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"], - "//conditions:default": [], - }), - "srcs": ["sharedonly.cpp"] + select({ - "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"], - "//conditions:default": [], - }) + select({ - "//build/bazel/platforms/os:android": ["android_shared.cpp"], - "//conditions:default": [], - }), - "whole_archive_deps": select({ - "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"], - "//conditions:default": [], - }), - }`, - "srcs": `["both.cpp"]`, - "static": `{ - "copts": ["staticflag"] + select({ - "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"], - "//conditions:default": [], - }), - "implementation_deps": [":static_dep_for_static"] + select({ - "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"], - "//conditions:default": [], - }), - "srcs": ["staticonly.cpp"] + select({ - "//build/bazel/platforms/arch:x86": ["x86_static.cpp"], - "//conditions:default": [], - }), - }`, + makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{ + "copts": `[ + "bothflag", + "staticflag", + ] + select({ + "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"], + "//conditions:default": [], + })`, + "implementation_deps": `[ + ":static_dep_for_both", + ":static_dep_for_static", + ] + select({ + "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + "srcs": `[ + "both.cpp", + "staticonly.cpp", + ] + select({ + "//build/bazel/platforms/arch:x86": ["x86_static.cpp"], + "//conditions:default": [], + })`, + }), + makeBazelTarget("cc_library_shared", "a", attrNameToString{ + "copts": `[ + "bothflag", + "sharedflag", + ] + select({ + "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"], + "//conditions:default": [], + }) + select({ + "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"], + "//conditions:default": [], + }) + select({ + "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"], + "//conditions:default": [], + })`, + "implementation_deps": `[ + ":static_dep_for_both", + ":static_dep_for_shared", + ] + select({ + "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"], + "//conditions:default": [], + }) + select({ + "//build/bazel/platforms/os:android": [":android_dep_for_shared"], + "//conditions:default": [], + })`, + "implementation_dynamic_deps": `select({ + "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"], + "//conditions:default": [], + })`, + "local_includes": `["."]`, + "srcs": `[ + "both.cpp", + "sharedonly.cpp", + ] + select({ + "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"], + "//conditions:default": [], + }) + select({ + "//build/bazel/platforms/os:android": ["android_shared.cpp"], + "//conditions:default": [], + })`, + "whole_archive_deps": `select({ + "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"], + "//conditions:default": [], + })`, }), }, - }) + }, + ) } func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) { @@ -751,57 +814,56 @@ filegroup { }, blueprint: soongCcLibraryPreamble, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ + makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{ "local_includes": `["."]`, - "shared": `{ - "srcs": [ - "shared_source.cpp", - "shared_source.cc", - ":shared_filegroup_cpp_srcs", - ], - "srcs_as": [ - "shared_source.s", - "shared_source.S", - ":shared_filegroup_as_srcs", - ], - "srcs_c": [ - "shared_source.c", - ":shared_filegroup_c_srcs", - ], - }`, "srcs": `[ "both_source.cpp", "both_source.cc", ":both_filegroup_cpp_srcs", + "static_source.cpp", + "static_source.cc", + ":static_filegroup_cpp_srcs", ]`, "srcs_as": `[ "both_source.s", "both_source.S", ":both_filegroup_as_srcs", + "static_source.s", + "static_source.S", + ":static_filegroup_as_srcs", ]`, "srcs_c": `[ "both_source.c", ":both_filegroup_c_srcs", + "static_source.c", + ":static_filegroup_c_srcs", ]`, - "static": `{ - "srcs": [ - "static_source.cpp", - "static_source.cc", - ":static_filegroup_cpp_srcs", - ], - "srcs_as": [ - "static_source.s", - "static_source.S", - ":static_filegroup_as_srcs", - ], - "srcs_c": [ - "static_source.c", - ":static_filegroup_c_srcs", - ], - }`, }), - }, - }) + makeBazelTarget("cc_library_shared", "a", attrNameToString{ + "local_includes": `["."]`, + "srcs": `[ + "both_source.cpp", + "both_source.cc", + ":both_filegroup_cpp_srcs", + "shared_source.cpp", + "shared_source.cc", + ":shared_filegroup_cpp_srcs", + ]`, + "srcs_as": `[ + "both_source.s", + "both_source.S", + ":both_filegroup_as_srcs", + "shared_source.s", + "shared_source.S", + ":shared_filegroup_as_srcs", + ]`, + "srcs_c": `[ + "both_source.c", + ":both_filegroup_c_srcs", + "shared_source.c", + ":shared_filegroup_c_srcs", + ]`, + })}}) } func TestCcLibraryNonConfiguredVersionScript(t *testing.T) { @@ -823,14 +885,13 @@ cc_library { `, }, blueprint: soongCcLibraryPreamble, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "additional_linker_inputs": `["v.map"]`, - "linkopts": `["-Wl,--version-script,$(location v.map)"]`, - "srcs": `["a.cpp"]`, - }), - }, - }) + expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{ + "additional_linker_inputs": `["v.map"]`, + "linkopts": `["-Wl,--version-script,$(location v.map)"]`, + "srcs": `["a.cpp"]`, + }), + }, + ) } func TestCcLibraryConfiguredVersionScript(t *testing.T) { @@ -860,22 +921,21 @@ cc_library { `, }, blueprint: soongCcLibraryPreamble, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "additional_linker_inputs": `select({ + expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{ + "additional_linker_inputs": `select({ "//build/bazel/platforms/arch:arm": ["arm.map"], "//build/bazel/platforms/arch:arm64": ["arm64.map"], "//conditions:default": [], })`, - "linkopts": `select({ + "linkopts": `select({ "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"], "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"], "//conditions:default": [], })`, - "srcs": `["a.cpp"]`, - }), - }, - }) + "srcs": `["a.cpp"]`, + }), + }, + ) } func TestCcLibrarySharedLibs(t *testing.T) { @@ -896,15 +956,43 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "implementation_dynamic_deps": `[":mylib"]`, - }), - }, - }) + expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{ + "implementation_dynamic_deps": `[":mylib"]`, + }), + }, + ) } func TestCcLibraryFeatures(t *testing.T) { + expected_targets := []string{} + expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{ + "features": `[ + "disable_pack_relocations", + "-no_undefined_symbols", + ]`, + "srcs": `["a.cpp"]`, + })...) + expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{ + "features": `select({ + "//build/bazel/platforms/arch:x86_64": [ + "disable_pack_relocations", + "-no_undefined_symbols", + ], + "//conditions:default": [], + })`, + "srcs": `["b.cpp"]`, + })...) + expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{ + "features": `select({ + "//build/bazel/platforms/os:darwin": [ + "disable_pack_relocations", + "-no_undefined_symbols", + ], + "//conditions:default": [], + })`, + "srcs": `["c.cpp"]`, + })...) + runCcLibraryTestCase(t, bp2buildTestCase{ description: "cc_library pack_relocations test", moduleTypeUnderTest: "cc_library", @@ -942,33 +1030,7 @@ cc_library { }, include_build_directory: false, }`, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "features": `[ - "disable_pack_relocations", - "-no_undefined_symbols", - ]`, - "srcs": `["a.cpp"]`, - }), makeBazelTarget("cc_library", "b", attrNameToString{ - "features": `select({ - "//build/bazel/platforms/arch:x86_64": [ - "disable_pack_relocations", - "-no_undefined_symbols", - ], - "//conditions:default": [], - })`, - "srcs": `["b.cpp"]`, - }), makeBazelTarget("cc_library", "c", attrNameToString{ - "features": `select({ - "//build/bazel/platforms/os:darwin": [ - "disable_pack_relocations", - "-no_undefined_symbols", - ], - "//conditions:default": [], - })`, - "srcs": `["c.cpp"]`, - }), - }, + expectedBazelTargets: expected_targets, }) } @@ -985,15 +1047,14 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "copts": `[ + expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{ + "copts": `[ "-include", "header.h", ]`, - }), - }, - }) + }), + }, + ) } func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) { @@ -1023,10 +1084,9 @@ func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrNameToString{ - "copts": `["-Wall"]`, - "cppflags": `[ + expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{ + "copts": `["-Wall"]`, + "cppflags": `[ "-fsigned-char", "-pedantic", ] + select({ @@ -1036,10 +1096,10 @@ func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) { "//build/bazel/platforms/os:android": ["-DANDROID=1"], "//conditions:default": [], })`, - "srcs": `["a.cpp"]`, - }), - }, - }) + "srcs": `["a.cpp"]`, + }), + }, + ) } func TestCcLibraryExcludeLibs(t *testing.T) { @@ -1122,33 +1182,32 @@ cc_library { bazel_module: { bp2build_available: false }, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo_static", attrNameToString{ - "implementation_deps": `select({ + expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{ + "implementation_deps": `select({ "//build/bazel/platforms/arch:arm": [], "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"], }) + select({ "//build/bazel/product_variables:malloc_not_svelte": [], "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"], })`, - "implementation_dynamic_deps": `select({ + "implementation_dynamic_deps": `select({ "//build/bazel/platforms/arch:arm": [], "//conditions:default": [":arm_shared_lib_excludes"], }) + select({ "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"], "//conditions:default": [], })`, - "srcs_c": `["common.c"]`, - "whole_archive_deps": `select({ + "srcs_c": `["common.c"]`, + "whole_archive_deps": `select({ "//build/bazel/platforms/arch:arm": [], "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"], }) + select({ "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"], "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"], })`, - }), - }, - }) + }), + }, + ) } func TestCCLibraryNoCrtTrue(t *testing.T) { @@ -1168,13 +1227,12 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "link_crt": `False`, - "srcs": `["impl.cpp"]`, - }), - }, - }) + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "link_crt": `False`, + "srcs": `["impl.cpp"]`, + }), + }, + ) } func TestCCLibraryNoCrtFalse(t *testing.T) { @@ -1194,11 +1252,9 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "srcs": `["impl.cpp"]`, - }), - }, + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "srcs": `["impl.cpp"]`, + }), }) } @@ -1248,12 +1304,35 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "srcs": `["impl.cpp"]`, - "use_libcrt": `False`, - }), - }}) + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "srcs": `["impl.cpp"]`, + "use_libcrt": `False`, + }), + }) +} + +func makeCcLibraryTargets(name string, attrs attrNameToString) []string { + STATIC_ONLY_ATTRS := map[string]bool{} + SHARED_ONLY_ATTRS := map[string]bool{ + "link_crt": true, + "additional_linker_inputs": true, + "linkopts": true, + "strip": true, + } + sharedAttrs := attrNameToString{} + staticAttrs := attrNameToString{} + for key, val := range attrs { + if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly { + sharedAttrs[key] = val + } + if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly { + staticAttrs[key] = val + } + } + sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs) + staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs) + + return []string{staticTarget, sharedTarget} } func TestCCLibraryNoLibCrtFalse(t *testing.T) { @@ -1273,12 +1352,11 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "srcs": `["impl.cpp"]`, - "use_libcrt": `True`, - }), - }}) + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "srcs": `["impl.cpp"]`, + "use_libcrt": `True`, + }), + }) } func TestCCLibraryNoLibCrtArchVariant(t *testing.T) { @@ -1304,19 +1382,46 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "srcs": `["impl.cpp"]`, - "use_libcrt": `select({ + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "srcs": `["impl.cpp"]`, + "use_libcrt": `select({ "//build/bazel/platforms/arch:arm": False, "//build/bazel/platforms/arch:x86": False, "//conditions:default": None, })`, - }), - }}) + }), + }) } func TestCcLibraryStrip(t *testing.T) { + expectedTargets := []string{} + expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{ + "strip": `{ + "all": True, + }`, + })...) + expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{ + "strip": `{ + "keep_symbols": True, + }`, + })...) + expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{ + "strip": `{ + "keep_symbols_and_debug_frame": True, + }`, + })...) + expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{ + "strip": `{ + "keep_symbols_list": ["symbol"], + }`, + })...) + expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{ + "strip": `{ + "none": True, + }`, + })...) + expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...) + runCcLibraryTestCase(t, bp2buildTestCase{ description: "cc_library strip args", moduleTypeUnderTest: "cc_library", @@ -1363,29 +1468,7 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "all", attrNameToString{ - "strip": `{ - "all": True, - }`, - }), makeBazelTarget("cc_library", "keep_symbols", attrNameToString{ - "strip": `{ - "keep_symbols": True, - }`, - }), makeBazelTarget("cc_library", "keep_symbols_and_debug_frame", attrNameToString{ - "strip": `{ - "keep_symbols_and_debug_frame": True, - }`, - }), makeBazelTarget("cc_library", "keep_symbols_list", attrNameToString{ - "strip": `{ - "keep_symbols_list": ["symbol"], - }`, - }), makeBazelTarget("cc_library", "none", attrNameToString{ - "strip": `{ - "none": True, - }`, - }), makeBazelTarget("cc_library", "nothing", attrNameToString{}), - }, + expectedBazelTargets: expectedTargets, }) } @@ -1420,9 +1503,8 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "multi-arch", attrNameToString{ - "strip": `{ + expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{ + "strip": `{ "keep_symbols": select({ "//build/bazel/platforms/arch:arm64": True, "//conditions:default": None, @@ -1439,9 +1521,9 @@ cc_library { "//conditions:default": [], }), }`, - }), - }, - }) + }), + }, + ) } func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) { @@ -1457,12 +1539,11 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "root_empty", attrNameToString{ - "system_dynamic_deps": `[]`, - }), - }, - }) + expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{ + "system_dynamic_deps": `[]`, + }), + }, + ) } func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) { @@ -1481,11 +1562,10 @@ cc_library { } `, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "static_empty", attrNameToString{ - "static": `{ - "system_dynamic_deps": [], - }`, + makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{ + "system_dynamic_deps": "[]", }), + makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}), }, }) } @@ -1506,10 +1586,9 @@ cc_library { } `, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "shared_empty", attrNameToString{ - "shared": `{ - "system_dynamic_deps": [], - }`, + makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}), + makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{ + "system_dynamic_deps": "[]", }), }, }) @@ -1535,10 +1614,9 @@ cc_library { } `, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "shared_empty", attrNameToString{ - "shared": `{ - "system_dynamic_deps": [], - }`, + makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}), + makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{ + "system_dynamic_deps": "[]", }), }, }) @@ -1565,12 +1643,11 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "target_linux_bionic_empty", attrNameToString{ - "system_dynamic_deps": `[]`, - }), - }, - }) + expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{ + "system_dynamic_deps": `[]`, + }), + }, + ) } func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) { @@ -1590,12 +1667,11 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "target_bionic_empty", attrNameToString{ - "system_dynamic_deps": `[]`, - }), - }, - }) + expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{ + "system_dynamic_deps": `[]`, + }), + }, + ) } func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) { @@ -1624,12 +1700,15 @@ cc_library { } `, expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo", attrNameToString{ - "shared": `{ - "system_dynamic_deps": [":libm"], - }`, + makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ "system_dynamic_deps": `[":libc"]`, }), + makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "system_dynamic_deps": `[ + ":libc", + ":libm", + ]`, + }), }, }) } @@ -1672,9 +1751,8 @@ cc_library { include_build_directory: false, } `, - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "foo-lib", attrNameToString{ - "srcs": `["base.cpp"] + select({ + expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{ + "srcs": `["base.cpp"] + select({ "//build/bazel/platforms/os:android": [ "linux.cpp", "bionic.cpp", @@ -1696,9 +1774,9 @@ cc_library { "//build/bazel/platforms/os:windows": ["windows.cpp"], "//conditions:default": [], })`, - }), - }, - }) + }), + }, + ) } func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) { @@ -1796,9 +1874,7 @@ cc_library { include_build_directory: false, } `, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), - expectedBazelTargets: []string{ - makeBazelTarget("cc_library", name_prefix+"_full", attrs), - }, + expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs), }) runCcLibraryStaticTestCase(t, bp2buildTestCase{ @@ -1859,14 +1935,11 @@ func TestCcLibraryProtoSimple(t *testing.T) { "strip_import_prefix": `""`, }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{ "deps": `[":foo_proto"]`, - }), makeBazelTarget("cc_library", "foo", attrNameToString{ + }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`, - "shared": `{ - "dynamic_deps": [":libprotobuf-cpp-lite"], - }`, - "static": `{ - "deps": [":libprotobuf-cpp-lite"], - }`, + "deps": `[":libprotobuf-cpp-lite"]`, + }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "dynamic_deps": `[":libprotobuf-cpp-lite"]`, }), }, }) @@ -1888,14 +1961,11 @@ func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) { "srcs": `["foo.proto"]`, }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{ "deps": `[":foo_proto"]`, - }), makeBazelTarget("cc_library", "foo", attrNameToString{ + }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`, - "shared": `{ - "dynamic_deps": [":libprotobuf-cpp-lite"], - }`, - "static": `{ - "deps": [":libprotobuf-cpp-lite"], - }`, + "deps": `[":libprotobuf-cpp-lite"]`, + }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "dynamic_deps": `[":libprotobuf-cpp-lite"]`, }), }, }) @@ -1918,14 +1988,11 @@ func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) { "strip_import_prefix": `""`, }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{ "deps": `[":foo_proto"]`, - }), makeBazelTarget("cc_library", "foo", attrNameToString{ + }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`, - "shared": `{ - "dynamic_deps": [":libprotobuf-cpp-lite"], - }`, - "static": `{ - "deps": [":libprotobuf-cpp-lite"], - }`, + "deps": `[":libprotobuf-cpp-lite"]`, + }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "dynamic_deps": `[":libprotobuf-cpp-lite"]`, }), }, }) @@ -1950,14 +2017,11 @@ func TestCcLibraryProtoFull(t *testing.T) { "srcs": `["foo.proto"]`, }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{ "deps": `[":foo_proto"]`, - }), makeBazelTarget("cc_library", "foo", attrNameToString{ + }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ "implementation_whole_archive_deps": `[":foo_cc_proto"]`, - "shared": `{ - "dynamic_deps": [":libprotobuf-cpp-full"], - }`, - "static": `{ - "deps": [":libprotobuf-cpp-full"], - }`, + "deps": `[":libprotobuf-cpp-full"]`, + }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "dynamic_deps": `[":libprotobuf-cpp-full"]`, }), }, }) @@ -1982,14 +2046,11 @@ func TestCcLibraryProtoLite(t *testing.T) { "srcs": `["foo.proto"]`, }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{ "deps": `[":foo_proto"]`, - }), makeBazelTarget("cc_library", "foo", attrNameToString{ + }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`, - "shared": `{ - "dynamic_deps": [":libprotobuf-cpp-lite"], - }`, - "static": `{ - "deps": [":libprotobuf-cpp-lite"], - }`, + "deps": `[":libprotobuf-cpp-lite"]`, + }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "dynamic_deps": `[":libprotobuf-cpp-lite"]`, }), }, }) @@ -2014,14 +2075,12 @@ func TestCcLibraryProtoExportHeaders(t *testing.T) { "srcs": `["foo.proto"]`, }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{ "deps": `[":foo_proto"]`, - }), makeBazelTarget("cc_library", "foo", attrNameToString{ + }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{ + "deps": `[":libprotobuf-cpp-lite"]`, + "whole_archive_deps": `[":foo_cc_proto_lite"]`, + }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{ + "dynamic_deps": `[":libprotobuf-cpp-lite"]`, "whole_archive_deps": `[":foo_cc_proto_lite"]`, - "shared": `{ - "dynamic_deps": [":libprotobuf-cpp-lite"], - }`, - "static": `{ - "deps": [":libprotobuf-cpp-lite"], - }`, }), }, }) diff --git a/cc/cc.go b/cc/cc.go index 113620cc1..aeb342f4f 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1713,7 +1713,15 @@ func (c *Module) setSubnameProperty(actx android.ModuleContext) { // Returns true if Bazel was successfully used for the analysis of this module. func (c *Module) maybeGenerateBazelActions(actx android.ModuleContext) bool { - bazelModuleLabel := c.GetBazelLabel(actx, c) + var bazelModuleLabel string + if actx.ModuleType() == "cc_library" && c.static() { + // cc_library is a special case in bp2build; two targets are generated -- one for each + // of the shared and static variants. The shared variant keeps the module name, but the + // static variant uses a different suffixed name. + bazelModuleLabel = bazelLabelForStaticModule(actx, c) + } else { + bazelModuleLabel = c.GetBazelLabel(actx, c) + } bazelActionsUsed := false // Mixed builds mode is disabled for modules outside of device OS. // TODO(b/200841190): Support non-device OS in mixed builds. diff --git a/cc/library.go b/cc/library.go index 84aae0d4d..d07142917 100644 --- a/cc/library.go +++ b/cc/library.go @@ -313,35 +313,74 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) { asFlags = bazel.MakeStringListAttribute(nil) } - attrs := &bazelCcLibraryAttributes{ - Srcs: srcs, - Srcs_c: compilerAttrs.cSrcs, - Srcs_as: compilerAttrs.asSrcs, - Hdrs: compilerAttrs.hdrs, + staticCommonAttrs := staticOrSharedAttributes{ + Srcs: *srcs.Clone().Append(staticAttrs.Srcs), + Srcs_c: *compilerAttrs.cSrcs.Clone().Append(staticAttrs.Srcs_c), + Srcs_as: *compilerAttrs.asSrcs.Clone().Append(staticAttrs.Srcs_as), + Copts: *compilerAttrs.copts.Clone().Append(staticAttrs.Copts), + Hdrs: *compilerAttrs.hdrs.Clone().Append(staticAttrs.Hdrs), + + Deps: *linkerAttrs.deps.Clone().Append(staticAttrs.Deps), + Implementation_deps: *linkerAttrs.implementationDeps.Clone().Append(staticAttrs.Implementation_deps), + Dynamic_deps: *linkerAttrs.dynamicDeps.Clone().Append(staticAttrs.Dynamic_deps), + Implementation_dynamic_deps: *linkerAttrs.implementationDynamicDeps.Clone().Append(staticAttrs.Implementation_dynamic_deps), + Implementation_whole_archive_deps: linkerAttrs.implementationWholeArchiveDeps, + Whole_archive_deps: *linkerAttrs.wholeArchiveDeps.Clone().Append(staticAttrs.Whole_archive_deps), + System_dynamic_deps: *linkerAttrs.systemDynamicDeps.Clone().Append(staticAttrs.System_dynamic_deps), + } + + sharedCommonAttrs := staticOrSharedAttributes{ + Srcs: *srcs.Clone().Append(sharedAttrs.Srcs), + Srcs_c: *compilerAttrs.cSrcs.Clone().Append(sharedAttrs.Srcs_c), + Srcs_as: *compilerAttrs.asSrcs.Clone().Append(sharedAttrs.Srcs_as), + Copts: *compilerAttrs.copts.Clone().Append(sharedAttrs.Copts), + Hdrs: *compilerAttrs.hdrs.Clone().Append(sharedAttrs.Hdrs), + + Deps: *linkerAttrs.deps.Clone().Append(sharedAttrs.Deps), + Implementation_deps: *linkerAttrs.implementationDeps.Clone().Append(sharedAttrs.Implementation_deps), + Dynamic_deps: *linkerAttrs.dynamicDeps.Clone().Append(sharedAttrs.Dynamic_deps), + Implementation_dynamic_deps: *linkerAttrs.implementationDynamicDeps.Clone().Append(sharedAttrs.Implementation_dynamic_deps), + Whole_archive_deps: *linkerAttrs.wholeArchiveDeps.Clone().Append(sharedAttrs.Whole_archive_deps), + System_dynamic_deps: *linkerAttrs.systemDynamicDeps.Clone().Append(sharedAttrs.System_dynamic_deps), + } + + staticTargetAttrs := &bazelCcLibraryStaticAttributes{ + staticOrSharedAttributes: staticCommonAttrs, - Copts: compilerAttrs.copts, Cppflags: compilerAttrs.cppFlags, Conlyflags: compilerAttrs.conlyFlags, Asflags: asFlags, - Implementation_deps: linkerAttrs.implementationDeps, - Deps: linkerAttrs.deps, - Implementation_dynamic_deps: linkerAttrs.implementationDynamicDeps, - Dynamic_deps: linkerAttrs.dynamicDeps, - Whole_archive_deps: linkerAttrs.wholeArchiveDeps, - Implementation_whole_archive_deps: linkerAttrs.implementationWholeArchiveDeps, - System_dynamic_deps: linkerAttrs.systemDynamicDeps, - Export_includes: exportedIncludes.Includes, - Export_system_includes: exportedIncludes.SystemIncludes, - Local_includes: compilerAttrs.localIncludes, - Absolute_includes: compilerAttrs.absoluteIncludes, - Linkopts: linkerAttrs.linkopts, - Link_crt: linkerAttrs.linkCrt, - Use_libcrt: linkerAttrs.useLibcrt, - Rtti: compilerAttrs.rtti, - Stl: compilerAttrs.stl, - Cpp_std: compilerAttrs.cppStd, - C_std: compilerAttrs.cStd, + Export_includes: exportedIncludes.Includes, + Export_system_includes: exportedIncludes.SystemIncludes, + Local_includes: compilerAttrs.localIncludes, + Absolute_includes: compilerAttrs.absoluteIncludes, + Use_libcrt: linkerAttrs.useLibcrt, + Rtti: compilerAttrs.rtti, + Stl: compilerAttrs.stl, + Cpp_std: compilerAttrs.cppStd, + C_std: compilerAttrs.cStd, + + Features: linkerAttrs.features, + } + + sharedTargetAttrs := &bazelCcLibrarySharedAttributes{ + staticOrSharedAttributes: sharedCommonAttrs, + Cppflags: compilerAttrs.cppFlags, + Conlyflags: compilerAttrs.conlyFlags, + Asflags: asFlags, + + Export_includes: exportedIncludes.Includes, + Export_system_includes: exportedIncludes.SystemIncludes, + Local_includes: compilerAttrs.localIncludes, + Absolute_includes: compilerAttrs.absoluteIncludes, + Linkopts: linkerAttrs.linkopts, + Link_crt: linkerAttrs.linkCrt, + Use_libcrt: linkerAttrs.useLibcrt, + Rtti: compilerAttrs.rtti, + Stl: compilerAttrs.stl, + Cpp_std: compilerAttrs.cppStd, + C_std: compilerAttrs.cStd, Additional_linker_inputs: linkerAttrs.additionalLinkerInputs, @@ -352,20 +391,20 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) { All: linkerAttrs.stripAll, None: linkerAttrs.stripNone, }, - - Shared: sharedAttrs, - - Static: staticAttrs, - Features: linkerAttrs.features, } - props := bazel.BazelTargetModuleProperties{ - Rule_class: "cc_library", - Bzl_load_location: "//build/bazel/rules:full_cc_library.bzl", + staticProps := bazel.BazelTargetModuleProperties{ + Rule_class: "cc_library_static", + Bzl_load_location: "//build/bazel/rules:cc_library_static.bzl", + } + sharedProps := bazel.BazelTargetModuleProperties{ + Rule_class: "cc_library_shared", + Bzl_load_location: "//build/bazel/rules:cc_library_shared.bzl", } - ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, attrs) + ctx.CreateBazelTargetModule(staticProps, android.CommonAttributes{Name: m.Name() + "_bp2build_cc_library_static"}, staticTargetAttrs) + ctx.CreateBazelTargetModule(sharedProps, android.CommonAttributes{Name: m.Name()}, sharedTargetAttrs) } // cc_library creates both static and/or shared libraries for a device and/or diff --git a/cc/library_test.go b/cc/library_test.go index 7ddfaa7fd..7427b5974 100644 --- a/cc/library_test.go +++ b/cc/library_test.go @@ -257,9 +257,14 @@ cc_library { CcObjectFiles: []string{"foo.o"}, Includes: []string{"include"}, SystemIncludes: []string{"system_include"}, - RootStaticArchives: []string{"foo.a"}, RootDynamicLibraries: []string{"foo.so"}, }, + "//foo/bar:bar_bp2build_cc_library_static": cquery.CcInfo{ + CcObjectFiles: []string{"foo.o"}, + Includes: []string{"include"}, + SystemIncludes: []string{"system_include"}, + RootStaticArchives: []string{"foo.a"}, + }, }, } ctx := testCcWithConfig(t, config)