diff options
Diffstat (limited to 'java/androidmk.go')
| -rw-r--r-- | java/androidmk.go | 730 |
1 files changed, 425 insertions, 305 deletions
diff --git a/java/androidmk.go b/java/androidmk.go index 45fd1c1c0..ae257d7ad 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -17,265 +17,330 @@ package java import ( "fmt" "io" - "strings" "android/soong/android" ) -func (library *Library) AndroidMkHostDex(w io.Writer, name string, data android.AndroidMkData) { - if Bool(library.deviceProperties.Hostdex) && !library.Host() { - fmt.Fprintln(w, "include $(CLEAR_VARS)") - fmt.Fprintln(w, "LOCAL_MODULE := "+name+"-hostdex") - fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true") - fmt.Fprintln(w, "LOCAL_MODULE_CLASS := JAVA_LIBRARIES") +func (library *Library) AndroidMkEntriesHostDex() android.AndroidMkEntries { + hostDexNeeded := Bool(library.deviceProperties.Hostdex) && !library.Host() + if !library.IsForPlatform() { + // Don't emit hostdex modules from the APEX variants + hostDexNeeded = false + } + + if hostDexNeeded { + var output android.Path if library.dexJarFile != nil { - fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", library.dexJarFile.String()) + output = library.dexJarFile } else { - fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", library.implementationAndResourcesJar.String()) + output = library.implementationAndResourcesJar } - if library.dexJarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", library.dexJarFile.String()) - } - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", library.headerJarFile.String()) - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", library.implementationAndResourcesJar.String()) - fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES := "+strings.Join(data.Required, " ")) - if r := library.deviceProperties.Target.Hostdex.Required; len(r) > 0 { - fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(r, " ")) + return android.AndroidMkEntries{ + Class: "JAVA_LIBRARIES", + SubName: "-hostdex", + OutputFile: android.OptionalPathForPath(output), + Required: library.deviceProperties.Target.Hostdex.Required, + Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetBool("LOCAL_IS_HOST_MODULE", true) + entries.SetPath("LOCAL_PREBUILT_MODULE_FILE", output) + if library.dexJarFile != nil { + entries.SetPath("LOCAL_SOONG_DEX_JAR", library.dexJarFile) + } + entries.SetPath("LOCAL_SOONG_HEADER_JAR", library.headerJarFile) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", library.implementationAndResourcesJar) + entries.SetString("LOCAL_MODULE_STEM", library.Stem()+"-hostdex") + }, + }, } - fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_java_prebuilt.mk") } + return android.AndroidMkEntries{Disabled: true} } -func (library *Library) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ - Class: "JAVA_LIBRARIES", - OutputFile: android.OptionalPathForPath(library.outputFile), - Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - if len(library.logtagsSrcs) > 0 { - var logtags []string - for _, l := range library.logtagsSrcs { - logtags = append(logtags, l.Rel()) +func (library *Library) AndroidMkEntries() []android.AndroidMkEntries { + var entriesList []android.AndroidMkEntries + + mainEntries := android.AndroidMkEntries{Disabled: true} + + // For a java library built for an APEX, we don't need Make module + hideFromMake := !library.IsForPlatform() + // If not available for platform, don't emit to make. + if !library.ApexModuleBase.AvailableFor(android.AvailableToPlatform) { + hideFromMake = true + } + if hideFromMake { + // May still need to add some additional dependencies. This will be called + // once for the platform variant (even if it is not being used) and once each + // for the APEX specific variants. In order to avoid adding the dependency + // multiple times only add it for the platform variant. + checkedModulePaths := library.additionalCheckedModules + if library.IsForPlatform() && len(checkedModulePaths) != 0 { + mainEntries = android.AndroidMkEntries{ + Class: "FAKE", + // Need at least one output file in order for this to take effect. + OutputFile: android.OptionalPathForPath(checkedModulePaths[0]), + Include: "$(BUILD_PHONY_PACKAGE)", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.AddStrings("LOCAL_ADDITIONAL_CHECKED_MODULE", checkedModulePaths.Strings()...) + }, + }, + } + } + } else { + mainEntries = android.AndroidMkEntries{ + Class: "JAVA_LIBRARIES", + DistFile: android.OptionalPathForPath(library.distFile), + OutputFile: android.OptionalPathForPath(library.outputFile), + Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + if len(library.logtagsSrcs) > 0 { + var logtags []string + for _, l := range library.logtagsSrcs { + logtags = append(logtags, l.Rel()) + } + entries.AddStrings("LOCAL_LOGTAGS_FILES", logtags...) } - fmt.Fprintln(w, "LOCAL_LOGTAGS_FILES :=", strings.Join(logtags, " ")) - } - if library.installFile == nil { - fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") - } - if library.dexJarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", library.dexJarFile.String()) - } - if len(library.dexpreopter.builtInstalled) > 0 { - fmt.Fprintln(w, "LOCAL_SOONG_BUILT_INSTALLED :=", library.dexpreopter.builtInstalled) - } - fmt.Fprintln(w, "LOCAL_SDK_VERSION :=", library.sdkVersion()) - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", library.implementationAndResourcesJar.String()) - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", library.headerJarFile.String()) + if library.installFile == nil { + entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", true) + } + if library.dexJarFile != nil { + entries.SetPath("LOCAL_SOONG_DEX_JAR", library.dexJarFile) + } + if len(library.dexpreopter.builtInstalled) > 0 { + entries.SetString("LOCAL_SOONG_BUILT_INSTALLED", library.dexpreopter.builtInstalled) + } + entries.SetString("LOCAL_SDK_VERSION", library.sdkVersion().raw) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", library.implementationAndResourcesJar) + entries.SetPath("LOCAL_SOONG_HEADER_JAR", library.headerJarFile) - if library.jacocoReportClassesFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR :=", library.jacocoReportClassesFile.String()) - } + if library.jacocoReportClassesFile != nil { + entries.SetPath("LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR", library.jacocoReportClassesFile) + } - if len(library.exportedSdkLibs) != 0 { - fmt.Fprintln(w, "LOCAL_EXPORT_SDK_LIBRARIES :=", strings.Join(library.exportedSdkLibs, " ")) - } + entries.AddStrings("LOCAL_EXPORT_SDK_LIBRARIES", library.exportedSdkLibs...) - if len(library.additionalCheckedModules) != 0 { - fmt.Fprintln(w, "LOCAL_ADDITIONAL_CHECKED_MODULE +=", strings.Join(library.additionalCheckedModules.Strings(), " ")) - } + if len(library.additionalCheckedModules) != 0 { + entries.AddStrings("LOCAL_ADDITIONAL_CHECKED_MODULE", library.additionalCheckedModules.Strings()...) + } - // Temporary hack: export sources used to compile framework.jar to Make - // to be used for droiddoc - // TODO(ccross): remove this once droiddoc is in soong - if (library.Name() == "framework") || (library.Name() == "framework-annotation-proc") { - fmt.Fprintln(w, "SOONG_FRAMEWORK_SRCS :=", strings.Join(library.compiledJavaSrcs.Strings(), " ")) - fmt.Fprintln(w, "SOONG_FRAMEWORK_SRCJARS :=", strings.Join(library.compiledSrcJars.Strings(), " ")) - } + if library.proguardDictionary != nil { + entries.SetPath("LOCAL_SOONG_PROGUARD_DICT", library.proguardDictionary) + } + entries.SetString("LOCAL_MODULE_STEM", library.Stem()) + + entries.SetOptionalPaths("LOCAL_SOONG_LINT_REPORTS", library.linter.reports) + }, }, - }, - Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { - android.WriteAndroidMkData(w, data) - library.AndroidMkHostDex(w, name, data) - }, + } } + + hostDexEntries := library.AndroidMkEntriesHostDex() + + entriesList = append(entriesList, mainEntries, hostDexEntries) + return entriesList } // Called for modules that are a component of a test suite. -func testSuiteComponent(w io.Writer, test_suites []string) { - fmt.Fprintln(w, "LOCAL_MODULE_TAGS := tests") +func testSuiteComponent(entries *android.AndroidMkEntries, test_suites []string) { + entries.SetString("LOCAL_MODULE_TAGS", "tests") if len(test_suites) > 0 { - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE :=", - strings.Join(test_suites, " ")) + entries.AddStrings("LOCAL_COMPATIBILITY_SUITE", test_suites...) } else { - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUITE := null-suite") + entries.SetString("LOCAL_COMPATIBILITY_SUITE", "null-suite") } } -func (j *Test) AndroidMk() android.AndroidMkData { - data := j.Library.AndroidMk() - data.Extra = append(data.Extra, func(w io.Writer, outputFile android.Path) { - testSuiteComponent(w, j.testProperties.Test_suites) +func (j *Test) AndroidMkEntries() []android.AndroidMkEntries { + entriesList := j.Library.AndroidMkEntries() + entries := &entriesList[0] + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + testSuiteComponent(entries, j.testProperties.Test_suites) if j.testConfig != nil { - fmt.Fprintln(w, "LOCAL_FULL_TEST_CONFIG :=", j.testConfig.String()) + entries.SetPath("LOCAL_FULL_TEST_CONFIG", j.testConfig) + } + androidMkWriteTestData(j.data, entries) + if !BoolDefault(j.testProperties.Auto_gen_config, true) { + entries.SetString("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", "true") } }) - androidMkWriteTestData(j.data, &data) - - return data + return entriesList } -func (j *TestHelperLibrary) AndroidMk() android.AndroidMkData { - data := j.Library.AndroidMk() - data.Extra = append(data.Extra, func(w io.Writer, outputFile android.Path) { - testSuiteComponent(w, j.testHelperLibraryProperties.Test_suites) +func (j *TestHelperLibrary) AndroidMkEntries() []android.AndroidMkEntries { + entriesList := j.Library.AndroidMkEntries() + entries := &entriesList[0] + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + testSuiteComponent(entries, j.testHelperLibraryProperties.Test_suites) }) - return data + return entriesList } -func (prebuilt *Import) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (prebuilt *Import) AndroidMkEntries() []android.AndroidMkEntries { + if !prebuilt.IsForPlatform() || !prebuilt.ContainingSdk().Unversioned() { + return []android.AndroidMkEntries{android.AndroidMkEntries{ + Disabled: true, + }} + } + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", OutputFile: android.OptionalPathForPath(prebuilt.combinedClasspathFile), Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := ", !Bool(prebuilt.properties.Installable)) - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", prebuilt.combinedClasspathFile.String()) - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", prebuilt.combinedClasspathFile.String()) - fmt.Fprintln(w, "LOCAL_SDK_VERSION :=", prebuilt.sdkVersion()) + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", !Bool(prebuilt.properties.Installable)) + entries.SetPath("LOCAL_SOONG_HEADER_JAR", prebuilt.combinedClasspathFile) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", prebuilt.combinedClasspathFile) + entries.SetString("LOCAL_SDK_VERSION", prebuilt.sdkVersion().raw) + entries.SetString("LOCAL_MODULE_STEM", prebuilt.Stem()) }, }, - } + }} } -func (prebuilt *DexImport) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (prebuilt *DexImport) AndroidMkEntries() []android.AndroidMkEntries { + if !prebuilt.IsForPlatform() { + return []android.AndroidMkEntries{android.AndroidMkEntries{ + Disabled: true, + }} + } + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", OutputFile: android.OptionalPathForPath(prebuilt.maybeStrippedDexJarFile), Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { if prebuilt.dexJarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", prebuilt.dexJarFile.String()) + entries.SetPath("LOCAL_SOONG_DEX_JAR", prebuilt.dexJarFile) // TODO(b/125517186): export the dex jar as a classes jar to match some mis-uses in Make until // boot_jars_package_check.mk can check dex jars. - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", prebuilt.dexJarFile.String()) - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", prebuilt.dexJarFile.String()) + entries.SetPath("LOCAL_SOONG_HEADER_JAR", prebuilt.dexJarFile) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", prebuilt.dexJarFile) } if len(prebuilt.dexpreopter.builtInstalled) > 0 { - fmt.Fprintln(w, "LOCAL_SOONG_BUILT_INSTALLED :=", prebuilt.dexpreopter.builtInstalled) + entries.SetString("LOCAL_SOONG_BUILT_INSTALLED", prebuilt.dexpreopter.builtInstalled) } + entries.SetString("LOCAL_MODULE_STEM", prebuilt.Stem()) }, }, - } + }} } -func (prebuilt *AARImport) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (prebuilt *AARImport) AndroidMkEntries() []android.AndroidMkEntries { + if !prebuilt.IsForPlatform() { + return []android.AndroidMkEntries{{ + Disabled: true, + }} + } + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", OutputFile: android.OptionalPathForPath(prebuilt.classpathFile), Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", prebuilt.classpathFile.String()) - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", prebuilt.classpathFile.String()) - fmt.Fprintln(w, "LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE :=", prebuilt.exportPackage.String()) - fmt.Fprintln(w, "LOCAL_SOONG_EXPORT_PROGUARD_FLAGS :=", prebuilt.proguardFlags.String()) - fmt.Fprintln(w, "LOCAL_SOONG_STATIC_LIBRARY_EXTRA_PACKAGES :=", prebuilt.extraAaptPackagesFile.String()) - fmt.Fprintln(w, "LOCAL_FULL_MANIFEST_FILE :=", prebuilt.manifest.String()) - fmt.Fprintln(w, "LOCAL_SDK_VERSION :=", prebuilt.sdkVersion()) + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true) + entries.SetPath("LOCAL_SOONG_HEADER_JAR", prebuilt.classpathFile) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", prebuilt.classpathFile) + entries.SetPath("LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE", prebuilt.exportPackage) + entries.SetPath("LOCAL_SOONG_EXPORT_PROGUARD_FLAGS", prebuilt.proguardFlags) + entries.SetPath("LOCAL_SOONG_STATIC_LIBRARY_EXTRA_PACKAGES", prebuilt.extraAaptPackagesFile) + entries.SetPath("LOCAL_FULL_MANIFEST_FILE", prebuilt.manifest) + entries.SetString("LOCAL_SDK_VERSION", prebuilt.sdkVersion().raw) }, }, - } + }} } -func (binary *Binary) AndroidMk() android.AndroidMkData { +func (binary *Binary) AndroidMkEntries() []android.AndroidMkEntries { if !binary.isWrapperVariant { - return android.AndroidMkData{ + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", OutputFile: android.OptionalPathForPath(binary.outputFile), Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", binary.headerJarFile.String()) - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", binary.implementationAndResourcesJar.String()) + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetPath("LOCAL_SOONG_HEADER_JAR", binary.headerJarFile) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", binary.implementationAndResourcesJar) if binary.dexJarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", binary.dexJarFile.String()) + entries.SetPath("LOCAL_SOONG_DEX_JAR", binary.dexJarFile) } if len(binary.dexpreopter.builtInstalled) > 0 { - fmt.Fprintln(w, "LOCAL_SOONG_BUILT_INSTALLED :=", binary.dexpreopter.builtInstalled) + entries.SetString("LOCAL_SOONG_BUILT_INSTALLED", binary.dexpreopter.builtInstalled) } }, }, - Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { - android.WriteAndroidMkData(w, data) - - fmt.Fprintln(w, "jar_installed_module := $(LOCAL_INSTALLED_MODULE)") + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string, entries *android.AndroidMkEntries) { + fmt.Fprintln(w, "jar_installed_module := $(LOCAL_INSTALLED_MODULE)") + }, }, - } + }} } else { - return android.AndroidMkData{ + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "EXECUTABLES", OutputFile: android.OptionalPathForPath(binary.wrapperFile), - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false") + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetBool("LOCAL_STRIP_MODULE", false) }, }, - Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { - android.WriteAndroidMkData(w, data) - - // Ensure that the wrapper script timestamp is always updated when the jar is updated - fmt.Fprintln(w, "$(LOCAL_INSTALLED_MODULE): $(jar_installed_module)") - fmt.Fprintln(w, "jar_installed_module :=") + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string, entries *android.AndroidMkEntries) { + // Ensure that the wrapper script timestamp is always updated when the jar is updated + fmt.Fprintln(w, "$(LOCAL_INSTALLED_MODULE): $(jar_installed_module)") + fmt.Fprintln(w, "jar_installed_module :=") + }, }, - } + }} } } -func (app *AndroidApp) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (app *AndroidApp) AndroidMkEntries() []android.AndroidMkEntries { + if !app.IsForPlatform() || app.appProperties.HideFromMake { + return []android.AndroidMkEntries{android.AndroidMkEntries{ + Disabled: true, + }} + } + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "APPS", OutputFile: android.OptionalPathForPath(app.outputFile), Include: "$(BUILD_SYSTEM)/soong_app_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - // TODO(jungjw): This, outputting two LOCAL_MODULE lines, works, but is not ideal. Find a better solution. - if app.Name() != app.installApkName { - fmt.Fprintln(w, "# Overridden by PRODUCT_PACKAGE_NAME_OVERRIDES") - fmt.Fprintln(w, "LOCAL_MODULE :=", app.installApkName) - } - fmt.Fprintln(w, "LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE :=", app.exportPackage.String()) + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + // App module names can be overridden. + entries.SetString("LOCAL_MODULE", app.installApkName) + entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", app.appProperties.PreventInstall) + entries.SetPath("LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE", app.exportPackage) if app.dexJarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_DEX_JAR :=", app.dexJarFile.String()) + entries.SetPath("LOCAL_SOONG_DEX_JAR", app.dexJarFile) } if app.implementationAndResourcesJar != nil { - fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", app.implementationAndResourcesJar.String()) + entries.SetPath("LOCAL_SOONG_CLASSES_JAR", app.implementationAndResourcesJar) } if app.headerJarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", app.headerJarFile.String()) + entries.SetPath("LOCAL_SOONG_HEADER_JAR", app.headerJarFile) } if app.bundleFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_BUNDLE :=", app.bundleFile.String()) + entries.SetPath("LOCAL_SOONG_BUNDLE", app.bundleFile) } if app.jacocoReportClassesFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR :=", app.jacocoReportClassesFile.String()) + entries.SetPath("LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR", app.jacocoReportClassesFile) } if app.proguardDictionary != nil { - fmt.Fprintln(w, "LOCAL_SOONG_PROGUARD_DICT :=", app.proguardDictionary.String()) + entries.SetPath("LOCAL_SOONG_PROGUARD_DICT", app.proguardDictionary) } if app.Name() == "framework-res" { - fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)") + entries.SetString("LOCAL_MODULE_PATH", "$(TARGET_OUT_JAVA_LIBRARIES)") // Make base_rules.mk not put framework-res in a subdirectory called // framework_res. - fmt.Fprintln(w, "LOCAL_NO_STANDARD_LIBRARIES := true") + entries.SetBoolIfTrue("LOCAL_NO_STANDARD_LIBRARIES", true) } filterRRO := func(filter overlayType) android.Paths { @@ -291,41 +356,62 @@ func (app *AndroidApp) AndroidMk() android.AndroidMkData { } deviceRRODirs := filterRRO(device) if len(deviceRRODirs) > 0 { - fmt.Fprintln(w, "LOCAL_SOONG_DEVICE_RRO_DIRS :=", strings.Join(deviceRRODirs.Strings(), " ")) + entries.AddStrings("LOCAL_SOONG_DEVICE_RRO_DIRS", deviceRRODirs.Strings()...) } productRRODirs := filterRRO(product) if len(productRRODirs) > 0 { - fmt.Fprintln(w, "LOCAL_SOONG_PRODUCT_RRO_DIRS :=", strings.Join(productRRODirs.Strings(), " ")) + entries.AddStrings("LOCAL_SOONG_PRODUCT_RRO_DIRS", productRRODirs.Strings()...) } - if Bool(app.appProperties.Export_package_resources) { - fmt.Fprintln(w, "LOCAL_EXPORT_PACKAGE_RESOURCES := true") - } + entries.SetBoolIfTrue("LOCAL_EXPORT_PACKAGE_RESOURCES", Bool(app.appProperties.Export_package_resources)) - fmt.Fprintln(w, "LOCAL_FULL_MANIFEST_FILE :=", app.manifestPath.String()) + entries.SetPath("LOCAL_FULL_MANIFEST_FILE", app.manifestPath) - if Bool(app.appProperties.Privileged) { - fmt.Fprintln(w, "LOCAL_PRIVILEGED_MODULE := true") - } + entries.SetBoolIfTrue("LOCAL_PRIVILEGED_MODULE", app.Privileged()) + + entries.SetString("LOCAL_CERTIFICATE", app.certificate.AndroidMkString()) + entries.AddStrings("LOCAL_OVERRIDES_PACKAGES", app.getOverriddenPackages()...) - fmt.Fprintln(w, "LOCAL_CERTIFICATE :=", app.certificate.Pem.String()) - if overriddenPkgs := app.getOverriddenPackages(); len(overriddenPkgs) > 0 { - fmt.Fprintln(w, "LOCAL_OVERRIDES_PACKAGES :=", strings.Join(overriddenPkgs, " ")) + if app.embeddedJniLibs { + jniSymbols := app.JNISymbolsInstalls(app.installPathForJNISymbols.String()) + entries.SetString("LOCAL_SOONG_JNI_LIBS_SYMBOLS", jniSymbols.String()) + } else { + for _, jniLib := range app.jniLibs { + entries.AddStrings("LOCAL_SOONG_JNI_LIBS_"+jniLib.target.Arch.ArchType.String(), jniLib.name) + } } - for _, jniLib := range app.installJniLibs { - fmt.Fprintln(w, "LOCAL_SOONG_JNI_LIBS_"+jniLib.target.Arch.ArchType.String(), "+=", jniLib.name) + if len(app.jniCoverageOutputs) > 0 { + entries.AddStrings("LOCAL_PREBUILT_COVERAGE_ARCHIVE", app.jniCoverageOutputs.Strings()...) } if len(app.dexpreopter.builtInstalled) > 0 { - fmt.Fprintln(w, "LOCAL_SOONG_BUILT_INSTALLED :=", app.dexpreopter.builtInstalled) + entries.SetString("LOCAL_SOONG_BUILT_INSTALLED", app.dexpreopter.builtInstalled) } - for _, split := range app.aapt.splits { - install := "$(LOCAL_MODULE_PATH)/" + strings.TrimSuffix(app.installApkName, ".apk") + split.suffix + ".apk" - fmt.Fprintln(w, "LOCAL_SOONG_BUILT_INSTALLED +=", split.path.String()+":"+install) + for _, extra := range app.extraOutputFiles { + install := app.onDeviceDir + "/" + extra.Base() + entries.AddStrings("LOCAL_SOONG_BUILT_INSTALLED", extra.String()+":"+install) } + + entries.SetOptionalPaths("LOCAL_SOONG_LINT_REPORTS", app.linter.reports) }, }, - } + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string, entries *android.AndroidMkEntries) { + if app.noticeOutputs.Merged.Valid() { + fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", + app.installApkName, app.noticeOutputs.Merged.String(), app.installApkName+"_NOTICE") + } + if app.noticeOutputs.TxtOutput.Valid() { + fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", + app.installApkName, app.noticeOutputs.TxtOutput.String(), app.installApkName+"_NOTICE.txt") + } + if app.noticeOutputs.HtmlOutput.Valid() { + fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", + app.installApkName, app.noticeOutputs.HtmlOutput.String(), app.installApkName+"_NOTICE.html") + } + }, + }, + }} } func (a *AndroidApp) getOverriddenPackages() []string { @@ -339,88 +425,96 @@ func (a *AndroidApp) getOverriddenPackages() []string { return overridden } -func (a *AndroidTest) AndroidMk() android.AndroidMkData { - data := a.AndroidApp.AndroidMk() - data.Extra = append(data.Extra, func(w io.Writer, outputFile android.Path) { - testSuiteComponent(w, a.testProperties.Test_suites) +func (a *AndroidTest) AndroidMkEntries() []android.AndroidMkEntries { + entriesList := a.AndroidApp.AndroidMkEntries() + entries := &entriesList[0] + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + testSuiteComponent(entries, a.testProperties.Test_suites) if a.testConfig != nil { - fmt.Fprintln(w, "LOCAL_FULL_TEST_CONFIG :=", a.testConfig.String()) + entries.SetPath("LOCAL_FULL_TEST_CONFIG", a.testConfig) } + androidMkWriteTestData(a.data, entries) }) - androidMkWriteTestData(a.data, &data) - return data + return entriesList } -func (a *AndroidTestHelperApp) AndroidMk() android.AndroidMkData { - data := a.AndroidApp.AndroidMk() - data.Extra = append(data.Extra, func(w io.Writer, outputFile android.Path) { - testSuiteComponent(w, a.appTestHelperAppProperties.Test_suites) +func (a *AndroidTestHelperApp) AndroidMkEntries() []android.AndroidMkEntries { + entriesList := a.AndroidApp.AndroidMkEntries() + entries := &entriesList[0] + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + testSuiteComponent(entries, a.appTestHelperAppProperties.Test_suites) }) - return data + return entriesList } -func (a *AndroidLibrary) AndroidMk() android.AndroidMkData { - data := a.Library.AndroidMk() +func (a *AndroidLibrary) AndroidMkEntries() []android.AndroidMkEntries { + if !a.IsForPlatform() { + return []android.AndroidMkEntries{{ + Disabled: true, + }} + } + entriesList := a.Library.AndroidMkEntries() + entries := &entriesList[0] - data.Extra = append(data.Extra, func(w io.Writer, outputFile android.Path) { + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { if a.aarFile != nil { - fmt.Fprintln(w, "LOCAL_SOONG_AAR :=", a.aarFile.String()) - } - if a.proguardDictionary != nil { - fmt.Fprintln(w, "LOCAL_SOONG_PROGUARD_DICT :=", a.proguardDictionary.String()) + entries.SetPath("LOCAL_SOONG_AAR", a.aarFile) } if a.Name() == "framework-res" { - fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)") + entries.SetString("LOCAL_MODULE_PATH", "$(TARGET_OUT_JAVA_LIBRARIES)") // Make base_rules.mk not put framework-res in a subdirectory called // framework_res. - fmt.Fprintln(w, "LOCAL_NO_STANDARD_LIBRARIES := true") + entries.SetBoolIfTrue("LOCAL_NO_STANDARD_LIBRARIES", true) } - fmt.Fprintln(w, "LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE :=", a.exportPackage.String()) - fmt.Fprintln(w, "LOCAL_SOONG_STATIC_LIBRARY_EXTRA_PACKAGES :=", a.extraAaptPackagesFile.String()) - fmt.Fprintln(w, "LOCAL_FULL_MANIFEST_FILE :=", a.manifestPath.String()) - fmt.Fprintln(w, "LOCAL_SOONG_EXPORT_PROGUARD_FLAGS :=", - strings.Join(a.exportedProguardFlagFiles.Strings(), " ")) - fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE := true") + entries.SetPath("LOCAL_SOONG_RESOURCE_EXPORT_PACKAGE", a.exportPackage) + entries.SetPath("LOCAL_SOONG_STATIC_LIBRARY_EXTRA_PACKAGES", a.extraAaptPackagesFile) + entries.SetPath("LOCAL_FULL_MANIFEST_FILE", a.mergedManifestFile) + entries.AddStrings("LOCAL_SOONG_EXPORT_PROGUARD_FLAGS", a.exportedProguardFlagFiles.Strings()...) + entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", true) }) - return data + return entriesList } -func (jd *Javadoc) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (jd *Javadoc) AndroidMkEntries() []android.AndroidMkEntries { + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", OutputFile: android.OptionalPathForPath(jd.stubsSrcJar), Include: "$(BUILD_SYSTEM)/soong_droiddoc_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { if BoolDefault(jd.properties.Installable, true) { - fmt.Fprintln(w, "LOCAL_DROIDDOC_DOC_ZIP := ", jd.docZip.String()) + entries.SetPath("LOCAL_DROIDDOC_DOC_ZIP", jd.docZip) } if jd.stubsSrcJar != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_STUBS_SRCJAR := ", jd.stubsSrcJar.String()) + entries.SetPath("LOCAL_DROIDDOC_STUBS_SRCJAR", jd.stubsSrcJar) } }, }, - } + }} } -func (ddoc *Droiddoc) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (ddoc *Droiddoc) AndroidMkEntries() []android.AndroidMkEntries { + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", OutputFile: android.OptionalPathForPath(ddoc.stubsSrcJar), Include: "$(BUILD_SYSTEM)/soong_droiddoc_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { if BoolDefault(ddoc.Javadoc.properties.Installable, true) && ddoc.Javadoc.docZip != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_DOC_ZIP := ", ddoc.Javadoc.docZip.String()) + entries.SetPath("LOCAL_DROIDDOC_DOC_ZIP", ddoc.Javadoc.docZip) } if ddoc.Javadoc.stubsSrcJar != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_STUBS_SRCJAR := ", ddoc.Javadoc.stubsSrcJar.String()) + entries.SetPath("LOCAL_DROIDDOC_STUBS_SRCJAR", ddoc.Javadoc.stubsSrcJar) } + }, + }, + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string, entries *android.AndroidMkEntries) { if ddoc.checkCurrentApiTimestamp != nil { fmt.Fprintln(w, ".PHONY:", ddoc.Name()+"-check-current-api") fmt.Fprintln(w, ddoc.Name()+"-check-current-api:", @@ -456,60 +550,56 @@ func (ddoc *Droiddoc) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, "droidcore: checkapi") } } - apiFilePrefix := "INTERNAL_PLATFORM_" - if String(ddoc.properties.Api_tag_name) != "" { - apiFilePrefix += String(ddoc.properties.Api_tag_name) + "_" - } - if ddoc.apiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"API_FILE := ", ddoc.apiFile.String()) - } - if ddoc.dexApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"DEX_API_FILE := ", ddoc.dexApiFile.String()) - } - if ddoc.privateApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"PRIVATE_API_FILE := ", ddoc.privateApiFile.String()) - } - if ddoc.privateDexApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"PRIVATE_DEX_API_FILE := ", ddoc.privateDexApiFile.String()) - } - if ddoc.removedApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"REMOVED_API_FILE := ", ddoc.removedApiFile.String()) - } - if ddoc.removedDexApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"REMOVED_DEX_API_FILE := ", ddoc.removedDexApiFile.String()) - } - if ddoc.exactApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"EXACT_API_FILE := ", ddoc.exactApiFile.String()) - } - if ddoc.proguardFile != nil { - fmt.Fprintln(w, apiFilePrefix+"PROGUARD_FILE := ", ddoc.proguardFile.String()) - } }, }, - } + }} } -func (dstubs *Droidstubs) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ +func (dstubs *Droidstubs) AndroidMkEntries() []android.AndroidMkEntries { + // If the stubsSrcJar is not generated (because generate_stubs is false) then + // use the api file as the output file to ensure the relevant phony targets + // are created in make if only the api txt file is being generated. This is + // needed because an invalid output file would prevent the make entries from + // being written. + // TODO(b/146727827): Revert when we do not need to generate stubs and API separately. + distFile := android.OptionalPathForPath(dstubs.apiFile) + outputFile := android.OptionalPathForPath(dstubs.stubsSrcJar) + if !outputFile.Valid() { + outputFile = distFile + } + return []android.AndroidMkEntries{android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", - OutputFile: android.OptionalPathForPath(dstubs.stubsSrcJar), + DistFile: distFile, + OutputFile: outputFile, Include: "$(BUILD_SYSTEM)/soong_droiddoc_prebuilt.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { if dstubs.Javadoc.stubsSrcJar != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_STUBS_SRCJAR := ", dstubs.Javadoc.stubsSrcJar.String()) + entries.SetPath("LOCAL_DROIDDOC_STUBS_SRCJAR", dstubs.Javadoc.stubsSrcJar) } if dstubs.apiVersionsXml != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_API_VERSIONS_XML := ", dstubs.apiVersionsXml.String()) + entries.SetPath("LOCAL_DROIDDOC_API_VERSIONS_XML", dstubs.apiVersionsXml) } if dstubs.annotationsZip != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_ANNOTATIONS_ZIP := ", dstubs.annotationsZip.String()) + entries.SetPath("LOCAL_DROIDDOC_ANNOTATIONS_ZIP", dstubs.annotationsZip) } if dstubs.jdiffDocZip != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_JDIFF_DOC_ZIP := ", dstubs.jdiffDocZip.String()) + entries.SetPath("LOCAL_DROIDDOC_JDIFF_DOC_ZIP", dstubs.jdiffDocZip) } if dstubs.metadataZip != nil { - fmt.Fprintln(w, "LOCAL_DROIDDOC_METADATA_ZIP := ", dstubs.metadataZip.String()) + entries.SetPath("LOCAL_DROIDDOC_METADATA_ZIP", dstubs.metadataZip) + } + }, + }, + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string, entries *android.AndroidMkEntries) { + if dstubs.apiFile != nil { + fmt.Fprintf(w, ".PHONY: %s %s.txt\n", dstubs.Name(), dstubs.Name()) + fmt.Fprintf(w, "%s %s.txt: %s\n", dstubs.Name(), dstubs.Name(), dstubs.apiFile) + } + if dstubs.removedApiFile != nil { + fmt.Fprintf(w, ".PHONY: %s %s.txt\n", dstubs.Name(), dstubs.Name()) + fmt.Fprintf(w, "%s %s.txt: %s\n", dstubs.Name(), dstubs.Name(), dstubs.removedApiFile) } if dstubs.checkCurrentApiTimestamp != nil { fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-check-current-api") @@ -537,13 +627,28 @@ func (dstubs *Droidstubs) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, dstubs.Name()+"-check-last-released-api:", dstubs.checkLastReleasedApiTimestamp.String()) - if dstubs.Name() == "api-stubs-docs" || dstubs.Name() == "system-api-stubs-docs" { - fmt.Fprintln(w, ".PHONY: checkapi") - fmt.Fprintln(w, "checkapi:", - dstubs.checkLastReleasedApiTimestamp.String()) + fmt.Fprintln(w, ".PHONY: checkapi") + fmt.Fprintln(w, "checkapi:", + dstubs.checkLastReleasedApiTimestamp.String()) - fmt.Fprintln(w, ".PHONY: droidcore") - fmt.Fprintln(w, "droidcore: checkapi") + fmt.Fprintln(w, ".PHONY: droidcore") + fmt.Fprintln(w, "droidcore: checkapi") + } + if dstubs.apiLintTimestamp != nil { + fmt.Fprintln(w, ".PHONY:", dstubs.Name()+"-api-lint") + fmt.Fprintln(w, dstubs.Name()+"-api-lint:", + dstubs.apiLintTimestamp.String()) + + fmt.Fprintln(w, ".PHONY: checkapi") + fmt.Fprintln(w, "checkapi:", + dstubs.Name()+"-api-lint") + + fmt.Fprintln(w, ".PHONY: droidcore") + fmt.Fprintln(w, "droidcore: checkapi") + + if dstubs.apiLintReport != nil { + fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", dstubs.Name()+"-api-lint", + dstubs.apiLintReport.String(), "apilint/"+dstubs.Name()+"-lint-report.txt") } } if dstubs.checkNullabilityWarningsTimestamp != nil { @@ -554,61 +659,76 @@ func (dstubs *Droidstubs) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, ".PHONY:", "droidcore") fmt.Fprintln(w, "droidcore: ", dstubs.Name()+"-check-nullability-warnings") } - apiFilePrefix := "INTERNAL_PLATFORM_" - if String(dstubs.properties.Api_tag_name) != "" { - apiFilePrefix += String(dstubs.properties.Api_tag_name) + "_" - } - if dstubs.apiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"API_FILE := ", dstubs.apiFile.String()) - } - if dstubs.dexApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"DEX_API_FILE := ", dstubs.dexApiFile.String()) - } - if dstubs.privateApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"PRIVATE_API_FILE := ", dstubs.privateApiFile.String()) - } - if dstubs.privateDexApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"PRIVATE_DEX_API_FILE := ", dstubs.privateDexApiFile.String()) - } - if dstubs.removedApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"REMOVED_API_FILE := ", dstubs.removedApiFile.String()) - } - if dstubs.removedDexApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"REMOVED_DEX_API_FILE := ", dstubs.removedDexApiFile.String()) - } - if dstubs.exactApiFile != nil { - fmt.Fprintln(w, apiFilePrefix+"EXACT_API_FILE := ", dstubs.exactApiFile.String()) - } }, }, - } + }} } -func androidMkWriteTestData(data android.Paths, ret *android.AndroidMkData) { +func (a *AndroidAppImport) AndroidMkEntries() []android.AndroidMkEntries { + return []android.AndroidMkEntries{android.AndroidMkEntries{ + Class: "APPS", + OutputFile: android.OptionalPathForPath(a.outputFile), + Include: "$(BUILD_SYSTEM)/soong_app_prebuilt.mk", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetBoolIfTrue("LOCAL_PRIVILEGED_MODULE", a.Privileged()) + entries.SetString("LOCAL_CERTIFICATE", a.certificate.AndroidMkString()) + entries.AddStrings("LOCAL_OVERRIDES_PACKAGES", a.properties.Overrides...) + if len(a.dexpreopter.builtInstalled) > 0 { + entries.SetString("LOCAL_SOONG_BUILT_INSTALLED", a.dexpreopter.builtInstalled) + } + entries.AddStrings("LOCAL_INSTALLED_MODULE_STEM", a.installPath.Rel()) + }, + }, + }} +} + +func (a *AndroidTestImport) AndroidMkEntries() []android.AndroidMkEntries { + entriesList := a.AndroidAppImport.AndroidMkEntries() + entries := &entriesList[0] + entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { + testSuiteComponent(entries, a.testProperties.Test_suites) + androidMkWriteTestData(a.data, entries) + }) + return entriesList +} + +func androidMkWriteTestData(data android.Paths, entries *android.AndroidMkEntries) { var testFiles []string for _, d := range data { testFiles = append(testFiles, d.String()+":"+d.Rel()) } - if len(testFiles) > 0 { - ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) { - fmt.Fprintln(w, "LOCAL_COMPATIBILITY_SUPPORT_FILES := "+strings.Join(testFiles, " ")) - }) - } + entries.AddStrings("LOCAL_COMPATIBILITY_SUPPORT_FILES", testFiles...) } -func (apkSet *AndroidAppSet) AndroidMk() android.AndroidMkData { - return android.AndroidMkData{ - Class: "APPS", - OutputFile: android.OptionalPathForPath(apkSet.packedOutput), - Include: "$(BUILD_SYSTEM)/soong_android_app_set.mk", - Extra: []android.AndroidMkExtraFunc{ - func(w io.Writer, outputFile android.Path) { - if apkSet.Privileged() { - fmt.Fprintln(w, "LOCAL_PRIVILEGED_MODULE := true") - } - fmt.Fprintln(w, "LOCAL_APK_SET_MASTER_FILE := ", apkSet.masterFile) - fmt.Fprintln(w, "LOCAL_APKCERTS_FILE := ", apkSet.apkcertsFile) - fmt.Fprintln(w, "LOCAL_OVERRIDES_PACKAGES :=", strings.Join(apkSet.properties.Overrides, " ")) +func (r *RuntimeResourceOverlay) AndroidMkEntries() []android.AndroidMkEntries { + return []android.AndroidMkEntries{android.AndroidMkEntries{ + Class: "ETC", + OutputFile: android.OptionalPathForPath(r.outputFile), + Include: "$(BUILD_SYSTEM)/soong_app_prebuilt.mk", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetString("LOCAL_CERTIFICATE", r.certificate.AndroidMkString()) + entries.SetPath("LOCAL_MODULE_PATH", r.installDir.ToMakePath()) + entries.AddStrings("LOCAL_OVERRIDES_PACKAGES", r.properties.Overrides...) + }, + }, + }} +} + +func (apkSet *AndroidAppSet) AndroidMkEntries() []android.AndroidMkEntries { + return []android.AndroidMkEntries{ + android.AndroidMkEntries{ + Class: "APPS", + OutputFile: android.OptionalPathForPath(apkSet.packedOutput), + Include: "$(BUILD_SYSTEM)/soong_android_app_set.mk", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(entries *android.AndroidMkEntries) { + entries.SetBoolIfTrue("LOCAL_PRIVILEGED_MODULE", apkSet.Privileged()) + entries.SetString("LOCAL_APK_SET_MASTER_FILE", apkSet.masterFile) + entries.SetPath("LOCAL_APKCERTS_FILE", apkSet.apkcertsFile) + entries.AddStrings("LOCAL_OVERRIDES_PACKAGES", apkSet.properties.Overrides...) + }, }, }, } |