1// Copyright 2023 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package java 16 17import ( 18 "android/soong/android" 19) 20 21type GeneratedJavaLibraryModule struct { 22 Library 23 callbacks GeneratedJavaLibraryCallbacks 24 moduleName string 25 26 // true if we've already called DepsMutator. Can't call AddLibrary or AddSharedLibrary 27 // after DepsMutator. 28 depsMutatorDone bool 29} 30 31type GeneratedJavaLibraryCallbacks interface { 32 // Called from inside DepsMutator, gives a chance to AddDependencies 33 DepsMutator(module *GeneratedJavaLibraryModule, ctx android.BottomUpMutatorContext) 34 35 // Called from inside GenerateAndroidBuildActions. Add the build rules to 36 // make the srcjar, and return the path to it. 37 GenerateSourceJarBuildActions(module *GeneratedJavaLibraryModule, ctx android.ModuleContext) (android.Path, android.Path) 38} 39 40// GeneratedJavaLibraryModuleFactory provides a utility for modules that are generated 41// source code, including ones outside the java package to build jar files 42// from that generated source. 43// 44// To use GeneratedJavaLibraryModule, call GeneratedJavaLibraryModuleFactory with 45// a callback interface and a properties object to add to the module. 46// 47// These modules will have some properties blocked, and it will be an error if 48// modules attempt to set them. See the list of property names in GeneratedAndroidBuildActions 49// for the list of those properties. 50func GeneratedJavaLibraryModuleFactory(moduleName string, callbacks GeneratedJavaLibraryCallbacks, properties interface{}) android.Module { 51 module := &GeneratedJavaLibraryModule{ 52 callbacks: callbacks, 53 moduleName: moduleName, 54 } 55 module.addHostAndDeviceProperties() 56 module.initModuleAndImport(module) 57 android.InitApexModule(module) 58 InitJavaModule(module, android.HostAndDeviceSupported) 59 if properties != nil { 60 module.AddProperties(properties) 61 } 62 return module 63} 64 65// Add a java shared library as a dependency, as if they had said `libs: [ "name" ]` 66func (module *GeneratedJavaLibraryModule) AddSharedLibrary(name string) { 67 if module.depsMutatorDone { 68 panic("GeneratedJavaLibraryModule.AddLibrary called after DepsMutator") 69 } 70 module.Library.properties.Libs = append(module.Library.properties.Libs, name) 71} 72 73// Add a java shared library as a dependency, as if they had said `libs: [ "name" ]` 74func (module *GeneratedJavaLibraryModule) AddStaticLibrary(name string) { 75 if module.depsMutatorDone { 76 panic("GeneratedJavaLibraryModule.AddStaticLibrary called after DepsMutator") 77 } 78 module.Library.properties.Static_libs = append(module.Library.properties.Static_libs, name) 79} 80 81func (module *GeneratedJavaLibraryModule) DepsMutator(ctx android.BottomUpMutatorContext) { 82 module.callbacks.DepsMutator(module, ctx) 83 module.depsMutatorDone = true 84 module.Library.DepsMutator(ctx) 85} 86 87func checkPropertyEmpty(ctx android.ModuleContext, module *GeneratedJavaLibraryModule, name string, value []string) { 88 if len(value) != 0 { 89 ctx.PropertyErrorf(name, "%s not allowed on %s", name, module.moduleName) 90 } 91} 92 93func (module *GeneratedJavaLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { 94 // These modules are all-generated, so disallow these properties to keep it simple. 95 // No additional sources 96 checkPropertyEmpty(ctx, module, "srcs", module.Library.properties.Srcs) 97 checkPropertyEmpty(ctx, module, "common_srcs", module.Library.properties.Common_srcs) 98 checkPropertyEmpty(ctx, module, "exclude_srcs", module.Library.properties.Exclude_srcs) 99 checkPropertyEmpty(ctx, module, "java_resource_dirs", module.Library.properties.Java_resource_dirs) 100 checkPropertyEmpty(ctx, module, "exclude_java_resource_dirs", module.Library.properties.Exclude_java_resource_dirs) 101 // Restrict these for no good reason other than to limit the surface area. If there's a 102 // good use case put them back. 103 checkPropertyEmpty(ctx, module, "plugins", module.Library.properties.Plugins) 104 checkPropertyEmpty(ctx, module, "exported_plugins", module.Library.properties.Exported_plugins) 105 106 srcJarPath, cacheOutputPath := module.callbacks.GenerateSourceJarBuildActions(module, ctx) 107 108 module.Library.properties.Generated_srcjars = append(module.Library.properties.Generated_srcjars, srcJarPath) 109 module.Library.properties.Aconfig_Cache_files = append(module.Library.properties.Aconfig_Cache_files, cacheOutputPath) 110 module.Library.GenerateAndroidBuildActions(ctx) 111} 112 113// Add a rule to the jarjar renaming rules. See RepackageProviderData. 114func (module *GeneratedJavaLibraryModule) AddJarJarRenameRule(original string, renamed string) { 115 module.addJarJarRenameRule(original, renamed) 116} 117