Merge "Collect aconfig_declarations of the dependent java_aconfig_library modules" into main
This commit is contained in:
commit
033ffb9533
6 changed files with 160 additions and 8 deletions
|
@ -76,7 +76,7 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) DepsMutator(module *ja
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuildActions(module *java.GeneratedJavaLibraryModule, ctx android.ModuleContext) android.Path {
|
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuildActions(module *java.GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path) {
|
||||||
// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
|
// Get the values that came from the global RELEASE_ACONFIG_VALUE_SETS flag
|
||||||
declarationsModules := ctx.GetDirectDepsWithTag(declarationsTag)
|
declarationsModules := ctx.GetDirectDepsWithTag(declarationsTag)
|
||||||
if len(declarationsModules) != 1 {
|
if len(declarationsModules) != 1 {
|
||||||
|
@ -129,7 +129,11 @@ func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) GenerateSourceJarBuild
|
||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
|
|
||||||
return srcJarPath
|
return srcJarPath, declarations.IntermediateCacheOutputPath
|
||||||
|
}
|
||||||
|
|
||||||
|
func (callbacks *JavaAconfigDeclarationsLibraryCallbacks) AconfigDeclarations() *string {
|
||||||
|
return proptools.StringPtr(callbacks.properties.Aconfig_declarations)
|
||||||
}
|
}
|
||||||
|
|
||||||
func isModeSupported(mode string) bool {
|
func isModeSupported(mode string) bool {
|
||||||
|
|
|
@ -11404,3 +11404,121 @@ func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
|
||||||
checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
|
checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAconfifDeclarationsValidation(t *testing.T) {
|
||||||
|
aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
|
||||||
|
for _, moduleName := range moduleNames {
|
||||||
|
ret += fmt.Sprintf(`
|
||||||
|
aconfig_declarations {
|
||||||
|
name: "%[1]s",
|
||||||
|
package: "com.example.package",
|
||||||
|
srcs: [
|
||||||
|
"%[1]s.aconfig",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
java_aconfig_library {
|
||||||
|
name: "%[1]s-lib",
|
||||||
|
aconfig_declarations: "%[1]s",
|
||||||
|
}
|
||||||
|
`, moduleName)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
result := android.GroupFixturePreparers(
|
||||||
|
prepareForApexTest,
|
||||||
|
java.PrepareForTestWithJavaSdkLibraryFiles,
|
||||||
|
java.FixtureWithLastReleaseApis("foo"),
|
||||||
|
android.FixtureModifyConfig(func(config android.Config) {
|
||||||
|
config.SetApiLibraries([]string{"foo"})
|
||||||
|
}),
|
||||||
|
).RunTestWithBp(t, `
|
||||||
|
java_library {
|
||||||
|
name: "baz-java-lib",
|
||||||
|
static_libs: [
|
||||||
|
"baz-lib",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
filegroup {
|
||||||
|
name: "qux-filegroup",
|
||||||
|
srcs: [
|
||||||
|
":qux-lib{.generated_srcjars}",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
filegroup {
|
||||||
|
name: "qux-another-filegroup",
|
||||||
|
srcs: [
|
||||||
|
":qux-filegroup",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
java_library {
|
||||||
|
name: "quux-java-lib",
|
||||||
|
srcs: [
|
||||||
|
"a.java",
|
||||||
|
],
|
||||||
|
libs: [
|
||||||
|
"quux-lib",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
java_sdk_library {
|
||||||
|
name: "foo",
|
||||||
|
srcs: [
|
||||||
|
":qux-another-filegroup",
|
||||||
|
],
|
||||||
|
api_packages: ["foo"],
|
||||||
|
system: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
module_lib: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
test: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
static_libs: [
|
||||||
|
"bar-lib",
|
||||||
|
],
|
||||||
|
libs: [
|
||||||
|
"baz-java-lib",
|
||||||
|
"quux-java-lib",
|
||||||
|
],
|
||||||
|
aconfig_declarations: [
|
||||||
|
"bar",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
`+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
|
||||||
|
|
||||||
|
m := result.ModuleForTests("foo.stubs.source", "android_common")
|
||||||
|
outDir := "out/soong/.intermediates"
|
||||||
|
|
||||||
|
// Arguments passed to aconfig to retrieve the state of the flags defined in the
|
||||||
|
// textproto files
|
||||||
|
aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
|
||||||
|
|
||||||
|
// "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
|
||||||
|
// cache file provided by the associated aconfig_declarations module "bar" should be passed
|
||||||
|
// to aconfig.
|
||||||
|
android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
|
||||||
|
"passed as an input",
|
||||||
|
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
|
||||||
|
|
||||||
|
// "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
|
||||||
|
// to metalava as classpath. Thus the cache file provided by the associated
|
||||||
|
// aconfig_declarations module "baz" should be passed to aconfig.
|
||||||
|
android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
|
||||||
|
"java_aconfig_library passed as an input",
|
||||||
|
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
|
||||||
|
|
||||||
|
// "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
|
||||||
|
// the associated aconfig_declarations module "qux" should be passed to aconfig.
|
||||||
|
android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
|
||||||
|
"input",
|
||||||
|
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
|
||||||
|
|
||||||
|
// "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
|
||||||
|
// statically depend on "quux-lib". Therefore, the cache file provided by the associated
|
||||||
|
// aconfig_declarations module "quux" should not be passed to aconfig.
|
||||||
|
android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
|
||||||
|
"depend on java_aconfig_library not passed as an input",
|
||||||
|
aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
|
||||||
|
}
|
||||||
|
|
15
java/base.go
15
java/base.go
|
@ -197,6 +197,9 @@ type CommonProperties struct {
|
||||||
// Additional srcJars tacked in by GeneratedJavaLibraryModule
|
// Additional srcJars tacked in by GeneratedJavaLibraryModule
|
||||||
Generated_srcjars []android.Path `android:"mutated"`
|
Generated_srcjars []android.Path `android:"mutated"`
|
||||||
|
|
||||||
|
// intermediate aconfig cache file tacked in by GeneratedJavaLibraryModule
|
||||||
|
Aconfig_Cache_files []android.Path `android:"mutated"`
|
||||||
|
|
||||||
// If true, then only the headers are built and not the implementation jar.
|
// If true, then only the headers are built and not the implementation jar.
|
||||||
Headers_only *bool
|
Headers_only *bool
|
||||||
|
|
||||||
|
@ -541,6 +544,11 @@ type Module struct {
|
||||||
jarjarRenameRules map[string]string
|
jarjarRenameRules map[string]string
|
||||||
|
|
||||||
stubsLinkType StubsLinkType
|
stubsLinkType StubsLinkType
|
||||||
|
|
||||||
|
// Paths to the aconfig intermediate cache files that are provided by the
|
||||||
|
// java_aconfig_library or java_library modules that are statically linked
|
||||||
|
// to this module. Does not contain cache files from all transitive dependencies.
|
||||||
|
aconfigCacheFiles android.Paths
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
|
func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
|
||||||
|
@ -1197,6 +1205,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
|
||||||
// final R classes from the app.
|
// final R classes from the app.
|
||||||
flags.classpath = append(android.CopyOf(extraClasspathJars), flags.classpath...)
|
flags.classpath = append(android.CopyOf(extraClasspathJars), flags.classpath...)
|
||||||
|
|
||||||
|
j.aconfigCacheFiles = append(deps.aconfigProtoFiles, j.properties.Aconfig_Cache_files...)
|
||||||
|
|
||||||
// If compiling headers then compile them and skip the rest
|
// If compiling headers then compile them and skip the rest
|
||||||
if proptools.Bool(j.properties.Headers_only) {
|
if proptools.Bool(j.properties.Headers_only) {
|
||||||
if srcFiles.HasExt(".kt") {
|
if srcFiles.HasExt(".kt") {
|
||||||
|
@ -1736,7 +1746,7 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath
|
||||||
ExportedPluginDisableTurbine: j.exportedDisableTurbine,
|
ExportedPluginDisableTurbine: j.exportedDisableTurbine,
|
||||||
JacocoReportClassesFile: j.jacocoReportClassesFile,
|
JacocoReportClassesFile: j.jacocoReportClassesFile,
|
||||||
StubsLinkType: j.stubsLinkType,
|
StubsLinkType: j.stubsLinkType,
|
||||||
AconfigIntermediateCacheOutputPaths: deps.aconfigProtoFiles,
|
AconfigIntermediateCacheOutputPaths: j.aconfigCacheFiles,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
|
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
|
||||||
|
@ -2350,7 +2360,10 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
|
||||||
deps.staticHeaderJars = append(deps.staticHeaderJars, dep.Srcs()...)
|
deps.staticHeaderJars = append(deps.staticHeaderJars, dep.Srcs()...)
|
||||||
}
|
}
|
||||||
} else if dep, ok := android.OtherModuleProvider(ctx, module, android.CodegenInfoProvider); ok {
|
} else if dep, ok := android.OtherModuleProvider(ctx, module, android.CodegenInfoProvider); ok {
|
||||||
|
switch tag {
|
||||||
|
case staticLibTag:
|
||||||
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...)
|
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
switch tag {
|
switch tag {
|
||||||
case bootClasspathTag:
|
case bootClasspathTag:
|
||||||
|
|
|
@ -391,12 +391,14 @@ func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
|
||||||
} else if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
|
} else if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
|
||||||
deps.classpath = append(deps.classpath, dep.HeaderJars...)
|
deps.classpath = append(deps.classpath, dep.HeaderJars...)
|
||||||
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...)
|
deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...)
|
||||||
|
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.AconfigIntermediateCacheOutputPaths...)
|
||||||
} else if dep, ok := module.(android.SourceFileProducer); ok {
|
} else if dep, ok := module.(android.SourceFileProducer); ok {
|
||||||
checkProducesJars(ctx, dep)
|
checkProducesJars(ctx, dep)
|
||||||
deps.classpath = append(deps.classpath, dep.Srcs()...)
|
deps.classpath = append(deps.classpath, dep.Srcs()...)
|
||||||
} else {
|
} else {
|
||||||
ctx.ModuleErrorf("depends on non-java module %q", otherName)
|
ctx.ModuleErrorf("depends on non-java module %q", otherName)
|
||||||
}
|
}
|
||||||
|
|
||||||
case java9LibTag:
|
case java9LibTag:
|
||||||
if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
|
if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
|
||||||
deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars...)
|
deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars...)
|
||||||
|
@ -429,6 +431,19 @@ func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
|
||||||
srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
|
srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
|
||||||
j.implicits = append(j.implicits, srcFiles...)
|
j.implicits = append(j.implicits, srcFiles...)
|
||||||
|
|
||||||
|
// Module can depend on a java_aconfig_library module using the ":module_name{.tag}" syntax.
|
||||||
|
// Find the corresponding aconfig_declarations module name for such case.
|
||||||
|
for _, src := range j.properties.Srcs {
|
||||||
|
if moduleName, tag := android.SrcIsModuleWithTag(src); moduleName != "" {
|
||||||
|
otherModule := android.GetModuleFromPathDep(ctx, moduleName, tag)
|
||||||
|
if otherModule != nil {
|
||||||
|
if dep, ok := android.OtherModuleProvider(ctx, otherModule, android.CodegenInfoProvider); ok {
|
||||||
|
deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
filterByPackage := func(srcs []android.Path, filterPackages []string) []android.Path {
|
filterByPackage := func(srcs []android.Path, filterPackages []string) []android.Path {
|
||||||
if filterPackages == nil {
|
if filterPackages == nil {
|
||||||
return srcs
|
return srcs
|
||||||
|
|
|
@ -34,7 +34,7 @@ type GeneratedJavaLibraryCallbacks interface {
|
||||||
|
|
||||||
// Called from inside GenerateAndroidBuildActions. Add the build rules to
|
// Called from inside GenerateAndroidBuildActions. Add the build rules to
|
||||||
// make the srcjar, and return the path to it.
|
// make the srcjar, and return the path to it.
|
||||||
GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) android.Path
|
GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GeneratedJavaLibraryModuleFactory provides a utility for modules that are generated
|
// GeneratedJavaLibraryModuleFactory provides a utility for modules that are generated
|
||||||
|
@ -103,8 +103,10 @@ func (module *GeneratedJavaLibraryModule) GenerateAndroidBuildActions(ctx androi
|
||||||
checkPropertyEmpty(ctx, module, "plugins", module.Library.properties.Plugins)
|
checkPropertyEmpty(ctx, module, "plugins", module.Library.properties.Plugins)
|
||||||
checkPropertyEmpty(ctx, module, "exported_plugins", module.Library.properties.Exported_plugins)
|
checkPropertyEmpty(ctx, module, "exported_plugins", module.Library.properties.Exported_plugins)
|
||||||
|
|
||||||
srcJarPath := module.callbacks.GenerateSourceJarBuildActions(module, ctx)
|
srcJarPath, cacheOutputPath := module.callbacks.GenerateSourceJarBuildActions(module, ctx)
|
||||||
|
|
||||||
module.Library.properties.Generated_srcjars = append(module.Library.properties.Generated_srcjars, srcJarPath)
|
module.Library.properties.Generated_srcjars = append(module.Library.properties.Generated_srcjars, srcJarPath)
|
||||||
|
module.Library.properties.Aconfig_Cache_files = append(module.Library.properties.Aconfig_Cache_files, cacheOutputPath)
|
||||||
module.Library.GenerateAndroidBuildActions(ctx)
|
module.Library.GenerateAndroidBuildActions(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,8 @@ type JavaGenLibTestCallbacks struct {
|
||||||
func (callbacks *JavaGenLibTestCallbacks) DepsMutator(module *GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) {
|
func (callbacks *JavaGenLibTestCallbacks) DepsMutator(module *GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (callbacks *JavaGenLibTestCallbacks) GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) android.Path {
|
func (callbacks *JavaGenLibTestCallbacks) GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path) {
|
||||||
return android.PathForOutput(ctx, "blah.srcjar")
|
return android.PathForOutput(ctx, "blah.srcjar"), android.PathForOutput(ctx, "blah.pb")
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGenLib(t *testing.T, errorHandler android.FixtureErrorHandler, bp string) *android.TestResult {
|
func testGenLib(t *testing.T, errorHandler android.FixtureErrorHandler, bp string) *android.TestResult {
|
||||||
|
|
Loading…
Reference in a new issue