Merge "Create (API) bp2build converters for droidstubs" am: 87c149dccb

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2322300

Change-Id: I5ad1683acf1b59ab2c3af1185ca8ef800f762f52
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Spandan Das
2022-12-29 18:31:40 +00:00
committed by Automerger Merge Worker
6 changed files with 231 additions and 3 deletions

View File

@@ -59,8 +59,14 @@ type apiDomain struct {
type apiDomainProperties struct { type apiDomainProperties struct {
// cc library contributions (.h files/.map.txt) of this API domain // cc library contributions (.h files/.map.txt) of this API domain
// This dependency is a no-op in Soong, but the corresponding Bazel target in the bp2build workspace will provide a `CcApiContributionInfo` provider // This dependency is a no-op in Soong, but the corresponding Bazel target in the api_bp2build workspace
// will provide a `CcApiContributionInfo` provider
Cc_api_contributions []string Cc_api_contributions []string
// java library contributions (as .txt) of this API domain
// This dependency is a no-op in Soong, but the corresponding Bazel target in the api_bp2build workspace
// will provide a `JavaApiContributionInfo` provider
Java_api_contributions []string
} }
func ApiDomainFactory() Module { func ApiDomainFactory() Module {
@@ -102,7 +108,8 @@ func contributionBazelAttributes(ctx TopDownMutatorContext, contributions []stri
} }
type bazelApiDomainAttributes struct { type bazelApiDomainAttributes struct {
Cc_api_contributions bazel.LabelListAttribute Cc_api_contributions bazel.LabelListAttribute
Java_api_contributions bazel.LabelListAttribute
} }
var _ ApiProvider = (*apiDomain)(nil) var _ ApiProvider = (*apiDomain)(nil)
@@ -113,7 +120,8 @@ func (a *apiDomain) ConvertWithApiBp2build(ctx TopDownMutatorContext) {
Bzl_load_location: "//build/bazel/rules/apis:api_domain.bzl", Bzl_load_location: "//build/bazel/rules/apis:api_domain.bzl",
} }
attrs := &bazelApiDomainAttributes{ attrs := &bazelApiDomainAttributes{
Cc_api_contributions: contributionBazelAttributes(ctx, a.properties.Cc_api_contributions), Cc_api_contributions: contributionBazelAttributes(ctx, a.properties.Cc_api_contributions),
Java_api_contributions: contributionBazelAttributes(ctx, a.properties.Java_api_contributions),
} }
ctx.CreateBazelTargetModule(props, CommonAttributes{ ctx.CreateBazelTargetModule(props, CommonAttributes{
Name: ctx.ModuleName(), Name: ctx.ModuleName(),

View File

@@ -44,6 +44,7 @@ const (
SdkNone SdkNone
SdkCore SdkCore
SdkCorePlatform SdkCorePlatform
SdkIntraCore // API surface provided by one core module to another
SdkPublic SdkPublic
SdkSystem SdkSystem
SdkTest SdkTest
@@ -69,6 +70,8 @@ func (k SdkKind) String() string {
return "core" return "core"
case SdkCorePlatform: case SdkCorePlatform:
return "core_platform" return "core_platform"
case SdkIntraCore:
return "intracore"
case SdkModule: case SdkModule:
return "module-lib" return "module-lib"
case SdkSystemServer: case SdkSystemServer:

View File

@@ -55,6 +55,7 @@ bootstrap_go_package {
"cc_test_conversion_test.go", "cc_test_conversion_test.go",
"cc_yasm_conversion_test.go", "cc_yasm_conversion_test.go",
"conversion_test.go", "conversion_test.go",
"droidstubs_conversion_test.go",
"filegroup_conversion_test.go", "filegroup_conversion_test.go",
"genrule_conversion_test.go", "genrule_conversion_test.go",
"gensrcs_conversion_test.go", "gensrcs_conversion_test.go",

View File

@@ -0,0 +1,104 @@
// 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 (
"testing"
"android/soong/android"
"android/soong/java"
)
func registerJavaApiModules(ctx android.RegistrationContext) {
java.RegisterSdkLibraryBuildComponents(ctx)
java.RegisterStubsBuildComponents(ctx)
}
func TestDroidstubsApiContributions(t *testing.T) {
bp := `
droidstubs {
name: "framework-stubs",
check_api: {
current: {
api_file: "framework.current.txt",
},
},
}
// Modules without check_api should not generate a Bazel API target
droidstubs {
name: "framework-docs",
}
// java_sdk_library is a macro that creates droidstubs
java_sdk_library {
name: "module-stubs",
srcs: ["A.java"],
// These api surfaces are added by default, but add them explicitly to make
// this test hermetic
public: {
enabled: true,
},
system: {
enabled: true,
},
// Disable other api surfaces to keep unit test scope limited
module_lib: {
enabled: false,
},
test: {
enabled: false,
},
}
`
expectedBazelTargets := []string{
MakeBazelTargetNoRestrictions(
"java_api_contribution",
"framework-stubs.contribution",
AttrNameToString{
"api": `"framework.current.txt"`,
"api_surface": `"publicapi"`,
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
}),
MakeBazelTargetNoRestrictions(
"java_api_contribution",
"module-stubs.stubs.source.contribution",
AttrNameToString{
"api": `"api/current.txt"`,
"api_surface": `"publicapi"`,
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
}),
MakeBazelTargetNoRestrictions(
"java_api_contribution",
"module-stubs.stubs.source.system.contribution",
AttrNameToString{
"api": `"api/system-current.txt"`,
"api_surface": `"systemapi"`,
"target_compatible_with": `["//build/bazel/platforms/os:android"]`,
}),
}
RunApiBp2BuildTestCase(t, registerJavaApiModules, Bp2buildTestCase{
Blueprint: bp,
ExpectedBazelTargets: expectedBazelTargets,
Filesystem: map[string]string{
"api/current.txt": "",
"api/removed.txt": "",
"api/system-current.txt": "",
"api/system-removed.txt": "",
},
})
}

View File

@@ -18,11 +18,13 @@ import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"regexp" "regexp"
"sort"
"strings" "strings"
"github.com/google/blueprint/proptools" "github.com/google/blueprint/proptools"
"android/soong/android" "android/soong/android"
"android/soong/bazel"
"android/soong/java/config" "android/soong/java/config"
"android/soong/remoteexec" "android/soong/remoteexec"
) )
@@ -834,6 +836,74 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
} }
} }
var _ android.ApiProvider = (*Droidstubs)(nil)
type bazelJavaApiContributionAttributes struct {
Api bazel.LabelAttribute
Api_surface *string
}
func (d *Droidstubs) ConvertWithApiBp2build(ctx android.TopDownMutatorContext) {
props := bazel.BazelTargetModuleProperties{
Rule_class: "java_api_contribution",
Bzl_load_location: "//build/bazel/rules/apis:java_api_contribution.bzl",
}
apiFile := d.properties.Check_api.Current.Api_file
// Do not generate a target if check_api is not set
if apiFile == nil {
return
}
attrs := &bazelJavaApiContributionAttributes{
Api: *bazel.MakeLabelAttribute(
android.BazelLabelForModuleSrcSingle(ctx, proptools.String(apiFile)).Label,
),
Api_surface: proptools.StringPtr(bazelApiSurfaceName(d.Name())),
}
ctx.CreateBazelTargetModule(props, android.CommonAttributes{
Name: android.ApiContributionTargetName(ctx.ModuleName()),
}, attrs)
}
// TODO (b/262014796): Export the API contributions of CorePlatformApi
// A map to populate the api surface of a droidstub from a substring appearing in its name
// This map assumes that droidstubs (either checked-in or created by java_sdk_library)
// use a strict naming convention
var (
droidstubsModuleNamingToSdkKind = map[string]android.SdkKind{
//public is commented out since the core libraries use public in their java_sdk_library names
"intracore": android.SdkIntraCore,
"intra.core": android.SdkIntraCore,
"system_server": android.SdkSystemServer,
"system-server": android.SdkSystemServer,
"system": android.SdkSystem,
"module_lib": android.SdkModule,
"module-lib": android.SdkModule,
"test": android.SdkTest,
}
)
// A helper function that returns the api surface of the corresponding java_api_contribution Bazel target
// The api_surface is populated using the naming convention of the droidstubs module.
func bazelApiSurfaceName(name string) string {
// Sort the keys so that longer strings appear first
// Otherwise substrings like system will match both system and system_server
sortedKeys := make([]string, 0)
for key := range droidstubsModuleNamingToSdkKind {
sortedKeys = append(sortedKeys, key)
}
sort.Slice(sortedKeys, func(i, j int) bool {
return len(sortedKeys[i]) > len(sortedKeys[j])
})
for _, sortedKey := range sortedKeys {
if strings.Contains(name, sortedKey) {
sdkKind := droidstubsModuleNamingToSdkKind[sortedKey]
return sdkKind.String() + "api"
}
}
// Default is publicapi
return android.SdkPublic.String() + "api"
}
func StubsDefaultsFactory() android.Module { func StubsDefaultsFactory() android.Module {
module := &DocDefaults{} module := &DocDefaults{}

View File

@@ -304,3 +304,45 @@ func TestDroidstubsWithSdkExtensions(t *testing.T) {
android.AssertStringDoesContain(t, "sdk-extensions-root present", cmdline, "--sdk-extensions-root sdk/extensions") android.AssertStringDoesContain(t, "sdk-extensions-root present", cmdline, "--sdk-extensions-root sdk/extensions")
android.AssertStringDoesContain(t, "sdk-extensions-info present", cmdline, "--sdk-extensions-info sdk/extensions/info.txt") android.AssertStringDoesContain(t, "sdk-extensions-info present", cmdline, "--sdk-extensions-info sdk/extensions/info.txt")
} }
func TestApiSurfaceFromDroidStubsName(t *testing.T) {
testCases := []struct {
desc string
name string
expectedApiSurface string
}{
{
desc: "Default is publicapi",
name: "mydroidstubs",
expectedApiSurface: "publicapi",
},
{
desc: "name contains system substring",
name: "mydroidstubs.system.suffix",
expectedApiSurface: "systemapi",
},
{
desc: "name contains system_server substring",
name: "mydroidstubs.system_server.suffix",
expectedApiSurface: "system-serverapi",
},
{
desc: "name contains module_lib substring",
name: "mydroidstubs.module_lib.suffix",
expectedApiSurface: "module-libapi",
},
{
desc: "name contains test substring",
name: "mydroidstubs.test.suffix",
expectedApiSurface: "testapi",
},
{
desc: "name contains intra.core substring",
name: "mydroidstubs.intra.core.suffix",
expectedApiSurface: "intracoreapi",
},
}
for _, tc := range testCases {
android.AssertStringEquals(t, tc.desc, tc.expectedApiSurface, bazelApiSurfaceName(tc.name))
}
}