From 5918d649a4c2e4e77efca5d50cbd0dfafb004251 Mon Sep 17 00:00:00 2001 From: Alix Date: Mon, 27 Jun 2022 20:57:44 +0000 Subject: [PATCH] Implement bp2build for prebuilt_etc_xml Bug: 237039154 Test: xml_conversion_test.go & bp2build Change-Id: I1f2c57b9532138f73041d8fc08feea3f66b2ebbc --- android/allowlists/allowlists.go | 4 + etc/prebuilt_etc.go | 27 +++++-- xml/Android.bp | 2 + xml/xml.go | 38 +++++++++ xml/xml_conversion_test.go | 129 +++++++++++++++++++++++++++++++ 5 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 xml/xml_conversion_test.go diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 6a8db79f7..40e366e88 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -462,6 +462,10 @@ var ( "libavb", "avb_headers", + //external/libxml2 + "xmllint", + "libxml2", + //external/fec "libfec_rs", diff --git a/etc/prebuilt_etc.go b/etc/prebuilt_etc.go index 7520f5875..362a8ef3c 100644 --- a/etc/prebuilt_etc.go +++ b/etc/prebuilt_etc.go @@ -678,9 +678,10 @@ type bazelPrebuiltFileAttributes struct { Filename_from_src bazel.BoolAttribute } -// ConvertWithBp2build performs bp2build conversion of PrebuiltEtc -// All prebuilt_* modules are PrebuiltEtc, which we treat uniformily as *PrebuiltFile* -func (module *PrebuiltEtc) ConvertWithBp2build(ctx android.TopDownMutatorContext) { +// Bp2buildHelper returns a bazelPrebuiltFileAttributes used for the conversion +// of prebuilt_* modules. bazelPrebuiltFileAttributes has the common attributes +// used by both prebuilt_etc_xml and other prebuilt_* moodules +func (module *PrebuiltEtc) Bp2buildHelper(ctx android.TopDownMutatorContext) *bazelPrebuiltFileAttributes { var src bazel.LabelAttribute for axis, configToProps := range module.GetArchVariantProperties(ctx, &prebuiltEtcProperties{}) { for config, p := range configToProps { @@ -727,10 +728,6 @@ func (module *PrebuiltEtc) ConvertWithBp2build(ctx android.TopDownMutatorContext } var dir = module.installDirBase - // prebuilt_file supports only `etc` or `usr/share` - if !(dir == "etc" || dir == "usr/share") { - return - } if subDir := module.subdirProperties.Sub_dir; subDir != nil { dir = dir + "/" + *subDir } @@ -752,6 +749,22 @@ func (module *PrebuiltEtc) ConvertWithBp2build(ctx android.TopDownMutatorContext attrs.Filename_from_src = bazel.BoolAttribute{Value: moduleProps.Filename_from_src} } + return attrs + +} + +// ConvertWithBp2build performs bp2build conversion of PrebuiltEtc +// prebuilt_* modules (except prebuilt_etc_xml) are PrebuiltEtc, +// which we treat as *PrebuiltFile* +func (module *PrebuiltEtc) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + var dir = module.installDirBase + // prebuilt_file supports only `etc` or `usr/share` + if !(dir == "etc" || dir == "usr/share") { + return + } + + attrs := module.Bp2buildHelper(ctx) + props := bazel.BazelTargetModuleProperties{ Rule_class: "prebuilt_file", Bzl_load_location: "//build/bazel/rules:prebuilt_file.bzl", diff --git a/xml/Android.bp b/xml/Android.bp index 154293032..d4753de62 100644 --- a/xml/Android.bp +++ b/xml/Android.bp @@ -9,6 +9,7 @@ bootstrap_go_package { "blueprint", "blueprint-pathtools", "soong", + "soong-bp2build", "soong-android", "soong-etc", ], @@ -18,6 +19,7 @@ bootstrap_go_package { ], testSrcs: [ "xml_test.go", + "xml_conversion_test.go", ], pluginFor: ["soong_build"], } diff --git a/xml/xml.go b/xml/xml.go index c28107847..8c0c07282 100644 --- a/xml/xml.go +++ b/xml/xml.go @@ -16,6 +16,7 @@ package xml import ( "android/soong/android" + "android/soong/bazel" "android/soong/etc" "github.com/google/blueprint" @@ -67,6 +68,8 @@ type prebuiltEtcXmlProperties struct { } type prebuiltEtcXml struct { + android.BazelModuleBase + etc.PrebuiltEtc properties prebuiltEtcXmlProperties @@ -129,5 +132,40 @@ func PrebuiltEtcXmlFactory() android.Module { etc.InitPrebuiltEtcModule(&module.PrebuiltEtc, "etc") // This module is device-only android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) + android.InitBazelModule(module) return module } + +type bazelPrebuiltEtcXmlAttributes struct { + Src bazel.LabelAttribute + Filename bazel.LabelAttribute + Dir string + Installable bazel.BoolAttribute + Filename_from_src bazel.BoolAttribute + Schema *string +} + +func (p *prebuiltEtcXml) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + baseAttrs := p.PrebuiltEtc.Bp2buildHelper(ctx) + + var schema *string + if p.properties.Schema != nil { + schema = p.properties.Schema + } + + attrs := &bazelPrebuiltEtcXmlAttributes{ + Src: baseAttrs.Src, + Filename: baseAttrs.Filename, + Dir: baseAttrs.Dir, + Installable: baseAttrs.Installable, + Filename_from_src: baseAttrs.Filename_from_src, + Schema: schema, + } + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "prebuilt_xml", + Bzl_load_location: "//build/bazel/rules/prebuilt_xml.bzl", + } + + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: p.Name()}, attrs) +} diff --git a/xml/xml_conversion_test.go b/xml/xml_conversion_test.go new file mode 100644 index 000000000..6606ddca6 --- /dev/null +++ b/xml/xml_conversion_test.go @@ -0,0 +1,129 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// 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 xml + +import ( + "android/soong/android" + "android/soong/bp2build" + + "testing" +) + +func runXmlPrebuiltEtcTestCase(t *testing.T, tc bp2build.Bp2buildTestCase) { + t.Helper() + (&tc).ModuleTypeUnderTest = "prebuilt_etc_xml" + (&tc).ModuleTypeUnderTestFactory = PrebuiltEtcXmlFactory + bp2build.RunBp2BuildTestCase(t, registerXmlModuleTypes, tc) +} + +func registerXmlModuleTypes(ctx android.RegistrationContext) { +} + +func TestXmlPrebuiltEtcSimple(t *testing.T) { + runXmlPrebuiltEtcTestCase(t, bp2build.Bp2buildTestCase{ + Description: "prebuilt_etc_xml - simple example", + Filesystem: map[string]string{}, + Blueprint: ` +prebuilt_etc_xml { + name: "foo", + src: "fooSrc", + filename: "fooFileName", + sub_dir: "fooDir", + schema: "foo.dtd", +} +`, + ExpectedBazelTargets: []string{ + bp2build.MakeBazelTarget("prebuilt_xml", "foo", bp2build.AttrNameToString{ + "src": `"fooSrc"`, + "filename": `"fooFileName"`, + "dir": `"etc/fooDir"`, + "schema": `"foo.dtd"`, + })}}) +} + +func TestXmlPrebuiltEtcFilenameFromSrc(t *testing.T) { + runXmlPrebuiltEtcTestCase(t, bp2build.Bp2buildTestCase{ + Description: "prebuilt_etc_xml - filenameFromSrc True ", + Filesystem: map[string]string{}, + Blueprint: ` +prebuilt_etc_xml { + name: "foo", + src: "fooSrc", + filename_from_src: true, + sub_dir: "fooDir", + schema: "foo.dtd", +} +`, + ExpectedBazelTargets: []string{ + bp2build.MakeBazelTarget("prebuilt_xml", "foo", bp2build.AttrNameToString{ + "src": `"fooSrc"`, + "filename": `"fooSrc"`, + "dir": `"etc/fooDir"`, + "schema": `"foo.dtd"`, + })}}) +} + +func TestXmlPrebuiltEtcFilenameAndFilenameFromSrc(t *testing.T) { + runXmlPrebuiltEtcTestCase(t, bp2build.Bp2buildTestCase{ + Description: "prebuilt_etc_xml - filename provided and filenameFromSrc True ", + Filesystem: map[string]string{}, + Blueprint: ` +prebuilt_etc_xml { + name: "foo", + src: "fooSrc", + filename: "fooFileName", + filename_from_src: true, + sub_dir: "fooDir", + schema: "foo.dtd", +} +`, + ExpectedBazelTargets: []string{ + bp2build.MakeBazelTarget("prebuilt_xml", "foo", bp2build.AttrNameToString{ + "src": `"fooSrc"`, + "filename": `"fooFileName"`, + "dir": `"etc/fooDir"`, + "schema": `"foo.dtd"`, + })}}) +} + +func TestXmlPrebuiltEtcFileNameFromSrcMultipleSrcs(t *testing.T) { + runXmlPrebuiltEtcTestCase(t, bp2build.Bp2buildTestCase{ + Description: "prebuilt_etc - filename_from_src is true but there are multiple srcs", + Filesystem: map[string]string{}, + Blueprint: ` +prebuilt_etc_xml { + name: "foo", + filename_from_src: true, + arch: { + arm: { + src: "barSrc", + }, + arm64: { + src: "bazSrc", + }, + } +} +`, + ExpectedBazelTargets: []string{ + bp2build.MakeBazelTarget("prebuilt_xml", "foo", bp2build.AttrNameToString{ + "filename_from_src": `True`, + "dir": `"etc"`, + "src": `select({ + "//build/bazel/platforms/arch:arm": "barSrc", + "//build/bazel/platforms/arch:arm64": "bazSrc", + "//conditions:default": None, + })`, + })}}) +}