diff --git a/java/droiddoc.go b/java/droiddoc.go index abdceba33..098400bff 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -223,6 +223,9 @@ type DroiddocProperties struct { // if set to true, generate docs through Dokka instead of Doclava. Dokka_enabled *bool + + // Compat config XML. Generates compat change documentation if set. + Compat_config *string `android:"path"` } type DroidstubsProperties struct { @@ -1037,6 +1040,11 @@ func (d *Droiddoc) GenerateAndroidBuildActions(ctx android.ModuleContext) { cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles) + if d.properties.Compat_config != nil { + compatConfig := android.PathForModuleSrc(ctx, String(d.properties.Compat_config)) + cmd.FlagWithInput("-compatconfig ", compatConfig) + } + var desc string if Bool(d.properties.Dokka_enabled) { desc = "dokka" diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go index d5c7579e8..95c0574da 100644 --- a/java/platform_compat_config.go +++ b/java/platform_compat_config.go @@ -16,11 +16,17 @@ package java import ( "android/soong/android" + "fmt" ) func init() { android.RegisterSingletonType("platform_compat_config_singleton", platformCompatConfigSingletonFactory) android.RegisterModuleType("platform_compat_config", platformCompatConfigFactory) + android.RegisterModuleType("global_compat_config", globalCompatConfigFactory) +} + +func platformCompatConfigPath(ctx android.PathContext) android.OutputPath { + return android.PathForOutput(ctx, "compat_config", "merged_compat_config.xml") } type platformCompatConfigSingleton struct { @@ -68,7 +74,7 @@ func (p *platformCompatConfigSingleton) GenerateBuildActions(ctx android.Singlet } rule := android.NewRuleBuilder() - outputPath := android.PathForOutput(ctx, "compat_config", "merged_compat_config.xml") + outputPath := platformCompatConfigPath(ctx) rule.Command(). BuiltTool(ctx, "process-compat-config"). @@ -130,3 +136,49 @@ func platformCompatConfigFactory() android.Module { android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) return module } + +//============== merged_compat_config ================= +type globalCompatConfigProperties struct { + // name of the file into which the metadata will be copied. + Filename *string +} + +type globalCompatConfig struct { + android.ModuleBase + + properties globalCompatConfigProperties + + outputFilePath android.OutputPath +} + +func (c *globalCompatConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) { + filename := String(c.properties.Filename) + + inputPath := platformCompatConfigPath(ctx) + c.outputFilePath = android.PathForModuleOut(ctx, filename).OutputPath + + // This ensures that outputFilePath has the correct name for others to + // use, as the source file may have a different name. + ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Output: c.outputFilePath, + Input: inputPath, + }) +} + +func (h *globalCompatConfig) OutputFiles(tag string) (android.Paths, error) { + switch tag { + case "": + return android.Paths{h.outputFilePath}, nil + default: + return nil, fmt.Errorf("unsupported module reference tag %q", tag) + } +} + +// global_compat_config provides access to the merged compat config xml file generated by the build. +func globalCompatConfigFactory() android.Module { + module := &globalCompatConfig{} + module.AddProperties(&module.properties) + android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) + return module +}