Merge "Make sure that classpath fragment contents appear in make vars." am: 28e5eda261
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1740313 Change-Id: I216856a16603567c623114d3b5b42506e9dc89b2
This commit is contained in:
commit
dbd6abe28d
6 changed files with 209 additions and 20 deletions
|
@ -1665,8 +1665,9 @@ func (l *ConfiguredJarList) RemoveList(list ConfiguredJarList) ConfiguredJarList
|
|||
return ConfiguredJarList{apexes, jars}
|
||||
}
|
||||
|
||||
// Filter keeps the entries if a jar appears in the given list of jars to keep; returns a new list.
|
||||
func (l *ConfiguredJarList) Filter(jarsToKeep []string) ConfiguredJarList {
|
||||
// Filter keeps the entries if a jar appears in the given list of jars to keep. Returns a new list
|
||||
// and any remaining jars that are not on this list.
|
||||
func (l *ConfiguredJarList) Filter(jarsToKeep []string) (ConfiguredJarList, []string) {
|
||||
var apexes []string
|
||||
var jars []string
|
||||
|
||||
|
@ -1677,7 +1678,7 @@ func (l *ConfiguredJarList) Filter(jarsToKeep []string) ConfiguredJarList {
|
|||
}
|
||||
}
|
||||
|
||||
return ConfiguredJarList{apexes, jars}
|
||||
return ConfiguredJarList{apexes, jars}, RemoveListFromList(jarsToKeep, jars)
|
||||
}
|
||||
|
||||
// CopyOfJars returns a copy of the list of strings containing jar module name
|
||||
|
|
|
@ -159,11 +159,6 @@ func TestCreateClasspathElements(t *testing.T) {
|
|||
],
|
||||
}
|
||||
|
||||
bootclasspath_fragment {
|
||||
name: "non-apex-fragment",
|
||||
contents: ["othersdklibrary"],
|
||||
}
|
||||
|
||||
apex {
|
||||
name: "otherapex",
|
||||
key: "otherapex.key",
|
||||
|
@ -213,7 +208,6 @@ func TestCreateClasspathElements(t *testing.T) {
|
|||
myFragment := result.Module("mybootclasspath-fragment", "android_common_apex10000")
|
||||
myBar := result.Module("bar", "android_common_apex10000")
|
||||
|
||||
nonApexFragment := result.Module("non-apex-fragment", "android_common")
|
||||
other := result.Module("othersdklibrary", "android_common_apex10000")
|
||||
|
||||
otherApexLibrary := result.Module("otherapexlibrary", "android_common_apex10000")
|
||||
|
@ -253,15 +247,6 @@ func TestCreateClasspathElements(t *testing.T) {
|
|||
assertElementsEquals(t, "elements", expectedElements, elements)
|
||||
})
|
||||
|
||||
// Verify that CreateClasspathElements detects when a fragment does not have an associated apex.
|
||||
t.Run("non apex fragment", func(t *testing.T) {
|
||||
ctx := newCtx()
|
||||
elements := java.CreateClasspathElements(ctx, []android.Module{}, []android.Module{nonApexFragment})
|
||||
android.FailIfNoMatchingErrors(t, "fragment non-apex-fragment{.*} is not part of an apex", ctx.errs)
|
||||
expectedElements := java.ClasspathElements{}
|
||||
assertElementsEquals(t, "elements", expectedElements, elements)
|
||||
})
|
||||
|
||||
// Verify that CreateClasspathElements detects when an apex has multiple fragments.
|
||||
t.Run("multiple fragments for same apex", func(t *testing.T) {
|
||||
ctx := newCtx()
|
||||
|
|
|
@ -543,3 +543,140 @@ func TestPlatformBootclasspath_IncludesRemainingApexJars(t *testing.T) {
|
|||
"out/soong/target/product/test_device/system/etc/classpaths",
|
||||
)
|
||||
}
|
||||
|
||||
func TestBootJarNotInApex(t *testing.T) {
|
||||
android.GroupFixturePreparers(
|
||||
prepareForTestWithPlatformBootclasspath,
|
||||
PrepareForTestWithApexBuildComponents,
|
||||
prepareForTestWithMyapex,
|
||||
java.FixtureConfigureApexBootJars("myapex:foo"),
|
||||
).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
|
||||
`dependency "foo" of "myplatform-bootclasspath" missing variant`)).
|
||||
RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "foo",
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
}
|
||||
|
||||
bootclasspath_fragment {
|
||||
name: "not-in-apex-fragment",
|
||||
contents: [
|
||||
"foo",
|
||||
],
|
||||
}
|
||||
|
||||
platform_bootclasspath {
|
||||
name: "myplatform-bootclasspath",
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
||||
func TestBootFragmentNotInApex(t *testing.T) {
|
||||
android.GroupFixturePreparers(
|
||||
prepareForTestWithPlatformBootclasspath,
|
||||
PrepareForTestWithApexBuildComponents,
|
||||
prepareForTestWithMyapex,
|
||||
java.FixtureConfigureApexBootJars("myapex:foo"),
|
||||
).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
|
||||
`library foo.*have no corresponding fragment.*`)).RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
java_libs: ["foo"],
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "foo",
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["foo"],
|
||||
}
|
||||
|
||||
bootclasspath_fragment {
|
||||
name: "not-in-apex-fragment",
|
||||
contents: ["foo"],
|
||||
}
|
||||
|
||||
platform_bootclasspath {
|
||||
name: "myplatform-bootclasspath",
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
||||
func TestNonBootJarInFragment(t *testing.T) {
|
||||
android.GroupFixturePreparers(
|
||||
prepareForTestWithPlatformBootclasspath,
|
||||
PrepareForTestWithApexBuildComponents,
|
||||
prepareForTestWithMyapex,
|
||||
java.FixtureConfigureApexBootJars("myapex:foo"),
|
||||
).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
|
||||
`in contents must also be declared in PRODUCT_APEX_BOOT_JARS`)).
|
||||
RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
bootclasspath_fragments: ["apex-fragment"],
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "foo",
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["foo"],
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "bar",
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
apex_available: ["myapex"],
|
||||
permitted_packages: ["bar"],
|
||||
}
|
||||
|
||||
bootclasspath_fragment {
|
||||
name: "apex-fragment",
|
||||
contents: ["foo", "bar"],
|
||||
apex_available:[ "myapex" ],
|
||||
}
|
||||
|
||||
platform_bootclasspath {
|
||||
name: "myplatform-bootclasspath",
|
||||
fragments: [{
|
||||
apex: "myapex",
|
||||
module:"apex-fragment",
|
||||
}],
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
|
|
@ -130,3 +130,54 @@ func TestSystemserverclasspathFragmentNoGeneratedProto(t *testing.T) {
|
|||
`mysystemserverclasspathfragment`,
|
||||
})
|
||||
}
|
||||
|
||||
func TestSystemServerClasspathFragmentWithContentNotInMake(t *testing.T) {
|
||||
android.GroupFixturePreparers(
|
||||
prepareForTestWithSystemserverclasspathFragment,
|
||||
prepareForTestWithMyapex,
|
||||
dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
|
||||
).
|
||||
ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
|
||||
`in contents must also be declared in PRODUCT_UPDATABLE_SYSTEM_SERVER_JARS`)).
|
||||
RunTestWithBp(t, `
|
||||
apex {
|
||||
name: "myapex",
|
||||
key: "myapex.key",
|
||||
systemserverclasspath_fragments: [
|
||||
"mysystemserverclasspathfragment",
|
||||
],
|
||||
updatable: false,
|
||||
}
|
||||
|
||||
apex_key {
|
||||
name: "myapex.key",
|
||||
public_key: "testkey.avbpubkey",
|
||||
private_key: "testkey.pem",
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "foo",
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
|
||||
java_library {
|
||||
name: "bar",
|
||||
srcs: ["b.java"],
|
||||
installable: true,
|
||||
apex_available: ["myapex"],
|
||||
}
|
||||
|
||||
systemserverclasspath_fragment {
|
||||
name: "mysystemserverclasspathfragment",
|
||||
contents: [
|
||||
"foo",
|
||||
"bar",
|
||||
],
|
||||
apex_available: [
|
||||
"myapex",
|
||||
],
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
|
|
@ -538,7 +538,7 @@ func (b *BootclasspathFragmentModule) configuredJars(ctx android.ModuleContext)
|
|||
global := dexpreopt.GetGlobalConfig(ctx)
|
||||
|
||||
possibleUpdatableModules := gatherPossibleApexModuleNamesAndStems(ctx, b.properties.Contents, bootclasspathFragmentContentDepTag)
|
||||
jars := global.ApexBootJars.Filter(possibleUpdatableModules)
|
||||
jars, unknown := global.ApexBootJars.Filter(possibleUpdatableModules)
|
||||
|
||||
// TODO(satayev): for apex_test we want to include all contents unconditionally to classpaths
|
||||
// config. However, any test specific jars would not be present in ApexBootJars. Instead,
|
||||
|
@ -546,6 +546,12 @@ func (b *BootclasspathFragmentModule) configuredJars(ctx android.ModuleContext)
|
|||
// This is an exception to support end-to-end test for SdkExtensions, until such support exists.
|
||||
if android.InList("test_framework-sdkextensions", possibleUpdatableModules) {
|
||||
jars = jars.Append("com.android.sdkext", "test_framework-sdkextensions")
|
||||
} else if global.ApexBootJars.Len() != 0 && !android.IsModuleInVersionedSdk(ctx.Module()) {
|
||||
unknown = android.RemoveListFromList(unknown, b.properties.Coverage.Contents)
|
||||
_, unknown = android.RemoveFromList("core-icu4j", unknown)
|
||||
if len(unknown) > 0 {
|
||||
ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_APEX_BOOT_JARS", unknown)
|
||||
}
|
||||
}
|
||||
return jars
|
||||
}
|
||||
|
|
|
@ -107,7 +107,16 @@ func (s *SystemServerClasspathModule) configuredJars(ctx android.ModuleContext)
|
|||
global := dexpreopt.GetGlobalConfig(ctx)
|
||||
|
||||
possibleUpdatableModules := gatherPossibleApexModuleNamesAndStems(ctx, s.properties.Contents, systemServerClasspathFragmentContentDepTag)
|
||||
return global.ApexSystemServerJars.Filter(possibleUpdatableModules)
|
||||
jars, unknown := global.ApexSystemServerJars.Filter(possibleUpdatableModules)
|
||||
// TODO(satayev): remove geotz ssc_fragment, since geotz is not part of SSCP anymore.
|
||||
_, unknown = android.RemoveFromList("geotz", unknown)
|
||||
|
||||
// For non test apexes, make sure that all contents are actually declared in make.
|
||||
if global.ApexSystemServerJars.Len() > 0 && len(unknown) > 0 {
|
||||
ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_UPDATABLE_SYSTEM_SERVER_JARS", unknown)
|
||||
}
|
||||
|
||||
return jars
|
||||
}
|
||||
|
||||
type systemServerClasspathFragmentContentDependencyTag struct {
|
||||
|
|
Loading…
Reference in a new issue