1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2019 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage apex 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "io" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "strings" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 25*333d2b36SAndroid Build Coastguard Worker "android/soong/java" 26*333d2b36SAndroid Build Coastguard Worker "android/soong/rust" 27*333d2b36SAndroid Build Coastguard Worker) 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) AndroidMk() android.AndroidMkData { 30*333d2b36SAndroid Build Coastguard Worker if a.properties.HideFromMake { 31*333d2b36SAndroid Build Coastguard Worker return android.AndroidMkData{ 32*333d2b36SAndroid Build Coastguard Worker Disabled: true, 33*333d2b36SAndroid Build Coastguard Worker } 34*333d2b36SAndroid Build Coastguard Worker } 35*333d2b36SAndroid Build Coastguard Worker return a.androidMkForType() 36*333d2b36SAndroid Build Coastguard Worker} 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Worker// nameInMake converts apexFileClass into the corresponding class name in Make. 39*333d2b36SAndroid Build Coastguard Workerfunc (class apexFileClass) nameInMake() string { 40*333d2b36SAndroid Build Coastguard Worker switch class { 41*333d2b36SAndroid Build Coastguard Worker case etc: 42*333d2b36SAndroid Build Coastguard Worker return "ETC" 43*333d2b36SAndroid Build Coastguard Worker case nativeSharedLib: 44*333d2b36SAndroid Build Coastguard Worker return "SHARED_LIBRARIES" 45*333d2b36SAndroid Build Coastguard Worker case nativeExecutable, shBinary: 46*333d2b36SAndroid Build Coastguard Worker return "EXECUTABLES" 47*333d2b36SAndroid Build Coastguard Worker case javaSharedLib: 48*333d2b36SAndroid Build Coastguard Worker return "JAVA_LIBRARIES" 49*333d2b36SAndroid Build Coastguard Worker case nativeTest: 50*333d2b36SAndroid Build Coastguard Worker return "NATIVE_TESTS" 51*333d2b36SAndroid Build Coastguard Worker case app, appSet: 52*333d2b36SAndroid Build Coastguard Worker // b/142537672 Why isn't this APP? We want to have full control over 53*333d2b36SAndroid Build Coastguard Worker // the paths and file names of the apk file under the flattend APEX. 54*333d2b36SAndroid Build Coastguard Worker // If this is set to APP, then the paths and file names are modified 55*333d2b36SAndroid Build Coastguard Worker // by the Make build system. For example, it is installed to 56*333d2b36SAndroid Build Coastguard Worker // /system/apex/<apexname>/app/<Appname>/<apexname>.<Appname>/ instead of 57*333d2b36SAndroid Build Coastguard Worker // /system/apex/<apexname>/app/<Appname> because the build system automatically 58*333d2b36SAndroid Build Coastguard Worker // appends module name (which is <apexname>.<Appname> to the path. 59*333d2b36SAndroid Build Coastguard Worker return "ETC" 60*333d2b36SAndroid Build Coastguard Worker default: 61*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("unknown class %d", class)) 62*333d2b36SAndroid Build Coastguard Worker } 63*333d2b36SAndroid Build Coastguard Worker} 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker// Return the full module name for a dependency module, which appends the apex module name unless re-using a system lib. 66*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) fullModuleName(apexBundleName string, linkToSystemLib bool, fi *apexFile) string { 67*333d2b36SAndroid Build Coastguard Worker if linkToSystemLib { 68*333d2b36SAndroid Build Coastguard Worker return fi.androidMkModuleName 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker return fi.androidMkModuleName + "." + apexBundleName 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker// androidMkForFiles generates Make definitions for the contents of an 74*333d2b36SAndroid Build Coastguard Worker// apexBundle (apexBundle#filesInfo). The filesInfo structure can either be 75*333d2b36SAndroid Build Coastguard Worker// populated by Soong for unconverted APEXes, or Bazel in mixed mode. Use 76*333d2b36SAndroid Build Coastguard Worker// apexFile#isBazelPrebuilt to differentiate. 77*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) androidMkForFiles(w io.Writer, apexBundleName, moduleDir string, 78*333d2b36SAndroid Build Coastguard Worker apexAndroidMkData android.AndroidMkData) []string { 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker // apexBundleName comes from the 'name' property or soong module. 81*333d2b36SAndroid Build Coastguard Worker // apexName comes from 'name' property of apex_manifest. 82*333d2b36SAndroid Build Coastguard Worker // An apex is installed to /system/apex/<apexBundleName> and is activated at /apex/<apexName> 83*333d2b36SAndroid Build Coastguard Worker // In many cases, the two names are the same, but could be different in general. 84*333d2b36SAndroid Build Coastguard Worker // However, symbol files for apex files are installed under /apex/<apexBundleName> to avoid 85*333d2b36SAndroid Build Coastguard Worker // conflicts between two apexes with the same apexName. 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker moduleNames := []string{} 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 90*333d2b36SAndroid Build Coastguard Worker linkToSystemLib := a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() 91*333d2b36SAndroid Build Coastguard Worker moduleName := a.fullModuleName(apexBundleName, linkToSystemLib, &fi) 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker // This name will be added to LOCAL_REQUIRED_MODULES of the APEX. We need to be 94*333d2b36SAndroid Build Coastguard Worker // arch-specific otherwise we will end up installing both ABIs even when only 95*333d2b36SAndroid Build Coastguard Worker // either of the ABI is requested. 96*333d2b36SAndroid Build Coastguard Worker aName := moduleName 97*333d2b36SAndroid Build Coastguard Worker switch fi.multilib { 98*333d2b36SAndroid Build Coastguard Worker case "lib32": 99*333d2b36SAndroid Build Coastguard Worker aName = aName + ":32" 100*333d2b36SAndroid Build Coastguard Worker case "lib64": 101*333d2b36SAndroid Build Coastguard Worker aName = aName + ":64" 102*333d2b36SAndroid Build Coastguard Worker } 103*333d2b36SAndroid Build Coastguard Worker if !android.InList(aName, moduleNames) { 104*333d2b36SAndroid Build Coastguard Worker moduleNames = append(moduleNames, aName) 105*333d2b36SAndroid Build Coastguard Worker } 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker if linkToSystemLib { 108*333d2b36SAndroid Build Coastguard Worker // No need to copy the file since it's linked to the system file 109*333d2b36SAndroid Build Coastguard Worker continue 110*333d2b36SAndroid Build Coastguard Worker } 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "\ninclude $(CLEAR_VARS) # apex.apexBundle.files") 113*333d2b36SAndroid Build Coastguard Worker if fi.moduleDir != "" { 114*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PATH :=", fi.moduleDir) 115*333d2b36SAndroid Build Coastguard Worker } else { 116*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE :=", moduleName) 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker if fi.module != nil && fi.module.Owner() != "" { 121*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_OWNER :=", fi.module.Owner()) 122*333d2b36SAndroid Build Coastguard Worker } 123*333d2b36SAndroid Build Coastguard Worker // /apex/<apexBundleName>/{lib|framework|...} 124*333d2b36SAndroid Build Coastguard Worker pathForSymbol := filepath.Join("$(PRODUCT_OUT)", "apex", apexBundleName, fi.installDir) 125*333d2b36SAndroid Build Coastguard Worker modulePath := pathForSymbol 126*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", modulePath) 127*333d2b36SAndroid Build Coastguard Worker // AconfigUpdateAndroidMkData may have added elements to Extra. Process them here. 128*333d2b36SAndroid Build Coastguard Worker for _, extra := range apexAndroidMkData.Extra { 129*333d2b36SAndroid Build Coastguard Worker extra(w, fi.builtFile) 130*333d2b36SAndroid Build Coastguard Worker } 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker // For non-flattend APEXes, the merged notice file is attached to the APEX itself. 133*333d2b36SAndroid Build Coastguard Worker // We don't need to have notice file for the individual modules in it. Otherwise, 134*333d2b36SAndroid Build Coastguard Worker // we will have duplicated notice entries. 135*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true") 136*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_INSTALLED_MODULE :=", filepath.Join(modulePath, fi.stem())) 137*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_PAIRS :=", fi.builtFile.String()+":"+filepath.Join(modulePath, fi.stem())) 138*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", fi.builtFile.String()) 139*333d2b36SAndroid Build Coastguard Worker if fi.checkbuildTarget != nil { 140*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_CHECKED_MODULE :=", fi.checkbuildTarget.String()) 141*333d2b36SAndroid Build Coastguard Worker } else { 142*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_CHECKED_MODULE :=", fi.builtFile.String()) 143*333d2b36SAndroid Build Coastguard Worker } 144*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", fi.class.nameInMake()) 145*333d2b36SAndroid Build Coastguard Worker if fi.module != nil { 146*333d2b36SAndroid Build Coastguard Worker // This apexFile's module comes from Soong 147*333d2b36SAndroid Build Coastguard Worker if fi.module.Target().Arch.ArchType != android.Common { 148*333d2b36SAndroid Build Coastguard Worker archStr := fi.module.Target().Arch.ArchType.String() 149*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_TARGET_ARCH :=", archStr) 150*333d2b36SAndroid Build Coastguard Worker } 151*333d2b36SAndroid Build Coastguard Worker } 152*333d2b36SAndroid Build Coastguard Worker if fi.jacocoReportClassesFile != nil { 153*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR :=", fi.jacocoReportClassesFile.String()) 154*333d2b36SAndroid Build Coastguard Worker } 155*333d2b36SAndroid Build Coastguard Worker switch fi.class { 156*333d2b36SAndroid Build Coastguard Worker case javaSharedLib: 157*333d2b36SAndroid Build Coastguard Worker // soong_java_prebuilt.mk sets LOCAL_MODULE_SUFFIX := .jar Therefore 158*333d2b36SAndroid Build Coastguard Worker // we need to remove the suffix from LOCAL_MODULE_STEM, otherwise 159*333d2b36SAndroid Build Coastguard Worker // we will have foo.jar.jar 160*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", strings.TrimSuffix(fi.stem(), ".jar")) 161*333d2b36SAndroid Build Coastguard Worker if javaModule, ok := fi.module.(java.ApexDependency); ok { 162*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", javaModule.ImplementationAndResourcesJars()[0].String()) 163*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", javaModule.HeaderJars()[0].String()) 164*333d2b36SAndroid Build Coastguard Worker } else { 165*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", fi.builtFile.String()) 166*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", fi.builtFile.String()) 167*333d2b36SAndroid Build Coastguard Worker } 168*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", fi.builtFile.String()) 169*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_DEX_PREOPT := false") 170*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_java_prebuilt.mk") 171*333d2b36SAndroid Build Coastguard Worker case app: 172*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_CERTIFICATE :=", fi.certificate.AndroidMkString()) 173*333d2b36SAndroid Build Coastguard Worker // soong_app_prebuilt.mk sets LOCAL_MODULE_SUFFIX := .apk Therefore 174*333d2b36SAndroid Build Coastguard Worker // we need to remove the suffix from LOCAL_MODULE_STEM, otherwise 175*333d2b36SAndroid Build Coastguard Worker // we will have foo.apk.apk 176*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", strings.TrimSuffix(fi.stem(), ".apk")) 177*333d2b36SAndroid Build Coastguard Worker if app, ok := fi.module.(*java.AndroidApp); ok { 178*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE", app.JniCoverageOutputs().Strings()) 179*333d2b36SAndroid Build Coastguard Worker if jniLibSymbols := app.JNISymbolsInstalls(modulePath); len(jniLibSymbols) > 0 { 180*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_JNI_LIBS_SYMBOLS :=", jniLibSymbols.String()) 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker } 183*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_app_prebuilt.mk") 184*333d2b36SAndroid Build Coastguard Worker case appSet: 185*333d2b36SAndroid Build Coastguard Worker as, ok := fi.module.(*java.AndroidAppSet) 186*333d2b36SAndroid Build Coastguard Worker if !ok { 187*333d2b36SAndroid Build Coastguard Worker panic(fmt.Sprintf("Expected %s to be AndroidAppSet", fi.module)) 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_APK_SET_INSTALL_FILE :=", as.PackedAdditionalOutputs().String()) 190*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_APKCERTS_FILE :=", as.APKCertsFile().String()) 191*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_android_app_set.mk") 192*333d2b36SAndroid Build Coastguard Worker case nativeSharedLib, nativeExecutable, nativeTest: 193*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", fi.stem()) 194*333d2b36SAndroid Build Coastguard Worker if ccMod, ok := fi.module.(*cc.Module); ok { 195*333d2b36SAndroid Build Coastguard Worker if ccMod.UnstrippedOutputFile() != nil { 196*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", ccMod.UnstrippedOutputFile().String()) 197*333d2b36SAndroid Build Coastguard Worker } 198*333d2b36SAndroid Build Coastguard Worker ccMod.AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w) 199*333d2b36SAndroid Build Coastguard Worker if ccMod.CoverageOutputFile().Valid() { 200*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", ccMod.CoverageOutputFile().String()) 201*333d2b36SAndroid Build Coastguard Worker } 202*333d2b36SAndroid Build Coastguard Worker } else if rustMod, ok := fi.module.(*rust.Module); ok { 203*333d2b36SAndroid Build Coastguard Worker if rustMod.UnstrippedOutputFile() != nil { 204*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", rustMod.UnstrippedOutputFile().String()) 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker } 207*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_cc_rust_prebuilt.mk") 208*333d2b36SAndroid Build Coastguard Worker default: 209*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", fi.stem()) 210*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PREBUILT)") 211*333d2b36SAndroid Build Coastguard Worker } 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker // m <module_name> will build <module_name>.<apex_name> as well. 214*333d2b36SAndroid Build Coastguard Worker if fi.androidMkModuleName != moduleName { 215*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(w, ".PHONY: %s\n", fi.androidMkModuleName) 216*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(w, "%s: %s\n", fi.androidMkModuleName, moduleName) 217*333d2b36SAndroid Build Coastguard Worker } 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker return moduleNames 220*333d2b36SAndroid Build Coastguard Worker} 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) writeRequiredModules(w io.Writer, moduleNames []string) { 223*333d2b36SAndroid Build Coastguard Worker var required []string 224*333d2b36SAndroid Build Coastguard Worker var targetRequired []string 225*333d2b36SAndroid Build Coastguard Worker var hostRequired []string 226*333d2b36SAndroid Build Coastguard Worker required = append(required, a.required...) 227*333d2b36SAndroid Build Coastguard Worker targetRequired = append(targetRequired, a.TargetRequiredModuleNames()...) 228*333d2b36SAndroid Build Coastguard Worker hostRequired = append(hostRequired, a.HostRequiredModuleNames()...) 229*333d2b36SAndroid Build Coastguard Worker for _, fi := range a.filesInfo { 230*333d2b36SAndroid Build Coastguard Worker required = append(required, fi.requiredModuleNames...) 231*333d2b36SAndroid Build Coastguard Worker targetRequired = append(targetRequired, fi.targetRequiredModuleNames...) 232*333d2b36SAndroid Build Coastguard Worker hostRequired = append(hostRequired, fi.hostRequiredModuleNames...) 233*333d2b36SAndroid Build Coastguard Worker } 234*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_REQUIRED_MODULES", moduleNames, a.makeModulesToInstall, required) 235*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_TARGET_REQUIRED_MODULES", targetRequired) 236*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_HOST_REQUIRED_MODULES", hostRequired) 237*333d2b36SAndroid Build Coastguard Worker} 238*333d2b36SAndroid Build Coastguard Worker 239*333d2b36SAndroid Build Coastguard Workerfunc (a *apexBundle) androidMkForType() android.AndroidMkData { 240*333d2b36SAndroid Build Coastguard Worker return android.AndroidMkData{ 241*333d2b36SAndroid Build Coastguard Worker // While we do not provide a value for `Extra`, AconfigUpdateAndroidMkData may add some, which we must honor. 242*333d2b36SAndroid Build Coastguard Worker Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { 243*333d2b36SAndroid Build Coastguard Worker moduleNames := []string{} 244*333d2b36SAndroid Build Coastguard Worker if a.installable() { 245*333d2b36SAndroid Build Coastguard Worker moduleNames = a.androidMkForFiles(w, name, moduleDir, data) 246*333d2b36SAndroid Build Coastguard Worker } 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "\ninclude $(CLEAR_VARS) # apex.apexBundle") 249*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) 250*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE :=", name) 251*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_CLASS := ETC") // do we need a new class? 252*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", a.outputFile.String()) 253*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", a.installDir.String()) 254*333d2b36SAndroid Build Coastguard Worker stemSuffix := imageApexSuffix 255*333d2b36SAndroid Build Coastguard Worker if a.isCompressed { 256*333d2b36SAndroid Build Coastguard Worker stemSuffix = imageCapexSuffix 257*333d2b36SAndroid Build Coastguard Worker } 258*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", name+stemSuffix) 259*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !a.installable()) 260*333d2b36SAndroid Build Coastguard Worker if a.installable() { 261*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_INSTALLED_MODULE :=", a.installedFile.String()) 262*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_PAIRS :=", a.outputFile.String()+":"+a.installedFile.String()) 263*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_SYMLINKS := ", strings.Join(a.compatSymlinks.Strings(), " ")) 264*333d2b36SAndroid Build Coastguard Worker } 265*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "LOCAL_APEX_KEY_PATH := ", a.apexKeysPath.String()) 266*333d2b36SAndroid Build Coastguard Worker 267*333d2b36SAndroid Build Coastguard Worker // Because apex writes .mk with Custom(), we need to write manually some common properties 268*333d2b36SAndroid Build Coastguard Worker // which are available via data.Entries 269*333d2b36SAndroid Build Coastguard Worker commonProperties := []string{ 270*333d2b36SAndroid Build Coastguard Worker "LOCAL_FULL_INIT_RC", "LOCAL_FULL_VINTF_FRAGMENTS", 271*333d2b36SAndroid Build Coastguard Worker "LOCAL_PROPRIETARY_MODULE", "LOCAL_VENDOR_MODULE", "LOCAL_ODM_MODULE", "LOCAL_PRODUCT_MODULE", "LOCAL_SYSTEM_EXT_MODULE", 272*333d2b36SAndroid Build Coastguard Worker "LOCAL_MODULE_OWNER", 273*333d2b36SAndroid Build Coastguard Worker } 274*333d2b36SAndroid Build Coastguard Worker for _, name := range commonProperties { 275*333d2b36SAndroid Build Coastguard Worker if value, ok := data.Entries.EntryMap[name]; ok { 276*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, name, value) 277*333d2b36SAndroid Build Coastguard Worker } 278*333d2b36SAndroid Build Coastguard Worker } 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "LOCAL_OVERRIDES_MODULES", a.overridableProperties.Overrides) 281*333d2b36SAndroid Build Coastguard Worker a.writeRequiredModules(w, moduleNames) 282*333d2b36SAndroid Build Coastguard Worker // AconfigUpdateAndroidMkData may have added elements to Extra. Process them here. 283*333d2b36SAndroid Build Coastguard Worker for _, extra := range data.Extra { 284*333d2b36SAndroid Build Coastguard Worker extra(w, a.outputFile) 285*333d2b36SAndroid Build Coastguard Worker } 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "include $(BUILD_PREBUILT)") 288*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, "ALL_MODULES.$(my_register_name).BUNDLE :=", a.bundleModuleFile.String()) 289*333d2b36SAndroid Build Coastguard Worker android.AndroidMkEmitAssignList(w, "ALL_MODULES.$(my_register_name).LINT_REPORTS", a.lintReports.Strings()) 290*333d2b36SAndroid Build Coastguard Worker 291*333d2b36SAndroid Build Coastguard Worker if a.installedFilesFile != nil { 292*333d2b36SAndroid Build Coastguard Worker goal := "checkbuild" 293*333d2b36SAndroid Build Coastguard Worker distFile := name + "-installed-files.txt" 294*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, ".PHONY:", goal) 295*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", 296*333d2b36SAndroid Build Coastguard Worker goal, a.installedFilesFile.String(), distFile) 297*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(w, "$(call declare-0p-target,%s)\n", a.installedFilesFile.String()) 298*333d2b36SAndroid Build Coastguard Worker } 299*333d2b36SAndroid Build Coastguard Worker for _, dist := range data.Entries.GetDistForGoals(a) { 300*333d2b36SAndroid Build Coastguard Worker fmt.Fprintln(w, dist) 301*333d2b36SAndroid Build Coastguard Worker } 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker distCoverageFiles(w, "ndk_apis_usedby_apex", a.nativeApisUsedByModuleFile.String()) 304*333d2b36SAndroid Build Coastguard Worker distCoverageFiles(w, "ndk_apis_backedby_apex", a.nativeApisBackedByModuleFile.String()) 305*333d2b36SAndroid Build Coastguard Worker distCoverageFiles(w, "java_apis_used_by_apex", a.javaApisUsedByModuleFile.String()) 306*333d2b36SAndroid Build Coastguard Worker }} 307*333d2b36SAndroid Build Coastguard Worker} 308*333d2b36SAndroid Build Coastguard Worker 309*333d2b36SAndroid Build Coastguard Workerfunc distCoverageFiles(w io.Writer, dir string, distfile string) { 310*333d2b36SAndroid Build Coastguard Worker if distfile != "" { 311*333d2b36SAndroid Build Coastguard Worker goal := "apps_only" 312*333d2b36SAndroid Build Coastguard Worker fmt.Fprintf(w, "ifneq (,$(filter $(my_register_name),$(TARGET_BUILD_APPS)))\n"+ 313*333d2b36SAndroid Build Coastguard Worker " $(call dist-for-goals,%s,%s:%s/$(notdir %s))\n"+ 314*333d2b36SAndroid Build Coastguard Worker "endif\n", goal, distfile, dir, distfile) 315*333d2b36SAndroid Build Coastguard Worker } 316*333d2b36SAndroid Build Coastguard Worker} 317