From 45faf8f4270b218e2af85592622c559da1536736 Mon Sep 17 00:00:00 2001 From: Liz Kammer Date: Thu, 2 Jun 2022 16:00:54 -0400 Subject: [PATCH] Implement bp2build for linker_config Pair: agespino Bug: 211666695 Test: TODO Change-Id: I479bcd7c53b1c57563fb4277ec39ad70b16030b8 --- android/allowlists/allowlists.go | 2 +- bp2build/Android.bp | 4 +- bp2build/linker_config_conversion_test.go | 59 +++++++++++++++++++++++ linkerconfig/linkerconfig.go | 29 ++++++++++- 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 bp2build/linker_config_conversion_test.go diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index a5cea1720..b41bd1fe3 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -363,6 +363,7 @@ var ( } Bp2buildModuleTypeAlwaysConvertList = []string{ + "linker_config", "java_import", "java_import_host", } @@ -437,7 +438,6 @@ var ( "art-script", // depends on unconverted modules: dalvikvm, dex2oat "bin2c_fastdeployagent", // depends on unconverted modules: deployagent "com.android.runtime", // depends on unconverted modules: bionic-linker-config, linkerconfig - "conv_linker_config", // depends on unconverted modules: linker_config_proto "currysrc", // depends on unconverted modules: currysrc_org.eclipse, guavalib, jopt-simple-4.9 "dex2oat-script", // depends on unconverted modules: dex2oat "generated_android_icu4j_resources", // depends on unconverted modules: android_icu4j_srcgen_binary, soong_zip diff --git a/bp2build/Android.bp b/bp2build/Android.bp index 34548ed95..07557d604 100644 --- a/bp2build/Android.bp +++ b/bp2build/Android.bp @@ -20,15 +20,16 @@ bootstrap_go_package { "soong-android", "soong-android-allowlists", "soong-android-soongconfig", - "soong-shared", "soong-apex", "soong-bazel", "soong-cc", "soong-cc-config", "soong-etc", "soong-genrule", + "soong-linkerconfig", "soong-python", "soong-sh", + "soong-shared", "soong-starlark-format", "soong-ui-metrics", ], @@ -58,6 +59,7 @@ bootstrap_go_package { "java_library_host_conversion_test.go", "java_plugin_conversion_test.go", "java_proto_conversion_test.go", + "linker_config_conversion_test.go", "performance_test.go", "prebuilt_etc_conversion_test.go", "python_binary_conversion_test.go", diff --git a/bp2build/linker_config_conversion_test.go b/bp2build/linker_config_conversion_test.go new file mode 100644 index 000000000..4662af4c1 --- /dev/null +++ b/bp2build/linker_config_conversion_test.go @@ -0,0 +1,59 @@ +// 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 bp2build + +import ( + "fmt" + "testing" + + "android/soong/linkerconfig" +) + +func runLinkerConfigTestCase(t *testing.T, tc bp2buildTestCase) { + t.Helper() + (&tc).moduleTypeUnderTest = "linker_config" + (&tc).moduleTypeUnderTestFactory = linkerconfig.LinkerConfigFactory + runBp2BuildTestCaseSimple(t, tc) +} + +func TestLinkerConfigConvertsSrc(t *testing.T) { + runLinkerConfigTestCase(t, + bp2buildTestCase{ + blueprint: ` +linker_config { + name: "foo", + src: "a.json", +} +`, + expectedBazelTargets: []string{makeBazelTarget("linker_config", "foo", attrNameToString{ + "src": `"a.json"`, + })}, + }) + +} + +func TestLinkerConfigNoSrc(t *testing.T) { + runLinkerConfigTestCase(t, + bp2buildTestCase{ + blueprint: ` +linker_config { + name: "foo", +} +`, + expectedBazelTargets: []string{}, + expectedErr: fmt.Errorf("Android.bp:2:1: module \"foo\": src: empty src is not supported"), + }) + +} diff --git a/linkerconfig/linkerconfig.go b/linkerconfig/linkerconfig.go index 003b27507..412a23b26 100644 --- a/linkerconfig/linkerconfig.go +++ b/linkerconfig/linkerconfig.go @@ -22,6 +22,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/bazel" "android/soong/cc" "android/soong/etc" ) @@ -36,7 +37,7 @@ func init() { } func registerLinkerConfigBuildComponent(ctx android.RegistrationContext) { - ctx.RegisterModuleType("linker_config", linkerConfigFactory) + ctx.RegisterModuleType("linker_config", LinkerConfigFactory) } type linkerConfigProperties struct { @@ -52,6 +53,7 @@ type linkerConfigProperties struct { type linkerConfig struct { android.ModuleBase + android.BazelModuleBase properties linkerConfigProperties outputFilePath android.OutputPath @@ -100,6 +102,28 @@ func (l *linkerConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.InstallFile(l.installDirPath, l.outputFilePath.Base(), l.outputFilePath) } +type linkerConfigAttributes struct { + Src bazel.LabelAttribute +} + +func (l *linkerConfig) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + if l.properties.Src == nil { + ctx.PropertyErrorf("src", "empty src is not supported") + return + } + src := android.BazelLabelForModuleSrcSingle(ctx, *l.properties.Src) + targetModuleProperties := bazel.BazelTargetModuleProperties{ + Rule_class: "linker_config", + Bzl_load_location: "//build/bazel/rules:linker_config.bzl", + } + ctx.CreateBazelTargetModule( + targetModuleProperties, + android.CommonAttributes{Name: l.Name()}, + &linkerConfigAttributes{ + Src: bazel.LabelAttribute{Value: &src}, + }) +} + func BuildLinkerConfig(ctx android.ModuleContext, builder *android.RuleBuilder, input android.Path, otherModules []android.Module, output android.OutputPath) { @@ -141,10 +165,11 @@ func BuildLinkerConfig(ctx android.ModuleContext, builder *android.RuleBuilder, // linker_config generates protobuf file from json file. This protobuf file will be used from // linkerconfig while generating ld.config.txt. Format of this file can be found from // https://android.googlesource.com/platform/system/linkerconfig/+/master/README.md -func linkerConfigFactory() android.Module { +func LinkerConfigFactory() android.Module { m := &linkerConfig{} m.AddProperties(&m.properties) android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibFirst) + android.InitBazelModule(m) return m }