From a7da3f0e0b8199fdf8019f29a5d472adb7574887 Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Thu, 28 Sep 2023 19:30:51 +0000 Subject: [PATCH] Create bp2build converter for versioned_ndk_headers This module type is used by a single soong module - `common_libc` in bionic/libc Implementation details - Convert this module type to ndk_headers rule. Bazel's ndk_headers rule will have a boolean attribute `run_versioner` to determine if verioner should be run on the headers - Add this module type to the alwaysConvert bp2build list - Add the converted target for `common_libc` to the deps of `ndk_sysroot`. This ensures that unbundled apps link against the versioned NDK headers of libc Test: go test ./bp2build Test: b build //bionic/libc:common_libc --config=android Test: for f in $(find bazel-bin/bionic/libc/common_libc.versioned -type f); do cmp $f ${f/bazel-bin\/bionic\/libc\/common_libc.versioned/out\/soong\/ndk\/sysroot\/usr\/include}; done # no diff Bug: 301169067 Change-Id: I55be202f0589db9bdc743c8be41c9c5afd74c352 --- android/allowlists/allowlists.go | 1 + bp2build/build_conversion.go | 2 +- bp2build/cc_library_conversion_test.go | 37 +++++++++++++++++++++++--- cc/ndk_headers.go | 25 ++++++++++++++++- cc/ndk_sysroot.go | 2 +- 5 files changed, 61 insertions(+), 6 deletions(-) diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index f35fe3dc0..624e2034d 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -1011,6 +1011,7 @@ var ( "ndk_headers", "ndk_library", "sysprop_library", + "versioned_ndk_headers", "xsd_config", // go/keep-sorted end } diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go index f53588d76..53c37b90e 100644 --- a/bp2build/build_conversion.go +++ b/bp2build/build_conversion.go @@ -576,7 +576,7 @@ func createBuildConversionMetadata(ctx *android.Context) buildConversionMetadata Dir: ctx.ModuleDir(m), Deps: m.(*bootstrap.GoPackage).Deps(), } - } else if moduleType == "ndk_headers" { + } else if moduleType == "ndk_headers" || moduleType == "versioned_ndk_headers" { ndkHeaders = append(ndkHeaders, m) } }) diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index c2b65a1a1..f1020edd5 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -5198,7 +5198,7 @@ ndk_headers { name: "libfoo_headers", from: "from", to: "to", - srcs: ["foo.h", "foo_other.h"] + srcs: ["from/foo.h", "from/foo_other.h"] } `, ExpectedBazelTargets: []string{ @@ -5206,11 +5206,42 @@ ndk_headers { "strip_import_prefix": `"from"`, "import_prefix": `"to"`, "hdrs": `[ - "foo.h", - "foo_other.h", + "from/foo.h", + "from/foo_other.h", ]`, }), }, } runCcLibraryTestCase(t, tc) } + +func TestVersionedNdkHeadersConversion(t *testing.T) { + tc := Bp2buildTestCase{ + Description: "versioned_ndk_headers conversion", + ModuleTypeUnderTest: "versioned_ndk_headers", + ModuleTypeUnderTestFactory: cc.VersionedNdkHeadersFactory, + Blueprint: ` +versioned_ndk_headers { + name: "libfoo_headers", + from: "from", + to: "to", +} +`, + Filesystem: map[string]string{ + "from/foo.h": "", + "from/foo_other.h": "", + }, + ExpectedBazelTargets: []string{ + MakeBazelTargetNoRestrictions("ndk_headers", "libfoo_headers", AttrNameToString{ + "strip_import_prefix": `"from"`, + "import_prefix": `"to"`, + "hdrs": `[ + "from/foo.h", + "from/foo_other.h", + ]`, + "run_versioner": "True", + }), + }, + } + runCcLibraryTestCase(t, tc) +} diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go index da5db1c19..461aa961c 100644 --- a/cc/ndk_headers.go +++ b/cc/ndk_headers.go @@ -19,6 +19,7 @@ import ( "path/filepath" "github.com/google/blueprint" + "github.com/google/blueprint/proptools" "android/soong/android" "android/soong/bazel" @@ -151,6 +152,7 @@ type bazelNdkHeadersAttributes struct { Strip_import_prefix *string Import_prefix *string Hdrs bazel.LabelListAttribute + Run_versioner *bool } func (h *headerModule) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { @@ -217,6 +219,7 @@ type versionedHeaderProperties struct { // Note that this is really only built to handle bionic/libc/include. type versionedHeaderModule struct { android.ModuleBase + android.BazelModuleBase properties versionedHeaderProperties @@ -255,6 +258,25 @@ func (m *versionedHeaderModule) GenerateAndroidBuildActions(ctx android.ModuleCo processHeadersWithVersioner(ctx, fromSrcPath, toOutputPath, m.srcPaths, installPaths) } +func (h *versionedHeaderModule) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + props := bazel.BazelTargetModuleProperties{ + Rule_class: "ndk_headers", + Bzl_load_location: "//build/bazel/rules/cc:ndk_headers.bzl", + } + globPattern := headerGlobPattern(proptools.String(h.properties.From)) + attrs := &bazelNdkHeadersAttributes{ + Strip_import_prefix: h.properties.From, + Import_prefix: h.properties.To, + Run_versioner: proptools.BoolPtr(true), + Hdrs: bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, []string{globPattern})), + } + ctx.CreateBazelTargetModule( + props, + android.CommonAttributes{Name: h.Name()}, + attrs, + ) +} + func processHeadersWithVersioner(ctx android.ModuleContext, srcDir, outDir android.Path, srcPaths android.Paths, installPaths []android.WritablePath) android.Path { // The versioner depends on a dependencies directory to simplify determining include paths @@ -298,12 +320,13 @@ func processHeadersWithVersioner(ctx android.ModuleContext, srcDir, outDir andro // Unlike the ndk_headers soong module, versioned_ndk_headers operates on a // directory level specified in `from` property. This is only used to process // the bionic/libc/include directory. -func versionedNdkHeadersFactory() android.Module { +func VersionedNdkHeadersFactory() android.Module { module := &versionedHeaderModule{} module.AddProperties(&module.properties) android.InitAndroidModule(module) + android.InitBazelModule(module) return module } diff --git a/cc/ndk_sysroot.go b/cc/ndk_sysroot.go index 54a2ee267..483d23bd7 100644 --- a/cc/ndk_sysroot.go +++ b/cc/ndk_sysroot.go @@ -64,7 +64,7 @@ func init() { func RegisterNdkModuleTypes(ctx android.RegistrationContext) { ctx.RegisterModuleType("ndk_headers", NdkHeadersFactory) ctx.RegisterModuleType("ndk_library", NdkLibraryFactory) - ctx.RegisterModuleType("versioned_ndk_headers", versionedNdkHeadersFactory) + ctx.RegisterModuleType("versioned_ndk_headers", VersionedNdkHeadersFactory) ctx.RegisterModuleType("preprocessed_ndk_headers", preprocessedNdkHeadersFactory) ctx.RegisterParallelSingletonType("ndk", NdkSingleton) }