diff options
29 files changed, 700 insertions, 487 deletions
diff --git a/android/androidmk.go b/android/androidmk.go index 93175670f..66a1036a5 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -546,7 +546,7 @@ func (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint } if !amod.InRamdisk() && !amod.InVendorRamdisk() { - a.AddStrings("LOCAL_INIT_RC", amod.commonProperties.Init_rc...) + a.AddPaths("LOCAL_FULL_INIT_RC", amod.initRcPaths) } a.AddStrings("LOCAL_VINTF_FRAGMENTS", amod.commonProperties.Vintf_fragments...) a.SetBoolIfTrue("LOCAL_PROPRIETARY_MODULE", Bool(amod.commonProperties.Proprietary)) diff --git a/android/apex.go b/android/apex.go index 7f9f0f5c3..cfda2aa8f 100644 --- a/android/apex.go +++ b/android/apex.go @@ -919,7 +919,7 @@ func CheckMinSdkVersion(m UpdatableModule, ctx ModuleContext, minSdkVersion ApiL "Consider adding 'min_sdk_version: %q' to %q", minSdkVersion, ctx.ModuleName(), err.Error(), ctx.GetPathString(false), - minSdkVersion, ctx.ModuleName()) + minSdkVersion, toName) return false } } diff --git a/android/bazel.go b/android/bazel.go index 4a02b44de..b54ae64fd 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -175,6 +175,9 @@ var ( "libbionic_tests_headers_posix", // ruperts@, cc_library_static "libc_dns", // ruperts@, cc_library_static + "note_memtag_heap_async", // jingwen@, b/185079815, features.h includes not found + "note_memtag_heap_sync", // jingwen@, b/185079815, features.h includes not found + // List of all full_cc_libraries in //bionic, with their immediate failures "libc", // jingwen@, cc_library, depends on //external/gwp_asan "libc_malloc_debug", // jingwen@, cc_library, fatal error: 'assert.h' file not found diff --git a/android/bazel_handler.go b/android/bazel_handler.go index e90d019db..97eec3006 100644 --- a/android/bazel_handler.go +++ b/android/bazel_handler.go @@ -117,21 +117,25 @@ var _ BazelContext = noopBazelContext{} // A bazel context to use for tests. type MockBazelContext struct { - AllFiles map[string][]string + OutputBaseDir string + + LabelToOutputFiles map[string][]string + LabelToOutputFilesAndCcObjectFiles map[string]cquery.GetOutputFilesAndCcObjectFiles_Result + LabelToCcStaticLibraryFiles map[string][]string } func (m MockBazelContext) GetOutputFiles(label string, archType ArchType) ([]string, bool) { - result, ok := m.AllFiles[label] + result, ok := m.LabelToOutputFiles[label] return result, ok } func (m MockBazelContext) GetOutputFilesAndCcObjectFiles(label string, archType ArchType) ([]string, []string, bool) { - result, ok := m.AllFiles[label] - return result, result, ok + result, ok := m.LabelToOutputFilesAndCcObjectFiles[label] + return result.OutputFiles, result.CcObjectFiles, ok } func (m MockBazelContext) GetPrebuiltCcStaticLibraryFiles(label string, archType ArchType) ([]string, bool) { - result, ok := m.AllFiles[label] + result, ok := m.LabelToCcStaticLibraryFiles[label] return result, ok } @@ -143,9 +147,7 @@ func (m MockBazelContext) BazelEnabled() bool { return true } -func (m MockBazelContext) OutputBase() string { - return "outputbase" -} +func (m MockBazelContext) OutputBase() string { return m.OutputBaseDir } func (m MockBazelContext) BuildStatementsToRegister() []bazel.BuildStatement { return []bazel.BuildStatement{} diff --git a/apex/androidmk.go b/apex/androidmk.go index 99cd75ef1..9fc701d2c 100644 --- a/apex/androidmk.go +++ b/apex/androidmk.go @@ -284,7 +284,7 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, apexName, mo // To install companion files (init_rc, vintf_fragments) // Copy some common properties of apexBundle to apex_manifest commonProperties := []string{ - "LOCAL_INIT_RC", "LOCAL_VINTF_FRAGMENTS", + "LOCAL_FULL_INIT_RC", "LOCAL_VINTF_FRAGMENTS", } for _, name := range commonProperties { if value, ok := apexAndroidMkData.Entries.EntryMap[name]; ok { @@ -394,7 +394,7 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { // Because apex writes .mk with Custom(), we need to write manually some common properties // which are available via data.Entries commonProperties := []string{ - "LOCAL_INIT_RC", "LOCAL_VINTF_FRAGMENTS", + "LOCAL_FULL_INIT_RC", "LOCAL_VINTF_FRAGMENTS", "LOCAL_PROPRIETARY_MODULE", "LOCAL_VENDOR_MODULE", "LOCAL_ODM_MODULE", "LOCAL_PRODUCT_MODULE", "LOCAL_SYSTEM_EXT_MODULE", "LOCAL_MODULE_OWNER", } diff --git a/apex/apex_test.go b/apex/apex_test.go index 5439265df..ee4255e0c 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -2756,7 +2756,7 @@ func TestAndroidMkWritesCommonProperties(t *testing.T) { data.Custom(&builder, name, prefix, "", data) androidMk := builder.String() ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n") - ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n") + ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n") } func TestStaticLinking(t *testing.T) { diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go index 16e7278da..b7a28100b 100644 --- a/bp2build/build_conversion.go +++ b/bp2build/build_conversion.go @@ -394,21 +394,34 @@ func prettyPrint(propertyValue reflect.Value, indent int) (string, error) { return "", nil } - ret = "[\n" - for i := 0; i < propertyValue.Len(); i++ { - indexedValue, err := prettyPrint(propertyValue.Index(i), indent+1) + if propertyValue.Len() == 1 { + // Single-line list for list with only 1 element + ret += "[" + indexedValue, err := prettyPrint(propertyValue.Index(0), indent) if err != nil { return "", err } + ret += indexedValue + ret += "]" + } else { + // otherwise, use a multiline list. + ret += "[\n" + for i := 0; i < propertyValue.Len(); i++ { + indexedValue, err := prettyPrint(propertyValue.Index(i), indent+1) + if err != nil { + return "", err + } - if indexedValue != "" { - ret += makeIndent(indent + 1) - ret += indexedValue - ret += ",\n" + if indexedValue != "" { + ret += makeIndent(indent + 1) + ret += indexedValue + ret += ",\n" + } } + ret += makeIndent(indent) + ret += "]" } - ret += makeIndent(indent) - ret += "]" + case reflect.Struct: // Special cases where the bp2build sends additional information to the codegenerator // by wrapping the attributes in a custom struct type. diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go index 49897b3ca..1ede4428a 100644 --- a/bp2build/build_conversion_test.go +++ b/bp2build/build_conversion_test.go @@ -27,9 +27,7 @@ func TestGenerateSoongModuleTargets(t *testing.T) { expectedBazelTarget string }{ { - bp: `custom { - name: "foo", -} + bp: `custom { name: "foo" } `, expectedBazelTarget: `soong_module( name = "foo", @@ -85,9 +83,7 @@ func TestGenerateSoongModuleTargets(t *testing.T) { soong_module_variant = "", soong_module_deps = [ ], - required = [ - "bar", - ], + required = ["bar"], )`, }, { @@ -116,12 +112,10 @@ func TestGenerateSoongModuleTargets(t *testing.T) { targets: ["goal_foo"], tag: ".foo", }, - dists: [ - { - targets: ["goal_bar"], - tag: ".bar", - }, - ], + dists: [{ + targets: ["goal_bar"], + tag: ".bar", + }], } `, expectedBazelTarget: `soong_module( @@ -133,18 +127,12 @@ func TestGenerateSoongModuleTargets(t *testing.T) { ], dist = { "tag": ".foo", - "targets": [ - "goal_foo", - ], + "targets": ["goal_foo"], }, - dists = [ - { - "tag": ".bar", - "targets": [ - "goal_bar", - ], - }, - ], + dists = [{ + "tag": ".bar", + "targets": ["goal_bar"], + }], )`, }, { @@ -169,19 +157,13 @@ func TestGenerateSoongModuleTargets(t *testing.T) { soong_module_variant = "", soong_module_deps = [ ], - dists = [ - { - "tag": ".tag", - "targets": [ - "my_goal", - ], - }, - ], + dists = [{ + "tag": ".tag", + "targets": ["my_goal"], + }], owner = "custom_owner", ramdisk = True, - required = [ - "bar", - ], + required = ["bar"], target_required = [ "qux", "bazqux", @@ -553,9 +535,7 @@ genrule { }`, expectedBazelTargets: []string{`filegroup( name = "fg_foo", - srcs = [ - "b", - ], + srcs = ["b"], )`, }, }, @@ -625,7 +605,7 @@ genrule { bp: `filegroup { name: "foobar", srcs: [ - ":foo", + ":foo", "c", ], bazel_module: { bp2build_available: true }, @@ -671,25 +651,15 @@ genrule { `genrule( name = "foo", cmd = "$(location :foo.tool) --genDir=$(GENDIR) arg $(SRCS) $(OUTS)", - outs = [ - "foo.out", - ], - srcs = [ - "foo.in", - ], - tools = [ - ":foo.tool", - ], + outs = ["foo.out"], + srcs = ["foo.in"], + tools = [":foo.tool"], )`, `genrule( name = "foo.tool", cmd = "cp $(SRCS) $(OUTS)", - outs = [ - "foo_tool.out", - ], - srcs = [ - "foo_tool.in", - ], + outs = ["foo_tool.out"], + srcs = ["foo_tool.in"], )`, }, }, @@ -718,15 +688,9 @@ genrule { expectedBazelTargets: []string{`genrule( name = "foo", cmd = "$(locations :foo.tools) -s $(OUTS) $(SRCS)", - outs = [ - "foo.out", - ], - srcs = [ - "foo.in", - ], - tools = [ - ":foo.tools", - ], + outs = ["foo.out"], + srcs = ["foo.in"], + tools = [":foo.tools"], )`, `genrule( name = "foo.tools", @@ -735,9 +699,7 @@ genrule { "foo_tool.out", "foo_tool2.out", ], - srcs = [ - "foo_tool.in", - ], + srcs = ["foo_tool.in"], )`, }, }, @@ -758,15 +720,9 @@ genrule { expectedBazelTargets: []string{`genrule( name = "foo", cmd = "$(locations //other:foo.tool) -s $(OUTS) $(SRCS)", - outs = [ - "foo.out", - ], - srcs = [ - "foo.in", - ], - tools = [ - "//other:foo.tool", - ], + outs = ["foo.out"], + srcs = ["foo.in"], + tools = ["//other:foo.tool"], )`, }, fs: otherGenruleBp, @@ -788,15 +744,9 @@ genrule { expectedBazelTargets: []string{`genrule( name = "foo", cmd = "$(locations //other:foo.tool) -s $(OUTS) $(location //other:other.tool)", - outs = [ - "foo.out", - ], - srcs = [ - "//other:other.tool", - ], - tools = [ - "//other:foo.tool", - ], + outs = ["foo.out"], + srcs = ["//other:other.tool"], + tools = ["//other:foo.tool"], )`, }, fs: otherGenruleBp, @@ -818,12 +768,8 @@ genrule { expectedBazelTargets: []string{`genrule( name = "foo", cmd = "$(location //other:foo.tool) -s $(OUTS) $(SRCS)", - outs = [ - "foo.out", - ], - srcs = [ - "foo.in", - ], + outs = ["foo.out"], + srcs = ["foo.in"], tools = [ "//other:foo.tool", "//other:other.tool", @@ -849,12 +795,8 @@ genrule { expectedBazelTargets: []string{`genrule( name = "foo", cmd = "$(locations //other:foo.tool) -s $(OUTS) $(SRCS)", - outs = [ - "foo.out", - ], - srcs = [ - "foo.in", - ], + outs = ["foo.out"], + srcs = ["foo.in"], tools = [ "//other:foo.tool", "//other:other.tool", @@ -879,12 +821,8 @@ genrule { expectedBazelTargets: []string{`genrule( name = "foo", cmd = "cp $(SRCS) $(OUTS)", - outs = [ - "foo.out", - ], - srcs = [ - "foo.in", - ], + outs = ["foo.out"], + srcs = ["foo.in"], )`, }, }, @@ -988,12 +926,8 @@ genrule { expectedBazelTarget: `genrule( name = "gen", cmd = "do-something $(SRCS) $(OUTS)", - outs = [ - "out", - ], - srcs = [ - "in1", - ], + outs = ["out"], + srcs = ["in1"], )`, description: "genrule applies properties from a genrule_defaults dependency if not specified", }, @@ -1062,12 +996,8 @@ genrule { expectedBazelTarget: `genrule( name = "gen", cmd = "cp $(SRCS) $(OUTS)", - outs = [ - "out", - ], - srcs = [ - "in1", - ], + outs = ["out"], + srcs = ["in1"], )`, description: "genrule applies properties from list of genrule_defaults", }, diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 6a148a8a3..783af2e7c 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -109,12 +109,8 @@ cc_library { `, expectedBazelTargets: []string{`cc_library( name = "foo-lib", - copts = [ - "-Wall", - ], - deps = [ - ":some-headers", - ], + copts = ["-Wall"], + deps = [":some-headers"], hdrs = [ "header.h", "header.hh", @@ -127,40 +123,20 @@ cc_library { "header.h.generic", "foo-dir/a.h", ], - includes = [ - "foo-dir", - ], - 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", - ], + includes = ["foo-dir"], + 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({ - "//build/bazel/platforms/arch:x86": [ - "x86.cpp", - ], - "//build/bazel/platforms/arch:x86_64": [ - "x86_64.cpp", - ], + srcs = ["impl.cpp"] + select({ + "//build/bazel/platforms/arch:x86": ["x86.cpp"], + "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"], "//conditions:default": [], }) + select({ - "//build/bazel/platforms/os:android": [ - "android.cpp", - ], - "//build/bazel/platforms/os:darwin": [ - "darwin.cpp", - ], - "//build/bazel/platforms/os:linux": [ - "linux.cpp", - ], + "//build/bazel/platforms/os:android": ["android.cpp"], + "//build/bazel/platforms/os:darwin": ["darwin.cpp"], + "//build/bazel/platforms/os:linux": ["linux.cpp"], "//conditions:default": [], }), )`}, @@ -215,9 +191,7 @@ cc_library { "-Wunused", "-Werror", ], - deps = [ - ":libc_headers", - ], + deps = [":libc_headers"], hdrs = [ "linked_list.h", "linker.h", @@ -232,17 +206,11 @@ cc_library { "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a", "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a", ] + select({ - "//build/bazel/platforms/arch:x86": [ - "-Wl,--exclude-libs=libgcc_eh.a", - ], - "//build/bazel/platforms/arch:x86_64": [ - "-Wl,--exclude-libs=libgcc_eh.a", - ], + "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"], + "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"], "//conditions:default": [], }), - srcs = [ - "ld_android.cpp", - ], + srcs = ["ld_android.cpp"], )`}, }, } diff --git a/bp2build/cc_library_headers_conversion_test.go b/bp2build/cc_library_headers_conversion_test.go index 655218d29..c59241f2c 100644 --- a/bp2build/cc_library_headers_conversion_test.go +++ b/bp2build/cc_library_headers_conversion_test.go @@ -141,30 +141,18 @@ cc_library_headers { "dir-2/dir2a.h", "dir-2/dir2b.h", ] + select({ - "//build/bazel/platforms/arch:arm64": [ - "arch_arm64_exported_include_dir/a.h", - ], - "//build/bazel/platforms/arch:x86": [ - "arch_x86_exported_include_dir/b.h", - ], - "//build/bazel/platforms/arch:x86_64": [ - "arch_x86_64_exported_include_dir/c.h", - ], + "//build/bazel/platforms/arch:arm64": ["arch_arm64_exported_include_dir/a.h"], + "//build/bazel/platforms/arch:x86": ["arch_x86_exported_include_dir/b.h"], + "//build/bazel/platforms/arch:x86_64": ["arch_x86_64_exported_include_dir/c.h"], "//conditions:default": [], }), includes = [ "dir-1", "dir-2", ] + select({ - "//build/bazel/platforms/arch:arm64": [ - "arch_arm64_exported_include_dir", - ], - "//build/bazel/platforms/arch:x86": [ - "arch_x86_exported_include_dir", - ], - "//build/bazel/platforms/arch:x86_64": [ - "arch_x86_64_exported_include_dir", - ], + "//build/bazel/platforms/arch:arm64": ["arch_arm64_exported_include_dir"], + "//build/bazel/platforms/arch:x86": ["arch_x86_exported_include_dir"], + "//build/bazel/platforms/arch:x86_64": ["arch_x86_64_exported_include_dir"], "//conditions:default": [], }), )`, `cc_library_headers( @@ -173,18 +161,14 @@ cc_library_headers { "lib-1/lib1a.h", "lib-1/lib1b.h", ], - includes = [ - "lib-1", - ], + includes = ["lib-1"], )`, `cc_library_headers( name = "lib-2", hdrs = [ "lib-2/lib2a.h", "lib-2/lib2b.h", ], - includes = [ - "lib-2", - ], + includes = ["lib-2"], )`}, }, { @@ -223,27 +207,13 @@ cc_library_headers { name = "darwin-lib", )`, `cc_library_headers( name = "foo_headers", - deps = [ - ":base-lib", - ] + select({ - "//build/bazel/platforms/os:android": [ - ":android-lib", - ], - "//build/bazel/platforms/os:darwin": [ - ":darwin-lib", - ], - "//build/bazel/platforms/os:fuchsia": [ - ":fuchsia-lib", - ], - "//build/bazel/platforms/os:linux": [ - ":linux-lib", - ], - "//build/bazel/platforms/os:linux_bionic": [ - ":linux_bionic-lib", - ], - "//build/bazel/platforms/os:windows": [ - ":windows-lib", - ], + deps = [":base-lib"] + select({ + "//build/bazel/platforms/os:android": [":android-lib"], + "//build/bazel/platforms/os:darwin": [":darwin-lib"], + "//build/bazel/platforms/os:fuchsia": [":fuchsia-lib"], + "//build/bazel/platforms/os:linux": [":linux-lib"], + "//build/bazel/platforms/os:linux_bionic": [":linux_bionic-lib"], + "//build/bazel/platforms/os:windows": [":windows-lib"], "//conditions:default": [], }), )`, `cc_library_headers( diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go index a6a002818..427aed355 100644 --- a/bp2build/cc_library_static_conversion_test.go +++ b/bp2build/cc_library_static_conversion_test.go @@ -231,9 +231,7 @@ cc_library_static { "implicit_include_1.h", "implicit_include_2.h", ], - includes = [ - ".", - ], + includes = ["."], linkstatic = True, srcs = [ "static_lib_1.cc", @@ -246,9 +244,7 @@ cc_library_static { "implicit_include_1.h", "implicit_include_2.h", ], - includes = [ - ".", - ], + includes = ["."], linkstatic = True, srcs = [ "static_lib_2.cc", @@ -261,9 +257,7 @@ cc_library_static { "implicit_include_1.h", "implicit_include_2.h", ], - includes = [ - ".", - ], + includes = ["."], linkstatic = True, srcs = [ "whole_static_lib_1.cc", @@ -276,9 +270,7 @@ cc_library_static { "implicit_include_1.h", "implicit_include_2.h", ], - includes = [ - ".", - ], + includes = ["."], linkstatic = True, srcs = [ "whole_static_lib_2.cc", diff --git a/bp2build/cc_object_conversion_test.go b/bp2build/cc_object_conversion_test.go index 840bf4299..a9d24ace0 100644 --- a/bp2build/cc_object_conversion_test.go +++ b/bp2build/cc_object_conversion_test.go @@ -75,9 +75,7 @@ func TestCcObjectBp2Build(t *testing.T) { "include", ".", ], - srcs = [ - "a/b/c.c", - ], + srcs = ["a/b/c.c"], )`, }, }, @@ -124,9 +122,7 @@ cc_defaults { "include", ".", ], - srcs = [ - "a/b/c.c", - ], + srcs = ["a/b/c.c"], )`, }, }, @@ -156,29 +152,15 @@ cc_object { `, expectedBazelTargets: []string{`cc_object( name = "bar", - copts = [ - "-fno-addrsig", - ], - local_include_dirs = [ - ".", - ], - srcs = [ - "x/y/z.c", - ], + copts = ["-fno-addrsig"], + local_include_dirs = ["."], + srcs = ["x/y/z.c"], )`, `cc_object( name = "foo", - copts = [ - "-fno-addrsig", - ], - deps = [ - ":bar", - ], - local_include_dirs = [ - ".", - ], - srcs = [ - "a/b/c.c", - ], + copts = ["-fno-addrsig"], + deps = [":bar"], + local_include_dirs = ["."], + srcs = ["a/b/c.c"], )`, }, }, @@ -201,12 +183,8 @@ cc_object { `, expectedBazelTargets: []string{`cc_object( name = "foo", - copts = [ - "-fno-addrsig", - ], - srcs = [ - "a/b/c.c", - ], + copts = ["-fno-addrsig"], + srcs = ["a/b/c.c"], )`, }, }, @@ -229,12 +207,8 @@ cc_object { `, expectedBazelTargets: []string{`cc_object( name = "foo", - asflags = [ - "-DPLATFORM_SDK_VERSION={Platform_sdk_version}", - ], - copts = [ - "-fno-addrsig", - ], + asflags = ["-DPLATFORM_SDK_VERSION={Platform_sdk_version}"], + copts = ["-fno-addrsig"], )`, }, }, @@ -322,23 +296,13 @@ func TestCcObjectConfigurableAttributesBp2Build(t *testing.T) { expectedBazelTargets: []string{ `cc_object( name = "foo", - copts = [ - "-fno-addrsig", - ] + select({ - "//build/bazel/platforms/arch:x86": [ - "-fPIC", - ], + copts = ["-fno-addrsig"] + select({ + "//build/bazel/platforms/arch:x86": ["-fPIC"], "//conditions:default": [], }), - local_include_dirs = [ - ".", - ], - srcs = [ - "a.cpp", - ] + select({ - "//build/bazel/platforms/arch:arm": [ - "arch/arm/file.S", - ], + local_include_dirs = ["."], + srcs = ["a.cpp"] + select({ + "//build/bazel/platforms/arch:arm": ["arch/arm/file.S"], "//conditions:default": [], }), )`, @@ -376,41 +340,19 @@ func TestCcObjectConfigurableAttributesBp2Build(t *testing.T) { expectedBazelTargets: []string{ `cc_object( name = "foo", - copts = [ - "-fno-addrsig", - ] + select({ - "//build/bazel/platforms/arch:arm": [ - "-Wall", - ], - "//build/bazel/platforms/arch:arm64": [ - "-Wall", - ], - "//build/bazel/platforms/arch:x86": [ - "-fPIC", - ], - "//build/bazel/platforms/arch:x86_64": [ - "-fPIC", - ], + copts = ["-fno-addrsig"] + select({ + "//build/bazel/platforms/arch:arm": ["-Wall"], + "//build/bazel/platforms/arch:arm64": ["-Wall"], + "//build/bazel/platforms/arch:x86": ["-fPIC"], + "//build/bazel/platforms/arch:x86_64": ["-fPIC"], "//conditions:default": [], }), - local_include_dirs = [ - ".", - ], - srcs = [ - "base.cpp", - ] + select({ - "//build/bazel/platforms/arch:arm": [ - "arm.cpp", - ], - "//build/bazel/platforms/arch:arm64": [ - "arm64.cpp", - ], - "//build/bazel/platforms/arch:x86": [ - "x86.cpp", - ], - "//build/bazel/platforms/arch:x86_64": [ - "x86_64.cpp", - ], + local_include_dirs = ["."], + srcs = ["base.cpp"] + select({ + "//build/bazel/platforms/arch:arm": ["arm.cpp"], + "//build/bazel/platforms/arch:arm64": ["arm64.cpp"], + "//build/bazel/platforms/arch:x86": ["x86.cpp"], + "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"], "//conditions:default": [], }), )`, @@ -441,26 +383,14 @@ func TestCcObjectConfigurableAttributesBp2Build(t *testing.T) { expectedBazelTargets: []string{ `cc_object( name = "foo", - copts = [ - "-fno-addrsig", - ] + select({ - "//build/bazel/platforms/os:android": [ - "-fPIC", - ], - "//build/bazel/platforms/os:darwin": [ - "-Wall", - ], - "//build/bazel/platforms/os:windows": [ - "-fPIC", - ], + copts = ["-fno-addrsig"] + select({ + "//build/bazel/platforms/os:android": ["-fPIC"], + "//build/bazel/platforms/os:darwin": ["-Wall"], + "//build/bazel/platforms/os:windows": ["-fPIC"], "//conditions:default": [], }), - local_include_dirs = [ - ".", - ], - srcs = [ - "base.cpp", - ], + local_include_dirs = ["."], + srcs = ["base.cpp"], )`, }, }, diff --git a/bp2build/python_binary_conversion_test.go b/bp2build/python_binary_conversion_test.go index 7600e3651..2054e0678 100644 --- a/bp2build/python_binary_conversion_test.go +++ b/bp2build/python_binary_conversion_test.go @@ -33,24 +33,15 @@ func TestPythonBinaryHost(t *testing.T) { blueprint: `python_binary_host { name: "foo", main: "a.py", - srcs: [ - "**/*.py" - ], - exclude_srcs: [ - "b/e.py" - ], - data: [ - "files/data.txt", - ], - + srcs: ["**/*.py"], + exclude_srcs: ["b/e.py"], + data: ["files/data.txt",], bazel_module: { bp2build_available: true }, } `, expectedBazelTargets: []string{`py_binary( name = "foo", - data = [ - "files/data.txt", - ], + data = ["files/data.txt"], main = "a.py", srcs = [ "a.py", @@ -83,9 +74,7 @@ func TestPythonBinaryHost(t *testing.T) { expectedBazelTargets: []string{`py_binary( name = "foo", python_version = "PY2", - srcs = [ - "a.py", - ], + srcs = ["a.py"], )`, }, }, @@ -113,9 +102,7 @@ func TestPythonBinaryHost(t *testing.T) { // python_version is PY3 by default. `py_binary( name = "foo", - srcs = [ - "a.py", - ], + srcs = ["a.py"], )`, }, }, diff --git a/bp2build/sh_conversion_test.go b/bp2build/sh_conversion_test.go index 2aa373c3f..37f542ef7 100644 --- a/bp2build/sh_conversion_test.go +++ b/bp2build/sh_conversion_test.go @@ -74,9 +74,7 @@ func TestShBinaryBp2Build(t *testing.T) { }`, expectedBazelTargets: []string{`sh_binary( name = "foo", - srcs = [ - "foo.sh", - ], + srcs = ["foo.sh"], )`}, }, } diff --git a/cc/bp2build.go b/cc/bp2build.go index e7e4aa8b0..0bca30a75 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -59,13 +59,17 @@ func depsBp2BuildMutator(ctx android.BottomUpMutatorContext) { ctx.AddDependency(module, nil, android.SortedUniqueStrings(allDeps)...) } +// Convenience struct to hold all attributes parsed from compiler properties. +type compilerAttributes struct { + copts bazel.StringListAttribute + srcs bazel.LabelListAttribute + hdrs bazel.LabelListAttribute +} + // bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes. -func bp2BuildParseCompilerProps( - ctx android.TopDownMutatorContext, - module *Module) ( - copts bazel.StringListAttribute, - srcs bazel.LabelListAttribute, - hdrs bazel.LabelListAttribute) { +func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes { + var hdrs, srcs bazel.LabelListAttribute + var copts bazel.StringListAttribute hdrsAndSrcs := func(baseCompilerProps *BaseCompilerProperties) (bazel.LabelList, bazel.LabelList) { srcsList := android.BazelLabelForModuleSrcExcludes( @@ -100,13 +104,22 @@ func bp2BuildParseCompilerProps( } } - return copts, srcs, hdrs + return compilerAttributes{ + hdrs: hdrs, + srcs: srcs, + copts: copts, + } +} + +// Convenience struct to hold all attributes parsed from linker properties. +type linkerAttributes struct { + deps bazel.LabelListAttribute + linkopts bazel.StringListAttribute } // bp2BuildParseLinkerProps creates a label list attribute containing the header library deps of a module, including // configurable attribute values. -func bp2BuildParseLinkerProps( - ctx android.TopDownMutatorContext, module *Module) (bazel.LabelListAttribute, bazel.StringListAttribute) { +func bp2BuildParseLinkerProps(ctx android.TopDownMutatorContext, module *Module) linkerAttributes { var deps bazel.LabelListAttribute var linkopts bazel.StringListAttribute @@ -142,7 +155,10 @@ func bp2BuildParseLinkerProps( } } - return deps, linkopts + return linkerAttributes{ + deps: deps, + linkopts: linkopts, + } } func bp2BuildListHeadersInDir(ctx android.TopDownMutatorContext, includeDir string) bazel.LabelList { diff --git a/cc/cc_test.go b/cc/cc_test.go index 465283db5..e4dfc97ad 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -244,6 +244,120 @@ func TestVendorSrc(t *testing.T) { } } +func checkInstallPartition(t *testing.T, ctx *android.TestContext, name, variant, expected string) { + mod := ctx.ModuleForTests(name, variant).Module().(*Module) + partitionDefined := false + checkPartition := func(specific bool, partition string) { + if specific { + if expected != partition && !partitionDefined { + // The variant is installed to the 'partition' + t.Errorf("%s variant of %q must not be installed to %s partition", variant, name, partition) + } + partitionDefined = true + } else { + // The variant is not installed to the 'partition' + if expected == partition { + t.Errorf("%s variant of %q must be installed to %s partition", variant, name, partition) + } + } + } + socSpecific := func(m *Module) bool { + return m.SocSpecific() || m.socSpecificModuleContext() + } + deviceSpecific := func(m *Module) bool { + return m.DeviceSpecific() || m.deviceSpecificModuleContext() + } + productSpecific := func(m *Module) bool { + return m.ProductSpecific() || m.productSpecificModuleContext() + } + systemExtSpecific := func(m *Module) bool { + return m.SystemExtSpecific() + } + checkPartition(socSpecific(mod), "vendor") + checkPartition(deviceSpecific(mod), "odm") + checkPartition(productSpecific(mod), "product") + checkPartition(systemExtSpecific(mod), "system_ext") + if !partitionDefined && expected != "system" { + t.Errorf("%s variant of %q is expected to be installed to %s partition,"+ + " but installed to system partition", variant, name, expected) + } +} + +func TestInstallPartition(t *testing.T) { + t.Helper() + ctx := prepareForCcTest.RunTestWithBp(t, ` + cc_library { + name: "libsystem", + } + cc_library { + name: "libsystem_ext", + system_ext_specific: true, + } + cc_library { + name: "libproduct", + product_specific: true, + } + cc_library { + name: "libvendor", + vendor: true, + } + cc_library { + name: "libodm", + device_specific: true, + } + cc_library { + name: "liball_available", + vendor_available: true, + product_available: true, + } + cc_library { + name: "libsystem_ext_all_available", + system_ext_specific: true, + vendor_available: true, + product_available: true, + } + cc_library { + name: "liball_available_odm", + odm_available: true, + product_available: true, + } + cc_library { + name: "libproduct_vendoravailable", + product_specific: true, + vendor_available: true, + } + cc_library { + name: "libproduct_odmavailable", + product_specific: true, + odm_available: true, + } + `).TestContext + + checkInstallPartition(t, ctx, "libsystem", coreVariant, "system") + checkInstallPartition(t, ctx, "libsystem_ext", coreVariant, "system_ext") + checkInstallPartition(t, ctx, "libproduct", productVariant, "product") + checkInstallPartition(t, ctx, "libvendor", vendorVariant, "vendor") + checkInstallPartition(t, ctx, "libodm", vendorVariant, "odm") + + checkInstallPartition(t, ctx, "liball_available", coreVariant, "system") + checkInstallPartition(t, ctx, "liball_available", productVariant, "product") + checkInstallPartition(t, ctx, "liball_available", vendorVariant, "vendor") + + checkInstallPartition(t, ctx, "libsystem_ext_all_available", coreVariant, "system_ext") + checkInstallPartition(t, ctx, "libsystem_ext_all_available", productVariant, "product") + checkInstallPartition(t, ctx, "libsystem_ext_all_available", vendorVariant, "vendor") + + checkInstallPartition(t, ctx, "liball_available_odm", coreVariant, "system") + checkInstallPartition(t, ctx, "liball_available_odm", productVariant, "product") + checkInstallPartition(t, ctx, "liball_available_odm", vendorVariant, "odm") + + checkInstallPartition(t, ctx, "libproduct_vendoravailable", productVariant, "product") + checkInstallPartition(t, ctx, "libproduct_vendoravailable", vendorVariant, "vendor") + + checkInstallPartition(t, ctx, "libproduct_odmavailable", productVariant, "product") + checkInstallPartition(t, ctx, "libproduct_odmavailable", vendorVariant, "odm") +} + func checkVndkModule(t *testing.T, ctx *android.TestContext, name, subDir string, isVndkSp bool, extends string, variant string) { @@ -111,9 +111,7 @@ func genYacc(ctx android.ModuleContext, rule *android.RuleBuilder, yaccFile andr return ret } -func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile android.Path, - outFile, depFile android.ModuleGenPath, aidlFlags string) android.Paths { - +func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile android.Path, aidlFlags string) (cppFile android.OutputPath, headerFiles android.Paths) { aidlPackage := strings.TrimSuffix(aidlFile.Rel(), aidlFile.Base()) baseName := strings.TrimSuffix(aidlFile.Base(), aidlFile.Ext()) shortName := baseName @@ -126,6 +124,8 @@ func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile andr } outDir := android.PathForModuleGen(ctx, "aidl") + cppFile = outDir.Join(ctx, aidlPackage, baseName+".cpp") + depFile := outDir.Join(ctx, aidlPackage, baseName+".cpp.d") headerI := outDir.Join(ctx, aidlPackage, baseName+".h") headerBn := outDir.Join(ctx, aidlPackage, "Bn"+shortName+".h") headerBp := outDir.Join(ctx, aidlPackage, "Bp"+shortName+".h") @@ -142,14 +142,14 @@ func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile andr Flag(aidlFlags). Input(aidlFile). OutputDir(). - Output(outFile). + Output(cppFile). ImplicitOutputs(android.WritablePaths{ headerI, headerBn, headerBp, }) - return android.Paths{ + return cppFile, android.Paths{ headerI, headerBn, headerBp, @@ -293,10 +293,9 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths, aidlRule = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "aidl"), android.PathForModuleGen(ctx, "aidl.sbox.textproto")) } - cppFile := android.GenPathWithExt(ctx, "aidl", srcFile, "cpp") - depFile := android.GenPathWithExt(ctx, "aidl", srcFile, "cpp.d") + cppFile, aidlHeaders := genAidl(ctx, aidlRule, srcFile, buildFlags.aidlFlags) srcFiles[i] = cppFile - aidlHeaders := genAidl(ctx, aidlRule, srcFile, cppFile, depFile, buildFlags.aidlFlags) + info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...) // Use the generated headers as order only deps to ensure that they are up to date when // needed. diff --git a/cc/image.go b/cc/image.go index afe6a0e0c..ca00ac976 100644 --- a/cc/image.go +++ b/cc/image.go @@ -49,21 +49,15 @@ const ( ) func (ctx *moduleContext) ProductSpecific() bool { - // Additionally check if this module is inProduct() that means it is a "product" variant of a - // module. As well as product specific modules, product variants must be installed to /product. - return ctx.ModuleContext.ProductSpecific() || ctx.mod.InProduct() + return ctx.ModuleContext.ProductSpecific() || ctx.mod.productSpecificModuleContext() } func (ctx *moduleContext) SocSpecific() bool { - // Additionally check if this module is inVendor() that means it is a "vendor" variant of a - // module. As well as SoC specific modules, vendor variants must be installed to /vendor - // unless they have "odm_available: true". - return ctx.ModuleContext.SocSpecific() || (ctx.mod.InVendor() && !ctx.mod.VendorVariantToOdm()) + return ctx.ModuleContext.SocSpecific() || ctx.mod.socSpecificModuleContext() } func (ctx *moduleContext) DeviceSpecific() bool { - // Some vendor variants want to be installed to /odm by setting "odm_available: true". - return ctx.ModuleContext.DeviceSpecific() || (ctx.mod.InVendor() && ctx.mod.VendorVariantToOdm()) + return ctx.ModuleContext.DeviceSpecific() || ctx.mod.deviceSpecificModuleContext() } func (ctx *moduleContextImpl) inProduct() bool { @@ -86,6 +80,24 @@ func (ctx *moduleContextImpl) inRecovery() bool { return ctx.mod.InRecovery() } +func (c *Module) productSpecificModuleContext() bool { + // Additionally check if this module is inProduct() that means it is a "product" variant of a + // module. As well as product specific modules, product variants must be installed to /product. + return c.InProduct() +} + +func (c *Module) socSpecificModuleContext() bool { + // Additionally check if this module is inVendor() that means it is a "vendor" variant of a + // module. As well as SoC specific modules, vendor variants must be installed to /vendor + // unless they have "odm_available: true". + return c.HasVendorVariant() && c.InVendor() && !c.VendorVariantToOdm() +} + +func (c *Module) deviceSpecificModuleContext() bool { + // Some vendor variants want to be installed to /odm by setting "odm_available: true". + return c.InVendor() && c.VendorVariantToOdm() +} + // Returns true when this module is configured to have core and vendor variants. func (c *Module) HasVendorVariant() bool { return Bool(c.VendorProperties.Vendor_available) || Bool(c.VendorProperties.Odm_available) diff --git a/cc/library.go b/cc/library.go index 0ebcbaad5..738b45fc7 100644 --- a/cc/library.go +++ b/cc/library.go @@ -256,17 +256,17 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) { return } - copts, srcs, hdrs := bp2BuildParseCompilerProps(ctx, m) - deps, linkopts := bp2BuildParseLinkerProps(ctx, m) + compilerAttrs := bp2BuildParseCompilerProps(ctx, m) + linkerAttrs := bp2BuildParseLinkerProps(ctx, m) exportedIncludes, exportedIncludesHeaders := bp2BuildParseExportedIncludes(ctx, m) - hdrs.Append(exportedIncludesHeaders) + compilerAttrs.hdrs.Append(exportedIncludesHeaders) attrs := &bazelCcLibraryAttributes{ - Srcs: srcs, - Hdrs: hdrs, - Copts: copts, - Linkopts: linkopts, - Deps: deps, + Srcs: compilerAttrs.srcs, + Hdrs: compilerAttrs.hdrs, + Copts: compilerAttrs.copts, + Linkopts: linkerAttrs.linkopts, + Deps: linkerAttrs.deps, Includes: exportedIncludes, } @@ -2154,12 +2154,13 @@ func CcLibraryStaticBp2Build(ctx android.TopDownMutatorContext) { return } - copts, srcs, hdrs := bp2BuildParseCompilerProps(ctx, module) + compilerAttrs := bp2BuildParseCompilerProps(ctx, module) var includeDirs []string var localIncludeDirs []string for _, props := range module.compiler.compilerProps() { if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok { + // TODO: these should be arch and os specific. includeDirs = bp2BuildMakePathsRelativeToModule(ctx, baseCompilerProps.Include_dirs) localIncludeDirs = bp2BuildMakePathsRelativeToModule(ctx, baseCompilerProps.Local_include_dirs) break @@ -2174,15 +2175,16 @@ func CcLibraryStaticBp2Build(ctx android.TopDownMutatorContext) { // For Bazel, be more explicit about headers - list all header files in include dirs as srcs for _, includeDir := range includeDirs { - srcs.Value.Append(bp2BuildListHeadersInDir(ctx, includeDir)) + compilerAttrs.srcs.Value.Append(bp2BuildListHeadersInDir(ctx, includeDir)) } for _, localIncludeDir := range localIncludeDirs { - srcs.Value.Append(bp2BuildListHeadersInDir(ctx, localIncludeDir)) + compilerAttrs.srcs.Value.Append(bp2BuildListHeadersInDir(ctx, localIncludeDir)) } var staticLibs []string var wholeStaticLibs []string for _, props := range module.linker.linkerProps() { + // TODO: move this into bp2buildParseLinkerProps if baseLinkerProperties, ok := props.(*BaseLinkerProperties); ok { staticLibs = baseLinkerProperties.Static_libs wholeStaticLibs = baseLinkerProperties.Whole_static_libs @@ -2204,18 +2206,18 @@ func CcLibraryStaticBp2Build(ctx android.TopDownMutatorContext) { allIncludes.Value = append(allIncludes.Value, includeDirs...) allIncludes.Value = append(allIncludes.Value, localIncludeDirs...) - hdrs.Append(exportedIncludesHeaders) + compilerAttrs.hdrs.Append(exportedIncludesHeaders) - headerLibsLabels, _ := bp2BuildParseLinkerProps(ctx, module) - depsLabels.Append(headerLibsLabels.Value) + linkerAttrs := bp2BuildParseLinkerProps(ctx, module) + depsLabels.Append(linkerAttrs.deps.Value) attrs := &bazelCcLibraryStaticAttributes{ - Copts: copts, - Srcs: srcs, + Copts: compilerAttrs.copts, + Srcs: compilerAttrs.srcs, Deps: bazel.MakeLabelListAttribute(depsLabels), Linkstatic: true, Includes: allIncludes, - Hdrs: hdrs, + Hdrs: compilerAttrs.hdrs, } props := bazel.BazelTargetModuleProperties{ diff --git a/cc/library_headers.go b/cc/library_headers.go index 0f7f8f846..076ce80a5 100644 --- a/cc/library_headers.go +++ b/cc/library_headers.go @@ -96,14 +96,14 @@ func CcLibraryHeadersBp2Build(ctx android.TopDownMutatorContext) { } exportedIncludes, exportedIncludesHeaders := bp2BuildParseExportedIncludes(ctx, module) - copts, _, _ := bp2BuildParseCompilerProps(ctx, module) - headerLibs, _ := bp2BuildParseLinkerProps(ctx, module) + compilerAttrs := bp2BuildParseCompilerProps(ctx, module) + linkerAttrs := bp2BuildParseLinkerProps(ctx, module) attrs := &bazelCcLibraryHeadersAttributes{ - Copts: copts, + Copts: compilerAttrs.copts, Includes: exportedIncludes, Hdrs: exportedIncludesHeaders, - Deps: headerLibs, + Deps: linkerAttrs.deps, } props := bazel.BazelTargetModuleProperties{ diff --git a/cc/object.go b/cc/object.go index de45293dc..9bb279a3b 100644 --- a/cc/object.go +++ b/cc/object.go @@ -157,7 +157,7 @@ func ObjectBp2Build(ctx android.TopDownMutatorContext) { } // Set arch-specific configurable attributes - copts, srcs, hdrs := bp2BuildParseCompilerProps(ctx, m) + compilerAttrs := bp2BuildParseCompilerProps(ctx, m) var localIncludeDirs []string var asFlags []string for _, props := range m.compiler.compilerProps() { @@ -196,17 +196,11 @@ func ObjectBp2Build(ctx android.TopDownMutatorContext) { } // TODO(b/183595872) warn/error if we're not handling product variables - for arch, p := range m.GetArchProperties(&BaseCompilerProperties{}) { - if cProps, ok := p.(*BaseCompilerProperties); ok { - srcs.SetValueForArch(arch.Name, android.BazelLabelForModuleSrcExcludes(ctx, cProps.Srcs, cProps.Exclude_srcs)) - } - } - attrs := &bazelObjectAttributes{ - Srcs: srcs, - Hdrs: hdrs, + Srcs: compilerAttrs.srcs, + Hdrs: compilerAttrs.hdrs, Deps: deps, - Copts: copts, + Copts: compilerAttrs.copts, Asflags: asFlags, Local_include_dirs: localIncludeDirs, } diff --git a/cc/object_test.go b/cc/object_test.go index 6ff8a00c3..f82d5448b 100644 --- a/cc/object_test.go +++ b/cc/object_test.go @@ -15,6 +15,7 @@ package cc import ( + "android/soong/android" "testing" ) @@ -27,5 +28,28 @@ func TestLinkerScript(t *testing.T) { linker_script: "foo.lds", }`) }) +} + +func TestCcObjectWithBazel(t *testing.T) { + bp := ` +cc_object { + name: "foo", + srcs: ["baz.o"], + bazel_module: { label: "//foo/bar:bar" }, +}` + config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) + config.BazelContext = android.MockBazelContext{ + OutputBaseDir: "outputbase", + LabelToOutputFiles: map[string][]string{ + "//foo/bar:bar": []string{"bazel_out.o"}}} + ctx := testCcWithConfig(t, config) + + module := ctx.ModuleForTests("foo", "android_arm_armv7-a-neon").Module() + outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") + if err != nil { + t.Errorf("Unexpected error getting cc_object outputfiles %s", err) + } + expectedOutputFiles := []string{"outputbase/execroot/__main__/bazel_out.o"} + android.AssertDeepEquals(t, "output files", expectedOutputFiles, outputFiles.Strings()) } diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go index 3f1e9f3b9..3ce4f85f9 100644 --- a/genrule/genrule_test.go +++ b/genrule/genrule_test.go @@ -696,7 +696,8 @@ func TestGenruleWithBazel(t *testing.T) { result := android.GroupFixturePreparers( prepareForGenRuleTest, android.FixtureModifyConfig(func(config android.Config) { config.BazelContext = android.MockBazelContext{ - AllFiles: map[string][]string{ + OutputBaseDir: "outputbase", + LabelToOutputFiles: map[string][]string{ "//foo/bar:bar": []string{"bazelone.txt", "bazeltwo.txt"}}} })).RunTestWithBp(t, testGenruleBp()+bp) diff --git a/java/Android.bp b/java/Android.bp index 8334b85ec..f8ba1b6af 100644 --- a/java/Android.bp +++ b/java/Android.bp @@ -42,6 +42,7 @@ bootstrap_go_package { "gen.go", "genrule.go", "hiddenapi.go", + "hiddenapi_modular.go", "hiddenapi_singleton.go", "jacoco.go", "java.go", diff --git a/java/hiddenapi_modular.go b/java/hiddenapi_modular.go new file mode 100644 index 000000000..bed11fe39 --- /dev/null +++ b/java/hiddenapi_modular.go @@ -0,0 +1,172 @@ +// Copyright (C) 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package java + +import ( + "android/soong/android" +) + +// Contains support for processing hiddenAPI in a modular fashion. + +// HiddenAPIAugmentationProperties contains paths to the files that can be used to augment the information +// obtained from annotations within the source code in order to create the complete set of flags +// that should be applied to the dex implementation jars on the bootclasspath. +// +// Each property contains a list of paths. With the exception of the Unsupported_packages the paths +// of each property reference a plain text file that contains a java signature per line. The flags +// for each of those signatures will be updated in a property specific way. +// +// The Unsupported_packages property contains a list of paths, each of which is a plain text file +// with one Java package per line. All members of all classes within that package (but not nested +// packages) will be updated in a property specific way. +type HiddenAPIAugmentationProperties struct { + // Marks each signature in the referenced files as being unsupported. + Unsupported []string `android:"path"` + + // Marks each signature in the referenced files as being unsupported because it has been removed. + // Any conflicts with other flags are ignored. + Removed []string `android:"path"` + + // Marks each signature in the referenced files as being supported only for targetSdkVersion <= R + // and low priority. + Max_target_r_low_priority []string `android:"path"` + + // Marks each signature in the referenced files as being supported only for targetSdkVersion <= Q. + Max_target_q []string `android:"path"` + + // Marks each signature in the referenced files as being supported only for targetSdkVersion <= P. + Max_target_p []string `android:"path"` + + // Marks each signature in the referenced files as being supported only for targetSdkVersion <= O + // and low priority. Any conflicts with other flags are ignored. + Max_target_o_low_priority []string `android:"path"` + + // Marks each signature in the referenced files as being blocked. + Blocked []string `android:"path"` + + // Marks each signature in every package in the referenced files as being unsupported. + Unsupported_packages []string `android:"path"` +} + +func (p *HiddenAPIAugmentationProperties) hiddenAPIAugmentationInfo(ctx android.ModuleContext) hiddenAPIAugmentationInfo { + paths := func(paths []string) android.Paths { return android.PathsForModuleSrc(ctx, paths) } + return hiddenAPIAugmentationInfo{ + Unsupported: paths(p.Unsupported), + Removed: paths(p.Removed), + Max_target_r_low_priority: paths(p.Max_target_r_low_priority), + Max_target_q: paths(p.Max_target_q), + Max_target_p: paths(p.Max_target_p), + Max_target_o_low_priority: paths(p.Max_target_o_low_priority), + Blocked: paths(p.Blocked), + Unsupported_packages: paths(p.Unsupported_packages), + } +} + +// hiddenAPIAugmentationInfo contains paths resolved from HiddenAPIAugmentationProperties +type hiddenAPIAugmentationInfo struct { + // See HiddenAPIAugmentationProperties.Unsupported + Unsupported android.Paths + + // See HiddenAPIAugmentationProperties.Removed + Removed android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_r_low_priority + Max_target_r_low_priority android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_q + Max_target_q android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_p + Max_target_p android.Paths + + // See HiddenAPIAugmentationProperties.Max_target_o_low_priority + Max_target_o_low_priority android.Paths + + // See HiddenAPIAugmentationProperties.Blocked + Blocked android.Paths + + // See HiddenAPIAugmentationProperties.Unsupported_packages + Unsupported_packages android.Paths +} + +// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the +// flags from all the modules, the stub flags, augmented with some additional configuration files. +// +// baseFlagsPath is the path to the flags file containing all the information from the stubs plus +// an entry for every single member in the dex implementation jars of the individual modules. Every +// signature in any of the other files MUST be included in this file. +// +// moduleSpecificFlagsPaths are the paths to the flags files generated by each module using +// information from the baseFlagsPath as well as from annotations within the source. +// +// augmentationInfo is a struct containing paths to files that augment the information provided by +// the moduleSpecificFlagsPaths. +// ruleToGenerateHiddenApiFlags creates a rule to create the monolithic hidden API flags from the +// flags from all the modules, the stub flags, augmented with some additional configuration files. +// +// baseFlagsPath is the path to the flags file containing all the information from the stubs plus +// an entry for every single member in the dex implementation jars of the individual modules. Every +// signature in any of the other files MUST be included in this file. +// +// moduleSpecificFlagsPaths are the paths to the flags files generated by each module using +// information from the baseFlagsPath as well as from annotations within the source. +// +// augmentationInfo is a struct containing paths to files that augment the information provided by +// the moduleSpecificFlagsPaths. +func ruleToGenerateHiddenApiFlags(ctx android.BuilderContext, outputPath android.WritablePath, baseFlagsPath android.Path, moduleSpecificFlagsPaths android.Paths, augmentationInfo hiddenAPIAugmentationInfo) { + tempPath := android.PathForOutput(ctx, outputPath.Rel()+".tmp") + rule := android.NewRuleBuilder(pctx, ctx) + command := rule.Command(). + BuiltTool("generate_hiddenapi_lists"). + FlagWithInput("--csv ", baseFlagsPath). + Inputs(moduleSpecificFlagsPaths). + FlagWithOutput("--output ", tempPath) + + for _, path := range augmentationInfo.Unsupported { + command.FlagWithInput("--unsupported ", path) + } + + for _, path := range augmentationInfo.Removed { + command.FlagWithInput("--unsupported ", path).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "removed") + } + + for _, path := range augmentationInfo.Max_target_r_low_priority { + command.FlagWithInput("--max-target-r ", path).FlagWithArg("--tag ", "lo-prio") + } + + for _, path := range augmentationInfo.Max_target_q { + command.FlagWithInput("--max-target-q ", path) + } + + for _, path := range augmentationInfo.Max_target_p { + command.FlagWithInput("--max-target-p ", path) + } + + for _, path := range augmentationInfo.Max_target_o_low_priority { + command.FlagWithInput("--max-target-o ", path).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "lo-prio") + } + + for _, path := range augmentationInfo.Blocked { + command.FlagWithInput("--blocked ", path) + } + + for _, path := range augmentationInfo.Unsupported_packages { + command.FlagWithInput("--unsupported ", path).Flag("--packages ") + } + + commitChangeForRestat(rule, tempPath, outputPath) + + rule.Build("hiddenAPIFlagsFile", "hiddenapi flags") +} diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go index 7e9477bfe..641e19f60 100644 --- a/java/hiddenapi_singleton.go +++ b/java/hiddenapi_singleton.go @@ -18,7 +18,6 @@ import ( "fmt" "android/soong/android" - "android/soong/genrule" ) func init() { @@ -321,63 +320,10 @@ func prebuiltFlagsRule(ctx android.SingletonContext) android.Path { return outputPath } -// flagsRule creates a rule to build hiddenapi-flags.csv out of flags.csv files generated for boot image modules and -// the unsupported API. +// flagsRule is a placeholder that simply returns the location of the file, the generation of the +// ninja rules is done in generateHiddenAPIBuildActions. func flagsRule(ctx android.SingletonContext) android.Path { - var flagsCSV android.Paths - var combinedRemovedApis android.Path - - ctx.VisitAllModules(func(module android.Module) { - if h, ok := module.(hiddenAPIIntf); ok { - if csv := h.flagsCSV(); csv != nil { - flagsCSV = append(flagsCSV, csv) - } - } else if g, ok := module.(*genrule.Module); ok { - if ctx.ModuleName(module) == "combined-removed-dex" { - if len(g.GeneratedSourceFiles()) != 1 || combinedRemovedApis != nil { - ctx.Errorf("Expected 1 combined-removed-dex module that generates 1 output file.") - } - combinedRemovedApis = g.GeneratedSourceFiles()[0] - } - } - }) - - if combinedRemovedApis == nil { - ctx.Errorf("Failed to find combined-removed-dex.") - } - - rule := android.NewRuleBuilder(pctx, ctx) - outputPath := hiddenAPISingletonPaths(ctx).flags - tempPath := android.PathForOutput(ctx, outputPath.Rel()+".tmp") - - stubFlags := hiddenAPISingletonPaths(ctx).stubFlags - - rule.Command(). - BuiltTool("generate_hiddenapi_lists"). - FlagWithInput("--csv ", stubFlags). - Inputs(flagsCSV). - FlagWithInput("--unsupported ", - android.PathForSource(ctx, "frameworks/base/boot/hiddenapi/hiddenapi-unsupported.txt")). - FlagWithInput("--unsupported ", combinedRemovedApis).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "removed"). - FlagWithInput("--max-target-r ", - android.PathForSource(ctx, "frameworks/base/boot/hiddenapi/hiddenapi-max-target-r-loprio.txt")).FlagWithArg("--tag ", "lo-prio"). - FlagWithInput("--max-target-q ", - android.PathForSource(ctx, "frameworks/base/boot/hiddenapi/hiddenapi-max-target-q.txt")). - FlagWithInput("--max-target-p ", - android.PathForSource(ctx, "frameworks/base/boot/hiddenapi/hiddenapi-max-target-p.txt")). - FlagWithInput("--max-target-o ", android.PathForSource( - ctx, "frameworks/base/boot/hiddenapi/hiddenapi-max-target-o.txt")).Flag("--ignore-conflicts ").FlagWithArg("--tag ", "lo-prio"). - FlagWithInput("--blocked ", - android.PathForSource(ctx, "frameworks/base/boot/hiddenapi/hiddenapi-force-blocked.txt")). - FlagWithInput("--unsupported ", android.PathForSource( - ctx, "frameworks/base/boot/hiddenapi/hiddenapi-unsupported-packages.txt")).Flag("--packages "). - FlagWithOutput("--output ", tempPath) - - commitChangeForRestat(rule, tempPath, outputPath) - - rule.Build("hiddenAPIFlagsFile", "hiddenapi flags") - return outputPath } diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index 95d19b96e..e292d8057 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -84,10 +84,11 @@ type ApexVariantReference struct { } type platformBootclasspathProperties struct { - // The names of the bootclasspath_fragment modules that form part of this // platform_bootclasspath. Fragments []ApexVariantReference + + Hidden_api HiddenAPIAugmentationProperties } func platformBootclasspathFactory() android.Module { @@ -191,6 +192,8 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo } }) + b.generateHiddenAPIBuildActions(ctx, b.configuredModules) + // Nothing to do if skipping the dexpreopt of boot image jars. if SkipDexpreoptBootJars(ctx) { return @@ -215,3 +218,24 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo func (b *platformBootclasspathModule) getImageConfig(ctx android.EarlyModuleContext) *bootImageConfig { return defaultBootImageConfig(ctx) } + +// generateHiddenAPIBuildActions generates all the hidden API related build rules. +func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module) { + + moduleSpecificFlagsPaths := android.Paths{} + for _, module := range modules { + if h, ok := module.(hiddenAPIIntf); ok { + if csv := h.flagsCSV(); csv != nil { + moduleSpecificFlagsPaths = append(moduleSpecificFlagsPaths, csv) + } + } else { + ctx.ModuleErrorf("module %s of type %s does not implement hiddenAPIIntf", module, ctx.OtherModuleType(module)) + } + } + + augmentationInfo := b.properties.Hidden_api.hiddenAPIAugmentationInfo(ctx) + + outputPath := hiddenAPISingletonPaths(ctx).flags + baseFlagsPath := hiddenAPISingletonPaths(ctx).stubFlags + ruleToGenerateHiddenApiFlags(ctx, outputPath, baseFlagsPath, moduleSpecificFlagsPaths, augmentationInfo) +} diff --git a/rust/fuzz.go b/rust/fuzz.go index 6035e68ab..6b0a943f2 100644 --- a/rust/fuzz.go +++ b/rust/fuzz.go @@ -70,10 +70,12 @@ func (fuzzer *fuzzDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags } func (fuzzer *fuzzDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { - deps.StaticLibs = append(deps.StaticLibs, - config.LibFuzzerRuntimeLibrary(ctx.toolchain())) - deps.SharedLibs = append(deps.SharedLibs, - config.LibclangRuntimeLibrary(ctx.toolchain(), "asan")) + if libFuzzerRuntimeLibrary := config.LibFuzzerRuntimeLibrary(ctx.toolchain()); libFuzzerRuntimeLibrary != "" { + deps.StaticLibs = append(deps.StaticLibs, libFuzzerRuntimeLibrary) + } + if libclangRuntimeLibrary := config.LibclangRuntimeLibrary(ctx.toolchain(), "asan"); libclangRuntimeLibrary != "" { + deps.SharedLibs = append(deps.SharedLibs, libclangRuntimeLibrary) + } deps.SharedLibs = append(deps.SharedLibs, "libc++") deps.Rlibs = append(deps.Rlibs, "liblibfuzzer_sys") diff --git a/tests/bootstrap_test.sh b/tests/bootstrap_test.sh index b2f7b2bbb..5271f8d9e 100755 --- a/tests/bootstrap_test.sh +++ b/tests/bootstrap_test.sh @@ -295,6 +295,118 @@ EOF grep -q "Make it so" out/soong/build.ninja || fail "New action not present" } +# Tests a glob in a build= statement in an Android.bp file, which is interpreted +# during bootstrapping. +function test_glob_during_bootstrapping() { + setup + + mkdir -p a + cat > a/Android.bp <<'EOF' +build=["foo*.bp"] +EOF + cat > a/fooa.bp <<'EOF' +bootstrap_go_package { + name: "picard-soong-rules", + pkgPath: "android/soong/picard", + deps: [ + "blueprint", + "soong", + "soong-android", + ], + srcs: [ + "picard.go", + ], + pluginFor: ["soong_build"], +} +EOF + + cat > a/picard.go <<'EOF' +package picard + +import ( + "android/soong/android" + "github.com/google/blueprint" +) + +var ( + pctx = android.NewPackageContext("picard") +) + +func init() { + android.RegisterSingletonType("picard", PicardSingleton) +} + +func PicardSingleton() android.Singleton { + return &picardSingleton{} +} + +type picardSingleton struct{} + +var Message = "Make it so." + +func (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) { + picardRule := ctx.Rule(pctx, "picard", + blueprint.RuleParams{ + Command: "echo " + Message + " > ${out}", + CommandDeps: []string{}, + Description: "Something quotable", + }) + + outputFile := android.PathForOutput(ctx, "picard", "picard.txt") + var deps android.Paths + + ctx.Build(pctx, android.BuildParams{ + Rule: picardRule, + Output: outputFile, + Inputs: deps, + }) +} + +EOF + + run_soong + local mtime1=$(stat -c "%y" out/soong/build.ninja) + + grep -q "Make it so" out/soong/build.ninja || fail "Original action not present" + + cat > a/foob.bp <<'EOF' +bootstrap_go_package { + name: "worf-soong-rules", + pkgPath: "android/soong/worf", + deps: [ + "blueprint", + "soong", + "soong-android", + "picard-soong-rules", + ], + srcs: [ + "worf.go", + ], + pluginFor: ["soong_build"], +} +EOF + + cat > a/worf.go <<'EOF' +package worf + +import "android/soong/picard" + +func init() { + picard.Message = "Engage." +} +EOF + + run_soong + local mtime2=$(stat -c "%y" out/soong/build.ninja) + if [[ "$mtime1" == "$mtime2" ]]; then + fail "Output Ninja file did not change" + fi + + grep -q "Engage" out/soong/build.ninja || fail "New action not present" + + grep -q "Make it so" out/soong/build.ninja && fail "Original action still present" +} + function test_null_build_after_docs { setup run_soong @@ -326,5 +438,6 @@ test_add_android_bp test_change_android_bp test_delete_android_bp test_add_file_to_soong_build +test_glob_during_bootstrapping test_soong_build_rerun_iff_environment_changes test_dump_json_module_graph |