Ensure that sdk/module_exports depends on source members
Previously, preferring a prebuilt of an sdk/module_exports's member would cause the sdk/module_exports to depend on the prebuilt instead of the source and cause problems with the build. This chance prevents the dependency from an sdk/module_exports to its members from being replaced with prebuilts. Bug: 160785918 Test: m nothing Change-Id: Iee4bcd438c11929e30fb5766701b05a0e89956d9
This commit is contained in:
@@ -266,6 +266,9 @@ type SdkMemberTypeDependencyTag interface {
|
|||||||
SdkMemberType() SdkMemberType
|
SdkMemberType() SdkMemberType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ SdkMemberTypeDependencyTag = (*sdkMemberDependencyTag)(nil)
|
||||||
|
var _ ReplaceSourceWithPrebuilt = (*sdkMemberDependencyTag)(nil)
|
||||||
|
|
||||||
type sdkMemberDependencyTag struct {
|
type sdkMemberDependencyTag struct {
|
||||||
blueprint.BaseDependencyTag
|
blueprint.BaseDependencyTag
|
||||||
memberType SdkMemberType
|
memberType SdkMemberType
|
||||||
@@ -275,6 +278,12 @@ func (t *sdkMemberDependencyTag) SdkMemberType() SdkMemberType {
|
|||||||
return t.memberType
|
return t.memberType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prevent dependencies from the sdk/module_exports onto their members from being
|
||||||
|
// replaced with a preferred prebuilt.
|
||||||
|
func (t *sdkMemberDependencyTag) ReplaceSourceWithPrebuilt() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func DependencyTagForSdkMemberType(memberType SdkMemberType) SdkMemberTypeDependencyTag {
|
func DependencyTagForSdkMemberType(memberType SdkMemberType) SdkMemberTypeDependencyTag {
|
||||||
return &sdkMemberDependencyTag{memberType: memberType}
|
return &sdkMemberDependencyTag{memberType: memberType}
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
|
||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
@@ -173,20 +172,6 @@ func moduleToPath(name string) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) {
|
|
||||||
t.Helper()
|
|
||||||
module := ctx.ModuleForTests(name, variant).Module()
|
|
||||||
deps := []string{}
|
|
||||||
ctx.VisitDirectDeps(module, func(m blueprint.Module) {
|
|
||||||
deps = append(deps, m.Name())
|
|
||||||
})
|
|
||||||
sort.Strings(deps)
|
|
||||||
|
|
||||||
if actual := deps; !reflect.DeepEqual(expected, actual) {
|
|
||||||
t.Errorf("expected %#q, found %#q", expected, actual)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestJavaLinkType(t *testing.T) {
|
func TestJavaLinkType(t *testing.T) {
|
||||||
testJava(t, `
|
testJava(t, `
|
||||||
java_library {
|
java_library {
|
||||||
@@ -647,7 +632,7 @@ func TestJavaSdkLibraryImport(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
||||||
`prebuilt_sdklib.stubs`,
|
`prebuilt_sdklib.stubs`,
|
||||||
`prebuilt_sdklib.stubs.source.test`,
|
`prebuilt_sdklib.stubs.source.test`,
|
||||||
`prebuilt_sdklib.stubs.system`,
|
`prebuilt_sdklib.stubs.system`,
|
||||||
@@ -675,7 +660,7 @@ func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
|
|||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
||||||
checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
||||||
`dex2oatd`,
|
`dex2oatd`,
|
||||||
`prebuilt_sdklib`,
|
`prebuilt_sdklib`,
|
||||||
`sdklib.impl`,
|
`sdklib.impl`,
|
||||||
@@ -684,7 +669,7 @@ func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
|
|||||||
`sdklib.xml`,
|
`sdklib.xml`,
|
||||||
})
|
})
|
||||||
|
|
||||||
checkModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
|
CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
|
||||||
`prebuilt_sdklib.stubs`,
|
`prebuilt_sdklib.stubs`,
|
||||||
`sdklib.impl`,
|
`sdklib.impl`,
|
||||||
// This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
|
// This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
|
||||||
@@ -715,7 +700,7 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
|
|||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
||||||
checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
||||||
`dex2oatd`,
|
`dex2oatd`,
|
||||||
`prebuilt_sdklib`,
|
`prebuilt_sdklib`,
|
||||||
`sdklib.impl`,
|
`sdklib.impl`,
|
||||||
@@ -724,7 +709,7 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
|
|||||||
`sdklib.xml`,
|
`sdklib.xml`,
|
||||||
})
|
})
|
||||||
|
|
||||||
checkModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
|
CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{
|
||||||
`prebuilt_sdklib.stubs`,
|
`prebuilt_sdklib.stubs`,
|
||||||
`sdklib.impl`,
|
`sdklib.impl`,
|
||||||
`sdklib.xml`,
|
`sdklib.xml`,
|
||||||
@@ -1491,7 +1476,7 @@ func TestJavaSdkLibrary_Deps(t *testing.T) {
|
|||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
||||||
checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{
|
||||||
`dex2oatd`,
|
`dex2oatd`,
|
||||||
`sdklib.impl`,
|
`sdklib.impl`,
|
||||||
`sdklib.stubs`,
|
`sdklib.stubs`,
|
||||||
|
@@ -16,9 +16,13 @@ package java
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"sort"
|
||||||
|
"testing"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
"android/soong/cc"
|
"android/soong/cc"
|
||||||
|
"github.com/google/blueprint"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) android.Config {
|
func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) android.Config {
|
||||||
@@ -216,3 +220,17 @@ func GatherRequiredDepsForTest() string {
|
|||||||
|
|
||||||
return bp
|
return bp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CheckModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) {
|
||||||
|
t.Helper()
|
||||||
|
module := ctx.ModuleForTests(name, variant).Module()
|
||||||
|
deps := []string{}
|
||||||
|
ctx.VisitDirectDeps(module, func(m blueprint.Module) {
|
||||||
|
deps = append(deps, m.Name())
|
||||||
|
})
|
||||||
|
sort.Strings(deps)
|
||||||
|
|
||||||
|
if actual := deps; !reflect.DeepEqual(expected, actual) {
|
||||||
|
t.Errorf("expected %#q, found %#q", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -16,6 +16,8 @@ package sdk
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"android/soong/java"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testSdkWithJava(t *testing.T, bp string) *testSdkResult {
|
func testSdkWithJava(t *testing.T, bp string) *testSdkResult {
|
||||||
@@ -26,6 +28,9 @@ func testSdkWithJava(t *testing.T, bp string) *testSdkResult {
|
|||||||
"resource.test": nil,
|
"resource.test": nil,
|
||||||
"aidl/foo/bar/Test.aidl": nil,
|
"aidl/foo/bar/Test.aidl": nil,
|
||||||
|
|
||||||
|
// For java_import
|
||||||
|
"prebuilt.jar": nil,
|
||||||
|
|
||||||
// For java_sdk_library
|
// For java_sdk_library
|
||||||
"api/current.txt": nil,
|
"api/current.txt": nil,
|
||||||
"api/removed.txt": nil,
|
"api/removed.txt": nil,
|
||||||
@@ -85,6 +90,52 @@ java_import {
|
|||||||
|
|
||||||
// Contains tests for SDK members provided by the java package.
|
// Contains tests for SDK members provided by the java package.
|
||||||
|
|
||||||
|
func TestSdkDependsOnSourceEvenWhenPrebuiltPreferred(t *testing.T) {
|
||||||
|
result := testSdkWithJava(t, `
|
||||||
|
sdk {
|
||||||
|
name: "mysdk",
|
||||||
|
java_header_libs: ["sdkmember"],
|
||||||
|
}
|
||||||
|
|
||||||
|
java_library {
|
||||||
|
name: "sdkmember",
|
||||||
|
srcs: ["Test.java"],
|
||||||
|
system_modules: "none",
|
||||||
|
sdk_version: "none",
|
||||||
|
}
|
||||||
|
|
||||||
|
java_import {
|
||||||
|
name: "sdkmember",
|
||||||
|
prefer: true,
|
||||||
|
jars: ["prebuilt.jar"],
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
// Make sure that the mysdk module depends on "sdkmember" and not "prebuilt_sdkmember".
|
||||||
|
java.CheckModuleDependencies(t, result.ctx, "mysdk", "android_common", []string{"sdkmember"})
|
||||||
|
|
||||||
|
result.CheckSnapshot("mysdk", "",
|
||||||
|
checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.
|
||||||
|
|
||||||
|
java_import {
|
||||||
|
name: "mysdk_sdkmember@current",
|
||||||
|
sdk_member_name: "sdkmember",
|
||||||
|
jars: ["java/sdkmember.jar"],
|
||||||
|
}
|
||||||
|
|
||||||
|
java_import {
|
||||||
|
name: "sdkmember",
|
||||||
|
prefer: false,
|
||||||
|
jars: ["java/sdkmember.jar"],
|
||||||
|
}
|
||||||
|
|
||||||
|
sdk_snapshot {
|
||||||
|
name: "mysdk@current",
|
||||||
|
java_header_libs: ["mysdk_sdkmember@current"],
|
||||||
|
}
|
||||||
|
`))
|
||||||
|
}
|
||||||
|
|
||||||
func TestBasicSdkWithJavaLibrary(t *testing.T) {
|
func TestBasicSdkWithJavaLibrary(t *testing.T) {
|
||||||
result := testSdkWithJava(t, `
|
result := testSdkWithJava(t, `
|
||||||
sdk {
|
sdk {
|
||||||
|
Reference in New Issue
Block a user