diff options
259 files changed, 5244 insertions, 3693 deletions
diff --git a/aconfig/Android.bp b/aconfig/Android.bp index 6e2964a51..33e04a405 100644 --- a/aconfig/Android.bp +++ b/aconfig/Android.bp @@ -17,6 +17,7 @@ bootstrap_go_package { "aconfig_values.go", "aconfig_value_set.go", "all_aconfig_declarations.go", + "all_aconfig_declarations_extension.go", "exported_java_aconfig_library.go", "init.go", "testing.go", @@ -25,6 +26,7 @@ bootstrap_go_package { "aconfig_declarations_test.go", "aconfig_values_test.go", "aconfig_value_set_test.go", + "all_aconfig_declarations_extension_test.go", ], pluginFor: ["soong_build"], } @@ -34,13 +36,14 @@ bootstrap_go_package { // but other verticals/platforms can override via soong config setting. all_aconfig_declarations { name: "all_aconfig_declarations", - api_signature_files: select(soong_config_variable("android_aconfig", "opt_platform_api_srcs"), { - default: [ - ":frameworks-base-api-current.txt", - ":frameworks-base-api-system-current.txt", - ":frameworks-base-api-system-server-current.txt", - ":frameworks-base-api-module-lib-current.txt", - ], - }), + visibility: [ + "//vendor:__subpackages__", // for vendor extensions + ], + api_signature_files: [ + ":frameworks-base-api-current.txt", + ":frameworks-base-api-system-current.txt", + ":frameworks-base-api-system-server-current.txt", + ":frameworks-base-api-module-lib-current.txt", + ], finalized_flags_file: ":latest-finalized-flags", } diff --git a/aconfig/aconfig_declarations_test.go b/aconfig/aconfig_declarations_test.go index e89cd316f..c39008b74 100644 --- a/aconfig/aconfig_declarations_test.go +++ b/aconfig/aconfig_declarations_test.go @@ -37,7 +37,7 @@ func TestAconfigDeclarations(t *testing.T) { ` result := runTest(t, android.FixtureExpectsNoErrors, bp) - module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule) + module := result.ModuleForTests(t, "module_name", "").Module().(*DeclarationsModule) // Check that the provider has the right contents depData, _ := android.OtherModuleProvider(result, module, android.AconfigDeclarationsProviderKey) @@ -66,7 +66,7 @@ func TestAconfigDeclarationsWithExportableUnset(t *testing.T) { ` result := runTest(t, android.FixtureExpectsNoErrors, bp) - module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule) + module := result.ModuleForTests(t, "module_name", "").Module().(*DeclarationsModule) depData, _ := android.OtherModuleProvider(result, module, android.AconfigDeclarationsProviderKey) android.AssertBoolEquals(t, "exportable", depData.Exportable, false) } @@ -84,7 +84,7 @@ func TestAconfigDeclarationsWithContainer(t *testing.T) { ` result := runTest(t, android.FixtureExpectsNoErrors, bp) - module := result.ModuleForTests("module_name", "") + module := result.ModuleForTests(t, "module_name", "") rule := module.Rule("aconfig") android.AssertStringEquals(t, "rule must contain container", rule.Args["container"], "--container com.android.foo") } @@ -204,7 +204,7 @@ func TestGenerateAndroidBuildActions(t *testing.T) { fixture = fixture.ExtendWithErrorHandler(test.errorHandler) } result := fixture.RunTestWithBp(t, test.bp) - module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule) + module := result.ModuleForTests(t, "module_name", "").Module().(*DeclarationsModule) depData, _ := android.OtherModuleProvider(result, module, android.AconfigReleaseDeclarationsProviderKey) expectedKeys := []string{""} for _, rc := range strings.Split(test.buildFlags["RELEASE_ACONFIG_EXTRA_RELEASE_CONFIGS"], " ") { diff --git a/aconfig/aconfig_value_set_test.go b/aconfig/aconfig_value_set_test.go index 3b7281ec9..1f042442c 100644 --- a/aconfig/aconfig_value_set_test.go +++ b/aconfig/aconfig_value_set_test.go @@ -37,7 +37,7 @@ func TestAconfigValueSet(t *testing.T) { ` result := runTest(t, android.FixtureExpectsNoErrors, bp) - module := result.ModuleForTests("module_name", "").Module().(*ValueSetModule) + module := result.ModuleForTests(t, "module_name", "").Module().(*ValueSetModule) // Check that the provider has the right contents depData, _ := android.OtherModuleProvider(result, module, valueSetProviderKey) @@ -88,7 +88,7 @@ func TestAconfigValueSetBpGlob(t *testing.T) { checkModuleHasDependency := func(name, variant, dep string) bool { t.Helper() - module := result.ModuleForTests(name, variant).Module() + module := result.ModuleForTests(t, name, variant).Module() depFound := false result.VisitDirectDeps(module, func(m blueprint.Module) { if m.Name() == dep { diff --git a/aconfig/aconfig_values_test.go b/aconfig/aconfig_values_test.go index ddbea57a8..0bec14b4a 100644 --- a/aconfig/aconfig_values_test.go +++ b/aconfig/aconfig_values_test.go @@ -30,7 +30,7 @@ func TestAconfigValues(t *testing.T) { ` result := runTest(t, android.FixtureExpectsNoErrors, bp) - module := result.ModuleForTests("module_name", "").Module().(*ValuesModule) + module := result.ModuleForTests(t, "module_name", "").Module().(*ValuesModule) // Check that the provider has the right contents depData, _ := android.OtherModuleProvider(result, module, valuesProviderKey) diff --git a/aconfig/all_aconfig_declarations.go b/aconfig/all_aconfig_declarations.go index ec200997e..3d07e16dc 100644 --- a/aconfig/all_aconfig_declarations.go +++ b/aconfig/all_aconfig_declarations.go @@ -20,6 +20,7 @@ import ( "android/soong/android" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -37,12 +38,18 @@ func AllAconfigDeclarationsFactory() android.SingletonModule { return module } +type allAconfigDeclarationsInfo struct { + parsedFlagsFile android.Path +} + +var allAconfigDeclarationsInfoProvider = blueprint.NewProvider[allAconfigDeclarationsInfo]() + type allAconfigReleaseDeclarationsSingleton struct { intermediateBinaryProtoPath android.OutputPath intermediateTextProtoPath android.OutputPath } -type allAconfigReleaseDeclarationsProperties struct { +type ApiSurfaceContributorProperties struct { Api_signature_files proptools.Configurable[[]string] `android:"arch_variant,path"` Finalized_flags_file string `android:"arch_variant,path"` } @@ -51,7 +58,9 @@ type allAconfigDeclarationsSingleton struct { android.SingletonModuleBase releaseMap map[string]allAconfigReleaseDeclarationsSingleton - properties allAconfigReleaseDeclarationsProperties + properties ApiSurfaceContributorProperties + + finalizedFlags android.OutputPath } func (this *allAconfigDeclarationsSingleton) sortedConfigNames() []string { @@ -63,29 +72,38 @@ func (this *allAconfigDeclarationsSingleton) sortedConfigNames() []string { return names } -func (this *allAconfigDeclarationsSingleton) GenerateAndroidBuildActions(ctx android.ModuleContext) { +func GenerateFinalizedFlagsForApiSurface(ctx android.ModuleContext, outputPath android.WritablePath, + parsedFlagsFile android.Path, apiSurface ApiSurfaceContributorProperties) { + apiSignatureFiles := android.Paths{} - for _, apiSignatureFile := range this.properties.Api_signature_files.GetOrDefault(ctx, nil) { + for _, apiSignatureFile := range apiSurface.Api_signature_files.GetOrDefault(ctx, nil) { if path := android.PathForModuleSrc(ctx, apiSignatureFile); path != nil { apiSignatureFiles = append(apiSignatureFiles, path) } } - finalizedFlagsFile := android.PathForModuleSrc(ctx, this.properties.Finalized_flags_file) - parsedFlagsFile := android.PathForIntermediates(ctx, "all_aconfig_declarations.pb") - - output := android.PathForIntermediates(ctx, "finalized-flags.txt") + finalizedFlagsFile := android.PathForModuleSrc(ctx, apiSurface.Finalized_flags_file) ctx.Build(pctx, android.BuildParams{ Rule: RecordFinalizedFlagsRule, Inputs: append(apiSignatureFiles, finalizedFlagsFile, parsedFlagsFile), - Output: output, + Output: outputPath, Args: map[string]string{ "api_signature_files": android.JoinPathsWithPrefix(apiSignatureFiles, "--api-signature-file "), "finalized_flags_file": "--finalized-flags-file " + finalizedFlagsFile.String(), "parsed_flags_file": "--parsed-flags-file " + parsedFlagsFile.String(), }, }) - ctx.Phony("all_aconfig_declarations", output) +} + +func (this *allAconfigDeclarationsSingleton) GenerateAndroidBuildActions(ctx android.ModuleContext) { + parsedFlagsFile := android.PathForIntermediates(ctx, "all_aconfig_declarations.pb") + this.finalizedFlags = android.PathForIntermediates(ctx, "finalized-flags.txt") + GenerateFinalizedFlagsForApiSurface(ctx, this.finalizedFlags, parsedFlagsFile, this.properties) + ctx.Phony("all_aconfig_declarations", this.finalizedFlags) + + android.SetProvider(ctx, allAconfigDeclarationsInfoProvider, allAconfigDeclarationsInfo{ + parsedFlagsFile: parsedFlagsFile, + }) } func (this *allAconfigDeclarationsSingleton) GenerateSingletonBuildActions(ctx android.SingletonContext) { @@ -144,9 +162,7 @@ func (this *allAconfigDeclarationsSingleton) GenerateSingletonBuildActions(ctx a }) ctx.Phony("all_aconfig_declarations_textproto", this.releaseMap[rcName].intermediateTextProtoPath) } -} -func (this *allAconfigDeclarationsSingleton) MakeVars(ctx android.MakeVarsContext) { for _, rcName := range this.sortedConfigNames() { ctx.DistForGoal("droid", this.releaseMap[rcName].intermediateBinaryProtoPath) for _, goal := range []string{"docs", "droid", "sdk"} { @@ -154,5 +170,5 @@ func (this *allAconfigDeclarationsSingleton) MakeVars(ctx android.MakeVarsContex ctx.DistForGoalWithFilename(goal, this.releaseMap[rcName].intermediateTextProtoPath, assembleFileName(rcName, "flags.textproto")) } } - ctx.DistForGoalWithFilename("sdk", android.PathForIntermediates(ctx, "finalized-flags.txt"), "finalized-flags.txt") + ctx.DistForGoalWithFilename("sdk", this.finalizedFlags, "finalized-flags.txt") } diff --git a/aconfig/all_aconfig_declarations_extension.go b/aconfig/all_aconfig_declarations_extension.go new file mode 100644 index 000000000..d5a458811 --- /dev/null +++ b/aconfig/all_aconfig_declarations_extension.go @@ -0,0 +1,88 @@ +// Copyright 2025 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aconfig + +import ( + "android/soong/android" + "path" + + "github.com/google/blueprint" + "github.com/google/blueprint/proptools" +) + +func AllAconfigDeclarationsExtensionFactory() android.Module { + module := &allAconfigDeclarationsExtension{} + module.AddProperties(&module.properties) + android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) + return module +} + +type allAconfigDeclarationsExtensionProperties struct { + // all_aconfig_declarations module that this module extends. Defaults to + // all_aconfig_declarations. + Base *string + + // Directory where the dist artifact should be placed in. + Dist_dir *string + + ApiSurfaceContributorProperties +} + +type allAconfigDeclarationsExtension struct { + android.ModuleBase + + properties allAconfigDeclarationsExtensionProperties + + finalizedFlags android.ModuleOutPath +} + +type allAconfigDeclarationsDependencyTagStruct struct { + blueprint.BaseDependencyTag +} + +var allAconfigDeclarationsDependencyTag allAconfigDeclarationsDependencyTagStruct + +func (ext *allAconfigDeclarationsExtension) DepsMutator(ctx android.BottomUpMutatorContext) { + ctx.AddDependency(ctx.Module(), allAconfigDeclarationsDependencyTag, proptools.StringDefault(ext.properties.Base, "all_aconfig_declarations")) +} + +func (ext *allAconfigDeclarationsExtension) GenerateAndroidBuildActions(ctx android.ModuleContext) { + + var parsedFlagsFile android.Path + ctx.VisitDirectDepsProxyWithTag(allAconfigDeclarationsDependencyTag, func(proxy android.ModuleProxy) { + if info, ok := android.OtherModuleProvider(ctx, proxy, allAconfigDeclarationsInfoProvider); ok { + parsedFlagsFile = info.parsedFlagsFile + } else { + ctx.PropertyErrorf("base", "base must provide allAconfigDeclarationsInfo") + } + }) + + ext.finalizedFlags = android.PathForModuleOut(ctx, "finalized-flags.txt") + + GenerateFinalizedFlagsForApiSurface(ctx, + ext.finalizedFlags, + parsedFlagsFile, + ext.properties.ApiSurfaceContributorProperties, + ) + + ctx.Phony(ctx.ModuleName(), ext.finalizedFlags) + + ctx.DistForGoalWithFilename("sdk", ext.finalizedFlags, path.Join(proptools.String(ext.properties.Dist_dir), "finalized-flags.txt")) + + // This module must not set any provider or call `ctx.SetOutputFiles`! + // This module is only used to depend on the singleton module all_aconfig_declarations and + // generate the custom finalized-flags.txt file in dist builds, and should not be depended + // by other modules. +} diff --git a/aconfig/all_aconfig_declarations_extension_test.go b/aconfig/all_aconfig_declarations_extension_test.go new file mode 100644 index 000000000..5bd99d0c9 --- /dev/null +++ b/aconfig/all_aconfig_declarations_extension_test.go @@ -0,0 +1,50 @@ +// Copyright 2025 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aconfig + +import ( + "strings" + "testing" + + "android/soong/android" +) + +func TestAllAconfigDeclarationsExtension(t *testing.T) { + result := android.GroupFixturePreparers( + PrepareForTestWithAconfigBuildComponents, + android.FixtureMergeMockFs( + android.MockFS{ + "a.txt": nil, + "flags.txt": nil, + }, + ), + ).RunTestWithBp(t, ` + all_aconfig_declarations { + name: "all_aconfig_declarations", + } + + all_aconfig_declarations_extension { + name: "custom_aconfig_declarations", + base: "all_aconfig_declarations", + api_signature_files: [ + "a.txt", + ], + finalized_flags_file: "flags.txt", + } + `) + + finalizedFlags := result.ModuleForTests(t, "custom_aconfig_declarations", "").Output("finalized-flags.txt") + android.AssertStringContainsEquals(t, "must depend on all_aconfig_declarations", strings.Join(finalizedFlags.Inputs.Strings(), " "), "all_aconfig_declarations.pb", true) +} diff --git a/aconfig/build_flags/build_flags_singleton.go b/aconfig/build_flags/build_flags_singleton.go index 3b407556f..e375d9c70 100644 --- a/aconfig/build_flags/build_flags_singleton.go +++ b/aconfig/build_flags/build_flags_singleton.go @@ -16,6 +16,7 @@ package build_flags import ( "android/soong/android" + "fmt" ) // A singleton module that collects all of the build flags declared in the @@ -110,9 +111,7 @@ func (this *allBuildFlagDeclarationsSingleton) GenerateBuildActions(ctx android. this.configsBinaryProtoPath, this.configsTextProtoPath, ) -} -func (this *allBuildFlagDeclarationsSingleton) MakeVars(ctx android.MakeVarsContext) { ctx.DistForGoal("droid", this.flagsBinaryProtoPath) for _, goal := range []string{"docs", "droid", "sdk", "release_config_metadata"} { ctx.DistForGoalWithFilename(goal, this.flagsBinaryProtoPath, "build_flags/all_flags.pb") @@ -120,4 +119,26 @@ func (this *allBuildFlagDeclarationsSingleton) MakeVars(ctx android.MakeVarsCont ctx.DistForGoalWithFilename(goal, this.configsBinaryProtoPath, "build_flags/all_release_config_contributions.pb") ctx.DistForGoalWithFilename(goal, this.configsTextProtoPath, "build_flags/all_release_config_contributions.textproto") } + + if ctx.Config().HasDeviceProduct() { + flagsDir := android.PathForOutput(ctx, "release-config") + baseAllRelease := fmt.Sprintf("all_release_configs-%s", ctx.Config().DeviceProduct()) + + distAllReleaseConfigsArtifact := func(ext string) { + ctx.DistForGoalWithFilename( + "droid", + flagsDir.Join(ctx, fmt.Sprintf("%s.%s", baseAllRelease, ext)), + fmt.Sprintf("build_flags/all_release_configs.%s", ext), + ) + } + + distAllReleaseConfigsArtifact("pb") + distAllReleaseConfigsArtifact("textproto") + distAllReleaseConfigsArtifact("json") + ctx.DistForGoalWithFilename( + "droid", + flagsDir.Join(ctx, fmt.Sprintf("inheritance_graph-%s.dot", ctx.Config().DeviceProduct())), + fmt.Sprintf("build_flags/inheritance_graph-%s.dot", ctx.Config().DeviceProduct()), + ) + } } diff --git a/aconfig/codegen/aconfig_declarations_group_test.go b/aconfig/codegen/aconfig_declarations_group_test.go index ef954ce24..c822ef8a9 100644 --- a/aconfig/codegen/aconfig_declarations_group_test.go +++ b/aconfig/codegen/aconfig_declarations_group_test.go @@ -74,7 +74,7 @@ func TestAconfigDeclarationsGroup(t *testing.T) { // Check if srcjar files are correctly passed to the reverse dependency of // aconfig_declarations_group module - bazModule := result.ModuleForTests("baz", "android_common") + bazModule := result.ModuleForTests(t, "baz", "android_common") bazJavacSrcjars := bazModule.Rule("javac").Args["srcJars"] errorMessage := "baz javac argument expected to contain srcjar provided by aconfig_declrations_group" android.AssertStringDoesContain(t, errorMessage, bazJavacSrcjars, "foo-java.srcjar") diff --git a/aconfig/codegen/cc_aconfig_library_test.go b/aconfig/codegen/cc_aconfig_library_test.go index 7c7037a6a..5cb3f8b33 100644 --- a/aconfig/codegen/cc_aconfig_library_test.go +++ b/aconfig/codegen/cc_aconfig_library_test.go @@ -81,7 +81,7 @@ func testCCCodegenModeHelper(t *testing.T, bpMode string, ruleMode string) { } `, bpMode)) - module := result.ModuleForTests("my_cc_aconfig_library", "android_arm64_armv8-a_shared") + module := result.ModuleForTests(t, "my_cc_aconfig_library", "android_arm64_armv8-a_shared") rule := module.Rule("cc_aconfig_library") android.AssertStringEquals(t, "rule must contain test mode", rule.Args["mode"], ruleMode) } @@ -209,7 +209,7 @@ func TestAndroidMkCcLibrary(t *testing.T) { cc.PrepareForTestWithCcDefaultModules). ExtendWithErrorHandler(android.FixtureExpectsNoErrors).RunTestWithBp(t, bp) - module := result.ModuleForTests("my_cc_library", "android_vendor_arm64_armv8-a_shared").Module() + module := result.ModuleForTests(t, "my_cc_library", "android_vendor_arm64_armv8-a_shared").Module() entry := android.AndroidMkInfoForTest(t, result.TestContext, module).PrimaryInfo @@ -254,7 +254,7 @@ func TestForceReadOnly(t *testing.T) { } `)) - module := result.ModuleForTests("my_cc_aconfig_library", "android_arm64_armv8-a_shared").Module() + module := result.ModuleForTests(t, "my_cc_aconfig_library", "android_arm64_armv8-a_shared").Module() dependOnReadLib := false result.VisitDirectDeps(module, func(dep blueprint.Module) { if dep.Name() == libAconfigStorageReadApiCcDep { diff --git a/aconfig/codegen/java_aconfig_library_test.go b/aconfig/codegen/java_aconfig_library_test.go index d8372f3c9..8854369e2 100644 --- a/aconfig/codegen/java_aconfig_library_test.go +++ b/aconfig/codegen/java_aconfig_library_test.go @@ -57,7 +57,7 @@ func runJavaAndroidMkTest(t *testing.T, bp string) { } `) - module := result.ModuleForTests("my_module", "android_common").Module() + module := result.ModuleForTests(t, "my_module", "android_common").Module() entry := android.AndroidMkEntriesForTest(t, result.TestContext, module)[0] @@ -189,7 +189,7 @@ func testCodegenMode(t *testing.T, bpMode string, ruleMode string) { } `, bpMode)) - module := result.ModuleForTests("my_java_aconfig_library", "android_common") + module := result.ModuleForTests(t, "my_java_aconfig_library", "android_common") rule := module.Rule("java_aconfig_library") android.AssertStringEquals(t, "rule must contain test mode", rule.Args["mode"], ruleMode) } @@ -282,7 +282,7 @@ func TestMkEntriesMatchedContainer(t *testing.T) { } `) - module := result.ModuleForTests("my_module", "android_common").Module() + module := result.ModuleForTests(t, "my_module", "android_common").Module() entry := android.AndroidMkEntriesForTest(t, result.TestContext, module)[0] makeVar := entry.EntryMap["LOCAL_ACONFIG_FILES"] android.EnsureListContainsSuffix(t, makeVar, "my_aconfig_declarations_foo/intermediate.pb") diff --git a/aconfig/codegen/rust_aconfig_library_test.go b/aconfig/codegen/rust_aconfig_library_test.go index 523b464c0..670102128 100644 --- a/aconfig/codegen/rust_aconfig_library_test.go +++ b/aconfig/codegen/rust_aconfig_library_test.go @@ -57,13 +57,13 @@ func TestRustAconfigLibrary(t *testing.T) { } `)) - sourceVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_source") + sourceVariant := result.ModuleForTests(t, "libmy_rust_aconfig_library", "android_arm64_armv8-a_source") rule := sourceVariant.Rule("rust_aconfig_library") android.AssertStringEquals(t, "rule must contain production mode", rule.Args["mode"], "production") - dylibVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_dylib") - rlibRlibStdVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_rlib_rlib-std") - rlibDylibStdVariant := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_rlib_dylib-std") + dylibVariant := result.ModuleForTests(t, "libmy_rust_aconfig_library", "android_arm64_armv8-a_dylib") + rlibRlibStdVariant := result.ModuleForTests(t, "libmy_rust_aconfig_library", "android_arm64_armv8-a_rlib_rlib-std") + rlibDylibStdVariant := result.ModuleForTests(t, "libmy_rust_aconfig_library", "android_arm64_armv8-a_rlib_dylib-std") variants := []android.TestingModule{ dylibVariant, @@ -143,7 +143,7 @@ func testRustCodegenModeHelper(t *testing.T, bpMode string, ruleMode string) { } `, bpMode)) - module := result.ModuleForTests("libmy_rust_aconfig_library", "android_arm64_armv8-a_source") + module := result.ModuleForTests(t, "libmy_rust_aconfig_library", "android_arm64_armv8-a_source") rule := module.Rule("rust_aconfig_library") android.AssertStringEquals(t, "rule must contain test mode", rule.Args["mode"], ruleMode) } diff --git a/aconfig/exported_java_aconfig_library.go b/aconfig/exported_java_aconfig_library.go index dd068d10a..63d824a88 100644 --- a/aconfig/exported_java_aconfig_library.go +++ b/aconfig/exported_java_aconfig_library.go @@ -63,8 +63,5 @@ func (this *exportedJavaDeclarationsLibrarySingleton) GenerateBuildActions(ctx a }, }) ctx.Phony("exported_java_aconfig_library", this.intermediatePath) -} - -func (this *exportedJavaDeclarationsLibrarySingleton) MakeVars(ctx android.MakeVarsContext) { ctx.DistForGoalWithFilename("sdk", this.intermediatePath, "android-flags.jar") } diff --git a/aconfig/init.go b/aconfig/init.go index 3dcec5cd8..b2fe5a309 100644 --- a/aconfig/init.go +++ b/aconfig/init.go @@ -104,6 +104,7 @@ var ( ` --mode=exported` + ` --allow-instrumentation ${use_new_storage}` + ` --new-exported ${use_new_exported}` + + ` --single-exported-file true` + ` --check-api-level ${check_api_level}` + ` --out ${out}.tmp; ` + ` fi ` + @@ -131,4 +132,5 @@ func RegisterBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory) ctx.RegisterSingletonModuleType("all_aconfig_declarations", AllAconfigDeclarationsFactory) ctx.RegisterParallelSingletonType("exported_java_aconfig_library", ExportedJavaDeclarationsLibraryFactory) + ctx.RegisterModuleType("all_aconfig_declarations_extension", AllAconfigDeclarationsExtensionFactory) } diff --git a/aidl_library/aidl_library_test.go b/aidl_library/aidl_library_test.go index 166045635..63a08b9b1 100644 --- a/aidl_library/aidl_library_test.go +++ b/aidl_library/aidl_library_test.go @@ -46,7 +46,7 @@ func TestAidlLibrary(t *testing.T) { }.AddToFixture(), ).RunTest(t).TestContext - foo := ctx.ModuleForTests("foo", "").Module().(*AidlLibrary) + foo := ctx.ModuleForTests(t, "foo", "").Module().(*AidlLibrary) actualInfo, _ := android.OtherModuleProvider(ctx, foo, AidlLibraryProvider) android.AssertArrayString( @@ -95,7 +95,7 @@ func TestAidlLibraryWithoutStripImportPrefix(t *testing.T) { }.AddToFixture(), ).RunTest(t).TestContext - foo := ctx.ModuleForTests("foo", "").Module().(*AidlLibrary) + foo := ctx.ModuleForTests(t, "foo", "").Module().(*AidlLibrary) actualInfo, _ := android.OtherModuleProvider(ctx, foo, AidlLibraryProvider) android.AssertArrayString( diff --git a/android/Android.bp b/android/Android.bp index d27a8facf..aef18fec0 100644 --- a/android/Android.bp +++ b/android/Android.bp @@ -11,6 +11,7 @@ bootstrap_go_package { "blueprint-depset", "blueprint-gobtools", "blueprint-metrics", + "blueprint-pool", "sbox_proto", "soong", "soong-android_team_proto", @@ -125,7 +126,6 @@ bootstrap_go_package { "all_teams_test.go", "android_test.go", "androidmk_test.go", - "apex_test.go", "arch_test.go", "blueprint_e2e_test.go", "build_prop_test.go", @@ -141,6 +141,7 @@ bootstrap_go_package { "license_kind_test.go", "license_test.go", "licenses_test.go", + "makevars_test.go", "module_test.go", "mutator_test.go", "namespace_test.go", diff --git a/android/all_teams.go b/android/all_teams.go index 01be396d5..3b20107b9 100644 --- a/android/all_teams.go +++ b/android/all_teams.go @@ -134,9 +134,6 @@ func (t *allTeamsSingleton) GenerateBuildActions(ctx SingletonContext) { WriteFileRuleVerbatim(ctx, t.outputPath, string(data)) ctx.Phony("all_teams", t.outputPath) -} - -func (t *allTeamsSingleton) MakeVars(ctx MakeVarsContext) { ctx.DistForGoal("all_teams", t.outputPath) } diff --git a/android/all_teams_test.go b/android/all_teams_test.go index fa8c048d0..3b200f60d 100644 --- a/android/all_teams_test.go +++ b/android/all_teams_test.go @@ -131,7 +131,7 @@ func TestAllTeams(t *testing.T) { func getTeamProtoOutput(t *testing.T, ctx *TestResult) *team_proto.AllTeams { teams := new(team_proto.AllTeams) - config := ctx.SingletonForTests("all_teams") + config := ctx.SingletonForTests(t, "all_teams") allOutputs := config.AllOutputs() protoPath := allOutputs[0] diff --git a/android/androidmk.go b/android/androidmk.go index cf1589d3a..7d6b05673 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -64,7 +64,6 @@ type AndroidMkDataProvider interface { type AndroidMkData struct { Class string SubName string - DistFiles TaggedDistFiles OutputFile OptionalPath Disabled bool Include string @@ -719,22 +718,26 @@ func AndroidMkSingleton() Singleton { type androidMkSingleton struct{} -func (c *androidMkSingleton) GenerateBuildActions(ctx SingletonContext) { - var androidMkModulesList []blueprint.Module +func allModulesSorted(ctx SingletonContext) []blueprint.Module { + var allModules []blueprint.Module ctx.VisitAllModulesBlueprint(func(module blueprint.Module) { - androidMkModulesList = append(androidMkModulesList, module) + allModules = append(allModules, module) }) // Sort the module list by the module names to eliminate random churns, which may erroneously // invoke additional build processes. - sort.SliceStable(androidMkModulesList, func(i, j int) bool { - return ctx.ModuleName(androidMkModulesList[i]) < ctx.ModuleName(androidMkModulesList[j]) + sort.SliceStable(allModules, func(i, j int) bool { + return ctx.ModuleName(allModules[i]) < ctx.ModuleName(allModules[j]) }) - // If running in soong-only mode, do a different, more limited version of this singleton + return allModules +} + +func (c *androidMkSingleton) GenerateBuildActions(ctx SingletonContext) { + // If running in soong-only mode, more limited version of this singleton is run as + // soong only androidmk singleton if !ctx.Config().KatiEnabled() { - c.soongOnlyBuildActions(ctx, androidMkModulesList) return } @@ -745,7 +748,7 @@ func (c *androidMkSingleton) GenerateBuildActions(ctx SingletonContext) { moduleInfoJSON := PathForOutput(ctx, "module-info"+String(ctx.Config().productVariables.Make_suffix)+".json") - err := translateAndroidMk(ctx, absolutePath(transMk.String()), moduleInfoJSON, androidMkModulesList) + err := translateAndroidMk(ctx, absolutePath(transMk.String()), moduleInfoJSON, allModulesSorted(ctx)) if err != nil { ctx.Errorf(err.Error()) } @@ -756,12 +759,44 @@ func (c *androidMkSingleton) GenerateBuildActions(ctx SingletonContext) { }) } +type soongOnlyAndroidMkSingleton struct { + Singleton +} + +func soongOnlyAndroidMkSingletonFactory() Singleton { + return &soongOnlyAndroidMkSingleton{} +} + +func (so *soongOnlyAndroidMkSingleton) GenerateBuildActions(ctx SingletonContext) { + if !ctx.Config().KatiEnabled() { + so.soongOnlyBuildActions(ctx, allModulesSorted(ctx)) + } +} + // In soong-only mode, we don't do most of the androidmk stuff. But disted files are still largely // defined through the androidmk mechanisms, so this function is an alternate implementation of // the androidmk singleton that just focuses on getting the dist contributions -func (c *androidMkSingleton) soongOnlyBuildActions(ctx SingletonContext, mods []blueprint.Module) { +func (so *soongOnlyAndroidMkSingleton) soongOnlyBuildActions(ctx SingletonContext, mods []blueprint.Module) { allDistContributions, moduleInfoJSONs := getSoongOnlyDataFromMods(ctx, mods) + for _, provider := range append(makeVarsInitProviders, *getSingletonMakevarsProviders(ctx.Config())...) { + mctx := &makeVarsContext{ + SingletonContext: ctx, + pctx: provider.pctx, + } + provider.call(mctx) + if contribution := distsToDistContributions(mctx.dists); contribution != nil { + allDistContributions = append(allDistContributions, *contribution) + } + } + + singletonDists := getSingletonDists(ctx.Config()) + singletonDists.lock.Lock() + if contribution := distsToDistContributions(singletonDists.dists); contribution != nil { + allDistContributions = append(allDistContributions, *contribution) + } + singletonDists.lock.Unlock() + // Build module-info.json. Only in builds with HasDeviceProduct(), as we need a named // device to have a TARGET_OUT folder. if ctx.Config().HasDeviceProduct() { @@ -840,24 +875,24 @@ func writeValueIfChanged(ctx SingletonContext, path string, value string) { } } -func getMakeVarsDistContributions(mctx *makeVarsContext) *distContributions { - if len(mctx.dists) == 0 { +func distsToDistContributions(dists []dist) *distContributions { + if len(dists) == 0 { return nil } copyGoals := []*copiesForGoals{} - for _, dist := range mctx.dists { + for _, dist := range dists { for _, goal := range dist.goals { - copy := &copiesForGoals{} - copy.goals = goal - copy.copies = dist.paths - copyGoals = append(copyGoals, copy) + copyGoals = append(copyGoals, &copiesForGoals{ + goals: goal, + copies: dist.paths, + }) } } - contribution := &distContributions{} - contribution.copiesForGoals = copyGoals - return contribution + return &distContributions{ + copiesForGoals: copyGoals, + } } // getSoongOnlyDataFromMods gathers data from the given modules needed in soong-only builds. @@ -866,6 +901,12 @@ func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module) var allDistContributions []distContributions var moduleInfoJSONs []*ModuleInfoJSON for _, mod := range mods { + if distInfo, ok := OtherModuleProvider(ctx, mod, DistProvider); ok { + if contribution := distsToDistContributions(distInfo.Dists); contribution != nil { + allDistContributions = append(allDistContributions, *contribution) + } + } + if amod, ok := mod.(Module); ok && shouldSkipAndroidMkProcessing(ctx, amod.base()) { continue } @@ -892,13 +933,7 @@ func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module) } } } else { - mctx := &makeVarsContext{ - SingletonContext: ctx.(SingletonContext), - config: ctx.Config(), - pctx: pctx, - } - switch x := mod.(type) { - case AndroidMkDataProvider: + if x, ok := mod.(AndroidMkDataProvider); ok { data := x.AndroidMk() if data.Include == "" { @@ -915,7 +950,8 @@ func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module) if contribution := data.Entries.getDistContributions(mod); contribution != nil { allDistContributions = append(allDistContributions, *contribution) } - case AndroidMkEntriesProvider: + } + if x, ok := mod.(AndroidMkEntriesProvider); ok { entriesList := x.AndroidMkEntries() for _, entries := range entriesList { entries.fillInEntries(ctx, mod) @@ -929,23 +965,31 @@ func getSoongOnlyDataFromMods(ctx fillInEntriesContext, mods []blueprint.Module) allDistContributions = append(allDistContributions, *contribution) } } - case ModuleMakeVarsProvider: + } + if x, ok := mod.(ModuleMakeVarsProvider); ok { + mctx := &makeVarsContext{ + SingletonContext: ctx.(SingletonContext), + config: ctx.Config(), + pctx: pctx, + } if !x.Enabled(ctx) { continue } x.MakeVars(mctx) - if contribution := getMakeVarsDistContributions(mctx); contribution != nil { + if contribution := distsToDistContributions(mctx.dists); contribution != nil { allDistContributions = append(allDistContributions, *contribution) } - - case SingletonMakeVarsProvider: + } + if x, ok := mod.(SingletonMakeVarsProvider); ok { + mctx := &makeVarsContext{ + SingletonContext: ctx.(SingletonContext), + config: ctx.Config(), + pctx: pctx, + } x.MakeVars(mctx) - if contribution := getMakeVarsDistContributions(mctx); contribution != nil { + if contribution := distsToDistContributions(mctx.dists); contribution != nil { allDistContributions = append(allDistContributions, *contribution) } - - default: - // Not exported to make so no make variables to set. } } } @@ -1048,7 +1092,6 @@ func (data *AndroidMkData) fillInData(ctx fillInEntriesContext, mod blueprint.Mo data.Entries = AndroidMkEntries{ Class: data.Class, SubName: data.SubName, - DistFiles: data.DistFiles, OutputFile: data.OutputFile, Disabled: data.Disabled, Include: data.Include, diff --git a/android/androidmk_test.go b/android/androidmk_test.go index f63b227eb..0a81fb8bf 100644 --- a/android/androidmk_test.go +++ b/android/androidmk_test.go @@ -144,7 +144,7 @@ func buildContextAndCustomModuleFoo(t *testing.T, bp string) (*TestContext, *cus FixtureWithRootAndroidBp(bp), ).RunTest(t) - module := result.ModuleForTests("foo", "").Module().(*customModule) + module := result.ModuleForTests(t, "foo", "").Module().(*customModule) return result.TestContext, module } diff --git a/android/apex.go b/android/apex.go index c2f73a9c1..91fa2c718 100644 --- a/android/apex.go +++ b/android/apex.go @@ -17,7 +17,6 @@ package android import ( "fmt" "slices" - "sort" "strconv" "strings" "sync" @@ -55,18 +54,30 @@ type ApexInfo struct { // to true. UsePlatformApis bool - // List of Apex variant names that this module is associated with. This initially is the - // same as the `ApexVariationName` field. Then when multiple apex variants are merged in - // mergeApexVariations, ApexInfo struct of the merged variant holds the list of apexBundles - // that are merged together. - InApexVariants []string - // True if this is for a prebuilt_apex. // // If true then this will customize the apex processing to make it suitable for handling // prebuilt_apex, e.g. it will prevent ApexInfos from being merged together. // - // See Prebuilt.ApexInfoMutator for more information. + // Unlike the source apex module type the prebuilt_apex module type cannot share compatible variants + // across prebuilt_apex modules. That is because there is no way to determine whether two + // prebuilt_apex modules that export files for the same module are compatible. e.g. they could have + // been built from different source at different times or they could have been built with different + // build options that affect the libraries. + // + // While it may be possible to provide sufficient information to determine whether two prebuilt_apex + // modules were compatible it would be a lot of work and would not provide much benefit for a couple + // of reasons: + // - The number of prebuilt_apex modules that will be exporting files for the same module will be + // low as the prebuilt_apex only exports files for the direct dependencies that require it and + // very few modules are direct dependencies of multiple prebuilt_apex modules, e.g. there are a + // few com.android.art* apex files that contain the same contents and could export files for the + // same modules but only one of them needs to do so. Contrast that with source apex modules which + // need apex specific variants for every module that contributes code to the apex, whether direct + // or indirect. + // - The build cost of a prebuilt_apex variant is generally low as at worst it will involve some + // extra copying of files. Contrast that with source apex modules that has to build each variant + // from source. ForPrebuiltApex bool // Returns the name of the overridden apex (com.android.foo) @@ -74,24 +85,36 @@ type ApexInfo struct { // Returns the value of `apex_available_name` ApexAvailableName string +} - // Returns the apex names that this module is available for - ApexAvailableFor []string +func (a ApexInfo) Variation() string { + return a.ApexVariationName } -// AllApexInfo holds the ApexInfo of all apexes that include this module. -type AllApexInfo struct { - ApexInfos []ApexInfo +// Minimize is called during a transition from a module with a unique variation per apex to a module that should +// share variations between apexes. It returns a minimized ApexInfo that removes any apex names and replaces +// the variation name with one computed from the remaining properties. +func (a ApexInfo) Minimize() ApexInfo { + info := ApexInfo{ + MinSdkVersion: a.MinSdkVersion, + UsePlatformApis: a.UsePlatformApis, + } + info.ApexVariationName = info.mergedName() + return info +} + +type ApexAvailableInfo struct { + // Returns the apex names that this module is available for + ApexAvailableFor []string } var ApexInfoProvider = blueprint.NewMutatorProvider[ApexInfo]("apex_mutate") -var AllApexInfoProvider = blueprint.NewMutatorProvider[*AllApexInfo]("apex_info") +var ApexAvailableInfoProvider = blueprint.NewMutatorProvider[ApexAvailableInfo]("apex_mutate") func (i ApexInfo) AddJSONData(d *map[string]interface{}) { (*d)["Apex"] = map[string]interface{}{ "ApexVariationName": i.ApexVariationName, "MinSdkVersion": i.MinSdkVersion, - "InApexVariants": i.InApexVariants, "ForPrebuiltApex": i.ForPrebuiltApex, } } @@ -117,38 +140,24 @@ func (i ApexInfo) IsForPlatform() bool { return i.ApexVariationName == "" } -// InApexVariant tells whether this apex variant of the module is part of the given apexVariant or -// not. -func (i ApexInfo) InApexVariant(apexVariant string) bool { - for _, a := range i.InApexVariants { - if a == apexVariant { - return true - } - } - return false -} - // To satisfy the comparable interface func (i ApexInfo) Equal(other any) bool { otherApexInfo, ok := other.(ApexInfo) return ok && i.ApexVariationName == otherApexInfo.ApexVariationName && i.MinSdkVersion == otherApexInfo.MinSdkVersion && i.Updatable == otherApexInfo.Updatable && - i.UsePlatformApis == otherApexInfo.UsePlatformApis && - slices.Equal(i.InApexVariants, otherApexInfo.InApexVariants) + i.UsePlatformApis == otherApexInfo.UsePlatformApis } // ApexBundleInfo contains information about the dependencies of an apex type ApexBundleInfo struct { } -var ApexBundleInfoProvider = blueprint.NewMutatorProvider[ApexBundleInfo]("apex_info") +var ApexBundleInfoProvider = blueprint.NewMutatorProvider[ApexBundleInfo]("apex_mutate") -// DepIsInSameApex defines an interface that should be used to determine whether a given dependency -// should be considered as part of the same APEX as the current module or not. Note: this was -// extracted from ApexModule to make it easier to define custom subsets of the ApexModule interface -// and improve code navigation within the IDE. -type DepIsInSameApex interface { +// DepInSameApexChecker defines an interface that should be used to determine whether a given dependency +// should be considered as part of the same APEX as the current module or not. +type DepInSameApexChecker interface { // OutgoingDepIsInSameApex tests if the module depended on via 'tag' is considered as part of // the same APEX as this module. For example, a static lib dependency usually returns true here, while a // shared lib dependency to a stub library returns false. @@ -170,6 +179,15 @@ type DepIsInSameApex interface { IncomingDepIsInSameApex(tag blueprint.DependencyTag) bool } +// DepInSameApexInfo is a provider that wraps around a DepInSameApexChecker that can be +// used to check if a dependency belongs to the same apex as the module when walking +// through the dependencies of a module. +type DepInSameApexInfo struct { + Checker DepInSameApexChecker +} + +var DepInSameApexInfoProvider = blueprint.NewMutatorProvider[DepInSameApexInfo]("apex_unique") + func IsDepInSameApex(ctx BaseModuleContext, module, dep Module) bool { depTag := ctx.OtherModuleDependencyTag(dep) if _, ok := depTag.(ExcludeFromApexContentsTag); ok { @@ -178,12 +196,23 @@ func IsDepInSameApex(ctx BaseModuleContext, module, dep Module) bool { return false } - if m, ok := module.(DepIsInSameApex); ok && !m.OutgoingDepIsInSameApex(depTag) { - return false + if !ctx.EqualModules(ctx.Module(), module) { + if moduleInfo, ok := OtherModuleProvider(ctx, module, DepInSameApexInfoProvider); ok { + if !moduleInfo.Checker.OutgoingDepIsInSameApex(depTag) { + return false + } + } + } else { + if m, ok := ctx.Module().(ApexModule); ok && !m.GetDepInSameApexChecker().OutgoingDepIsInSameApex(depTag) { + return false + } } - if d, ok := dep.(DepIsInSameApex); ok && !d.IncomingDepIsInSameApex(depTag) { - return false + if depInfo, ok := OtherModuleProvider(ctx, dep, DepInSameApexInfoProvider); ok { + if !depInfo.Checker.IncomingDepIsInSameApex(depTag) { + return false + } } + return true } @@ -202,7 +231,6 @@ func IsDepInSameApex(ctx BaseModuleContext, module, dep Module) bool { // mergedName) when the two APEXes have the same min_sdk_version requirement. type ApexModule interface { Module - DepIsInSameApex apexModuleBase() *ApexModuleBase @@ -254,16 +282,15 @@ type ApexModule interface { // check-platform-availability mutator in the apex package. SetNotAvailableForPlatform() - // Returns nil (success) if this module should support the given sdk version. Returns an - // error if not. No default implementation is provided for this method. A module type - // implementing this interface should provide an implementation. A module supports an sdk - // version when the module's min_sdk_version is equal to or less than the given sdk version. - ShouldSupportSdkVersion(ctx BaseModuleContext, sdkVersion ApiLevel) error + // Returns the min sdk version that the module supports, . + MinSdkVersionSupported(ctx BaseModuleContext) ApiLevel // Returns true if this module needs a unique variation per apex, effectively disabling the // deduping. This is turned on when, for example if use_apex_name_macro is set so that each // apex variant should be built with different macro definitions. UniqueApexVariations() bool + + GetDepInSameApexChecker() DepInSameApexChecker } // Properties that are common to all module types implementing ApexModule interface. @@ -315,6 +342,61 @@ type ApexModuleBase struct { apexInfosLock sync.Mutex // protects apexInfos during parallel apexInfoMutator } +func (m *ApexModuleBase) ApexTransitionMutatorSplit(ctx BaseModuleContext) []ApexInfo { + return []ApexInfo{{}} +} + +func (m *ApexModuleBase) ApexTransitionMutatorOutgoing(ctx OutgoingTransitionContext, info ApexInfo) ApexInfo { + if !ctx.Module().(ApexModule).GetDepInSameApexChecker().OutgoingDepIsInSameApex(ctx.DepTag()) { + return ApexInfo{} + } + return info +} + +func (m *ApexModuleBase) ApexTransitionMutatorIncoming(ctx IncomingTransitionContext, info ApexInfo) ApexInfo { + module := ctx.Module().(ApexModule) + if !module.CanHaveApexVariants() { + return ApexInfo{} + } + + if !ctx.Module().(ApexModule).GetDepInSameApexChecker().IncomingDepIsInSameApex(ctx.DepTag()) { + return ApexInfo{} + } + + if info.ApexVariationName == "" { + return ApexInfo{} + } + + if !ctx.Module().(ApexModule).UniqueApexVariations() && !m.ApexProperties.UniqueApexVariationsForDeps && !info.ForPrebuiltApex { + return info.Minimize() + } + return info +} + +func (m *ApexModuleBase) ApexTransitionMutatorMutate(ctx BottomUpMutatorContext, info ApexInfo) { + SetProvider(ctx, ApexInfoProvider, info) + + module := ctx.Module().(ApexModule) + base := module.apexModuleBase() + + platformVariation := info.ApexVariationName == "" + if !platformVariation { + // Do some validity checks. + // TODO(jiyong): is this the right place? + base.checkApexAvailableProperty(ctx) + + SetProvider(ctx, ApexAvailableInfoProvider, ApexAvailableInfo{ + ApexAvailableFor: module.ApexAvailableFor(), + }) + } + if platformVariation && !ctx.Host() && !module.AvailableFor(AvailableToPlatform) && module.NotAvailableForPlatform() { + // Do not install the module for platform, but still allow it to output + // uninstallable AndroidMk entries in certain cases when they have side + // effects. TODO(jiyong): move this routine to somewhere else + module.MakeUninstallable() + } +} + // Initializes ApexModuleBase struct. Not calling this (even when inheriting from ApexModuleBase) // prevents the module from being mutated for apexBundle. func InitApexModule(m ApexModule) { @@ -394,19 +476,17 @@ func (m *ApexModuleBase) UniqueApexVariations() bool { } // Implements ApexModule -func (m *ApexModuleBase) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { - // By default, if there is a dependency from A to B, we try to include both in the same - // APEX, unless B is explicitly from outside of the APEX (i.e. a stubs lib). Thus, returning - // true. This is overridden by some module types like apex.ApexBundle, cc.Module, - // java.Module, etc. +func (m *ApexModuleBase) GetDepInSameApexChecker() DepInSameApexChecker { + return BaseDepInSameApexChecker{} +} + +type BaseDepInSameApexChecker struct{} + +func (m BaseDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { return true } -func (m *ApexModuleBase) IncomingDepIsInSameApex(tag blueprint.DependencyTag) bool { - // By default, if there is a dependency from A to B, we try to include both in the same - // APEX, unless B is explicitly from outside of the APEX (i.e. a stubs lib). Thus, returning - // true. This is overridden by some module types like apex.ApexBundle, cc.Module, - // java.Module, etc. +func (m BaseDepInSameApexChecker) IncomingDepIsInSameApex(tag blueprint.DependencyTag) bool { return true } @@ -514,194 +594,14 @@ func AvailableToSameApexes(mod1, mod2 ApexModule) bool { return true } -// mergeApexVariations deduplicates apex variations that would build identically into a common -// variation. It returns the reduced list of variations and a list of aliases from the original -// variation names to the new variation names. -func mergeApexVariations(apexInfos []ApexInfo) (merged []ApexInfo, aliases [][2]string) { - seen := make(map[string]int) - for _, apexInfo := range apexInfos { - // If this is for a prebuilt apex then use the actual name of the apex variation to prevent this - // from being merged with other ApexInfo. See Prebuilt.ApexInfoMutator for more information. - if apexInfo.ForPrebuiltApex { - merged = append(merged, apexInfo) - continue - } - - // Merge the ApexInfo together. If a compatible ApexInfo exists then merge the information from - // this one into it, otherwise create a new merged ApexInfo from this one and save it away so - // other ApexInfo instances can be merged into it. - variantName := apexInfo.ApexVariationName - mergedName := apexInfo.mergedName() - if index, exists := seen[mergedName]; exists { - // Variants having the same mergedName are deduped - merged[index].InApexVariants = append(merged[index].InApexVariants, variantName) - merged[index].Updatable = merged[index].Updatable || apexInfo.Updatable - // Platform APIs is allowed for this module only when all APEXes containing - // the module are with `use_platform_apis: true`. - merged[index].UsePlatformApis = merged[index].UsePlatformApis && apexInfo.UsePlatformApis - } else { - seen[mergedName] = len(merged) - apexInfo.ApexVariationName = mergedName - apexInfo.InApexVariants = CopyOf(apexInfo.InApexVariants) - merged = append(merged, apexInfo) - } - aliases = append(aliases, [2]string{variantName, mergedName}) - } - return merged, aliases -} - -// IncomingApexTransition is called by apexTransitionMutator.IncomingTransition on modules that can be in apexes. -// The incomingVariation can be either the name of an apex if the dependency is coming directly from an apex -// module, or it can be the name of an apex variation (e.g. apex10000) if it is coming from another module that -// is in the apex. -func IncomingApexTransition(ctx IncomingTransitionContext, incomingVariation string) string { - module := ctx.Module().(ApexModule) - base := module.apexModuleBase() - - var apexInfos []ApexInfo - if allApexInfos, ok := ModuleProvider(ctx, AllApexInfoProvider); ok { - apexInfos = allApexInfos.ApexInfos - } - - // Dependencies from platform variations go to the platform variation. - if incomingVariation == "" { - return "" - } - - if len(apexInfos) == 0 { - if ctx.IsAddingDependency() { - // If this module has no apex variations we can't do any mapping on the incoming variation, just return it - // and let the caller get a "missing variant" error. - return incomingVariation - } else { - // If this module has no apex variations the use the platform variation. - return "" - } - } - - // Convert the list of apex infos into from the AllApexInfoProvider into the merged list - // of apex variations and the aliases from apex names to apex variations. - var aliases [][2]string - if !module.UniqueApexVariations() && !base.ApexProperties.UniqueApexVariationsForDeps { - apexInfos, aliases = mergeApexVariations(apexInfos) - } - - // Check if the incoming variation matches an apex name, and if so use the corresponding - // apex variation. - aliasIndex := slices.IndexFunc(aliases, func(alias [2]string) bool { - return alias[0] == incomingVariation - }) - if aliasIndex >= 0 { - return aliases[aliasIndex][1] - } - - // Check if the incoming variation matches an apex variation. - apexIndex := slices.IndexFunc(apexInfos, func(info ApexInfo) bool { - return info.ApexVariationName == incomingVariation - }) - if apexIndex >= 0 { - return incomingVariation - } - - return "" -} - -func MutateApexTransition(ctx BaseModuleContext, variation string) { - module := ctx.Module().(ApexModule) - base := module.apexModuleBase() - platformVariation := variation == "" - - var apexInfos []ApexInfo - if allApexInfos, ok := ModuleProvider(ctx, AllApexInfoProvider); ok { - apexInfos = allApexInfos.ApexInfos - } - - // Shortcut - if len(apexInfos) == 0 { - return - } - - // Do some validity checks. - // TODO(jiyong): is this the right place? - base.checkApexAvailableProperty(ctx) - - if !module.UniqueApexVariations() && !base.ApexProperties.UniqueApexVariationsForDeps { - apexInfos, _ = mergeApexVariations(apexInfos) - } - - if platformVariation && !ctx.Host() && !module.AvailableFor(AvailableToPlatform) && module.NotAvailableForPlatform() { - // Do not install the module for platform, but still allow it to output - // uninstallable AndroidMk entries in certain cases when they have side - // effects. TODO(jiyong): move this routine to somewhere else - module.MakeUninstallable() - } - if !platformVariation { - var thisApexInfo ApexInfo - - apexIndex := slices.IndexFunc(apexInfos, func(info ApexInfo) bool { - return info.ApexVariationName == variation - }) - if apexIndex >= 0 { - thisApexInfo = apexInfos[apexIndex] - } else { - panic(fmt.Errorf("failed to find apexInfo for incoming variation %q", variation)) - } - thisApexInfo.ApexAvailableFor = module.ApexAvailableFor() - - SetProvider(ctx, ApexInfoProvider, thisApexInfo) - } -} - -func ApexInfoMutator(ctx TopDownMutatorContext, module ApexModule) { - base := module.apexModuleBase() - if len(base.apexInfos) > 0 { - apexInfos := slices.Clone(base.apexInfos) - slices.SortFunc(apexInfos, func(a, b ApexInfo) int { - return strings.Compare(a.ApexVariationName, b.ApexVariationName) - }) - SetProvider(ctx, AllApexInfoProvider, &AllApexInfo{apexInfos}) - // base.apexInfos is only needed to propagate the list of apexes from the apex module to its - // contents within apexInfoMutator. Clear it so it doesn't accidentally get used later. - base.apexInfos = nil - } -} - // UpdateUniqueApexVariationsForDeps sets UniqueApexVariationsForDeps if any dependencies that are // in the same APEX have unique APEX variations so that the module can link against the right // variant. func UpdateUniqueApexVariationsForDeps(mctx BottomUpMutatorContext, am ApexModule) { - // anyInSameApex returns true if the two ApexInfo lists contain any values in an - // InApexVariants list in common. It is used instead of OutgoingDepIsInSameApex because it needs to - // determine if the dep is in the same APEX due to being directly included, not only if it - // is included _because_ it is a dependency. - anyInSameApex := func(a, b ApexModule) bool { - collectApexes := func(m ApexModule) []string { - if allApexInfo, ok := OtherModuleProvider(mctx, m, AllApexInfoProvider); ok { - var ret []string - for _, info := range allApexInfo.ApexInfos { - ret = append(ret, info.InApexVariants...) - } - return ret - } - return nil - } - - aApexes := collectApexes(a) - bApexes := collectApexes(b) - sort.Strings(bApexes) - for _, aApex := range aApexes { - index := sort.SearchStrings(bApexes, aApex) - if index < len(bApexes) && bApexes[index] == aApex { - return true - } - } - return false - } - // If any of the dependencies requires unique apex variations, so does this module. mctx.VisitDirectDeps(func(dep Module) { if depApexModule, ok := dep.(ApexModule); ok { - if anyInSameApex(depApexModule, am) && + if IsDepInSameApex(mctx, am, depApexModule) && (depApexModule.UniqueApexVariations() || depApexModule.apexModuleBase().ApexProperties.UniqueApexVariationsForDeps) { am.apexModuleBase().ApexProperties.UniqueApexVariationsForDeps = true @@ -826,30 +726,53 @@ func CheckMinSdkVersion(ctx ModuleContext, minSdkVersion ApiLevel, walk WalkPayl if !IsDepInSameApex(ctx, from, to) { return false } - if m, ok := to.(ModuleWithMinSdkVersionCheck); ok { - // This dependency performs its own min_sdk_version check, just make sure it sets min_sdk_version - // to trigger the check. - if !m.MinSdkVersion(ctx).Specified() { - ctx.OtherModuleErrorf(m, "must set min_sdk_version") + if info, ok := OtherModuleProvider(ctx, to, CommonModuleInfoKey); ok && info.ModuleWithMinSdkVersionCheck { + if info.MinSdkVersion.ApiLevel == nil || !info.MinSdkVersion.ApiLevel.Specified() { + // This dependency performs its own min_sdk_version check, just make sure it sets min_sdk_version + // to trigger the check. + ctx.OtherModuleErrorf(to, "must set min_sdk_version") } return false } - if err := to.ShouldSupportSdkVersion(ctx, minSdkVersion); err != nil { - toName := ctx.OtherModuleName(to) + if err := ShouldSupportSdkVersion(ctx, to, minSdkVersion); err != nil { ctx.OtherModuleErrorf(to, "should support min_sdk_version(%v) for %q: %v."+ "\n\nDependency path: %s\n\n"+ "Consider adding 'min_sdk_version: %q' to %q", minSdkVersion, ctx.ModuleName(), err.Error(), ctx.GetPathString(false), - minSdkVersion, toName) + minSdkVersion, ctx.OtherModuleName(to)) return false } return true }) } +type MinSdkVersionFromValueContext interface { + Config() Config + DeviceConfig() DeviceConfig + ModuleErrorContext +} + +// Returns nil (success) if this module should support the given sdk version. Returns an +// error if not. No default implementation is provided for this method. A module type +// implementing this interface should provide an implementation. A module supports an sdk +// version when the module's min_sdk_version is equal to or less than the given sdk version. +func ShouldSupportSdkVersion(ctx BaseModuleContext, module Module, sdkVersion ApiLevel) error { + info, ok := OtherModuleProvider(ctx, module, CommonModuleInfoKey) + if !ok || info.MinSdkVersionSupported.IsNone() { + return fmt.Errorf("min_sdk_version is not specified") + } + minVer := info.MinSdkVersionSupported + + if minVer.GreaterThan(sdkVersion) { + return fmt.Errorf("newer SDK(%v)", minVer) + } + + return nil +} + // Construct ApiLevel object from min_sdk_version string value -func MinSdkVersionFromValue(ctx EarlyModuleContext, value string) ApiLevel { +func MinSdkVersionFromValue(ctx MinSdkVersionFromValueContext, value string) ApiLevel { if value == "" { return NoneApiLevel } @@ -890,3 +813,21 @@ type PrebuiltInfo struct { // to generate the mainline module prebuilt. Prebuilt_info_file_path string `json:",omitempty"` } + +// FragmentInApexTag is embedded into a dependency tag to allow apex modules to annotate +// their fragments in a way that allows the java bootclasspath modules to traverse from +// the apex to the fragment. +type FragmentInApexTag struct{} + +func (FragmentInApexTag) isFragmentInApexTag() {} + +type isFragmentInApexTagIntf interface { + isFragmentInApexTag() +} + +// IsFragmentInApexTag returns true if the dependency tag embeds FragmentInApexTag, +// signifying that it is a dependency from an apex module to its fragment. +func IsFragmentInApexTag(tag blueprint.DependencyTag) bool { + _, ok := tag.(isFragmentInApexTagIntf) + return ok +} diff --git a/android/apex_contributions.go b/android/apex_contributions.go index ce3427840..fe7a8352e 100644 --- a/android/apex_contributions.go +++ b/android/apex_contributions.go @@ -104,19 +104,8 @@ var ( AcDepTag = apexContributionsDepTag{} ) -// Creates a dep to each selected apex_contributions -func (a *allApexContributions) DepsMutator(ctx BottomUpMutatorContext) { - // Skip apex_contributions if BuildApexContributionContents is true - // This product config var allows some products in the same family to use mainline modules from source - // (e.g. shiba and shiba_fullmte) - // Eventually these product variants will have their own release config maps. - if !proptools.Bool(ctx.Config().BuildIgnoreApexContributionContents()) { - ctx.AddDependency(ctx.Module(), AcDepTag, ctx.Config().AllApexContributions()...) - } -} - // Set PrebuiltSelectionInfoProvider in post deps phase -func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BaseModuleContext) { +func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BottomUpMutatorContext) { addContentsToProvider := func(p *PrebuiltSelectionInfoMap, m *apexContributions) { for _, content := range m.Contents() { // Verify that the module listed in contents exists in the tree @@ -135,13 +124,23 @@ func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BaseModuleCo } p := PrebuiltSelectionInfoMap{} - ctx.VisitDirectDepsWithTag(AcDepTag, func(child Module) { - if m, ok := child.(*apexContributions); ok { - addContentsToProvider(&p, m) - } else { - ctx.ModuleErrorf("%s is not an apex_contributions module\n", child.Name()) + // Skip apex_contributions if BuildApexContributionContents is true + // This product config var allows some products in the same family to use mainline modules from source + // (e.g. shiba and shiba_fullmte) + // Eventually these product variants will have their own release config maps. + if !proptools.Bool(ctx.Config().BuildIgnoreApexContributionContents()) { + deps := ctx.AddDependency(ctx.Module(), AcDepTag, ctx.Config().AllApexContributions()...) + for _, child := range deps { + if child == nil { + continue + } + if m, ok := child.(*apexContributions); ok { + addContentsToProvider(&p, m) + } else { + ctx.ModuleErrorf("%s is not an apex_contributions module\n", child.Name()) + } } - }) + } SetProvider(ctx, PrebuiltSelectionInfoProvider, p) } diff --git a/android/apex_test.go b/android/apex_test.go deleted file mode 100644 index acc195de2..000000000 --- a/android/apex_test.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2020 Google Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package android - -import ( - "reflect" - "testing" -) - -func Test_mergeApexVariations(t *testing.T) { - const ( - ForPrebuiltApex = true - NotForPrebuiltApex = false - ) - tests := []struct { - name string - in []ApexInfo - wantMerged []ApexInfo - wantAliases [][2]string - }{ - { - name: "single", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantAliases: [][2]string{ - {"foo", "apex10000"}, - }, - }, - { - name: "merge", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "bar", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo", "bar"}, - }}, - wantAliases: [][2]string{ - {"foo", "apex10000"}, - {"bar", "apex10000"}, - }, - }, - { - name: "don't merge version", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "bar", - MinSdkVersion: uncheckedFinalApiLevel(30), - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "apex30", - MinSdkVersion: uncheckedFinalApiLevel(30), - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantAliases: [][2]string{ - {"foo", "apex10000"}, - {"bar", "apex30"}, - }, - }, - { - name: "merge updatable", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "bar", - MinSdkVersion: FutureApiLevel, - Updatable: true, - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000", - MinSdkVersion: FutureApiLevel, - Updatable: true, - InApexVariants: []string{"foo", "bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantAliases: [][2]string{ - {"foo", "apex10000"}, - {"bar", "apex10000"}, - }, - }, - { - name: "don't merge when for prebuilt_apex", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "bar", - MinSdkVersion: FutureApiLevel, - Updatable: true, - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - // This one should not be merged in with the others because it is for - // a prebuilt_apex. - { - ApexVariationName: "baz", - MinSdkVersion: FutureApiLevel, - Updatable: true, - InApexVariants: []string{"baz"}, - ForPrebuiltApex: ForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000", - MinSdkVersion: FutureApiLevel, - Updatable: true, - InApexVariants: []string{"foo", "bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "baz", - MinSdkVersion: FutureApiLevel, - Updatable: true, - InApexVariants: []string{"baz"}, - ForPrebuiltApex: ForPrebuiltApex, - }, - }, - wantAliases: [][2]string{ - {"foo", "apex10000"}, - {"bar", "apex10000"}, - }, - }, - { - name: "don't merge different UsePlatformApis", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "bar", - MinSdkVersion: FutureApiLevel, - UsePlatformApis: true, - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000", - MinSdkVersion: FutureApiLevel, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "apex10000_p", - MinSdkVersion: FutureApiLevel, - UsePlatformApis: true, - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantAliases: [][2]string{ - {"foo", "apex10000"}, - {"bar", "apex10000_p"}, - }, - }, - { - name: "merge same UsePlatformApis and allow using platform api", - in: []ApexInfo{ - { - ApexVariationName: "foo", - MinSdkVersion: FutureApiLevel, - UsePlatformApis: true, - InApexVariants: []string{"foo"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - { - ApexVariationName: "bar", - MinSdkVersion: FutureApiLevel, - UsePlatformApis: true, - InApexVariants: []string{"bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantMerged: []ApexInfo{ - { - ApexVariationName: "apex10000_p", - MinSdkVersion: FutureApiLevel, - UsePlatformApis: true, - InApexVariants: []string{"foo", "bar"}, - ForPrebuiltApex: NotForPrebuiltApex, - }, - }, - wantAliases: [][2]string{ - {"foo", "apex10000_p"}, - {"bar", "apex10000_p"}, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotMerged, gotAliases := mergeApexVariations(tt.in) - if !reflect.DeepEqual(gotMerged, tt.wantMerged) { - t.Errorf("mergeApexVariations() gotMerged = %v, want %v", gotMerged, tt.wantMerged) - } - if !reflect.DeepEqual(gotAliases, tt.wantAliases) { - t.Errorf("mergeApexVariations() gotAliases = %v, want %v", gotAliases, tt.wantAliases) - } - }) - } -} diff --git a/android/api_levels.go b/android/api_levels.go index 2b1d01d8b..6d0c3891f 100644 --- a/android/api_levels.go +++ b/android/api_levels.go @@ -252,6 +252,9 @@ var NoneApiLevel = ApiLevel{ isPreview: true, } +// A special ApiLevel that all modules should at least support. +var MinApiLevel = ApiLevel{number: 1} + // Sentinel ApiLevel to validate that an apiLevel is either an int or a recognized codename. var InvalidApiLevel = NewInvalidApiLevel("invalid") @@ -311,7 +314,7 @@ func ReplaceFinalizedCodenames(config Config, raw string) (string, error) { // ApiLevelFrom converts the given string `raw` to an ApiLevel. // If `raw` is invalid (empty string, unrecognized codename etc.) it returns an invalid ApiLevel -func ApiLevelFrom(ctx PathContext, raw string) ApiLevel { +func ApiLevelFrom(ctx ConfigContext, raw string) ApiLevel { ret, err := ApiLevelFromUser(ctx, raw) if err != nil { return NewInvalidApiLevel(raw) @@ -333,7 +336,7 @@ func ApiLevelFrom(ctx PathContext, raw string) ApiLevel { // // Inputs that are not "current", known previews, or convertible to an integer // will return an error. -func ApiLevelFromUser(ctx PathContext, raw string) (ApiLevel, error) { +func ApiLevelFromUser(ctx ConfigContext, raw string) (ApiLevel, error) { return ApiLevelFromUserWithConfig(ctx.Config(), raw) } @@ -413,7 +416,7 @@ func ApiLevelForTest(raw string) ApiLevel { // Converts an API level string `raw` into an ApiLevel in the same method as // `ApiLevelFromUser`, but the input is assumed to have no errors and any errors // will panic instead of returning an error. -func ApiLevelOrPanic(ctx PathContext, raw string) ApiLevel { +func ApiLevelOrPanic(ctx ConfigContext, raw string) ApiLevel { value, err := ApiLevelFromUser(ctx, raw) if err != nil { panic(err.Error()) diff --git a/android/arch_test.go b/android/arch_test.go index 7914884bb..adb655f68 100644 --- a/android/arch_test.go +++ b/android/arch_test.go @@ -432,7 +432,7 @@ func TestArchMutator(t *testing.T) { var ret []string variants := ctx.ModuleVariantsForTests(name) for _, variant := range variants { - m := ctx.ModuleForTests(name, variant) + m := ctx.ModuleForTests(t, name, variant) if m.Module().Enabled(PanickingConfigAndErrorContext(ctx)) { ret = append(ret, variant) } @@ -442,7 +442,7 @@ func TestArchMutator(t *testing.T) { moduleMultiTargets := func(ctx *TestContext, name string, variant string) []string { var ret []string - targets := ctx.ModuleForTests(name, variant).Module().MultiTargets() + targets := ctx.ModuleForTests(t, name, variant).Module().MultiTargets() for _, t := range targets { ret = append(ret, t.String()) } @@ -546,7 +546,7 @@ func TestArchMutatorNativeBridge(t *testing.T) { var ret []string variants := ctx.ModuleVariantsForTests(name) for _, variant := range variants { - m := ctx.ModuleForTests(name, variant) + m := ctx.ModuleForTests(t, name, variant) if m.Module().Enabled(PanickingConfigAndErrorContext(ctx)) { ret = append(ret, variant) } @@ -758,7 +758,7 @@ func TestArchProperties(t *testing.T) { for _, want := range tt.results { t.Run(want.module+"_"+want.variant, func(t *testing.T) { - got := result.ModuleForTests(want.module, want.variant).Module().(*testArchPropertiesModule).properties.A + got := result.ModuleForTests(t, want.module, want.variant).Module().(*testArchPropertiesModule).properties.A AssertArrayString(t, "arch mutator property", want.property, got) }) } diff --git a/android/build_prop_test.go b/android/build_prop_test.go index e75975a0a..e136a1a44 100644 --- a/android/build_prop_test.go +++ b/android/build_prop_test.go @@ -36,6 +36,6 @@ android_info { res := GroupFixturePreparers( FixtureRegisterWithContext(registerBuildPropComponents), ).RunTestWithBp(t, bp) - buildPropCmd := res.ModuleForTests("vendor-build.prop", "").Rule("vendor-build.prop_.vendor-build.prop").RuleParams.Command + buildPropCmd := res.ModuleForTests(t, "vendor-build.prop", "").Rule("vendor-build.prop_.vendor-build.prop").RuleParams.Command AssertStringDoesContain(t, "Could not find android-info in prop files of vendor build.prop", buildPropCmd, "--prop-files=out/soong/.intermediates/board-info/android-info.prop") } diff --git a/android/compliance_metadata.go b/android/compliance_metadata.go index 1e1f4bc60..35805a2a8 100644 --- a/android/compliance_metadata.go +++ b/android/compliance_metadata.go @@ -244,18 +244,6 @@ var ( `${sqlite3} $out ".import --csv ${make_modules} make_modules"`, CommandDeps: []string{"${sqlite3}"}, }, "make_metadata", "make_modules") - - buildMakeMetadataCsv = pctx.AndroidStaticRule("buildMakeMetadataCsv", - blueprint.RuleParams{ - Command: `rm -rf $out && ` + - `echo "installed_file,module_path,is_soong_module,is_prebuilt_make_module,product_copy_files,kernel_module_copy_files,is_platform_generated,static_libs,whole_static_libs,license_text" > $out`, - }) - - buildMakeModulesCsv = pctx.AndroidStaticRule("buildMakeModulesCsv", - blueprint.RuleParams{ - Command: `rm -rf $out && ` + - `echo "name,module_path,module_class,module_type,static_libs,whole_static_libs,built_files,installed_files" > $out`, - }) ) func complianceMetadataSingletonFactory() Singleton { @@ -328,14 +316,8 @@ func (c *complianceMetadataSingleton) GenerateBuildActions(ctx SingletonContext) makeModulesCsv := PathForOutput(ctx, "compliance-metadata", deviceProduct, "make-modules.csv") if !ctx.Config().KatiEnabled() { - ctx.Build(pctx, BuildParams{ - Rule: buildMakeMetadataCsv, - Output: makeMetadataCsv, - }) - ctx.Build(pctx, BuildParams{ - Rule: buildMakeModulesCsv, - Output: makeModulesCsv, - }) + WriteFileRule(ctx, makeMetadataCsv, "installed_file,module_path,is_soong_module,is_prebuilt_make_module,product_copy_files,kernel_module_copy_files,is_platform_generated,static_libs,whole_static_libs,license_text") + WriteFileRule(ctx, makeModulesCsv, "name,module_path,module_class,module_type,static_libs,whole_static_libs,built_files,installed_files") } // Import metadata from Make and Soong to sqlite3 database diff --git a/android/config.go b/android/config.go index eda8e718a..acaad60ad 100644 --- a/android/config.go +++ b/android/config.go @@ -386,10 +386,10 @@ type config struct { type partialCompileFlags struct { // Is partial compilation enabled at all? - enabled bool + Enabled bool // Whether to use d8 instead of r8 - use_d8 bool + Use_d8 bool // Add others as needed. } @@ -429,7 +429,7 @@ type jsonConfigurable interface { // switch statement below. var defaultPartialCompileFlags = partialCompileFlags{ // Set any opt-out flags here. Opt-in flags are off by default. - enabled: false, + Enabled: false, } func (c *config) parsePartialCompileFlags(isEngBuild bool) (partialCompileFlags, error) { @@ -473,14 +473,14 @@ func (c *config) parsePartialCompileFlags(isEngBuild bool) (partialCompileFlags, switch tok { case "true": ret = defaultPartialCompileFlags - ret.enabled = true + ret.Enabled = true case "false": // Set everything to false. ret = partialCompileFlags{} case "enabled": - ret.enabled = makeVal(state, defaultPartialCompileFlags.enabled) + ret.Enabled = makeVal(state, defaultPartialCompileFlags.Enabled) case "use_d8": - ret.use_d8 = makeVal(state, defaultPartialCompileFlags.use_d8) + ret.Use_d8 = makeVal(state, defaultPartialCompileFlags.Use_d8) default: return partialCompileFlags{}, fmt.Errorf("Unknown SOONG_PARTIAL_COMPILE value: %v", tok) } diff --git a/android/config_test.go b/android/config_test.go index 4fdcc9ca4..4bdf05f0e 100644 --- a/android/config_test.go +++ b/android/config_test.go @@ -214,12 +214,12 @@ func TestConfiguredJarList(t *testing.T) { } func (p partialCompileFlags) updateEnabled(value bool) partialCompileFlags { - p.enabled = value + p.Enabled = value return p } func (p partialCompileFlags) updateUseD8(value bool) partialCompileFlags { - p.use_d8 = value + p.Use_d8 = value return p } diff --git a/android/container.go b/android/container.go index eb2fc1874..5dc97d38e 100644 --- a/android/container.go +++ b/android/container.go @@ -167,8 +167,8 @@ var productContainerBoundaryFunc containerBoundaryFunc = func(mctx ModuleContext } var apexContainerBoundaryFunc containerBoundaryFunc = func(mctx ModuleContext) bool { - _, ok := ModuleProvider(mctx, AllApexInfoProvider) - return ok + // TODO(b/394955484): a module can't determine the apexes it belongs to any more + return false } var ctsContainerBoundaryFunc containerBoundaryFunc = func(mctx ModuleContext) bool { @@ -380,7 +380,7 @@ func (c *ContainersInfo) BelongingContainers() []*container { func (c *ContainersInfo) ApexNames() (ret []string) { for _, apex := range c.belongingApexes { - ret = append(ret, apex.InApexVariants...) + ret = append(ret, apex.BaseApexName) } slices.Sort(ret) return ret @@ -441,14 +441,10 @@ func generateContainerInfo(ctx ModuleContext) ContainersInfo { } } - var belongingApexes []ApexInfo - if apexInfo, ok := ModuleProvider(ctx, AllApexInfoProvider); ok { - belongingApexes = apexInfo.ApexInfos - } - return ContainersInfo{ belongingContainers: containers, - belongingApexes: belongingApexes, + // TODO(b/394955484): a module can't determine the apexes it belongs to any more + belongingApexes: nil, } } diff --git a/android/csuite_config_test.go b/android/csuite_config_test.go index b8a176eb3..7e25aac3c 100644 --- a/android/csuite_config_test.go +++ b/android/csuite_config_test.go @@ -32,7 +32,6 @@ func TestCSuiteConfig(t *testing.T) { if len(variants) > 1 { t.Errorf("expected 1, got %d", len(variants)) } - outputFilename := result.ModuleForTests( - "plain", variants[0]).Module().(*CSuiteConfig).OutputFilePath.Base() + outputFilename := result.ModuleForTests(t, "plain", variants[0]).Module().(*CSuiteConfig).OutputFilePath.Base() AssertStringEquals(t, "output file name", "plain", outputFilename) } diff --git a/android/deapexer.go b/android/deapexer.go index 4049d2b2a..6d00dcd72 100644 --- a/android/deapexer.go +++ b/android/deapexer.go @@ -75,8 +75,6 @@ type DeapexerInfo struct { // map from the name of an exported file from a prebuilt_apex to the path to that file. The // exported file name is the apex relative path, e.g. javalib/core-libart.jar. - // - // See Prebuilt.ApexInfoMutator for more information. exports map[string]WritablePath // name of the java libraries exported from the apex diff --git a/android/defaults_test.go b/android/defaults_test.go index 0ad0fb859..24f14617a 100644 --- a/android/defaults_test.go +++ b/android/defaults_test.go @@ -123,8 +123,8 @@ func TestDefaultsAllowMissingDependencies(t *testing.T) { FixtureWithRootAndroidBp(bp), ).RunTest(t) - missingDefaults := result.ModuleForTests("missing_defaults", "").Output("out") - missingTransitiveDefaults := result.ModuleForTests("missing_transitive_defaults", "").Output("out") + missingDefaults := result.ModuleForTests(t, "missing_defaults", "").Output("out") + missingTransitiveDefaults := result.ModuleForTests(t, "missing_transitive_defaults", "").Output("out") AssertSame(t, "missing_defaults rule", ErrorRule, missingDefaults.Rule) diff --git a/android/deptag_test.go b/android/deptag_test.go index eb4fa89a6..903787107 100644 --- a/android/deptag_test.go +++ b/android/deptag_test.go @@ -90,10 +90,10 @@ func TestInstallDependencyTag(t *testing.T) { config := result.Config - hostFoo := result.ModuleForTests("foo", config.BuildOSCommonTarget.String()).Description("install") - hostInstallDep := result.ModuleForTests("install_dep", config.BuildOSCommonTarget.String()).Description("install") - hostTransitive := result.ModuleForTests("transitive", config.BuildOSCommonTarget.String()).Description("install") - hostDep := result.ModuleForTests("dep", config.BuildOSCommonTarget.String()).Description("install") + hostFoo := result.ModuleForTests(t, "foo", config.BuildOSCommonTarget.String()).Description("install") + hostInstallDep := result.ModuleForTests(t, "install_dep", config.BuildOSCommonTarget.String()).Description("install") + hostTransitive := result.ModuleForTests(t, "transitive", config.BuildOSCommonTarget.String()).Description("install") + hostDep := result.ModuleForTests(t, "dep", config.BuildOSCommonTarget.String()).Description("install") if g, w := hostFoo.Implicits.Strings(), hostInstallDep.Output.String(); !InList(w, g) { t.Errorf("expected host dependency %q, got %q", w, g) @@ -111,10 +111,10 @@ func TestInstallDependencyTag(t *testing.T) { t.Errorf("expected no host dependency %q, got %q", w, g) } - deviceFoo := result.ModuleForTests("foo", "android_common").Description("install") - deviceInstallDep := result.ModuleForTests("install_dep", "android_common").Description("install") - deviceTransitive := result.ModuleForTests("transitive", "android_common").Description("install") - deviceDep := result.ModuleForTests("dep", "android_common").Description("install") + deviceFoo := result.ModuleForTests(t, "foo", "android_common").Description("install") + deviceInstallDep := result.ModuleForTests(t, "install_dep", "android_common").Description("install") + deviceTransitive := result.ModuleForTests(t, "transitive", "android_common").Description("install") + deviceDep := result.ModuleForTests(t, "dep", "android_common").Description("install") if g, w := deviceFoo.OrderOnly.Strings(), deviceInstallDep.Output.String(); !InList(w, g) { t.Errorf("expected device dependency %q, got %q", w, g) diff --git a/android/fixture.go b/android/fixture.go index 5ad47e8c9..ea52b95f5 100644 --- a/android/fixture.go +++ b/android/fixture.go @@ -1048,7 +1048,7 @@ func (r *TestResult) Preparer() FixturePreparer { // Module returns the module with the specific name and of the specified variant. func (r *TestResult) Module(name string, variant string) Module { - return r.ModuleForTests(name, variant).Module() + return r.ModuleForTests(r.fixture.t, name, variant).Module() } // CollateErrs adds additional errors to the result and returns true if there is more than one diff --git a/android/makevars.go b/android/makevars.go index d4389cfac..baa1d4453 100644 --- a/android/makevars.go +++ b/android/makevars.go @@ -185,6 +185,7 @@ func makeVarsSingletonFunc() Singleton { type makeVarsSingleton struct { varsForTesting []makeVarsVariable installsForTesting []byte + lateForTesting []byte } type makeVarsProvider struct { @@ -265,6 +266,11 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { dists = append(dists, mctx.dists...) } + singletonDists := getSingletonDists(ctx.Config()) + singletonDists.lock.Lock() + dists = append(dists, singletonDists.dists...) + singletonDists.lock.Unlock() + ctx.VisitAllModules(func(m Module) { if provider, ok := m.(ModuleMakeVarsProvider); ok && m.Enabled(ctx) { mctx := &makeVarsContext{ @@ -285,6 +291,10 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { katiVintfManifestInstalls = append(katiVintfManifestInstalls, info.KatiVintfInstalls...) katiSymlinks = append(katiSymlinks, info.KatiSymlinks...) } + + if distInfo, ok := OtherModuleProvider(ctx, m, DistProvider); ok { + dists = append(dists, distInfo.Dists...) + } }) compareKatiInstalls := func(a, b katiInstall) int { @@ -318,19 +328,12 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { sort.Slice(phonies, func(i, j int) bool { return phonies[i].name < phonies[j].name }) - lessArr := func(a, b []string) bool { - if len(a) == len(b) { - for i := range a { - if a[i] < b[i] { - return true - } - } - return false - } - return len(a) < len(b) - } sort.Slice(dists, func(i, j int) bool { - return lessArr(dists[i].goals, dists[j].goals) || lessArr(dists[i].paths.Strings(), dists[j].paths.Strings()) + goals := slices.Compare(dists[i].goals, dists[j].goals) + if goals != 0 { + return goals < 0 + } + return slices.Compare(dists[i].paths.Strings(), dists[j].paths.Strings()) < 0 }) outBytes := s.writeVars(vars) @@ -354,6 +357,7 @@ func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { if ctx.Config().RunningInsideUnitTest() { s.varsForTesting = vars s.installsForTesting = installsBytes + s.lateForTesting = lateOutBytes } } @@ -651,6 +655,7 @@ func (c *makeVarsContext) DistForGoals(goals []string, paths ...Path) { for _, path := range paths { copies = append(copies, distCopy{ from: path, + dest: path.Base(), }) } c.addDist(goals, copies) diff --git a/android/makevars_test.go b/android/makevars_test.go new file mode 100644 index 000000000..387d45759 --- /dev/null +++ b/android/makevars_test.go @@ -0,0 +1,96 @@ +package android + +import ( + "regexp" + "testing" +) + +func TestDistFilesInGenerateAndroidBuildActions(t *testing.T) { + result := GroupFixturePreparers( + FixtureRegisterWithContext(func(ctx RegistrationContext) { + ctx.RegisterModuleType("my_module_type", newDistFileModule) + ctx.RegisterParallelSingletonType("my_singleton", newDistFileSingleton) + ctx.RegisterParallelSingletonModuleType("my_singleton_module", newDistFileSingletonModule) + }), + FixtureModifyConfig(SetKatiEnabledForTests), + PrepareForTestWithMakevars, + ).RunTestWithBp(t, ` + my_module_type { + name: "foo", + } + my_singleton_module { + name: "bar" + } + `) + + lateContents := string(result.SingletonForTests(t, "makevars").Singleton().(*makeVarsSingleton).lateForTesting) + matched, err := regexp.MatchString(`call dist-for-goals,my_goal,.*/my_file.txt:my_file.txt\)`, lateContents) + if err != nil || !matched { + t.Fatalf("Expected a dist of my_file.txt, but got: %s", lateContents) + } + matched, err = regexp.MatchString(`call dist-for-goals,my_singleton_goal,.*/my_singleton_file.txt:my_singleton_file.txt\)`, lateContents) + if err != nil || !matched { + t.Fatalf("Expected a dist of my_singleton_file.txt, but got: %s", lateContents) + } + matched, err = regexp.MatchString(`call dist-for-goals,my_singleton_module_module_goal,.*/my_singleton_module_module_file.txt:my_singleton_module_module_file.txt\)`, lateContents) + if err != nil || !matched { + t.Fatalf("Expected a dist of my_singleton_module_module_file.txt, but got: %s", lateContents) + } + matched, err = regexp.MatchString(`call dist-for-goals,my_singleton_module_singleton_goal,.*/my_singleton_module_singleton_file.txt:my_singleton_module_singleton_file.txt\)`, lateContents) + if err != nil || !matched { + t.Fatalf("Expected a dist of my_singleton_module_singleton_file.txt, but got: %s", lateContents) + } +} + +type distFileModule struct { + ModuleBase +} + +func newDistFileModule() Module { + m := &distFileModule{} + InitAndroidModule(m) + return m +} + +func (m *distFileModule) GenerateAndroidBuildActions(ctx ModuleContext) { + out := PathForModuleOut(ctx, "my_file.txt") + WriteFileRule(ctx, out, "Hello, world!") + ctx.DistForGoal("my_goal", out) +} + +type distFileSingleton struct { +} + +func newDistFileSingleton() Singleton { + return &distFileSingleton{} +} + +func (d *distFileSingleton) GenerateBuildActions(ctx SingletonContext) { + out := PathForOutput(ctx, "my_singleton_file.txt") + WriteFileRule(ctx, out, "Hello, world!") + ctx.DistForGoal("my_singleton_goal", out) +} + +type distFileSingletonModule struct { + SingletonModuleBase +} + +func newDistFileSingletonModule() SingletonModule { + sm := &distFileSingletonModule{} + InitAndroidSingletonModule(sm) + return sm +} + +// GenerateAndroidBuildActions implements SingletonModule. +func (d *distFileSingletonModule) GenerateAndroidBuildActions(ctx ModuleContext) { + out := PathForModuleOut(ctx, "my_singleton_module_module_file.txt") + WriteFileRule(ctx, out, "Hello, world!") + ctx.DistForGoal("my_singleton_module_module_goal", out) +} + +// GenerateSingletonBuildActions implements SingletonModule. +func (d *distFileSingletonModule) GenerateSingletonBuildActions(ctx SingletonContext) { + out := PathForOutput(ctx, "my_singleton_module_singleton_file.txt") + WriteFileRule(ctx, out, "Hello, world!") + ctx.DistForGoal("my_singleton_module_singleton_goal", out) +} diff --git a/android/module.go b/android/module.go index 39a165463..0ffb6cb53 100644 --- a/android/module.go +++ b/android/module.go @@ -1091,6 +1091,10 @@ var vintfDepTag = struct { InstallAlwaysNeededDependencyTag }{} +func IsVintfDepTag(depTag blueprint.DependencyTag) bool { + return depTag == vintfDepTag +} + func addVintfFragmentDeps(ctx BottomUpMutatorContext) { // Vintf manifests in the recovery partition will be ignored. if !ctx.Device() || ctx.Module().InstallInRecovery() { @@ -1109,7 +1113,7 @@ func addVintfFragmentDeps(ctx BottomUpMutatorContext) { // of nil pointer dereference errors, but we should resolve the missing dependencies. continue } - if vintfModule, ok := vintf.(*vintfFragmentModule); ok { + if vintfModule, ok := vintf.(*VintfFragmentModule); ok { vintfPartition := vintfModule.PartitionTag(deviceConfig) if modPartition != vintfPartition { ctx.ModuleErrorf("Module %q(%q) and Vintf_fragment %q(%q) are installed to different partitions.", @@ -1894,7 +1898,7 @@ type CommonModuleInfo struct { SkipAndroidMkProcessing bool BaseModuleName string CanHaveApexVariants bool - MinSdkVersion string + MinSdkVersion ApiLevelOrPlatform SdkVersion string NotAvailableForPlatform bool // There some subtle differences between this one and the one above. @@ -1908,6 +1912,13 @@ type CommonModuleInfo struct { SkipInstall bool IsStubsModule bool Host bool + MinSdkVersionSupported ApiLevel + ModuleWithMinSdkVersionCheck bool +} + +type ApiLevelOrPlatform struct { + ApiLevel *ApiLevel + IsPlatform bool } var CommonModuleInfoKey = blueprint.NewProvider[CommonModuleInfo]() @@ -1925,6 +1936,12 @@ type HostToolProviderInfo struct { var HostToolProviderInfoProvider = blueprint.NewProvider[HostToolProviderInfo]() +type DistInfo struct { + Dists []dist +} + +var DistProvider = blueprint.NewProvider[DistInfo]() + type SourceFileGenerator interface { GeneratedSourceFiles() Paths GeneratedHeaderDirs() Paths @@ -2222,6 +2239,13 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) Phonies: ctx.phonies, }) } + + if len(ctx.dists) > 0 { + SetProvider(ctx, DistProvider, DistInfo{ + Dists: ctx.dists, + }) + } + buildComplianceMetadataProvider(ctx, m) commonData := CommonModuleInfo{ @@ -2238,11 +2262,16 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) MinSdkVersion(ctx EarlyModuleContext) ApiLevel }); ok { ver := mm.MinSdkVersion(ctx) - if !ver.IsNone() { - commonData.MinSdkVersion = ver.String() - } + commonData.MinSdkVersion.ApiLevel = &ver } else if mm, ok := m.module.(interface{ MinSdkVersion() string }); ok { - commonData.MinSdkVersion = mm.MinSdkVersion() + ver := mm.MinSdkVersion() + // Compile against the current platform + if ver == "" { + commonData.MinSdkVersion.IsPlatform = true + } else { + api := ApiLevelFrom(ctx, ver) + commonData.MinSdkVersion.ApiLevel = &api + } } if mm, ok := m.module.(interface { @@ -2265,7 +2294,13 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) commonData.CanHaveApexVariants = am.CanHaveApexVariants() commonData.NotAvailableForPlatform = am.NotAvailableForPlatform() commonData.NotInPlatform = am.NotInPlatform() + commonData.MinSdkVersionSupported = am.MinSdkVersionSupported(ctx) } + + if _, ok := m.module.(ModuleWithMinSdkVersionCheck); ok { + commonData.ModuleWithMinSdkVersionCheck = true + } + if st, ok := m.module.(StubsAvailableModule); ok { commonData.IsStubsModule = st.IsStubsModule() } @@ -2984,6 +3019,9 @@ func AddAncestors(ctx SingletonContext, dirMap map[string]Paths, mmName func(str func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) { var checkbuildDeps Paths + // Create a top level partialcompileclean target for modules to add dependencies to. + ctx.Phony("partialcompileclean") + mmTarget := func(dir string) string { return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1) } diff --git a/android/module_context.go b/android/module_context.go index d3c537097..f279fd9e5 100644 --- a/android/module_context.go +++ b/android/module_context.go @@ -81,6 +81,8 @@ type BuildParams struct { Default bool // Args is a key value mapping for replacements of variables within the Rule Args map[string]string + // PhonyOutput marks this build as `phony_output = true` + PhonyOutput bool } type ModuleBuildParams BuildParams @@ -255,6 +257,24 @@ type ModuleContext interface { setContainersInfo(info ContainersInfo) setAconfigPaths(paths Paths) + + // DistForGoals creates a rule to copy one or more Paths to the artifacts + // directory on the build server when any of the specified goals are built. + DistForGoal(goal string, paths ...Path) + + // DistForGoalWithFilename creates a rule to copy a Path to the artifacts + // directory on the build server with the given filename when the specified + // goal is built. + DistForGoalWithFilename(goal string, path Path, filename string) + + // DistForGoals creates a rule to copy one or more Paths to the artifacts + // directory on the build server when any of the specified goals are built. + DistForGoals(goals []string, paths ...Path) + + // DistForGoalsWithFilename creates a rule to copy a Path to the artifacts + // directory on the build server with the given filename when any of the + // specified goals are built. + DistForGoalsWithFilename(goals []string, path Path, filename string) } type moduleContext struct { @@ -312,6 +332,8 @@ type moduleContext struct { // complianceMetadataInfo is for different module types to dump metadata. // See android.ModuleContext interface. complianceMetadataInfo *ComplianceMetadataInfo + + dists []dist } var _ ModuleContext = &moduleContext{} @@ -349,6 +371,7 @@ func convertBuildParams(params BuildParams) blueprint.BuildParams { Validations: params.Validations.Strings(), Args: params.Args, Default: params.Default, + PhonyOutput: params.PhonyOutput, } if params.Depfile != nil { @@ -693,6 +716,17 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat implicitDeps = append(implicitDeps, extraZip.zip) } + var cpFlags = "-f" + + // If this is a device file, copy while preserving timestamps. This is to support + // adb sync in soong-only builds. Because soong-only builds have 2 different staging + // directories, the out/target/product one and the out/soong/.intermediates one, + // we need to ensure the files in them have the same timestamps so that adb sync doesn't + // update the files on device. + if strings.Contains(fullInstallPath.String(), "target/product") { + cpFlags += " -p" + } + m.Build(pctx, BuildParams{ Rule: rule, Description: "install " + fullInstallPath.Base(), @@ -702,7 +736,7 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat OrderOnly: orderOnlyDeps, Args: map[string]string{ "extraCmds": extraCmds, - "cpFlags": "-f", + "cpFlags": cpFlags, }, }) } @@ -796,7 +830,7 @@ func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name str }) if !m.Config().KatiEnabled() { m.Build(pctx, BuildParams{ - Rule: Symlink, + Rule: SymlinkWithBash, Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath, Output: fullInstallPath, Args: map[string]string{ @@ -959,3 +993,32 @@ func (m *moduleContext) getContainersInfo() ContainersInfo { func (m *moduleContext) setContainersInfo(info ContainersInfo) { m.containersInfo = info } + +func (c *moduleContext) DistForGoal(goal string, paths ...Path) { + c.DistForGoals([]string{goal}, paths...) +} + +func (c *moduleContext) DistForGoalWithFilename(goal string, path Path, filename string) { + c.DistForGoalsWithFilename([]string{goal}, path, filename) +} + +func (c *moduleContext) DistForGoals(goals []string, paths ...Path) { + var copies distCopies + for _, path := range paths { + copies = append(copies, distCopy{ + from: path, + dest: path.Base(), + }) + } + c.dists = append(c.dists, dist{ + goals: slices.Clone(goals), + paths: copies, + }) +} + +func (c *moduleContext) DistForGoalsWithFilename(goals []string, path Path, filename string) { + c.dists = append(c.dists, dist{ + goals: slices.Clone(goals), + paths: distCopies{{from: path, dest: filename}}, + }) +} diff --git a/android/module_test.go b/android/module_test.go index 6e6d44909..5331e4970 100644 --- a/android/module_test.go +++ b/android/module_test.go @@ -321,7 +321,7 @@ func TestInstall(t *testing.T) { if host { variant = result.Config.BuildOSCommonTarget.String() } - return result.ModuleForTests(name, variant) + return result.ModuleForTests(t, name, variant) } outputRule := func(name string) TestingBuildParams { return module(name, false).Output(name) } @@ -434,11 +434,12 @@ func TestInstallKatiEnabled(t *testing.T) { rules := result.InstallMakeRulesForTesting(t) module := func(name string, host bool) TestingModule { + t.Helper() variant := "android_common" if host { variant = result.Config.BuildOSCommonTarget.String() } - return result.ModuleForTests(name, variant) + return result.ModuleForTests(t, name, variant) } outputRule := func(name string) TestingBuildParams { return module(name, false).Output(name) } @@ -743,7 +744,7 @@ test { FixtureWithRootAndroidBp(tc.bp), ).RunTest(t) - foo := result.ModuleForTests("foo", "").Module().base() + foo := result.ModuleForTests(t, "foo", "").Module().base() AssertDeepEquals(t, "foo ", tc.expectedProps, foo.propertiesWithValues()) }) @@ -1078,7 +1079,7 @@ func TestOutputFileForModule(t *testing.T) { PathContext: PathContextForTesting(config), OtherModuleProviderContext: result.TestContext.OtherModuleProviderAdaptor(), } - got := OutputFileForModule(ctx, result.ModuleForTests("test_module", "").Module(), tt.tag) + got := OutputFileForModule(ctx, result.ModuleForTests(t, "test_module", "").Module(), tt.tag) AssertPathRelativeToTopEquals(t, "expected output path", tt.expected, got) AssertArrayString(t, "expected missing deps", tt.missingDeps, ctx.missingDeps) }) @@ -1110,3 +1111,14 @@ func TestVintfFragmentModulesChecksPartition(t *testing.T) { "Module .+ and Vintf_fragment .+ are installed to different partitions.")). RunTestWithBp(t, bp) } + +func TestInvalidModuleName(t *testing.T) { + bp := ` + deps { + name: "fo o", + } + ` + prepareForModuleTests. + ExtendWithErrorHandler(FixtureExpectsOneErrorPattern(`should use a valid name`)). + RunTestWithBp(t, bp) +} diff --git a/android/mutator.go b/android/mutator.go index 1b0700a56..12861c074 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -15,9 +15,8 @@ package android import ( - "sync" - "github.com/google/blueprint" + "github.com/google/blueprint/pool" ) // Phases: @@ -67,7 +66,6 @@ type registerMutatorsContext struct { } type RegisterMutatorsContext interface { - TopDown(name string, m TopDownMutator) MutatorHandle BottomUp(name string, m BottomUpMutator) MutatorHandle BottomUpBlueprint(name string, m blueprint.BottomUpMutator) MutatorHandle Transition(name string, m VariationTransitionMutator) TransitionMutatorHandle @@ -159,6 +157,7 @@ func registerArchMutator(ctx RegisterMutatorsContext) { var preDeps = []RegisterMutatorFunc{ registerArchMutator, + RegisterPrebuiltsPreDepsMutators, } var postDeps = []RegisterMutatorFunc{ @@ -194,17 +193,6 @@ func FinalDepsMutators(f RegisterMutatorFunc) { finalDeps = append(finalDeps, f) } -type TopDownMutator func(TopDownMutatorContext) - -type TopDownMutatorContext interface { - BaseModuleContext -} - -type topDownMutatorContext struct { - bp blueprint.TopDownMutatorContext - baseModuleContext -} - type BottomUpMutator func(BottomUpMutatorContext) type BottomUpMutatorContext interface { @@ -280,22 +268,12 @@ type BottomUpMutatorContext interface { } // An outgoingTransitionContextImpl and incomingTransitionContextImpl is created for every dependency of every module -// for each transition mutator. bottomUpMutatorContext and topDownMutatorContext are created once for every module -// for every BottomUp or TopDown mutator. Use a global pool for each to avoid reallocating every time. +// for each transition mutator. bottomUpMutatorContext is created once for every module for every BottomUp mutator. +// Use a global pool for each to avoid reallocating every time. var ( - outgoingTransitionContextPool = sync.Pool{ - New: func() any { return &outgoingTransitionContextImpl{} }, - } - incomingTransitionContextPool = sync.Pool{ - New: func() any { return &incomingTransitionContextImpl{} }, - } - bottomUpMutatorContextPool = sync.Pool{ - New: func() any { return &bottomUpMutatorContext{} }, - } - - topDownMutatorContextPool = sync.Pool{ - New: func() any { return &topDownMutatorContext{} }, - } + outgoingTransitionContextPool = pool.New[outgoingTransitionContextImpl]() + incomingTransitionContextPool = pool.New[incomingTransitionContextImpl]() + bottomUpMutatorContextPool = pool.New[bottomUpMutatorContext]() ) type bottomUpMutatorContext struct { @@ -306,10 +284,10 @@ type bottomUpMutatorContext struct { // callers must immediately follow the call to this function with defer bottomUpMutatorContextPool.Put(mctx). func bottomUpMutatorContextFactory(ctx blueprint.BottomUpMutatorContext, a Module, - finalPhase bool) BottomUpMutatorContext { + finalPhase bool) *bottomUpMutatorContext { moduleContext := a.base().baseModuleContextFactory(ctx) - mctx := bottomUpMutatorContextPool.Get().(*bottomUpMutatorContext) + mctx := bottomUpMutatorContextPool.Get() *mctx = bottomUpMutatorContext{ bp: ctx, baseModuleContext: moduleContext, @@ -370,24 +348,6 @@ func (x *registerMutatorsContext) mutatorName(name string) string { return name } -func (x *registerMutatorsContext) TopDown(name string, m TopDownMutator) MutatorHandle { - f := func(ctx blueprint.TopDownMutatorContext) { - if a, ok := ctx.Module().(Module); ok { - moduleContext := a.base().baseModuleContextFactory(ctx) - actx := topDownMutatorContextPool.Get().(*topDownMutatorContext) - defer topDownMutatorContextPool.Put(actx) - *actx = topDownMutatorContext{ - bp: ctx, - baseModuleContext: moduleContext, - } - m(actx) - } - } - mutator := &mutator{name: x.mutatorName(name), topDownMutator: f} - x.mutators = append(x.mutators, mutator) - return mutator -} - func (mutator *mutator) componentName() string { return mutator.name } @@ -397,8 +357,6 @@ func (mutator *mutator) register(ctx *Context) { var handle blueprint.MutatorHandle if mutator.bottomUpMutator != nil { handle = blueprintCtx.RegisterBottomUpMutator(mutator.name, mutator.bottomUpMutator) - } else if mutator.topDownMutator != nil { - handle = blueprintCtx.RegisterTopDownMutator(mutator.name, mutator.topDownMutator) } else if mutator.transitionMutator != nil { handle := blueprintCtx.RegisterTransitionMutator(mutator.name, mutator.transitionMutator) if mutator.neverFar { @@ -528,11 +486,11 @@ func registerDepsMutator(ctx RegisterMutatorsContext) { ctx.BottomUp("deps", depsMutator).UsesReverseDependencies() } -// android.topDownMutatorContext either has to embed blueprint.TopDownMutatorContext, in which case every method that +// android.bottomUpMutatorContext either has to embed blueprint.BottomUpMutatorContext, in which case every method that // has an overridden version in android.BaseModuleContext has to be manually forwarded to BaseModuleContext to avoid -// ambiguous method errors, or it has to store a blueprint.TopDownMutatorContext non-embedded, in which case every +// ambiguous method errors, or it has to store a blueprint.BottomUpMutatorContext non-embedded, in which case every // non-overridden method has to be forwarded. There are fewer non-overridden methods, so use the latter. The following -// methods forward to the identical blueprint versions for topDownMutatorContext and bottomUpMutatorContext. +// methods forward to the identical blueprint versions for bottomUpMutatorContext. func (b *bottomUpMutatorContext) Rename(name string) { b.bp.Rename(name) diff --git a/android/mutator_test.go b/android/mutator_test.go index 60a61199f..f7ee7d857 100644 --- a/android/mutator_test.go +++ b/android/mutator_test.go @@ -54,7 +54,7 @@ func (m *mutatorTestModule) DepsMutator(ctx BottomUpMutatorContext) { ctx.AddDependency(ctx.Module(), nil, m.props.Deps_missing_deps...) } -func addMissingDependenciesMutator(ctx TopDownMutatorContext) { +func addMissingDependenciesMutator(ctx BottomUpMutatorContext) { ctx.AddMissingDependencies(ctx.Module().(*mutatorTestModule).props.Mutator_missing_deps) } @@ -72,13 +72,13 @@ func TestMutatorAddMissingDependencies(t *testing.T) { FixtureRegisterWithContext(func(ctx RegistrationContext) { ctx.RegisterModuleType("test", mutatorTestModuleFactory) ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { - ctx.TopDown("add_missing_dependencies", addMissingDependenciesMutator) + ctx.BottomUp("add_missing_dependencies", addMissingDependenciesMutator) }) }), FixtureWithRootAndroidBp(bp), ).RunTest(t) - foo := result.ModuleForTests("foo", "").Module().(*mutatorTestModule) + foo := result.ModuleForTests(t, "foo", "").Module().(*mutatorTestModule) AssertDeepEquals(t, "foo missing deps", []string{"added_missing_dep", "regular_missing_dep"}, foo.missingDeps) } diff --git a/android/namespace_test.go b/android/namespace_test.go index 0327e7824..a183bbf0d 100644 --- a/android/namespace_test.go +++ b/android/namespace_test.go @@ -683,7 +683,7 @@ func numDeps(result *TestResult, module TestingModule) int { } func getModule(result *TestResult, moduleName string) TestingModule { - return result.ModuleForTests(moduleName, "") + return result.ModuleForTests(result.fixture.t, moduleName, "") } func findModuleById(result *TestResult, id string) (module TestingModule) { @@ -691,7 +691,7 @@ func findModuleById(result *TestResult, id string) (module TestingModule) { testModule, ok := candidate.(*testModule) if ok { if testModule.properties.Id == id { - module = newTestingModule(result.config, testModule) + module = newTestingModule(result.fixture.t, result.config, testModule) } } } diff --git a/android/packaging.go b/android/packaging.go index d216c0c18..4e0c74a12 100644 --- a/android/packaging.go +++ b/android/packaging.go @@ -202,6 +202,11 @@ func (p *PackagingSpec) SrcPath() Path { return p.srcPath } +// The symlink target of the PackagingSpec. Do not use, for the soong-only migration. +func (p *PackagingSpec) SymlinkTarget() string { + return p.symlinkTarget +} + type PackageModule interface { Module packagingBase() *PackagingBase @@ -598,12 +603,12 @@ func (p *PackagingBase) GatherPackagingSpecs(ctx ModuleContext) map[string]Packa func (p *PackagingBase) CopySpecsToDir(ctx ModuleContext, builder *RuleBuilder, specs map[string]PackagingSpec, dir WritablePath) (entries []string) { dirsToSpecs := make(map[WritablePath]map[string]PackagingSpec) dirsToSpecs[dir] = specs - return p.CopySpecsToDirs(ctx, builder, dirsToSpecs) + return p.CopySpecsToDirs(ctx, builder, dirsToSpecs, false) } // CopySpecsToDirs is a helper that will add commands to the rule builder to copy the PackagingSpec // entries into corresponding directories. -func (p *PackagingBase) CopySpecsToDirs(ctx ModuleContext, builder *RuleBuilder, dirsToSpecs map[WritablePath]map[string]PackagingSpec) (entries []string) { +func (p *PackagingBase) CopySpecsToDirs(ctx ModuleContext, builder *RuleBuilder, dirsToSpecs map[WritablePath]map[string]PackagingSpec, preserveTimestamps bool) (entries []string) { empty := true for _, specs := range dirsToSpecs { if len(specs) > 0 { @@ -637,7 +642,11 @@ func (p *PackagingBase) CopySpecsToDirs(ctx ModuleContext, builder *RuleBuilder, builder.Command().Textf("mkdir -p %s", destDir) } if ps.symlinkTarget == "" { - builder.Command().Text("cp").Input(ps.srcPath).Text(destPath) + cmd := builder.Command().Text("cp") + if preserveTimestamps { + cmd.Flag("-p") + } + cmd.Input(ps.srcPath).Text(destPath) } else { builder.Command().Textf("ln -sf %s %s", ps.symlinkTarget, destPath) } diff --git a/android/paths_test.go b/android/paths_test.go index 20beecc35..b125c4e73 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -1269,7 +1269,7 @@ func testPathForModuleSrc(t *testing.T, tests []pathForModuleSrcTestCase) { ExtendWithErrorHandler(errorHandler). RunTest(t) - m := result.ModuleForTests("foo", "").Module().(*pathForModuleSrcTestModule) + m := result.ModuleForTests(t, "foo", "").Module().(*pathForModuleSrcTestModule) AssertStringPathsRelativeToTopEquals(t, "srcs", result.Config, test.srcs, m.srcs) AssertStringPathsRelativeToTopEquals(t, "rels", result.Config, test.rels, m.rels) @@ -1533,13 +1533,13 @@ func TestPathsForModuleSrc_AllowMissingDependencies(t *testing.T) { FixtureWithRootAndroidBp(bp), ).RunTest(t) - foo := result.ModuleForTests("foo", "").Module().(*pathForModuleSrcTestModule) + foo := result.ModuleForTests(t, "foo", "").Module().(*pathForModuleSrcTestModule) AssertArrayString(t, "foo missing deps", []string{"a", "b", "c"}, foo.missingDeps) AssertArrayString(t, "foo srcs", []string{}, foo.srcs) AssertStringEquals(t, "foo src", "", foo.src) - bar := result.ModuleForTests("bar", "").Module().(*pathForModuleSrcTestModule) + bar := result.ModuleForTests(t, "bar", "").Module().(*pathForModuleSrcTestModule) AssertArrayString(t, "bar missing deps", []string{"d", "e"}, bar.missingDeps) AssertArrayString(t, "bar srcs", []string{}, bar.srcs) diff --git a/android/prebuilt.go b/android/prebuilt.go index bf2717865..6b076b7b4 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -28,6 +28,7 @@ import ( func RegisterPrebuiltMutators(ctx RegistrationContext) { ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators) + ctx.PreDepsMutators(RegisterPrebuiltsPreDepsMutators) ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators) } @@ -195,6 +196,10 @@ func (p *Prebuilt) UsePrebuilt() bool { return p.properties.UsePrebuilt } +func (p *Prebuilt) SetUsePrebuilt(use bool) { + p.properties.UsePrebuilt = use +} + // Called to provide the srcs value for the prebuilt module. // // This can be called with a context for any module not just the prebuilt one itself. It can also be @@ -422,9 +427,12 @@ func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_rename", PrebuiltRenameMutator).UsesRename() } -func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) { +func RegisterPrebuiltsPreDepsMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_source", PrebuiltSourceDepsMutator).UsesReverseDependencies() ctx.BottomUp("prebuilt_select", PrebuiltSelectModuleMutator) +} + +func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_postdeps", PrebuiltPostDepsMutator).UsesReplaceDependencies() } @@ -468,7 +476,7 @@ func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) { bmn, _ := m.(baseModuleName) name := bmn.BaseModuleName() if ctx.OtherModuleReverseDependencyVariantExists(name) { - ctx.AddReverseDependency(ctx.Module(), PrebuiltDepTag, name) + ctx.AddReverseVariationDependency(nil, PrebuiltDepTag, name) p.properties.SourceExists = true } } @@ -604,6 +612,13 @@ func hideUnflaggedModules(ctx BottomUpMutatorContext, psi PrebuiltSelectionInfoM } } +func IsDontReplaceSourceWithPrebuiltTag(tag blueprint.DependencyTag) bool { + if t, ok := tag.(ReplaceSourceWithPrebuilt); ok { + return !t.ReplaceSourceWithPrebuilt() + } + return false +} + // PrebuiltPostDepsMutator replaces dependencies on the source module with dependencies on the // prebuilt when both modules exist and the prebuilt should be used. When the prebuilt should not // be used, disable installing it. diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go index b90ef3b1c..27a68fbe5 100644 --- a/android/prebuilt_test.go +++ b/android/prebuilt_test.go @@ -335,7 +335,7 @@ func TestPrebuilts(t *testing.T) { ).RunTestWithBp(t, bp) for _, variant := range result.ModuleVariantsForTests("foo") { - foo := result.ModuleForTests("foo", variant) + foo := result.ModuleForTests(t, "foo", variant) t.Run(foo.Module().Target().Os.String(), func(t *testing.T) { var dependsOnSourceModule, dependsOnPrebuiltModule bool result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) { diff --git a/android/provider.go b/android/provider.go index 81d17a175..b48fd9148 100644 --- a/android/provider.go +++ b/android/provider.go @@ -4,8 +4,8 @@ import ( "github.com/google/blueprint" ) -// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or -// TopDownMutatorContext for use in OtherModuleProvider. +// OtherModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext +// for use in OtherModuleProvider. type OtherModuleProviderContext interface { otherModuleProvider(m blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) } @@ -13,7 +13,6 @@ type OtherModuleProviderContext interface { var _ OtherModuleProviderContext = BaseModuleContext(nil) var _ OtherModuleProviderContext = ModuleContext(nil) var _ OtherModuleProviderContext = BottomUpMutatorContext(nil) -var _ OtherModuleProviderContext = TopDownMutatorContext(nil) var _ OtherModuleProviderContext = SingletonContext(nil) var _ OtherModuleProviderContext = (*TestContext)(nil) @@ -21,8 +20,7 @@ var _ OtherModuleProviderContext = (*TestContext)(nil) // returned and the boolean is true. If it has not been set the zero value of the provider's type is returned // and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider. // -// OtherModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or -// TopDownMutatorContext. +// OtherModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext. func OtherModuleProvider[K any](ctx OtherModuleProviderContext, module blueprint.Module, provider blueprint.ProviderKey[K]) (K, bool) { value, ok := ctx.otherModuleProvider(getWrappedModule(module), provider) if !ok { @@ -37,8 +35,8 @@ func OtherModuleProviderOrDefault[K any](ctx OtherModuleProviderContext, module return value } -// ModuleProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or -// TopDownMutatorContext for use in ModuleProvider. +// ModuleProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext +// for use in ModuleProvider. type ModuleProviderContext interface { provider(provider blueprint.AnyProviderKey) (any, bool) } @@ -46,14 +44,12 @@ type ModuleProviderContext interface { var _ ModuleProviderContext = BaseModuleContext(nil) var _ ModuleProviderContext = ModuleContext(nil) var _ ModuleProviderContext = BottomUpMutatorContext(nil) -var _ ModuleProviderContext = TopDownMutatorContext(nil) // ModuleProvider reads the provider for the current module. If the provider has been set the value is // returned and the boolean is true. If it has not been set the zero value of the provider's type is returned // and the boolean is false. The value returned may be a deep copy of the value originally passed to SetProvider. // -// ModuleProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or -// TopDownMutatorContext. +// ModuleProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext. func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.ProviderKey[K]) (K, bool) { value, ok := ctx.provider(provider) if !ok { @@ -63,8 +59,8 @@ func ModuleProvider[K any](ctx ModuleProviderContext, provider blueprint.Provide return value.(K), ok } -// SetProviderContext is a helper interface that is a subset of ModuleContext, BottomUpMutatorContext, or -// TopDownMutatorContext for use in SetProvider. +// SetProviderContext is a helper interface that is a subset of ModuleContext or BottomUpMutatorContext +// for use in SetProvider. type SetProviderContext interface { setProvider(provider blueprint.AnyProviderKey, value any) } @@ -72,15 +68,13 @@ type SetProviderContext interface { var _ SetProviderContext = BaseModuleContext(nil) var _ SetProviderContext = ModuleContext(nil) var _ SetProviderContext = BottomUpMutatorContext(nil) -var _ SetProviderContext = TopDownMutatorContext(nil) // SetProvider sets the value for a provider for the current module. It panics if not called // during the appropriate mutator or GenerateBuildActions pass for the provider, if the value // is not of the appropriate type, or if the value has already been set. The value should not // be modified after being passed to SetProvider. // -// SetProviderContext is a helper interface that accepts ModuleContext, BottomUpMutatorContext, or -// TopDownMutatorContext. +// SetProviderContext is a helper interface that accepts ModuleContext or BottomUpMutatorContext. func SetProvider[K any](ctx SetProviderContext, provider blueprint.ProviderKey[K], value K) { ctx.setProvider(provider, value) } diff --git a/android/register.go b/android/register.go index 8d2f19e73..10c9114f5 100644 --- a/android/register.go +++ b/android/register.go @@ -89,7 +89,6 @@ var singletons sortableComponents type mutator struct { name string bottomUpMutator blueprint.BottomUpMutator - topDownMutator blueprint.TopDownMutator transitionMutator blueprint.TransitionMutator usesRename bool @@ -192,6 +191,11 @@ func (ctx *Context) registerSingletonMakeVarsProvider(makevars SingletonMakeVars func collateGloballyRegisteredSingletons() sortableComponents { allSingletons := append(sortableComponents(nil), singletons...) allSingletons = append(allSingletons, + // Soong only androidmk is registered later than other singletons in order to collect + // dist contributions from other singletons. This singleton is registered just before + // phony so that its phony rules can be collected by the phony singleton. + singleton{parallel: false, name: "soongonlyandroidmk", factory: soongOnlyAndroidMkSingletonFactory}, + // Register phony just before makevars so it can write out its phony rules as Make rules singleton{parallel: false, name: "phony", factory: phonySingletonFactory}, diff --git a/android/rule_builder_test.go b/android/rule_builder_test.go index 566bafa06..5f3b9bee4 100644 --- a/android/rule_builder_test.go +++ b/android/rule_builder_test.go @@ -651,7 +651,7 @@ func TestRuleBuilder_Build(t *testing.T) { outFile := "out/soong/.intermediates/foo/gen/foo" rspFile := "out/soong/.intermediates/foo/rsp" rspFile2 := "out/soong/.intermediates/foo/rsp2" - module := result.ModuleForTests("foo", "") + module := result.ModuleForTests(t, "foo", "") check(t, module.Rule("rule"), module.Output(rspFile2), "cp in "+outFile+" @"+rspFile+" @"+rspFile2, outFile, outFile+".d", rspFile, rspFile2, true, nil, nil) @@ -668,7 +668,7 @@ func TestRuleBuilder_Build(t *testing.T) { sandboxPath := shared.TempDirForOutDir("out/soong") cmd := sbox + ` --sandbox-path ` + sandboxPath + ` --output-dir ` + sboxOutDir + ` --manifest ` + manifest - module := result.ModuleForTests("foo_sbox", "") + module := result.ModuleForTests(t, "foo_sbox", "") check(t, module.Output("gen/foo_sbox"), module.Output(rspFile2), cmd, outFile, depFile, rspFile, rspFile2, false, []string{manifest}, []string{sbox}) }) @@ -685,7 +685,7 @@ func TestRuleBuilder_Build(t *testing.T) { cmd := sbox + ` --sandbox-path ` + sandboxPath + ` --output-dir ` + sboxOutDir + ` --manifest ` + manifest - module := result.ModuleForTests("foo_sbox_inputs", "") + module := result.ModuleForTests(t, "foo_sbox_inputs", "") check(t, module.Output("gen/foo_sbox_inputs"), module.Output(rspFile2), cmd, outFile, depFile, rspFile, rspFile2, false, []string{manifest}, []string{sbox}) }) @@ -693,7 +693,7 @@ func TestRuleBuilder_Build(t *testing.T) { outFile := filepath.Join("out/soong/singleton/gen/baz") rspFile := filepath.Join("out/soong/singleton/rsp") rspFile2 := filepath.Join("out/soong/singleton/rsp2") - singleton := result.SingletonForTests("rule_builder_test") + singleton := result.SingletonForTests(t, "rule_builder_test") check(t, singleton.Rule("rule"), singleton.Output(rspFile2), "cp in "+outFile+" @"+rspFile+" @"+rspFile2, outFile, outFile+".d", rspFile, rspFile2, true, nil, nil) @@ -756,14 +756,14 @@ func TestRuleBuilderHashInputs(t *testing.T) { for _, test := range testcases { t.Run(test.name, func(t *testing.T) { t.Run("sbox", func(t *testing.T) { - gen := result.ModuleForTests(test.name+"_sbox", "") + gen := result.ModuleForTests(t, test.name+"_sbox", "") manifest := RuleBuilderSboxProtoForTests(t, result.TestContext, gen.Output("sbox.textproto")) hash := manifest.Commands[0].GetInputHash() AssertStringEquals(t, "hash", test.expectedHash, hash) }) t.Run("", func(t *testing.T) { - gen := result.ModuleForTests(test.name+"", "") + gen := result.ModuleForTests(t, test.name+"", "") command := gen.Output("gen/" + test.name).RuleParams.Command if g, w := command, " # hash of input list: "+test.expectedHash; !strings.HasSuffix(g, w) { t.Errorf("Expected command line to end with %q, got %q", w, g) diff --git a/android/sbom.go b/android/sbom.go index f2b9c0ff1..fc61c41dd 100644 --- a/android/sbom.go +++ b/android/sbom.go @@ -84,12 +84,6 @@ func (this *sbomSingleton) GenerateBuildActions(ctx SingletonContext) { Inputs: []Path{this.sbomFile}, Output: PathForPhony(ctx, "sbom"), }) - } -} - -func (this *sbomSingleton) MakeVars(ctx MakeVarsContext) { - // When building SBOM of products - if !ctx.Config().UnbundledBuildApps() { ctx.DistForGoalWithFilename("droid", this.sbomFile, "sbom/sbom.spdx.json") } } diff --git a/android/sdk_version.go b/android/sdk_version.go index a9b88fbce..fa3abaa7c 100644 --- a/android/sdk_version.go +++ b/android/sdk_version.go @@ -123,6 +123,31 @@ func (k SdkKind) DefaultJavaLibraryName() string { } } +func JavaLibraryNameToSdkKind(name string) (SdkKind, bool) { + if name == SdkPublic.DefaultJavaLibraryName() { + return SdkPublic, true + } + if name == SdkSystem.DefaultJavaLibraryName() { + return SdkSystem, true + } + if name == SdkTest.DefaultJavaLibraryName() { + return SdkTest, true + } + if name == SdkTestFrameworksCore.DefaultJavaLibraryName() { + return SdkTestFrameworksCore, true + } + if name == SdkCore.DefaultJavaLibraryName() { + return SdkCore, true + } + if name == SdkModule.DefaultJavaLibraryName() { + return SdkModule, true + } + if name == SdkSystemServer.DefaultJavaLibraryName() { + return SdkSystemServer, true + } + return SdkInvalid, false +} + func (k SdkKind) DefaultExportableJavaLibraryName() string { switch k { case SdkPublic, SdkSystem, SdkTest, SdkModule, SdkSystemServer: diff --git a/android/selects_test.go b/android/selects_test.go index 1397ed8b7..7f20a3d66 100644 --- a/android/selects_test.go +++ b/android/selects_test.go @@ -1118,7 +1118,7 @@ my_module_type { for moduleName := range tc.providers { expected := tc.providers[moduleName] - m := result.ModuleForTests(moduleName, "android_arm64_armv8-a") + m := result.ModuleForTests(t, moduleName, "android_arm64_armv8-a") p, _ := OtherModuleProvider(result.testContext.OtherModuleProviderAdaptor(), m.Module(), selectsTestProviderKey) if !reflect.DeepEqual(p, expected) { t.Errorf("Expected:\n %q\ngot:\n %q", expected.String(), p.String()) diff --git a/android/singleton.go b/android/singleton.go index 0754b0ccb..df2204591 100644 --- a/android/singleton.go +++ b/android/singleton.go @@ -15,6 +15,9 @@ package android import ( + "slices" + "sync" + "github.com/google/blueprint" ) @@ -97,6 +100,24 @@ type SingletonContext interface { // HasMutatorFinished returns true if the given mutator has finished running. // It will panic if given an invalid mutator name. HasMutatorFinished(mutatorName string) bool + + // DistForGoals creates a rule to copy one or more Paths to the artifacts + // directory on the build server when any of the specified goals are built. + DistForGoal(goal string, paths ...Path) + + // DistForGoalWithFilename creates a rule to copy a Path to the artifacts + // directory on the build server with the given filename when the specified + // goal is built. + DistForGoalWithFilename(goal string, path Path, filename string) + + // DistForGoals creates a rule to copy one or more Paths to the artifacts + // directory on the build server when any of the specified goals are built. + DistForGoals(goals []string, paths ...Path) + + // DistForGoalsWithFilename creates a rule to copy a Path to the artifacts + // directory on the build server with the given filename when any of the + // specified goals are built. + DistForGoalsWithFilename(goals []string, path Path, filename string) } type singletonAdaptor struct { @@ -118,6 +139,13 @@ func (s *singletonAdaptor) GenerateBuildActions(ctx blueprint.SingletonContext) s.buildParams = sctx.buildParams s.ruleParams = sctx.ruleParams + + if len(sctx.dists) > 0 { + dists := getSingletonDists(sctx.Config()) + dists.lock.Lock() + defer dists.lock.Unlock() + dists.dists = append(dists.dists, sctx.dists...) + } } func (s *singletonAdaptor) BuildParamsForTests() []BuildParams { @@ -128,6 +156,19 @@ func (s *singletonAdaptor) RuleParamsForTests() map[blueprint.Rule]blueprint.Rul return s.ruleParams } +var singletonDistsKey = NewOnceKey("singletonDistsKey") + +type singletonDistsAndLock struct { + dists []dist + lock sync.Mutex +} + +func getSingletonDists(config Config) *singletonDistsAndLock { + return config.Once(singletonDistsKey, func() interface{} { + return &singletonDistsAndLock{} + }).(*singletonDistsAndLock) +} + type Singleton interface { GenerateBuildActions(SingletonContext) } @@ -137,6 +178,7 @@ type singletonContextAdaptor struct { buildParams []BuildParams ruleParams map[blueprint.Rule]blueprint.RuleParams + dists []dist } func (s *singletonContextAdaptor) blueprintSingletonContext() blueprint.SingletonContext { @@ -315,3 +357,31 @@ func (s *singletonContextAdaptor) OtherModulePropertyErrorf(module Module, prope func (s *singletonContextAdaptor) HasMutatorFinished(mutatorName string) bool { return s.blueprintSingletonContext().HasMutatorFinished(mutatorName) } +func (s *singletonContextAdaptor) DistForGoal(goal string, paths ...Path) { + s.DistForGoals([]string{goal}, paths...) +} + +func (s *singletonContextAdaptor) DistForGoalWithFilename(goal string, path Path, filename string) { + s.DistForGoalsWithFilename([]string{goal}, path, filename) +} + +func (s *singletonContextAdaptor) DistForGoals(goals []string, paths ...Path) { + var copies distCopies + for _, path := range paths { + copies = append(copies, distCopy{ + from: path, + dest: path.Base(), + }) + } + s.dists = append(s.dists, dist{ + goals: slices.Clone(goals), + paths: copies, + }) +} + +func (s *singletonContextAdaptor) DistForGoalsWithFilename(goals []string, path Path, filename string) { + s.dists = append(s.dists, dist{ + goals: slices.Clone(goals), + paths: distCopies{{from: path, dest: filename}}, + }) +} diff --git a/android/singleton_module_test.go b/android/singleton_module_test.go index 3b8c6b213..6f61a3b48 100644 --- a/android/singleton_module_test.go +++ b/android/singleton_module_test.go @@ -61,7 +61,7 @@ func TestSingletonModule(t *testing.T) { FixtureWithRootAndroidBp(bp), ).RunTest(t) - ops := result.ModuleForTests("test_singleton_module", "").Module().(*testSingletonModule).ops + ops := result.ModuleForTests(t, "test_singleton_module", "").Module().(*testSingletonModule).ops wantOps := []string{"GenerateAndroidBuildActions", "GenerateSingletonBuildActions", "MakeVars"} AssertDeepEquals(t, "operations", wantOps, ops) } @@ -88,7 +88,7 @@ func TestUnusedSingletonModule(t *testing.T) { prepareForSingletonModuleTest, ).RunTest(t) - singleton := result.SingletonForTests("test_singleton_module").Singleton() + singleton := result.SingletonForTests(t, "test_singleton_module").Singleton() sm := singleton.(*singletonModuleSingletonAdaptor).sm ops := sm.(*testSingletonModule).ops if ops != nil { diff --git a/android/soong_config_modules_test.go b/android/soong_config_modules_test.go index 04aafdeee..f98e02b0c 100644 --- a/android/soong_config_modules_test.go +++ b/android/soong_config_modules_test.go @@ -321,10 +321,10 @@ func TestSoongConfigModule(t *testing.T) { FixtureWithRootAndroidBp(bp), ).RunTest(t) - foo := result.ModuleForTests("foo", "").Module().(*soongConfigTestModule) + foo := result.ModuleForTests(t, "foo", "").Module().(*soongConfigTestModule) AssertDeepEquals(t, "foo cflags", tc.fooExpectedFlags, foo.props.Cflags) - fooDefaults := result.ModuleForTests("foo_with_defaults", "").Module().(*soongConfigTestModule) + fooDefaults := result.ModuleForTests(t, "foo_with_defaults", "").Module().(*soongConfigTestModule) AssertDeepEquals(t, "foo_with_defaults cflags", tc.fooDefaultsExpectedFlags, fooDefaults.props.Cflags) }) } @@ -499,8 +499,8 @@ func TestSoongConfigModuleSingletonModule(t *testing.T) { ).RunTest(t) // Make sure that the singleton was created. - result.SingletonForTests("test_singleton") - m := result.ModuleForTests("wiley", "").module.(*soongConfigTestSingletonModule) + result.SingletonForTests(t, "test_singleton") + m := result.ModuleForTests(t, "wiley", "").module.(*soongConfigTestSingletonModule) AssertStringEquals(t, "fragments", test.expectedFragments, fmt.Sprintf("%+v", m.props.Fragments)) }) } diff --git a/android/team_proto/OWNERS b/android/team_proto/OWNERS index 2beb4f47d..1eb820b4c 100644 --- a/android/team_proto/OWNERS +++ b/android/team_proto/OWNERS @@ -1,5 +1,4 @@ dariofreni@google.com joeo@google.com ronish@google.com -caditya@google.com rbraunstein@google.com diff --git a/android/team_test.go b/android/team_test.go index ccfcaaa66..dcc1c99cc 100644 --- a/android/team_test.go +++ b/android/team_test.go @@ -61,9 +61,9 @@ func TestTeam(t *testing.T) { `) // Assert the rule from GenerateAndroidBuildActions exists. - m := ctx.ModuleForTests("main_test", "") + m := ctx.ModuleForTests(t, "main_test", "") AssertStringEquals(t, "msg", m.Module().base().Team(), "someteam") - m = ctx.ModuleForTests("tool", "") + m = ctx.ModuleForTests(t, "tool", "") AssertStringEquals(t, "msg", m.Module().base().Team(), "team2") } diff --git a/android/test_suites.go b/android/test_suites.go index 936d2b651..18744f1da 100644 --- a/android/test_suites.go +++ b/android/test_suites.go @@ -58,9 +58,6 @@ func (t *testSuiteFiles) GenerateBuildActions(ctx SingletonContext) { t.ravenwood = ravenwoodTestSuite(ctx, files["ravenwood-tests"]) ctx.Phony("ravenwood-tests", t.ravenwood...) -} - -func (t *testSuiteFiles) MakeVars(ctx MakeVarsContext) { ctx.DistForGoal("robolectric-tests", t.robolectric...) ctx.DistForGoal("ravenwood-tests", t.ravenwood...) } diff --git a/android/test_suites_test.go b/android/test_suites_test.go index db9a34d11..bf4de197e 100644 --- a/android/test_suites_test.go +++ b/android/test_suites_test.go @@ -52,7 +52,7 @@ func TestBuildTestList(t *testing.T) { } `) - config := ctx.SingletonForTests("testsuites") + config := ctx.SingletonForTests(t, "testsuites") allOutputs := config.AllOutputs() wantContents := map[string]string{ diff --git a/android/testing.go b/android/testing.go index 6c4f4f8de..8e38b3b1c 100644 --- a/android/testing.go +++ b/android/testing.go @@ -530,7 +530,8 @@ func (ctx *TestContext) RegisterParallelSingletonType(name string, factory Singl // both have the same value. Both the module and the map are allowed to have // extra variations that the other doesn't have. Panics if not exactly one // module variant matches. -func (ctx *TestContext) ModuleVariantForTests(name string, matchVariations map[string]string) TestingModule { +func (ctx *TestContext) ModuleVariantForTests(t *testing.T, name string, matchVariations map[string]string) TestingModule { + t.Helper() modules := []Module{} ctx.VisitAllModules(func(m blueprint.Module) { if ctx.ModuleName(m) == name { @@ -562,12 +563,12 @@ func (ctx *TestContext) ModuleVariantForTests(name string, matchVariations map[s }) if len(allVariants) == 0 { - panic(fmt.Errorf("failed to find module %q. All modules:\n %s", - name, strings.Join(SortedUniqueStrings(allModuleNames), "\n "))) + t.Fatalf("failed to find module %q. All modules:\n %s", + name, strings.Join(SortedUniqueStrings(allModuleNames), "\n ")) } else { sort.Strings(allVariants) - panic(fmt.Errorf("failed to find module %q matching %v. All variants:\n %s", - name, matchVariations, strings.Join(allVariants, "\n "))) + t.Fatalf("failed to find module %q matching %v. All variants:\n %s", + name, matchVariations, strings.Join(allVariants, "\n ")) } } @@ -577,14 +578,15 @@ func (ctx *TestContext) ModuleVariantForTests(name string, matchVariations map[s moduleStrings = append(moduleStrings, m.String()) } sort.Strings(moduleStrings) - panic(fmt.Errorf("module %q has more than one variant that match %v:\n %s", - name, matchVariations, strings.Join(moduleStrings, "\n "))) + t.Fatalf("module %q has more than one variant that match %v:\n %s", + name, matchVariations, strings.Join(moduleStrings, "\n ")) } - return newTestingModule(ctx.config, modules[0]) + return newTestingModule(t, ctx.config, modules[0]) } -func (ctx *TestContext) ModuleForTests(name, variant string) TestingModule { +func (ctx *TestContext) ModuleForTests(t *testing.T, name, variant string) TestingModule { + t.Helper() var module Module ctx.VisitAllModules(func(m blueprint.Module) { if ctx.ModuleName(m) == name && ctx.ModuleSubDir(m) == variant { @@ -605,15 +607,15 @@ func (ctx *TestContext) ModuleForTests(name, variant string) TestingModule { sort.Strings(allVariants) if len(allVariants) == 0 { - panic(fmt.Errorf("failed to find module %q. All modules:\n %s", - name, strings.Join(SortedUniqueStrings(allModuleNames), "\n "))) + t.Fatalf("failed to find module %q. All modules:\n %s", + name, strings.Join(SortedUniqueStrings(allModuleNames), "\n ")) } else { - panic(fmt.Errorf("failed to find module %q variant %q. All variants:\n %s", - name, variant, strings.Join(allVariants, "\n "))) + t.Fatalf("failed to find module %q variant %q. All variants:\n %s", + name, variant, strings.Join(allVariants, "\n ")) } } - return newTestingModule(ctx.config, module) + return newTestingModule(t, ctx.config, module) } func (ctx *TestContext) ModuleVariantsForTests(name string) []string { @@ -627,21 +629,24 @@ func (ctx *TestContext) ModuleVariantsForTests(name string) []string { } // SingletonForTests returns a TestingSingleton for the singleton registered with the given name. -func (ctx *TestContext) SingletonForTests(name string) TestingSingleton { +func (ctx *TestContext) SingletonForTests(t *testing.T, name string) TestingSingleton { + t.Helper() allSingletonNames := []string{} for _, s := range ctx.Singletons() { n := ctx.SingletonName(s) if n == name { return TestingSingleton{ - baseTestingComponent: newBaseTestingComponent(ctx.config, s.(testBuildProvider)), + baseTestingComponent: newBaseTestingComponent(t, ctx.config, s.(testBuildProvider)), singleton: s.(*singletonAdaptor).Singleton, } } allSingletonNames = append(allSingletonNames, n) } - panic(fmt.Errorf("failed to find singleton %q."+ - "\nall singletons: %v", name, allSingletonNames)) + t.Fatalf("failed to find singleton %q."+ + "\nall singletons: %v", name, allSingletonNames) + + return TestingSingleton{} } type InstallMakeRule struct { @@ -651,6 +656,7 @@ type InstallMakeRule struct { } func parseMkRules(t *testing.T, config Config, nodes []mkparser.Node) []InstallMakeRule { + t.Helper() var rules []InstallMakeRule for _, node := range nodes { if mkParserRule, ok := node.(*mkparser.Rule); ok { @@ -688,7 +694,8 @@ func parseMkRules(t *testing.T, config Config, nodes []mkparser.Node) []InstallM } func (ctx *TestContext) InstallMakeRulesForTesting(t *testing.T) []InstallMakeRule { - installs := ctx.SingletonForTests("makevars").Singleton().(*makeVarsSingleton).installsForTesting + t.Helper() + installs := ctx.SingletonForTests(t, "makevars").Singleton().(*makeVarsSingleton).installsForTesting buf := bytes.NewBuffer(append([]byte(nil), installs...)) parser := mkparser.NewParser("makevars", buf) @@ -728,8 +735,9 @@ var PrepareForTestAccessingMakeVars = GroupFixturePreparers( // // It is necessary to use PrepareForTestAccessingMakeVars in tests that want to call this function. // Along with any other preparers needed to add the make vars. -func (ctx *TestContext) MakeVarsForTesting(filter func(variable MakeVarVariable) bool) []MakeVarVariable { - vars := ctx.SingletonForTests("makevars").Singleton().(*makeVarsSingleton).varsForTesting +func (ctx *TestContext) MakeVarsForTesting(t *testing.T, filter func(variable MakeVarVariable) bool) []MakeVarVariable { + t.Helper() + vars := ctx.SingletonForTests(t, "makevars").Singleton().(*makeVarsSingleton).varsForTesting result := make([]MakeVarVariable, 0, len(vars)) for _, v := range vars { if filter(v) { @@ -846,12 +854,13 @@ func (p TestingBuildParams) AllOutputs() []string { // baseTestingComponent provides functionality common to both TestingModule and TestingSingleton. type baseTestingComponent struct { + t *testing.T config Config provider testBuildProvider } -func newBaseTestingComponent(config Config, provider testBuildProvider) baseTestingComponent { - return baseTestingComponent{config, provider} +func newBaseTestingComponent(t *testing.T, config Config, provider testBuildProvider) baseTestingComponent { + return baseTestingComponent{t, config, provider} } // A function that will normalize a string containing paths, e.g. ninja command, by replacing @@ -924,7 +933,7 @@ func (b baseTestingComponent) maybeBuildParamsFromRule(rule string) (TestingBuil func (b baseTestingComponent) buildParamsFromRule(rule string) TestingBuildParams { p, searchRules := b.maybeBuildParamsFromRule(rule) if p.Rule == nil { - panic(fmt.Errorf("couldn't find rule %q.\nall rules:\n%s", rule, strings.Join(searchRules, "\n"))) + b.t.Fatalf("couldn't find rule %q.\nall rules:\n%s", rule, strings.Join(searchRules, "\n")) } return p } @@ -943,7 +952,7 @@ func (b baseTestingComponent) maybeBuildParamsFromDescription(desc string) (Test func (b baseTestingComponent) buildParamsFromDescription(desc string) TestingBuildParams { p, searchedDescriptions := b.maybeBuildParamsFromDescription(desc) if p.Rule == nil { - panic(fmt.Errorf("couldn't find description %q\nall descriptions:\n%s", desc, strings.Join(searchedDescriptions, "\n"))) + b.t.Fatalf("couldn't find description %q\nall descriptions:\n%s", desc, strings.Join(searchedDescriptions, "\n")) } return p } @@ -976,8 +985,8 @@ func (b baseTestingComponent) maybeBuildParamsFromOutput(file string) (TestingBu func (b baseTestingComponent) buildParamsFromOutput(file string) TestingBuildParams { p, searchedOutputs := b.maybeBuildParamsFromOutput(file) if p.Rule == nil { - panic(fmt.Errorf("couldn't find output %q.\nall outputs:\n %s\n", - file, strings.Join(searchedOutputs, "\n "))) + b.t.Fatalf("couldn't find output %q.\nall outputs:\n %s\n", + file, strings.Join(searchedOutputs, "\n ")) } return p } @@ -1040,9 +1049,9 @@ type TestingModule struct { module Module } -func newTestingModule(config Config, module Module) TestingModule { +func newTestingModule(t *testing.T, config Config, module Module) TestingModule { return TestingModule{ - newBaseTestingComponent(config, module), + newBaseTestingComponent(t, config, module), module, } } diff --git a/android/transition.go b/android/transition.go index e1aa891d1..0677ca1dd 100644 --- a/android/transition.go +++ b/android/transition.go @@ -197,7 +197,7 @@ func (a *androidTransitionMutatorAdapter) Split(ctx blueprint.BaseModuleContext) func (a *androidTransitionMutatorAdapter) OutgoingTransition(bpctx blueprint.OutgoingTransitionContext, sourceTransitionInfo blueprint.TransitionInfo) blueprint.TransitionInfo { m := bpctx.Module().(Module) - ctx := outgoingTransitionContextPool.Get().(*outgoingTransitionContextImpl) + ctx := outgoingTransitionContextPool.Get() defer outgoingTransitionContextPool.Put(ctx) *ctx = outgoingTransitionContextImpl{ archModuleContext: m.base().archModuleContextFactory(bpctx), @@ -209,7 +209,7 @@ func (a *androidTransitionMutatorAdapter) OutgoingTransition(bpctx blueprint.Out func (a *androidTransitionMutatorAdapter) IncomingTransition(bpctx blueprint.IncomingTransitionContext, incomingTransitionInfo blueprint.TransitionInfo) blueprint.TransitionInfo { m := bpctx.Module().(Module) - ctx := incomingTransitionContextPool.Get().(*incomingTransitionContextImpl) + ctx := incomingTransitionContextPool.Get() defer incomingTransitionContextPool.Put(ctx) *ctx = incomingTransitionContextImpl{ archModuleContext: m.base().archModuleContextFactory(bpctx), diff --git a/android/util.go b/android/util.go index 30d8ec6b3..8591cc63e 100644 --- a/android/util.go +++ b/android/util.go @@ -213,21 +213,23 @@ func PrettyConcat(list []string, quote bool, lastSep string) string { } // ListSetDifference checks if the two lists contain the same elements. It returns -// a boolean which is true if there is a difference, and then returns lists of elements +// a boolean which is true if there is a difference, and then returns lists of unique elements // that are in l1 but not l2, and l2 but not l1. func ListSetDifference[T comparable](l1, l2 []T) (bool, []T, []T) { listsDiffer := false + l1 = firstUnique(l1) + l2 = firstUnique(l2) diff1 := []T{} diff2 := []T{} m1 := setFromList(l1) m2 := setFromList(l2) - for t := range m1 { + for _, t := range l1 { if _, ok := m2[t]; !ok { diff1 = append(diff1, t) listsDiffer = true } } - for t := range m2 { + for _, t := range l2 { if _, ok := m1[t]; !ok { diff2 = append(diff2, t) listsDiffer = true @@ -238,8 +240,13 @@ func ListSetDifference[T comparable](l1, l2 []T) (bool, []T, []T) { // Returns true if the two lists have common elements. func HasIntersection[T comparable](l1, l2 []T) bool { - _, a, b := ListSetDifference(l1, l2) - return len(a)+len(b) < len(setFromList(l1))+len(setFromList(l2)) + m1 := setFromList(l1) + for _, x := range l2 { + if _, ok := m1[x]; ok { + return true + } + } + return false } // Returns true if the given string s is prefixed with any string in the given prefix list. diff --git a/android/variable.go b/android/variable.go index 4867067b0..81999f340 100644 --- a/android/variable.go +++ b/android/variable.go @@ -664,6 +664,9 @@ type PartitionVariables struct { ProductVirtualAbCompressionFactor string `json:",omitempty"` ProductVirtualAbCowVersion string `json:",omitempty"` AbOtaUpdater bool `json:",omitempty"` + AbOtaPartitions []string `json:",omitempty"` + AbOtaKeys []string `json:",omitempty"` + AbOtaPostInstallConfig []string `json:",omitempty"` // Avb (android verified boot) stuff BoardAvbEnable bool `json:",omitempty"` @@ -710,6 +713,8 @@ type PartitionVariables struct { ProductFsCasefold string `json:",omitempty"` ProductQuotaProjid string `json:",omitempty"` ProductFsCompression string `json:",omitempty"` + + ReleaseToolsExtensionDir string `json:",omitempty"` } func boolPtr(v bool) *bool { diff --git a/android/variable_test.go b/android/variable_test.go index 73dc052d5..1d928f2c8 100644 --- a/android/variable_test.go +++ b/android/variable_test.go @@ -299,7 +299,7 @@ func TestProductVariablesDefaults(t *testing.T) { FixtureWithRootAndroidBp(bp), ).RunTest(t) - foo := result.ModuleForTests("foo", "").Module().(*productVariablesDefaultsTestModule) + foo := result.ModuleForTests(t, "foo", "").Module().(*productVariablesDefaultsTestModule) want := []string{"defaults", "module", "product_variable_defaults", "product_variable_module"} AssertDeepEquals(t, "foo", want, foo.properties.Foo) @@ -360,7 +360,7 @@ func TestProductVariablesArch(t *testing.T) { FixtureWithRootAndroidBp(bp), ).RunTest(t) - foo := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*productVariablesDefaultsTestModule) + foo := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Module().(*productVariablesDefaultsTestModule) want := []string{"module", "arm64"} AssertDeepEquals(t, "foo", want, foo.properties.Foo) diff --git a/android/vintf_fragment.go b/android/vintf_fragment.go index a3343fd5a..49cf99972 100644 --- a/android/vintf_fragment.go +++ b/android/vintf_fragment.go @@ -19,8 +19,9 @@ type vintfFragmentProperties struct { Src string `android:"path"` } -type vintfFragmentModule struct { +type VintfFragmentModule struct { ModuleBase + ApexModuleBase properties vintfFragmentProperties @@ -40,7 +41,7 @@ func registerVintfFragmentComponents(ctx RegistrationContext) { // Vintf fragment files formerly listed in vintf_fragment property would be transformed into // this module type. func vintfLibraryFactory() Module { - m := &vintfFragmentModule{} + m := &VintfFragmentModule{} m.AddProperties( &m.properties, ) @@ -49,7 +50,7 @@ func vintfLibraryFactory() Module { return m } -func (m *vintfFragmentModule) GenerateAndroidBuildActions(ctx ModuleContext) { +func (m *VintfFragmentModule) GenerateAndroidBuildActions(ctx ModuleContext) { builder := NewRuleBuilder(pctx, ctx) srcVintfFragment := PathForModuleSrc(ctx, m.properties.Src) processedVintfFragment := PathForModuleOut(ctx, srcVintfFragment.Base()) @@ -69,8 +70,12 @@ func (m *vintfFragmentModule) GenerateAndroidBuildActions(ctx ModuleContext) { ctx.InstallFile(m.installDirPath, processedVintfFragment.Base(), processedVintfFragment) } +func (m *VintfFragmentModule) OutputFile() Path { + return m.outputFilePath +} + // Make this module visible to AndroidMK so it can be referenced from modules defined from Android.mk files -func (m *vintfFragmentModule) AndroidMkEntries() []AndroidMkEntries { +func (m *VintfFragmentModule) AndroidMkEntries() []AndroidMkEntries { return []AndroidMkEntries{{ Class: "ETC", OutputFile: OptionalPathForPath(m.outputFilePath), @@ -82,3 +87,10 @@ func (m *vintfFragmentModule) AndroidMkEntries() []AndroidMkEntries { }, }} } + +var _ ApexModule = (*VintfFragmentModule)(nil) + +// Implements android.ApexModule +func (m *VintfFragmentModule) MinSdkVersionSupported(ctx BaseModuleContext) ApiLevel { + return MinApiLevel +} diff --git a/android/vintf_fragment_test.go b/android/vintf_fragment_test.go index cb038f5ad..7f0078caf 100644 --- a/android/vintf_fragment_test.go +++ b/android/vintf_fragment_test.go @@ -29,7 +29,7 @@ func TestVintfManifestBuildAction(t *testing.T) { testResult := PrepareForTestWithAndroidBuildComponents.RunTestWithBp(t, bp) - vintfFragmentBuild := testResult.TestContext.ModuleForTests("test_vintf_fragment", "android_common").Rule("assemble_vintf") + vintfFragmentBuild := testResult.TestContext.ModuleForTests(t, "test_vintf_fragment", "android_common").Rule("assemble_vintf") if !strings.Contains(vintfFragmentBuild.RuleParams.Command, "assemble_vintf") { t.Error("Vintf_manifest build command does not process with assemble_vintf : " + vintfFragmentBuild.RuleParams.Command) } diff --git a/android/visibility.go b/android/visibility.go index cee465e8c..4837c7d4b 100644 --- a/android/visibility.go +++ b/android/visibility.go @@ -529,7 +529,7 @@ func visibilityRuleEnforcer(ctx BottomUpMutatorContext) { rule := effectiveVisibilityRules(ctx.Config(), depQualified) if !rule.matches(qualified) { - ctx.ModuleErrorf("depends on %s which is not visible to this module\nYou may need to add %q to its visibility", depQualified, "//"+ctx.ModuleDir()) + ctx.ModuleErrorf("depends on %s which is not visible to this module\nYou may need to add %q to its visibility, %#v", depQualified, "//"+ctx.ModuleDir(), ctx.OtherModuleDependencyTag(dep)) } }) } diff --git a/android_sdk/sdk_repo_host_test.go b/android_sdk/sdk_repo_host_test.go index 0688921f4..ce8420408 100644 --- a/android_sdk/sdk_repo_host_test.go +++ b/android_sdk/sdk_repo_host_test.go @@ -44,7 +44,7 @@ func TestSdkRepoHostDeps(t *testing.T) { `) // produces "sdk-repo-{OS}-platform-tools.zip" - result.ModuleForTests("platform-tools", "linux_glibc_common").Output("sdk-repo-linux-platform-tools.zip") + result.ModuleForTests(t, "platform-tools", "linux_glibc_common").Output("sdk-repo-linux-platform-tools.zip") } func TestRemapPackageSpecs(t *testing.T) { diff --git a/apex/apex.go b/apex/apex.go index fa796e534..4d0e3f183 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -61,12 +61,11 @@ func RegisterPreDepsMutators(ctx android.RegisterMutatorsContext) { } func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) { - ctx.TopDown("apex_info", apexInfoMutator) ctx.BottomUp("apex_unique", apexUniqueVariationsMutator) // Run mark_platform_availability before the apexMutator as the apexMutator needs to know whether // it should create a platform variant. ctx.BottomUp("mark_platform_availability", markPlatformAvailability) - ctx.Transition("apex", &apexTransitionMutator{}) + ctx.InfoBasedTransition("apex", android.NewGenericTransitionMutatorAdapter(&apexTransitionMutator{})) } type apexBundleProperties struct { @@ -768,6 +767,17 @@ var ( shBinaryTag = &dependencyTag{name: "shBinary", payload: true} ) +type fragmentInApexDepTag struct { + blueprint.BaseDependencyTag + android.FragmentInApexTag +} + +func (fragmentInApexDepTag) ExcludeFromVisibilityEnforcement() {} + +// fragmentInApexTag is used by apex modules to depend on their fragments. Java bootclasspath +// modules can traverse from the apex to the fragment using android.IsFragmentInApexTag. +var fragmentInApexTag = fragmentInApexDepTag{} + // TODO(jiyong): shorten this function signature func addDependenciesForNativeModules(ctx android.BottomUpMutatorContext, nativeModules ResolvedApexNativeDependencies, target android.Target, imageVariation string) { binVariations := target.Variations() @@ -916,6 +926,7 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { commonVariation := ctx.Config().AndroidCommonTarget.Variations() ctx.AddFarVariationDependencies(commonVariation, rroTag, a.properties.Rros...) ctx.AddFarVariationDependencies(commonVariation, bcpfTag, a.properties.Bootclasspath_fragments.GetOrDefault(ctx, nil)...) + ctx.AddFarVariationDependencies(commonVariation, fragmentInApexTag, a.properties.Bootclasspath_fragments.GetOrDefault(ctx, nil)...) ctx.AddFarVariationDependencies(commonVariation, sscpfTag, a.properties.Systemserverclasspath_fragments.GetOrDefault(ctx, nil)...) ctx.AddFarVariationDependencies(commonVariation, javaLibTag, a.properties.Java_libs...) ctx.AddFarVariationDependencies(commonVariation, fsTag, a.properties.Filesystems...) @@ -984,45 +995,29 @@ func (a *apexBundle) OverridablePropertiesDepsMutator(ctx android.BottomUpMutato } } -var _ ApexInfoMutator = (*apexBundle)(nil) +var _ ApexTransitionMutator = (*apexBundle)(nil) func (a *apexBundle) ApexVariationName() string { return a.properties.ApexVariationName } -// ApexInfoMutator is responsible for collecting modules that need to have apex variants. They are -// identified by doing a graph walk starting from an apexBundle. Basically, all the (direct and -// indirect) dependencies are collected. But a few types of modules that shouldn't be included in -// the apexBundle (e.g. stub libraries) are not collected. Note that a single module can be depended -// on by multiple apexBundles. In that case, the module is collected for all of the apexBundles. -// -// For each dependency between an apex and an ApexModule an ApexInfo object describing the apex -// is passed to that module's BuildForApex(ApexInfo) method which collates them all in a list. -// The apexMutator uses that list to create module variants for the apexes to which it belongs. -// The relationship between module variants and apexes is not one-to-one as variants will be -// shared between compatible apexes. -func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) { +type generateApexInfoContext interface { + android.MinSdkVersionFromValueContext + Module() android.Module + ModuleName() string +} +// generateApexInfo returns an android.ApexInfo configuration that should be used for dependencies of this apex. +func (a *apexBundle) generateApexInfo(ctx generateApexInfoContext) android.ApexInfo { // The VNDK APEX is special. For the APEX, the membership is described in a very different // way. There is no dependency from the VNDK APEX to the VNDK libraries. Instead, VNDK // libraries are self-identified by their vndk.enabled properties. There is no need to run - // this mutator for the APEX as nothing will be collected. So, let's return fast. + // this mutator for the APEX as nothing will be collected so return an empty ApexInfo. if a.vndkApex { - return - } - - continueApexDepsWalk := func(child, parent android.Module) bool { - am, ok := child.(android.ApexModule) - if !ok || !am.CanHaveApexVariants() { - return false - } - - return android.IsDepInSameApex(mctx, parent, child) + return android.ApexInfo{} } - android.SetProvider(mctx, android.ApexBundleInfoProvider, android.ApexBundleInfo{}) - - minSdkVersion := a.minSdkVersion(mctx) + minSdkVersion := a.minSdkVersion(ctx) // When min_sdk_version is not set, the apex is built against FutureApiLevel. if minSdkVersion.IsNone() { minSdkVersion = android.FutureApiLevel @@ -1031,56 +1026,45 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) { // This is the main part of this mutator. Mark the collected dependencies that they need to // be built for this apexBundle. - apexVariationName := mctx.ModuleName() // could be com.android.foo + apexVariationName := ctx.ModuleName() // could be com.android.foo if a.GetOverriddenBy() != "" { // use the overridden name com.mycompany.android.foo apexVariationName = a.GetOverriddenBy() } - a.properties.ApexVariationName = apexVariationName apexInfo := android.ApexInfo{ ApexVariationName: apexVariationName, MinSdkVersion: minSdkVersion, Updatable: a.Updatable(), UsePlatformApis: a.UsePlatformApis(), - InApexVariants: []string{apexVariationName}, - BaseApexName: mctx.ModuleName(), + BaseApexName: ctx.ModuleName(), ApexAvailableName: proptools.String(a.properties.Apex_available_name), } - mctx.WalkDeps(func(child, parent android.Module) bool { - if !continueApexDepsWalk(child, parent) { - return false - } - child.(android.ApexModule).BuildForApex(apexInfo) // leave a mark! - return true - }) + return apexInfo } -type ApexInfoMutator interface { - // ApexVariationName returns the name of the APEX variation to use in the apex - // mutator etc. It is the same name as ApexInfo.ApexVariationName. - ApexVariationName() string +func (a *apexBundle) ApexTransitionMutatorSplit(ctx android.BaseModuleContext) []android.ApexInfo { + return []android.ApexInfo{a.generateApexInfo(ctx)} +} - // ApexInfoMutator implementations must call BuildForApex(ApexInfo) on any modules that are - // depended upon by an apex and which require an apex specific variant. - ApexInfoMutator(android.TopDownMutatorContext) +func (a *apexBundle) ApexTransitionMutatorOutgoing(ctx android.OutgoingTransitionContext, sourceInfo android.ApexInfo) android.ApexInfo { + return sourceInfo } -// apexInfoMutator delegates the work of identifying which modules need an ApexInfo and apex -// specific variant to modules that support the ApexInfoMutator. -// It also propagates updatable=true to apps of updatable apexes -func apexInfoMutator(mctx android.TopDownMutatorContext) { - if !mctx.Module().Enabled(mctx) { - return - } +func (a *apexBundle) ApexTransitionMutatorIncoming(ctx android.IncomingTransitionContext, outgoingInfo android.ApexInfo) android.ApexInfo { + return a.generateApexInfo(ctx) +} - if a, ok := mctx.Module().(ApexInfoMutator); ok { - a.ApexInfoMutator(mctx) - } +func (a *apexBundle) ApexTransitionMutatorMutate(ctx android.BottomUpMutatorContext, info android.ApexInfo) { + android.SetProvider(ctx, android.ApexBundleInfoProvider, android.ApexBundleInfo{}) + a.properties.ApexVariationName = info.ApexVariationName +} - if am, ok := mctx.Module().(android.ApexModule); ok { - android.ApexInfoMutator(mctx, am) - } +type ApexTransitionMutator interface { + ApexTransitionMutatorSplit(ctx android.BaseModuleContext) []android.ApexInfo + ApexTransitionMutatorOutgoing(ctx android.OutgoingTransitionContext, sourceInfo android.ApexInfo) android.ApexInfo + ApexTransitionMutatorIncoming(ctx android.IncomingTransitionContext, outgoingInfo android.ApexInfo) android.ApexInfo + ApexTransitionMutatorMutate(ctx android.BottomUpMutatorContext, info android.ApexInfo) } // TODO: b/215736885 Whittle the denylist @@ -1143,6 +1127,9 @@ func apexUniqueVariationsMutator(mctx android.BottomUpMutatorContext) { } if am, ok := mctx.Module().(android.ApexModule); ok { android.UpdateUniqueApexVariationsForDeps(mctx, am) + android.SetProvider(mctx, android.DepInSameApexInfoProvider, android.DepInSameApexInfo{ + Checker: am.GetDepInSameApexChecker(), + }) } } @@ -1195,49 +1182,35 @@ func markPlatformAvailability(mctx android.BottomUpMutatorContext) { type apexTransitionMutator struct{} -func (a *apexTransitionMutator) Split(ctx android.BaseModuleContext) []string { - // apexBundle itself is mutated so that it and its dependencies have the same apex variant. - if ai, ok := ctx.Module().(ApexInfoMutator); ok && apexModuleTypeRequiresVariant(ai) { - if overridable, ok := ctx.Module().(android.OverridableModule); ok && overridable.GetOverriddenBy() != "" { - return []string{overridable.GetOverriddenBy()} - } - return []string{ai.ApexVariationName()} +func (a *apexTransitionMutator) Split(ctx android.BaseModuleContext) []android.ApexInfo { + if ai, ok := ctx.Module().(ApexTransitionMutator); ok { + return ai.ApexTransitionMutatorSplit(ctx) } - return []string{""} + return []android.ApexInfo{{}} } -func (a *apexTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { - return sourceVariation -} - -func (a *apexTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { - if am, ok := ctx.Module().(android.ApexModule); ok && am.CanHaveApexVariants() { - return android.IncomingApexTransition(ctx, incomingVariation) - } else if ai, ok := ctx.Module().(ApexInfoMutator); ok { - if overridable, ok := ctx.Module().(android.OverridableModule); ok && overridable.GetOverriddenBy() != "" { - return overridable.GetOverriddenBy() - } - return ai.ApexVariationName() +func (a *apexTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceInfo android.ApexInfo) android.ApexInfo { + if ai, ok := ctx.Module().(ApexTransitionMutator); ok { + return ai.ApexTransitionMutatorOutgoing(ctx, sourceInfo) } - - return "" + return android.ApexInfo{} } -func (a *apexTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { - if am, ok := ctx.Module().(android.ApexModule); ok && am.CanHaveApexVariants() { - android.MutateApexTransition(ctx, variation) +func (a *apexTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, outgoingInfo android.ApexInfo) android.ApexInfo { + if ai, ok := ctx.Module().(ApexTransitionMutator); ok { + return ai.ApexTransitionMutatorIncoming(ctx, outgoingInfo) } + return android.ApexInfo{} } -// apexModuleTypeRequiresVariant determines whether the module supplied requires an apex specific -// variant. -func apexModuleTypeRequiresVariant(module ApexInfoMutator) bool { - if a, ok := module.(*apexBundle); ok { - // TODO(jiyong): document the reason why the VNDK APEX is an exception here. - return !a.vndkApex +func (a *apexTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, info android.ApexInfo) { + if ai, ok := ctx.Module().(ApexTransitionMutator); ok { + ai.ApexTransitionMutatorMutate(ctx, info) } +} - return true +func (a *apexTransitionMutator) TransitionInfoFromVariation(variation string) android.ApexInfo { + panic(fmt.Errorf("adding dependencies on explicit apex variations is not supported")) } const ( @@ -1253,21 +1226,6 @@ const ( erofsFsType = "erofs" ) -var _ android.DepIsInSameApex = (*apexBundle)(nil) - -// Implements android.DepInInSameApex -func (a *apexBundle) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { - // direct deps of an APEX bundle are all part of the APEX bundle - // TODO(jiyong): shouldn't we look into the payload field of the dependencyTag? - return true -} - -func (a *apexBundle) IncomingDepIsInSameApex(tag blueprint.DependencyTag) bool { - // direct deps of an APEX bundle are all part of the APEX bundle - // TODO(jiyong): shouldn't we look into the payload field of the dependencyTag? - return true -} - func (a *apexBundle) Exportable() bool { return true } @@ -1505,6 +1463,12 @@ func apexFileForCompatConfig(ctx android.BaseModuleContext, config java.Platform return newApexFile(ctx, fileToCopy, depName, dirInApex, etc, config) } +func apexFileForVintfFragment(ctx android.BaseModuleContext, vintfFragment *android.VintfFragmentModule) apexFile { + dirInApex := filepath.Join("etc", "vintf") + + return newApexFile(ctx, vintfFragment.OutputFile(), vintfFragment.BaseModuleName(), dirInApex, etc, vintfFragment) +} + // javaModule is an interface to handle all Java modules (java_library, dex_import, etc) in the same // way. type javaModule interface { @@ -1659,10 +1623,6 @@ func apexFileForFilesystem(ctx android.BaseModuleContext, buildFile android.Path // to the child modules. Returning false makes the visit to continue in the sibling or the parent // modules. This is used in check* functions below. func (a *apexBundle) WalkPayloadDeps(ctx android.BaseModuleContext, do android.PayloadDepsCallback) { - apexVariationName := ctx.ModuleName() - if overrideName := a.GetOverriddenBy(); overrideName != "" { - apexVariationName = overrideName - } ctx.WalkDeps(func(child, parent android.Module) bool { am, ok := child.(android.ApexModule) if !ok || !am.CanHaveApexVariants() { @@ -1681,8 +1641,7 @@ func (a *apexBundle) WalkPayloadDeps(ctx android.BaseModuleContext, do android.P return false } - ai, _ := android.OtherModuleProvider(ctx, child, android.ApexInfoProvider) - externalDep := !android.InList(apexVariationName, ai.InApexVariants) + externalDep := !android.IsDepInSameApex(ctx, parent, child) // Visit actually return do(ctx, parent, am, externalDep) @@ -1707,8 +1666,7 @@ func (a *apexBundle) WalkPayloadDepsProxy(ctx android.BaseModuleContext, return false } - ai, _ := android.OtherModuleProvider(ctx, child, android.ApexInfoProvider) - externalDep := !android.InList(ctx.ModuleName(), ai.InApexVariants) + externalDep := !android.IsDepInSameApex(ctx, parent, child) // Visit actually return do(ctx, parent, child, externalDep) @@ -2196,7 +2154,13 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, // nothing } else if am.CanHaveApexVariants() && am.IsInstallableToApex() { ctx.ModuleErrorf("unexpected tag %s for indirect dependency %q", android.PrettyPrintTag(depTag), depName) + } else if android.IsVintfDepTag(depTag) { + if vf, ok := child.(*android.VintfFragmentModule); ok { + apexFile := apexFileForVintfFragment(ctx, vf) + vctx.filesInfo = append(vctx.filesInfo, apexFile) + } } + return false } @@ -2555,7 +2519,7 @@ func (a *apexBundle) CheckMinSdkVersion(ctx android.ModuleContext) { } // Returns apex's min_sdk_version string value, honoring overrides -func (a *apexBundle) minSdkVersionValue(ctx android.EarlyModuleContext) string { +func (a *apexBundle) minSdkVersionValue(ctx android.MinSdkVersionFromValueContext) string { // Only override the minSdkVersion value on Apexes which already specify // a min_sdk_version (it's optional for non-updatable apexes), and that its // min_sdk_version value is lower than the one to override with. @@ -2579,7 +2543,7 @@ func (a *apexBundle) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLe } // Returns apex's min_sdk_version ApiLevel, honoring overrides -func (a *apexBundle) minSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { +func (a *apexBundle) minSdkVersion(ctx android.MinSdkVersionFromValueContext) android.ApiLevel { return android.MinSdkVersionFromValue(ctx, a.minSdkVersionValue(ctx)) } @@ -2595,7 +2559,7 @@ func (a *apexBundle) checkStaticLinkingToStubLibraries(ctx android.ModuleContext librariesDirectlyInApex[ctx.OtherModuleName(dep)] = true }) - a.WalkPayloadDepsProxy(ctx, func(ctx android.BaseModuleContext, from, to android.ModuleProxy, externalDep bool) bool { + a.WalkPayloadDeps(ctx, func(ctx android.BaseModuleContext, from android.Module, to android.ApexModule, externalDep bool) bool { if info, ok := android.OtherModuleProvider(ctx, to, cc.LinkableInfoProvider); ok { // If `to` is not actually in the same APEX as `from` then it does not need // apex_available and neither do any of its dependencies. @@ -2709,7 +2673,7 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) { return } - a.WalkPayloadDepsProxy(ctx, func(ctx android.BaseModuleContext, from, to android.ModuleProxy, externalDep bool) bool { + a.WalkPayloadDeps(ctx, func(ctx android.BaseModuleContext, from android.Module, to android.ApexModule, externalDep bool) bool { // As soon as the dependency graph crosses the APEX boundary, don't go further. if externalDep { return false @@ -2727,7 +2691,7 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) { toName := ctx.OtherModuleName(to) if android.CheckAvailableForApex(apexName, - android.OtherModuleProviderOrDefault(ctx, to, android.ApexInfoProvider).ApexAvailableFor) { + android.OtherModuleProviderOrDefault(ctx, to, android.ApexAvailableInfoProvider).ApexAvailableFor) { return true } diff --git a/apex/apex_singleton.go b/apex/apex_singleton.go index 263e0a52c..a8bd984b2 100644 --- a/apex/apex_singleton.go +++ b/apex/apex_singleton.go @@ -175,8 +175,5 @@ func (a *apexPrebuiltInfo) GenerateBuildActions(ctx android.SingletonContext) { } a.out = android.PathForOutput(ctx, "prebuilt_info.json") android.WriteFileRule(ctx, a.out, string(j)) -} - -func (a *apexPrebuiltInfo) MakeVars(ctx android.MakeVarsContext) { ctx.DistForGoal("droidcore", a.out) } diff --git a/apex/apex_test.go b/apex/apex_test.go index 987cb6905..5519bd2fd 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -505,10 +505,10 @@ func TestBasicApex(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") // Make sure that Android.mk is created - ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + ab := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, ab) var builder strings.Builder data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) @@ -585,14 +585,14 @@ func TestBasicApex(t *testing.T) { } fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, - ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n") + ctx.ModuleForTests(t, "myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n") ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex") ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar") ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar") flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, - ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n") + ctx.ModuleForTests(t, "myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n") ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))") @@ -699,7 +699,7 @@ func TestApexManifest(t *testing.T) { } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") args := module.Rule("apexRule").Args if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() { t.Error("manifest should be apex_manifest.pb, but " + manifest) @@ -771,7 +771,7 @@ func TestApexManifestMinSdkVersion(t *testing.T) { }, } for _, tc := range testCases { - module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module) + module := ctx.ModuleForTests(t, tc.module, "android_common_"+tc.module) args := module.Rule("apexRule").Args optFlags := args["opt_flags"] if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) { @@ -845,7 +845,7 @@ func TestApexWithDessertSha(t *testing.T) { }, } for _, tc := range testCases { - module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module) + module := ctx.ModuleForTests(t, tc.module, "android_common_"+tc.module) args := module.Rule("apexRule").Args optFlags := args["opt_flags"] if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) { @@ -876,7 +876,7 @@ func TestFileContexts(t *testing.T) { } `) - rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts") + rule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Output("file_contexts") if vendor { android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file", rule.RuleParams.Command, @@ -1039,7 +1039,7 @@ func TestApexWithStubs(t *testing.T) { `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that direct non-stubs dep is always included @@ -1053,7 +1053,7 @@ func TestApexWithStubs(t *testing.T) { ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so") ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rs.so") - mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] + mylibLdFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] // Ensure that mylib is linking with the latest version of stubs for mylib2 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so") @@ -1078,15 +1078,15 @@ func TestApexWithStubs(t *testing.T) { // including the original cflags's "-include mylib.h". // // Ensure that stubs libs are built without -include flags - // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + // mylib2Cflags := ctx.ModuleForTests(t, "mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] // ensureNotContains(t, mylib2Cflags, "-include ") // Ensure that genstub for platform-provided lib is invoked with --systemapi - ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") - ensureContains(t, ctx.ModuleForTests("libmylib2_rs", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") + ensureContains(t, ctx.ModuleForTests(t, "mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") + ensureContains(t, ctx.ModuleForTests(t, "libmylib2_rs", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") // Ensure that genstub for apex-provided lib is invoked with --apex - ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex") - ensureContains(t, ctx.ModuleForTests("libmylib3_rs", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex") + ensureContains(t, ctx.ModuleForTests(t, "mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex") + ensureContains(t, ctx.ModuleForTests(t, "libmylib3_rs", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex") ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ "lib64/mylib.so", @@ -1103,13 +1103,13 @@ func TestApexWithStubs(t *testing.T) { ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so") ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.shared_from_rust.so") // The rust module is linked to the stub cc library - rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"] + rustDeps := ctx.ModuleForTests(t, "foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"] ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so") ensureContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libfoo_rs.shared_from_rust.so") ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so") ensureNotContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rs.shared_from_rust.so") - apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") + apexManifestRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexManifestRule") ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so") ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.shared_from_rust.so") @@ -1118,14 +1118,14 @@ func TestApexWithStubs(t *testing.T) { // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so") // Ensure that genstub for platform-provided lib is invoked with --systemapi - ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") + ensureContains(t, ctx.ModuleForTests(t, "my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so") // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so") // Ensure that genstub for platform-provided lib is invoked with --systemapi - ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") + ensureContains(t, ctx.ModuleForTests(t, "my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi") } func TestApexShouldNotEmbedStubVariant(t *testing.T) { @@ -1236,7 +1236,7 @@ func TestApexCanUsePrivateApis(t *testing.T) { `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that indirect stubs dep is not included @@ -1247,12 +1247,12 @@ func TestApexCanUsePrivateApis(t *testing.T) { // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because // of the platform_apis: true) - mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_p").Rule("ld").Args["libFlags"] + mylibLdFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex10000_p").Rule("ld").Args["libFlags"] ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so") ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so") ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so") ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so") - rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_p").Rule("rustc").Args["linkFlags"] + rustDeps := ctx.ModuleForTests(t, "foo.rust", "android_arm64_armv8-a_apex10000_p").Rule("rustc").Args["linkFlags"] ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so") ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so") ensureNotContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib_rust.shared_from_rust.so") @@ -1363,7 +1363,7 @@ func TestApexWithStubsWithMinSdkVersion(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that direct non-stubs dep is always included @@ -1378,7 +1378,7 @@ func TestApexWithStubsWithMinSdkVersion(t *testing.T) { // Ensure that direct stubs dep is included ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so") - mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"] + mylibLdFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"] // Ensure that mylib is linking with the latest version of stub for mylib2 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so") @@ -1395,12 +1395,12 @@ func TestApexWithStubsWithMinSdkVersion(t *testing.T) { ensureNotContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_29/unstripped/libmylib3_rust.so") // Ensure that stubs libs are built without -include flags - mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"] + mylib2Cflags := ctx.ModuleForTests(t, "mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"] ensureNotContains(t, mylib2Cflags, "-include ") // Ensure that genstub is invoked with --systemapi - ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi") - ensureContains(t, ctx.ModuleForTests("libmylib2_rust", "android_arm64_armv8-a_shared_29").Rule("cc.genStubSrc").Args["flags"], "--systemapi") + ensureContains(t, ctx.ModuleForTests(t, "mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi") + ensureContains(t, ctx.ModuleForTests(t, "libmylib2_rust", "android_arm64_armv8-a_shared_29").Rule("cc.genStubSrc").Args["flags"], "--systemapi") ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ "lib64/mylib.so", @@ -1497,20 +1497,20 @@ func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) { ) // Ensure that mylib from myapex is built against the latest stub (current) - mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] + mylibCflags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ") // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs - mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] + mylibLdflags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ") ensureContains(t, mylibLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ") // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex - libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + libplatformCflags := ctx.ModuleForTests(t, "libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs - libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] + libplatformLdflags := ctx.ModuleForTests(t, "libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ") ensureContains(t, libplatformLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ") } @@ -1589,7 +1589,7 @@ func TestApexWithExplicitStubsDependency(t *testing.T) { `) - apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex2", "android_common_myapex2").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that direct non-stubs dep is always included @@ -1603,7 +1603,7 @@ func TestApexWithExplicitStubsDependency(t *testing.T) { ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so") ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.from_rust.so") - mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] + mylibLdFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] // Ensure that mylib is linking with version 10 of libfoo ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so") @@ -1612,19 +1612,19 @@ func TestApexWithExplicitStubsDependency(t *testing.T) { ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so") ensureNotContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rust.so") - libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"] - libFooRustStubsLdFlags := ctx.ModuleForTests("libfoo_rust", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"] + libFooStubsLdFlags := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"] + libFooRustStubsLdFlags := ctx.ModuleForTests(t, "libfoo_rust", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"] // Ensure that libfoo stubs is not linking to libbar (since it is a stubs) ensureNotContains(t, libFooStubsLdFlags, "libbar.so") ensureNotContains(t, libFooRustStubsLdFlags, "libbar.from_rust.so") fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, - ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n") + ctx.ModuleForTests(t, "myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n") ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib") flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx, - ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n") + ctx.ModuleForTests(t, "myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n") ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)") } @@ -1729,7 +1729,7 @@ func TestApexWithRuntimeLibsDependency(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that direct non-stubs dep is always included @@ -1746,7 +1746,7 @@ func TestApexWithRuntimeLibsDependency(t *testing.T) { ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so") - apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") + apexManifestRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexManifestRule") ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"])) ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so") ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.so") @@ -1816,7 +1816,7 @@ func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) { "lib64/bionic/libclang_rt.hwasan-aarch64-android.so", }) - hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared") + hwasan := ctx.ModuleForTests(t, "libclang_rt.hwasan", "android_arm64_armv8-a_shared") installed := hwasan.Description("install libclang_rt.hwasan") ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so") @@ -1872,7 +1872,7 @@ func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) { "lib64/bionic/libclang_rt.hwasan-aarch64-android.so", }) - hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared") + hwasan := ctx.ModuleForTests(t, "libclang_rt.hwasan", "android_arm64_armv8-a_shared") installed := hwasan.Description("install libclang_rt.hwasan") ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so") @@ -1955,17 +1955,17 @@ func TestApexDependsOnLLNDKTransitively(t *testing.T) { }) // Ensure that LLNDK dep is required - apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") + apexManifestRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexManifestRule") ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"])) ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so") - mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"] + mylibLdFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"] ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so") for _, ver := range tc.shouldNotLink { ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so") } - mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"] + mylibCFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"] ver := tc.shouldLink if tc.shouldLink == "current" { ver = strconv.Itoa(android.FutureApiLevelInt) @@ -2038,7 +2038,7 @@ func TestApexWithSystemLibsStubs(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that mylib, libmylib_rs, libm, libdl, libstd.dylib.so (from Rust) are included. @@ -2052,10 +2052,10 @@ func TestApexWithSystemLibsStubs(t *testing.T) { ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so") ensureNotContains(t, copyCmds, "image.apex/lib64/liblog.so") - mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] - mylibRsFlags := ctx.ModuleForTests("libmylib_rs", "android_arm64_armv8-a_shared_apex10000").Rule("rustc").Args["linkFlags"] - mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] - mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"] + mylibLdFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] + mylibRsFlags := ctx.ModuleForTests(t, "libmylib_rs", "android_arm64_armv8-a_shared_apex10000").Rule("rustc").Args["linkFlags"] + mylibCFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] + mylibSharedCFlags := ctx.ModuleForTests(t, "mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"] // For dependency to libc // Ensure that mylib is linking with the latest version of stubs @@ -2113,13 +2113,13 @@ func TestApexWithSystemLibsStubs(t *testing.T) { ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_apex10000/libvers.so") // Ensure that libBootstrap is depending on the platform variant of bionic libs - libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] + libFlags := ctx.ModuleForTests(t, "libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so") ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so") ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so") // Ensure that libbootstrap_rs is depending on the platform variant of bionic libs - libRsFlags := ctx.ModuleForTests("libbootstrap_rs", "android_arm64_armv8-a_shared").Rule("rustc").Args["linkFlags"] + libRsFlags := ctx.ModuleForTests(t, "libbootstrap_rs", "android_arm64_armv8-a_shared").Rule("rustc").Args["linkFlags"] ensureContains(t, libRsFlags, "libc/android_arm64_armv8-a_shared/libc.so") ensureContains(t, libRsFlags, "libm/android_arm64_armv8-a_shared/libm.so") ensureContains(t, libRsFlags, "libdl/android_arm64_armv8-a_shared/libdl.so") @@ -2202,11 +2202,11 @@ func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) `) expectLink := func(from, from_variant, to, to_variant string) { - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectNoLink := func(from, from_variant, to, to_variant string) { - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } // platform liba is linked to non-stub version @@ -2272,11 +2272,11 @@ func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) { ) expectLink := func(from, from_variant, to, to_variant string) { - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectNoLink := func(from, from_variant, to, to_variant string) { - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectLink("libx", "shared_apex10000", "libz", "shared_current") @@ -2352,11 +2352,11 @@ func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) { `) expectLink := func(from, from_variant, to, to_variant string) { - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectNoLink := func(from, from_variant, to, to_variant string) { - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectLink("libx", "shared_apex10000", "libz", "shared_current") @@ -2400,14 +2400,14 @@ func TestApexMinSdkVersion_InVendorApex(t *testing.T) { vendorVariant := "android_vendor_arm64_armv8-a" - mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29") + mylib := ctx.ModuleForTests(t, "mylib", vendorVariant+"_shared_apex29") // Ensure that mylib links with "current" LLNDK libFlags := names(mylib.Rule("ld").Args["libFlags"]) ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so") // Ensure that mylib is targeting 29 - ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o") + ccRule := ctx.ModuleForTests(t, "mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o") ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29") // Ensure that the correct variant of crtbegin_so is used. @@ -2415,7 +2415,7 @@ func TestApexMinSdkVersion_InVendorApex(t *testing.T) { ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o") // Ensure that the crtbegin_so used by the APEX is targeting 29 - cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"] + cflags := ctx.ModuleForTests(t, "crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"] android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29") } @@ -2479,14 +2479,14 @@ func TestTrackAllowedDepsForAndroidApex(t *testing.T) { "system/sepolicy/apex/com.android.myapex-file_contexts": nil, })) - depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") + depsinfo := ctx.SingletonForTests(t, "apex_depsinfo_singleton") inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings() android.AssertStringListContains(t, "updatable com.android.myapex should generate depsinfo file", inputs, "out/soong/.intermediates/com.android.myapex/android_common_com.android.myapex/depsinfo/flatlist.txt") android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs, "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt") - myapex := ctx.ModuleForTests("com.android.myapex", "android_common_com.android.myapex") + myapex := ctx.ModuleForTests(t, "com.android.myapex", "android_common_com.android.myapex") flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx, myapex.Output("depsinfo/flatlist.txt")), "\n") android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep", @@ -2549,7 +2549,7 @@ func TestNotTrackAllowedDepsForNonAndroidApex(t *testing.T) { "packages/modules/common/build/allowed_deps.txt": nil, })) - depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") + depsinfo := ctx.SingletonForTests(t, "apex_depsinfo_singleton") inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings() android.AssertStringListDoesNotContain(t, "updatable myapex should generate depsinfo file", inputs, "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt") @@ -2576,7 +2576,7 @@ func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) { android.FixtureMergeMockFs(android.MockFS{ "system/sepolicy/apex/com.android.myapex-file_contexts": nil, })) - depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton") + depsinfo := ctx.SingletonForTests(t, "apex_depsinfo_singleton") if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output { t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist") } @@ -2628,12 +2628,12 @@ func TestPlatformUsesLatestStubsFromApexes(t *testing.T) { expectLink := func(from, from_variant, to, to_variant string) { t.Helper() - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectNoLink := func(from, from_variant, to, to_variant string) { t.Helper() - ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] + ldArgs := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"] ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } expectLink("libz", "shared", "libx", "shared_current") @@ -2690,7 +2690,7 @@ func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) { prepareForTestWithSantitizeHwaddress, ) expectLink := func(from, from_variant, to, to_variant string) { - ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld") + ld := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld") libFlags := ld.Args["libFlags"] ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } @@ -2722,10 +2722,10 @@ func TestQTargetApexUsesStaticUnwinder(t *testing.T) { `) // ensure apex variant of c++ is linked with static unwinder - cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module) + cm := ctx.ModuleForTests(t, "libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module) ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind") // note that platform variant is not. - cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module) + cm = ctx.ModuleForTests(t, "libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module) ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind") } @@ -3218,7 +3218,7 @@ func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion } `) expectLink := func(from, from_variant, to, to_variant string) { - ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld") + ld := ctx.ModuleForTests(t, from, "android_arm64_armv8-a_"+from_variant).Rule("ld") libFlags := ld.Args["libFlags"] ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so") } @@ -3293,7 +3293,7 @@ func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) { `, withSAsActiveCodeNames) // ensure libfoo is linked with current version of libbar stub - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared_apex10000") libFlags := libfoo.Rule("ld").Args["libFlags"] ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so") } @@ -3349,7 +3349,7 @@ func TestFilesInSubDir(t *testing.T) { } `) - generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig") + generateFsRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("generateFsConfig") cmd := generateFsRule.RuleParams.Command // Ensure that the subdirectories are all listed @@ -3463,7 +3463,7 @@ func TestVendorApex(t *testing.T) { "lib64/libc++.so", }) - apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apexBundle := result.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle) name := apexBundle.BaseModuleName() prefix := "TARGET_" @@ -3473,7 +3473,7 @@ func TestVendorApex(t *testing.T) { installPath := "out/target/product/test_device/vendor/apex" ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath) - apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") + apexManifestRule := result.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexManifestRule") requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"]) ensureListNotContains(t, requireNativeLibs, ":vndk") } @@ -3504,7 +3504,7 @@ func TestProductVariant(t *testing.T) { `) cflags := strings.Fields( - ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"]) + ctx.ModuleForTests(t, "foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"]) ensureListContains(t, cflags, "-D__ANDROID_VNDK__") ensureListContains(t, cflags, "-D__ANDROID_APEX__") ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__") @@ -3573,7 +3573,7 @@ func TestAndroidMk_VendorApexRequired(t *testing.T) { } `) - apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apexBundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, apexBundle) name := apexBundle.BaseModuleName() prefix := "TARGET_" @@ -3602,7 +3602,7 @@ func TestAndroidMkWritesCommonProperties(t *testing.T) { } `) - apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apexBundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, apexBundle) name := apexBundle.BaseModuleName() prefix := "TARGET_" @@ -3660,7 +3660,7 @@ func TestStaticLinking(t *testing.T) { } `) - ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"] + ldFlags := ctx.ModuleForTests(t, "not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"] // Ensure that not_in_apex is linking with the static variant of mylib ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a") @@ -3706,7 +3706,7 @@ func TestKeys(t *testing.T) { `) // check the APEX keys - keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey) + keys := ctx.ModuleForTests(t, "myapex.key", "android_common").Module().(*apexKey) if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" { t.Errorf("public key %q is not %q", keys.publicKeyFile.String(), @@ -3718,7 +3718,7 @@ func TestKeys(t *testing.T) { } // check the APK certs. It should be overridden to myapex.certificate.override - certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"] + certs := ctx.ModuleForTests(t, "myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"] if certs != "testkey.override.x509.pem testkey.override.pk8" { t.Errorf("cert and private key %q are not %q", certs, "testkey.override.509.pem testkey.override.pk8") @@ -3740,7 +3740,7 @@ func TestCertificate(t *testing.T) { public_key: "testkey.avbpubkey", private_key: "testkey.pem", }`) - rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk") + rule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("signapk") expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8" if actual := rule.Args["certificates"]; actual != expected { t.Errorf("certificates should be %q, not %q", expected, actual) @@ -3764,7 +3764,7 @@ func TestCertificate(t *testing.T) { name: "myapex.certificate.override", certificate: "testkey.override", }`) - rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk") + rule := ctx.ModuleForTests(t, "myapex_keytest", "android_common_myapex_keytest").Rule("signapk") expected := "testkey.override.x509.pem testkey.override.pk8" if actual := rule.Args["certificates"]; actual != expected { t.Errorf("certificates should be %q, not %q", expected, actual) @@ -3788,7 +3788,7 @@ func TestCertificate(t *testing.T) { name: "myapex.certificate", certificate: "testkey", }`) - rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk") + rule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("signapk") expected := "testkey.x509.pem testkey.pk8" if actual := rule.Args["certificates"]; actual != expected { t.Errorf("certificates should be %q, not %q", expected, actual) @@ -3813,7 +3813,7 @@ func TestCertificate(t *testing.T) { name: "myapex.certificate.override", certificate: "testkey.override", }`) - rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk") + rule := ctx.ModuleForTests(t, "myapex_keytest", "android_common_myapex_keytest").Rule("signapk") expected := "testkey.override.x509.pem testkey.override.pk8" if actual := rule.Args["certificates"]; actual != expected { t.Errorf("certificates should be %q, not %q", expected, actual) @@ -3837,7 +3837,7 @@ func TestCertificate(t *testing.T) { "vendor/foo/devkeys/testkey.x509.pem": nil, }.AddToFixture(), ) - rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk") + rule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("signapk") expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8" if actual := rule.Args["certificates"]; actual != expected { t.Errorf("certificates should be %q, not %q", expected, actual) @@ -3862,7 +3862,7 @@ func TestCertificate(t *testing.T) { name: "myapex.certificate.override", certificate: "testkey.override", }`) - rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk") + rule := ctx.ModuleForTests(t, "myapex_keytest", "android_common_myapex_keytest").Rule("signapk") expected := "testkey.override.x509.pem testkey.override.pk8" if actual := rule.Args["certificates"]; actual != expected { t.Errorf("certificates should be %q, not %q", expected, actual) @@ -3933,34 +3933,34 @@ func TestMacro(t *testing.T) { `) // non-APEX variant does not have __ANDROID_APEX__ defined - mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + mylibCFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined - mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] + mylibCFlags = ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"] ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__") // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined - mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"] + mylibCFlags = ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"] ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__") // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and // each variant defines additional macros to distinguish which apex variant it is built for // non-APEX variant does not have __ANDROID_APEX__ defined - mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + mylibCFlags = ctx.ModuleForTests(t, "mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") // recovery variant does not set __ANDROID_APEX__ - mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + mylibCFlags = ctx.ModuleForTests(t, "mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") // non-APEX variant does not have __ANDROID_APEX__ defined - mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + mylibCFlags = ctx.ModuleForTests(t, "mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") // recovery variant does not set __ANDROID_APEX__ - mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + mylibCFlags = ctx.ModuleForTests(t, "mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"] ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__") } @@ -4010,7 +4010,7 @@ func TestHeaderLibsDependency(t *testing.T) { } `) - cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + cFlags := ctx.ModuleForTests(t, "otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"] // Ensure that the include path of the header lib is exported to 'otherlib' ensureContains(t, cFlags, "-Imy_include") @@ -4042,7 +4042,7 @@ func (f fileInApex) match(expectation string) bool { func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex { t.Helper() - module := ctx.ModuleForTests(moduleName, variant) + module := ctx.ModuleForTests(t, moduleName, variant) apexRule := module.MaybeRule("apexRule") apexDir := "/image.apex/" copyCmds := apexRule.Args["copy_commands"] @@ -4133,7 +4133,7 @@ func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, var } func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) { - deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex") + deapexer := ctx.ModuleForTests(t, moduleName, variant).Description("deapex") outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1) if deapexer.Output != nil { outputs = append(outputs, deapexer.Output.String()) @@ -4262,7 +4262,7 @@ func TestVndkApexNameRule(t *testing.T) { }`+vndkLibrariesTxtFiles("28", "29")) assertApexName := func(expected, moduleName string) { - module := ctx.ModuleForTests(moduleName, "android_common") + module := ctx.ModuleForTests(t, moduleName, "android_common") apexManifestRule := module.Rule("apexManifestRule") ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected) } @@ -4490,25 +4490,25 @@ func TestDependenciesInApexManifest(t *testing.T) { var apexManifestRule android.TestingBuildParams var provideNativeLibs, requireNativeLibs []string - apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule") + apexManifestRule = ctx.ModuleForTests(t, "myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule") provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) ensureListEmpty(t, provideNativeLibs) ensureListEmpty(t, requireNativeLibs) - apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule") + apexManifestRule = ctx.ModuleForTests(t, "myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule") provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) ensureListEmpty(t, provideNativeLibs) ensureListContains(t, requireNativeLibs, "libfoo.so") - apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule") + apexManifestRule = ctx.ModuleForTests(t, "myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule") provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) ensureListContains(t, provideNativeLibs, "libfoo.so") ensureListEmpty(t, requireNativeLibs) - apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule") + apexManifestRule = ctx.ModuleForTests(t, "myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule") provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"]) requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"]) ensureListContains(t, provideNativeLibs, "libbar.so") @@ -4545,7 +4545,7 @@ func TestOverrideApexManifestDefaultVersion(t *testing.T) { "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234", })) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexManifestRule := module.Rule("apexManifestRule") ensureContains(t, apexManifestRule.Args["default_version"], "1234") } @@ -4609,7 +4609,7 @@ func TestCompileMultilibProp(t *testing.T) { } `, testCase.compileMultiLibProp), ) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] for _, containedLib := range testCase.containedLibs { @@ -4649,7 +4649,7 @@ func TestNonTestApex(t *testing.T) { } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] @@ -4669,7 +4669,7 @@ func TestNonTestApex(t *testing.T) { // Ensure that the platform variant ends with _shared ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared") - if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() { + if !ctx.ModuleForTests(t, "mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() { t.Log("Found mylib_common not in any apex!") t.Fail() } @@ -4704,7 +4704,7 @@ func TestTestApex(t *testing.T) { } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] @@ -4778,7 +4778,7 @@ func TestLibzVendorIsntStable(t *testing.T) { ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ "bin/mybin", }) - apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") + apexManifestRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexManifestRule") android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so") } // libz doesn't provide stubs for vendor variant. @@ -4787,7 +4787,7 @@ func TestLibzVendorIsntStable(t *testing.T) { "bin/mybin", "lib64/libz.so", }) - apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule") + apexManifestRule := ctx.ModuleForTests(t, "myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule") android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "") } } @@ -4862,7 +4862,7 @@ func TestApexWithTarget(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that main rule creates an output @@ -4947,7 +4947,7 @@ func TestApexWithArch(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that apex variant is created for the direct dep @@ -4985,7 +4985,7 @@ func TestApexWithShBinary(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh") @@ -5021,7 +5021,7 @@ func TestApexInVariousPartition(t *testing.T) { } `) - apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apex := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) expected := "out/target/product/test_device/" + tc.partition + "/apex" actual := apex.installDir.RelativeToTop().String() if actual != expected { @@ -5046,7 +5046,7 @@ func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) { private_key: "testkey.pem", } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") rule := module.Output("file_contexts") ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts") } @@ -5106,7 +5106,7 @@ func TestFileContexts_ProductSpecificApexes(t *testing.T) { `, withFiles(map[string][]byte{ "product_specific_file_contexts": nil, })) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") rule := module.Output("file_contexts") ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts") } @@ -5135,7 +5135,7 @@ func TestFileContexts_SetViaFileGroup(t *testing.T) { `, withFiles(map[string][]byte{ "product_specific_file_contexts": nil, })) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") rule := module.Output("file_contexts") ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts") } @@ -5161,7 +5161,7 @@ func TestApexKeyFromOtherModule(t *testing.T) { } `) - apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey) + apex_key := ctx.ModuleForTests(t, "myapex.key", "android_common").Module().(*apexKey) expected_pubkey := "testkey2.avbpubkey" actual_pubkey := apex_key.publicKeyFile.String() if actual_pubkey != expected_pubkey { @@ -5190,7 +5190,7 @@ func TestPrebuilt(t *testing.T) { } `) - testingModule := ctx.ModuleForTests("myapex", "android_common_myapex") + testingModule := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") prebuilt := testingModule.Module().(*Prebuilt) expectedInput := "myapex-arm64.apex" @@ -5211,7 +5211,7 @@ func TestPrebuilt(t *testing.T) { func TestPrebuiltMissingSrc(t *testing.T) { t.Parallel() - testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, ` + testApexError(t, `module "myapex" variant "android_common_prebuilt_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, ` prebuilt_apex { name: "myapex", } @@ -5228,7 +5228,7 @@ func TestPrebuiltFilenameOverride(t *testing.T) { } `) - testingModule := ctx.ModuleForTests("myapex", "android_common_myapex") + testingModule := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") p := testingModule.Module().(*Prebuilt) expected := "notmyapex.apex" @@ -5251,7 +5251,7 @@ func TestApexSetFilenameOverride(t *testing.T) { set: "company-myapex.apks", filename: "com.company.android.myapex.apex" } - `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") + `).ModuleForTests(t, "com.company.android.myapex", "android_common_prebuilt_com.android.myapex") testApex(t, ` apex_set { @@ -5260,7 +5260,7 @@ func TestApexSetFilenameOverride(t *testing.T) { set: "company-myapex.apks", filename: "com.company.android.myapex.capex" } - `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") + `).ModuleForTests(t, "com.company.android.myapex", "android_common_prebuilt_com.android.myapex") testApexError(t, `filename should end in .apex or .capex for apex_set`, ` apex_set { @@ -5284,7 +5284,7 @@ func TestPrebuiltOverrides(t *testing.T) { } `) - testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt") + testingModule := ctx.ModuleForTests(t, "myapex.prebuilt", "android_common_prebuilt_myapex.prebuilt") p := testingModule.Module().(*Prebuilt) expected := []string{"myapex"} @@ -5307,7 +5307,7 @@ func TestPrebuiltApexName(t *testing.T) { apex_name: "com.android.myapex", src: "company-myapex-arm.apex", } - `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") + `).ModuleForTests(t, "com.company.android.myapex", "android_common_prebuilt_com.android.myapex") testApex(t, ` apex_set { @@ -5315,7 +5315,7 @@ func TestPrebuiltApexName(t *testing.T) { apex_name: "com.android.myapex", set: "company-myapex.apks", } - `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex") + `).ModuleForTests(t, "com.company.android.myapex", "android_common_prebuilt_com.android.myapex") } func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) { @@ -5341,6 +5341,12 @@ func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) { exported_bootclasspath_fragments: ["art-bootclasspath-fragment"], } + prebuilt_apex { + name: "com.android.art", + src: "com.android.art-arm.apex", + exported_bootclasspath_fragments: ["art-bootclasspath-fragment"], + } + prebuilt_bootclasspath_fragment { name: "art-bootclasspath-fragment", image_name: "art", @@ -5394,7 +5400,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) { t.Helper() - platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common") + platformBootclasspath := ctx.ModuleForTests(t, "platform-bootclasspath", "android_common") var rule android.TestingBuildParams rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv") @@ -5403,7 +5409,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) { t.Helper() - platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common") + platformBootclasspath := ctx.ModuleForTests(t, "platform-bootclasspath", "android_common") var rule android.TestingBuildParams rule = platformBootclasspath.Output("hiddenapi-index.csv") @@ -5549,7 +5555,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv `) - myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module() + myApex := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex").Module() overrideNames := []string{ "", @@ -5633,7 +5639,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { // prebuilt_apex module always depends on the prebuilt, and so it doesn't // find the dex boot jar in it. We either need to disable the source libfoo // or make the prebuilt libfoo preferred. - testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment) + testDexpreoptWithApexes(t, bp, `module "platform-bootclasspath" variant ".*": module libfoo{.*} does not provide a dex jar`, preparer, fragment) // dexbootjar check is skipped if AllowMissingDependencies is true preparerAllowMissingDeps := android.GroupFixturePreparers( preparer, @@ -5669,6 +5675,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { prebuilt_apex { name: "myapex", + prefer: true, arch: { arm64: { src: "myapex-arm64.apex", @@ -6088,7 +6095,7 @@ func TestApexWithTests(t *testing.T) { } `) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that test dep (and their transitive dependencies) are copied into apex. @@ -6100,7 +6107,7 @@ func TestApexWithTests(t *testing.T) { ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz") // Ensure the module is correctly translated. - bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + bundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, bundle) name := bundle.BaseModuleName() prefix := "TARGET_" @@ -6182,7 +6189,7 @@ func TestApexWithJavaImport(t *testing.T) { } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar") @@ -6248,7 +6255,7 @@ func TestApexWithApps(t *testing.T) { } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] @@ -6256,14 +6263,14 @@ func TestApexWithApps(t *testing.T) { ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk") ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml") - appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs") + appZipRule := ctx.ModuleForTests(t, "AppFoo", "android_common_apex10000").Description("zip jni libs") // JNI libraries are uncompressed if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") { t.Errorf("jni libs are not uncompressed for AppFoo") } // JNI libraries including transitive deps are for _, jni := range []string{"libjni", "libfoo"} { - jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop() + jniOutput := ctx.ModuleForTests(t, jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop() // ... embedded inside APK (jnilibs.zip) ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String()) // ... and not directly inside the APEX @@ -6356,7 +6363,7 @@ func TestApexWithAppImports(t *testing.T) { } `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] @@ -6434,7 +6441,7 @@ func TestApexWithTestHelperApp(t *testing.T) { `) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] @@ -6603,16 +6610,10 @@ func TestApexAvailable_IndirectDep(t *testing.T) { testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path: .*via tag apex\.dependencyTag\{"sharedLib"\} .*-> libfoo.*link:shared.* -.*via tag cc\.dependencyTag.* -.*-> libfoo.*link:static.* .*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.* .*-> libbar.*link:shared.* -.*via tag cc\.dependencyTag.* -.*-> libbar.*link:static.* .*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.* -.*-> libbaz.*link:shared.* -.*via tag cc\.dependencyTag.* -.*-> libbaz.*link:static.*`, ` +.*-> libbaz.*link:shared.*`, ` apex { name: "myapex", key: "myapex.key", @@ -6938,14 +6939,14 @@ func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) { } `) - fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule") + fooManifestRule := result.ModuleForTests(t, "foo", "android_common_foo").Rule("apexManifestRule") fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion fooActualDefaultVersion := fooManifestRule.Args["default_version"] if fooActualDefaultVersion != fooExpectedDefaultVersion { t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion) } - barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule") + barManifestRule := result.ModuleForTests(t, "bar", "android_common_bar").Rule("apexManifestRule") defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion) barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3) barActualDefaultVersion := barManifestRule.Args["default_version"] @@ -6953,7 +6954,7 @@ func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) { t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion) } - overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule") + overrideBarManifestRule := result.ModuleForTests(t, "bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule") overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"] if overrideBarActualDefaultVersion != barExpectedDefaultVersion { t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion) @@ -7193,14 +7194,14 @@ func TestApexAvailable_CheckForPlatform(t *testing.T) { // libfoo shouldn't be available to platform even though it has "//apex_available:platform", // because it depends on libbar which isn't available to platform - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module) + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module) if libfoo.NotAvailableForPlatform() != true { t.Errorf("%q shouldn't be available to platform", libfoo.String()) } // libfoo2 however can be available to platform because it depends on libbaz which provides // stubs - libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module) + libfoo2 := ctx.ModuleForTests(t, "libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module) if libfoo2.NotAvailableForPlatform() == true { t.Errorf("%q should be available to platform", libfoo2.String()) } @@ -7232,11 +7233,11 @@ func TestApexAvailable_CreatedForApex(t *testing.T) { }, }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module) + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module) if libfooShared.NotAvailableForPlatform() != true { t.Errorf("%q shouldn't be available to platform", libfooShared.String()) } - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module) + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module) if libfooStatic.NotAvailableForPlatform() != false { t.Errorf("%q should be available to platform", libfooStatic.String()) } @@ -7356,7 +7357,7 @@ func TestApexValidation_UsesProperPartitionTag(t *testing.T) { variables.VendorPath = proptools.StringPtr("system/vendor") })) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") android.AssertStringEquals(t, "partition tag for host_apex_verifier", "vendor", module.Output("host_apex_verifier.timestamp").Args["partition_tag"]) @@ -7383,7 +7384,7 @@ func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) { } `) - validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings() + validations := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("signapk").Validations.Strings() if android.SuffixInList(validations, "host_apex_verifier.timestamp") { t.Error("should not run host_apex_verifier") } @@ -7404,7 +7405,7 @@ func TestApexValidation_TestApexCheckInitRc(t *testing.T) { } `) - validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings() + validations := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("signapk").Validations.Strings() if !android.SuffixInList(validations, "host_apex_verifier.timestamp") { t.Error("should run host_apex_verifier") } @@ -7508,8 +7509,8 @@ func TestOverrideApex(t *testing.T) { } `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"})) - originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule) - overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule) + originalVariant := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(android.OverridableModule) + overriddenVariant := ctx.ModuleForTests(t, "myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule) if originalVariant.GetOverriddenBy() != "" { t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy()) } @@ -7517,7 +7518,7 @@ func TestOverrideApex(t *testing.T) { t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy()) } - module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_override_myapex_override_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] @@ -7608,7 +7609,7 @@ func TestMinSdkVersionOverride(t *testing.T) { `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31)) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that direct non-stubs dep is always included @@ -7668,7 +7669,7 @@ func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) { `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29)) - apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule") + apexRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that direct non-stubs dep is always included @@ -7707,7 +7708,7 @@ func TestLegacyAndroid10Support(t *testing.T) { } `, withUnbundledBuild) - module := ctx.ModuleForTests("myapex", "android_common_myapex") + module := ctx.ModuleForTests(t, "myapex", "android_common_myapex") args := module.Rule("apexRule").Args ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String()) @@ -7716,8 +7717,8 @@ func TestLegacyAndroid10Support(t *testing.T) { // the dependency names directly here but for some reason the names are blank in // this test. for _, lib := range []string{"libc++", "mylib"} { - apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits - nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits + apexImplicits := ctx.ModuleForTests(t, lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits + nonApexImplicits := ctx.ModuleForTests(t, lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits if len(apexImplicits) != len(nonApexImplicits)+1 { t.Errorf("%q missing unwinder dep", lib) } @@ -7776,7 +7777,7 @@ func TestJavaSDKLibrary(t *testing.T) { "etc/permissions/foo.xml", }) // Permission XML should point to the activated path of impl jar of java_sdk_library - sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml") + sdkLibrary := ctx.ModuleForTests(t, "foo.xml", "android_common_myapex").Output("foo.xml") contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary) ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"") } @@ -7817,7 +7818,7 @@ func TestJavaSDKLibraryOverrideApexes(t *testing.T) { // Permission XML should point to the activated path of impl jar of java_sdk_library. // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant // (com.android.foo), the filepath should not contain override apex name. - sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml") + sdkLibrary := ctx.ModuleForTests(t, "foo.xml", "android_common_mycompanyapex").Output("foo.xml") contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary) ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"") } @@ -7872,7 +7873,7 @@ func TestJavaSDKLibrary_WithinApex(t *testing.T) { }) // The bar library should depend on the implementation jar. - barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac") + barLibrary := ctx.ModuleForTests(t, "bar", "android_common_apex10000").Rule("javac") if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } @@ -7924,7 +7925,7 @@ func TestJavaSDKLibrary_CrossBoundary(t *testing.T) { }) // The bar library should depend on the stubs jar. - barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac") + barLibrary := ctx.ModuleForTests(t, "bar", "android_common").Rule("javac") if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } @@ -8018,7 +8019,7 @@ func TestJavaSDKLibrary_ImportPreferred(t *testing.T) { }) // The bar library should depend on the implementation jar. - barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac") + barLibrary := ctx.ModuleForTests(t, "bar", "android_common_apex10000").Rule("javac") if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } @@ -8397,7 +8398,7 @@ func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) { } `) - apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apexBundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, apexBundle) var builder strings.Builder data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) @@ -8483,7 +8484,7 @@ func TestApexWithJniLibs(t *testing.T) { `) - rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule") + rule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexManifestRule") // Notice mylib2.so (transitive dep) is not added as a jni_lib ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so") ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{ @@ -8498,31 +8499,6 @@ func TestApexWithJniLibs(t *testing.T) { ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so") } -func TestApexMutatorsDontRunIfDisabled(t *testing.T) { - t.Parallel() - ctx := testApex(t, ` - apex { - name: "myapex", - key: "myapex.key", - updatable: false, - } - apex_key { - name: "myapex.key", - public_key: "testkey.avbpubkey", - private_key: "testkey.pem", - } - `, - android.FixtureModifyConfig(func(config android.Config) { - delete(config.Targets, android.Android) - config.AndroidCommonTarget = android.Target{} - }), - ) - - if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) { - t.Errorf("Expected variants: %v, but got: %v", expected, got) - } -} - func TestAppBundle(t *testing.T) { t.Parallel() ctx := testApex(t, ` @@ -8548,7 +8524,7 @@ func TestAppBundle(t *testing.T) { } `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"})) - bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json") + bundleConfigRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Output("bundle_config.json") content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule) ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`) @@ -8575,7 +8551,7 @@ func TestAppSetBundle(t *testing.T) { name: "AppSet", set: "AppSet.apks", }`) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") bundleConfigRule := mod.Output("bundle_config.json") content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule) ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`) @@ -8609,16 +8585,16 @@ func TestAppSetBundlePrebuilt(t *testing.T) { ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress) // Check that the extractor produces the correct output file from the correct input file. - extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks" + extractorOutput := "out/soong/.intermediates/myapex/android_common_prebuilt_myapex/extracted/myapex.hwasan.apks" - m := ctx.ModuleForTests("myapex", "android_common_myapex") + m := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") extractedApex := m.Output(extractorOutput) android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings()) // Ditto for the apex. - m = ctx.ModuleForTests("myapex", "android_common_myapex") - copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex") + m = ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") + copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_prebuilt_myapex/foo_v2.apex") android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String()) } @@ -8637,10 +8613,10 @@ func TestApexSetApksModuleAssignment(t *testing.T) { } `) - m := ctx.ModuleForTests("myapex", "android_common_myapex") + m := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") // Check that the extractor produces the correct apks file from the input module - extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks" + extractorOutput := "out/soong/.intermediates/myapex/android_common_prebuilt_myapex/extracted/myapex.apks" extractedApex := m.Output(extractorOutput) android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings()) @@ -9029,7 +9005,7 @@ func TestApexSet(t *testing.T) { }), ) - m := ctx.ModuleForTests("myapex", "android_common_myapex") + m := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") // Check extract_apks tool parameters. extractedApex := m.Output("extracted/myapex.apks") @@ -9044,7 +9020,7 @@ func TestApexSet(t *testing.T) { t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual) } - m = ctx.ModuleForTests("myapex", "android_common_myapex") + m = ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") a := m.Module().(*ApexSet) expectedOverrides := []string{"foo"} actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"] @@ -9071,7 +9047,7 @@ func TestApexSet_NativeBridge(t *testing.T) { }), ) - m := ctx.ModuleForTests("myapex", "android_common_myapex") + m := ctx.ModuleForTests(t, "myapex", "android_common_prebuilt_myapex") // Check extract_apks tool parameters. No native bridge arch expected extractedApex := m.Output("extracted/myapex.apks") @@ -9133,7 +9109,7 @@ func TestApexKeysTxt(t *testing.T) { } `) - myapex := ctx.ModuleForTests("myapex", "android_common_myapex") + myapex := ctx.ModuleForTests(t, "myapex", "android_common_myapex") content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt")) ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) } @@ -9176,10 +9152,10 @@ func TestApexKeysTxtOverrides(t *testing.T) { `) content := android.ContentFromFileRuleForTests(t, ctx, - ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt")) + ctx.ModuleForTests(t, "myapex", "android_common_myapex").Output("apexkeys.txt")) ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) content = android.ContentFromFileRuleForTests(t, ctx, - ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt")) + ctx.ModuleForTests(t, "myapex_set", "android_common_prebuilt_myapex_set").Output("apexkeys.txt")) ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`) } @@ -9229,12 +9205,12 @@ func TestAllowedFiles(t *testing.T) { `), })) - rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule") + rule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("diffApexContentRule") if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual { t.Errorf("allowed_files_file: expected %q but got %q", expected, actual) } - rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule") + rule2 := ctx.ModuleForTests(t, "myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule") if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual { t.Errorf("allowed_files_file: expected %q but got %q", expected, actual) } @@ -9297,14 +9273,14 @@ func TestCompressedApex(t *testing.T) { }), ) - compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule") + compressRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("compressRule") ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned") - signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex") + signApkRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Description("sign compressedApex") ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String()) // Make sure output of bundle is .capex - ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + ab := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) ensureContains(t, ab.outputFile.String(), "myapex.capex") // Verify android.mk rules @@ -9336,7 +9312,7 @@ func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) { }), ) - compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule") + compressRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").MaybeRule("compressRule") if compressRule.Rule != nil { t.Error("erofs apex should not be compressed") } @@ -9358,7 +9334,7 @@ func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) { }), ) - build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex") + build := ctx.ModuleForTests(t, "com.company.android.myapex", "android_common_prebuilt_com.android.myapex").Output("com.company.android.myapex.apex") if compressionEnabled { ensureEquals(t, build.Rule.String(), "android/soong/android.Cp") } else { @@ -9410,7 +9386,7 @@ func TestPreferredPrebuiltSharedLibDep(t *testing.T) { } `) - ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + ab := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, ab) var builder strings.Builder data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) @@ -9460,15 +9436,15 @@ func TestExcludeDependency(t *testing.T) { `) // Check if mylib is linked to mylib2 for the non-apex target - ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] + ldFlags := ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"] ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so") // Make sure that the link doesn't occur for the apex target - ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] + ldFlags = ctx.ModuleForTests(t, "mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"] ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so") // It shouldn't appear in the copy cmd as well. - copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"] + copyCmds := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"] ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so") } @@ -9584,7 +9560,7 @@ func TestPrebuiltStubLibDep(t *testing.T) { if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") { continue } - mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module) + mod := ctx.ModuleForTests(t, modName, variant).Module().(*cc.Module) if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() { continue } @@ -9707,13 +9683,13 @@ func TestApexJavaCoverage(t *testing.T) { ).RunTest(t) // Make sure jacoco ran on both mylib and mybootclasspathlib - if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { + if result.ModuleForTests(t, "mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { t.Errorf("Failed to find jacoco rule for mylib") } - if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { + if result.ModuleForTests(t, "mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { t.Errorf("Failed to find jacoco rule for mybootclasspathlib") } - if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { + if result.ModuleForTests(t, "mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil { t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib") } } @@ -9796,7 +9772,7 @@ func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) { dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"), ) - apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apexBundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, apexBundle) var builder strings.Builder data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) @@ -9845,7 +9821,7 @@ func TestAndroidMk_RequiredModules(t *testing.T) { } `) - apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + apexBundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, apexBundle) var builder strings.Builder data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data) @@ -9869,7 +9845,7 @@ func TestAndroidMk_RequiredDeps(t *testing.T) { } `) - bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + bundle := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo") data := android.AndroidMkDataForTest(t, ctx, bundle) var builder strings.Builder @@ -9921,7 +9897,7 @@ func TestApexOutputFileProducer(t *testing.T) { android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.CompressedApex = proptools.BoolPtr(true) })) - javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test) + javaTest := ctx.ModuleForTests(t, tc.name, "android_common").Module().(*java.Test) data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data) }) @@ -10124,7 +10100,7 @@ func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) { // Verifies that the APEX depends on all the Make modules in the list. func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) { - a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle) + a := ctx.ModuleForTests(t, moduleName, variant).Module().(*apexBundle) for _, dep := range deps { android.AssertStringListContains(t, "", a.makeModulesToInstall, dep) } @@ -10132,7 +10108,7 @@ func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleNa // Verifies that the APEX does not depend on any of the Make modules in the list. func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) { - a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle) + a := ctx.ModuleForTests(t, moduleName, variant).Module().(*apexBundle) for _, dep := range deps { android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep) } @@ -10240,8 +10216,8 @@ func TestApexStrictUpdtabilityLint(t *testing.T) { } } - myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29") - apex := result.ModuleForTests("myapex", "android_common_myapex") + myjavalib := result.ModuleForTests(t, "myjavalib", "android_common_apex29") + apex := result.ModuleForTests(t, "myapex", "android_common_myapex") apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp") javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp") @@ -10290,7 +10266,7 @@ func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) { } result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture()) - apex := result.ModuleForTests("myapex", "android_common_myapex") + apex := result.ModuleForTests(t, "myapex", "android_common_myapex") apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp") android.AssertStringDoesContain(t, "strict updatability check rule for myapex", apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi") @@ -10342,7 +10318,7 @@ func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) { android.FixtureMergeMockFs(fs), ).RunTestWithBp(t, bp) - myapex := result.ModuleForTests("myapex", "android_common_myapex") + myapex := result.ModuleForTests(t, "myapex", "android_common_myapex") lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ") android.AssertStringDoesContain(t, "myapex lint report expected to contain that of the sdk library impl lib as an input", @@ -10394,7 +10370,7 @@ func TestCannedFsConfig(t *testing.T) { public_key: "testkey.avbpubkey", private_key: "testkey.pem", }`) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") generateFsRule := mod.Rule("generateFsConfig") cmd := generateFsRule.RuleParams.Command @@ -10416,7 +10392,7 @@ func TestCannedFsConfig_HasCustomConfig(t *testing.T) { public_key: "testkey.avbpubkey", private_key: "testkey.pem", }`) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") generateFsRule := mod.Rule("generateFsConfig") cmd := generateFsRule.RuleParams.Command @@ -10551,7 +10527,7 @@ func TestFileSystemShouldSkipApexLibraries(t *testing.T) { } `) - inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits + inputs := result.ModuleForTests(t, "myfilesystem", "android_common").Output("myfilesystem.img").Implicits android.AssertStringListDoesNotContain(t, "filesystem should not have libbar", inputs.Strings(), "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so") @@ -10645,7 +10621,7 @@ func TestAconfigFilesJavaDeps(t *testing.T) { } `) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") s := mod.Rule("apexRule").Args["copy_commands"] copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) if len(copyCmds) != 14 { @@ -10784,7 +10760,7 @@ func TestAconfigFilesJavaAndCcDeps(t *testing.T) { } `) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") s := mod.Rule("apexRule").Args["copy_commands"] copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) if len(copyCmds) != 18 { @@ -10946,7 +10922,7 @@ func TestAconfigFilesRustDeps(t *testing.T) { } `) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") s := mod.Rule("apexRule").Args["copy_commands"] copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) if len(copyCmds) != 32 { @@ -11062,7 +11038,7 @@ func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) { } `) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") combineAconfigRule := mod.Rule("All_aconfig_declarations_dump") s := " " + combineAconfigRule.Args["cache_files"] aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:] @@ -11142,7 +11118,7 @@ func TestAconfigFilesRemoveDuplicates(t *testing.T) { } `) - mod := ctx.ModuleForTests("myapex", "android_common_myapex") + mod := ctx.ModuleForTests(t, "myapex", "android_common_myapex") combineAconfigRule := mod.Rule("All_aconfig_declarations_dump") s := " " + combineAconfigRule.Args["cache_files"] aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:] @@ -11165,7 +11141,7 @@ func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) { t.Parallel() checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) { t.Helper() - s := ctx.ModuleForTests("dex_bootjars", "android_common") + s := ctx.ModuleForTests(t, "dex_bootjars", "android_common") foundLibfooJar := false base := stem + ".jar" for _, output := range s.AllOutputs() { @@ -11183,14 +11159,14 @@ func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) { // Check that the boot jars of the selected apex are run through boot_jars_package_check // This validates that the jars on the bootclasspath do not contain packages outside an allowlist checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) { - platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common") + platformBcp := ctx.ModuleForTests(t, "platform-bootclasspath", "android_common") bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check") android.AssertStringMatches(t, "Could not find the correct boot dex jar in package check rule", bootJarsCheckRule.RuleParams.Command, "build/soong/scripts/check_boot_jars/package_allowed_list.txt.*"+expectedBootJar) } // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) { - monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command + monolithicHiddenapiFlagsCmd := ctx.ModuleForTests(t, "platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar) } @@ -11305,12 +11281,12 @@ func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) { { desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt", selectedApexContributions: "foo.prebuilt.contributions", - expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar", + expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_prebuilt_com.android.foo/deapexer/javalib/framework-foo.jar", }, { desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt", selectedApexContributions: "foo.prebuilt.v2.contributions", - expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar", + expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_prebuilt_com.android.foo/deapexer/javalib/framework-foo.jar", }, } @@ -11355,18 +11331,18 @@ func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) { // for a mainline module family, check that only the flagged soong module is visible to make checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) { variation := func(moduleName string) string { - ret := "android_common_com.android.foo" + ret := "android_common_prebuilt_com.android.foo" if moduleName == "com.google.android.foo" { ret = "android_common_com.google.android.foo" } return ret } - visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module() + visibleModule := ctx.ModuleForTests(t, visibleModuleName, variation(visibleModuleName)).Module() android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake()) for _, hiddenModuleName := range hiddenModuleNames { - hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module() + hiddenModule := ctx.ModuleForTests(t, hiddenModuleName, variation(hiddenModuleName)).Module() android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake()) } @@ -11502,19 +11478,19 @@ func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) { checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) { variation := func(moduleName string) string { ret := "android_common_com.android.adservices" - if moduleName == "com.google.android.foo" { - ret = "android_common_com.google.android.foo_com.google.android.foo" + if moduleName == "com.google.android.adservices" || moduleName == "com.google.android.adservices.v2" { + ret = "android_common_prebuilt_com.android.adservices" } return ret } for _, visibleModuleName := range visibleModuleNames { - visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module() + visibleModule := ctx.ModuleForTests(t, visibleModuleName, variation(visibleModuleName)).Module() android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake()) } for _, hiddenModuleName := range hiddenModuleNames { - hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module() + hiddenModule := ctx.ModuleForTests(t, hiddenModuleName, variation(hiddenModuleName)).Module() android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake()) } @@ -11578,13 +11554,13 @@ func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) { expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"}, }, { - desc: "Prebuilt apex prebuilt_com.android.foo is selected", + desc: "Prebuilt apex prebuilt_com.android.adservices is selected", selectedApexContributions: "adservices.prebuilt.contributions", expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"}, expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"}, }, { - desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected", + desc: "Prebuilt apex prebuilt_com.android.adservices.v2 is selected", selectedApexContributions: "adservices.prebuilt.v2.contributions", expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"}, expectedHiddenModuleNames: []string{"com.google.android.adservices"}, @@ -11686,7 +11662,7 @@ func TestAconfifDeclarationsValidation(t *testing.T) { } `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"})) - m := result.ModuleForTests("foo.stubs.source", "android_common") + m := result.ModuleForTests(t, "foo.stubs.source", "android_common") outDir := "out/soong/.intermediates" // Arguments passed to aconfig to retrieve the state of the flags defined in the @@ -11751,7 +11727,7 @@ func TestMultiplePrebuiltsWithSameBase(t *testing.T) { "packages/modules/common/build/allowed_deps.txt": nil, })) - ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle) + ab := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Module().(*apexBundle) data := android.AndroidMkDataForTest(t, ctx, ab) var builder strings.Builder data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data) @@ -11823,18 +11799,18 @@ func TestApexMinSdkVersionOverride(t *testing.T) { }), ) - baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30") + baseModule := ctx.ModuleForTests(t, "com.android.apex30", "android_common_com.android.apex30") checkMinSdkVersion(t, baseModule, "30") // Override module, but uses same min_sdk_version - overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30") - javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30") + overridingModuleSameMinSdkVersion := ctx.ModuleForTests(t, "com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30") + javalibApex30Variant := ctx.ModuleForTests(t, "javalib", "android_common_apex30") checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30") checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module()) // Override module, uses different min_sdk_version - overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31") - javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31") + overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests(t, "com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31") + javalibApex31Variant := ctx.ModuleForTests(t, "javalib", "android_common_apex31") checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31") checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module()) } @@ -11903,7 +11879,7 @@ func TestPrebuiltStubNoinstall(t *testing.T) { android.FixtureMergeMockFs(fs), ).RunTest(t) - ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld") + ldRule := result.ModuleForTests(t, "installedlib", "android_arm64_armv8-a_shared").Rule("ld") android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so") installRules := result.InstallMakeRulesForTesting(t) @@ -12204,7 +12180,39 @@ func TestFilesystemWithApexDeps(t *testing.T) { } `, filesystem.PrepareForTestWithFilesystemBuildComponents) - partition := result.ModuleForTests("myfilesystem", "android_common") + partition := result.ModuleForTests(t, "myfilesystem", "android_common") fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList")) android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList) } + +func TestVintfFragmentInApex(t *testing.T) { + t.Parallel() + ctx := testApex(t, apex_default_bp+` + apex { + name: "myapex", + manifest: ":myapex.manifest", + androidManifest: ":myapex.androidmanifest", + key: "myapex.key", + binaries: [ "mybin" ], + updatable: false, + } + + cc_binary { + name: "mybin", + srcs: ["mybin.cpp"], + vintf_fragment_modules: ["my_vintf_fragment.xml"], + apex_available: [ "myapex" ], + } + + vintf_fragment { + name: "my_vintf_fragment.xml", + src: "my_vintf_fragment.xml", + } + `) + + generateFsRule := ctx.ModuleForTests(t, "myapex", "android_common_myapex").Rule("generateFsConfig") + cmd := generateFsRule.RuleParams.Command + + // Ensure that vintf fragment file is being installed + ensureContains(t, cmd, "/etc/vintf/my_vintf_fragment.xml ") +} diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go index c7674b58a..97644e631 100644 --- a/apex/bootclasspath_fragment_test.go +++ b/apex/bootclasspath_fragment_test.go @@ -292,6 +292,7 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { apex_available: [ "com.android.art", ], + min_sdk_version: "33", compile_dex: true, } `, content, prefer) @@ -329,7 +330,7 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { // Make sure that the source bootclasspath_fragment copies its dex files to the predefined // locations for the art image. - module := result.ModuleForTests("dex_bootjars", "android_common") + module := result.ModuleForTests(t, "dex_bootjars", "android_common") checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo") }) @@ -420,7 +421,7 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"), ).RunTest(t) - ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common_com.android.art", []string{ + ensureExactDeapexedContents(t, result.TestContext, "prebuilt_com.android.art", "android_common_prebuilt_com.android.art", []string{ "etc/boot-image.prof", "javalib/bar.jar", "javalib/foo.jar", @@ -431,12 +432,13 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { `art-bootclasspath-fragment`, `com.android.art.key`, `dex2oatd`, + `prebuilt_art-bootclasspath-fragment`, `prebuilt_com.android.art`, }) // Make sure that the prebuilt bootclasspath_fragment copies its dex files to the predefined // locations for the art image. - module := result.ModuleForTests("dex_bootjars", "android_common") + module := result.ModuleForTests(t, "dex_bootjars", "android_common") checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo") }) @@ -589,20 +591,20 @@ func TestBootclasspathFragmentInPrebuiltArtApex(t *testing.T) { t.Parallel() result := preparers.RunTestWithBp(t, fmt.Sprintf(bp, "enabled: false,")) - java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_com.android.art", []string{ + java.CheckModuleDependencies(t, result.TestContext, "com.android.art", "android_common_prebuilt_com.android.art", []string{ `all_apex_contributions`, `dex2oatd`, `prebuilt_art-bootclasspath-fragment`, }) - java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_com.android.art", []string{ + java.CheckModuleDependencies(t, result.TestContext, "art-bootclasspath-fragment", "android_common_prebuilt_com.android.art", []string{ `all_apex_contributions`, `dex2oatd`, `prebuilt_bar`, `prebuilt_foo`, }) - module := result.ModuleForTests("dex_bootjars", "android_common") + module := result.ModuleForTests(t, "dex_bootjars", "android_common") checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo") }) } @@ -707,7 +709,7 @@ func TestBootclasspathFragmentContentsNoName(t *testing.T) { `mybootclasspathfragment`, }) - apex := result.ModuleForTests("myapex", "android_common_myapex") + apex := result.ModuleForTests(t, "myapex", "android_common_myapex") apexRule := apex.Rule("apexRule") copyCommands := apexRule.Args["copy_commands"] @@ -862,8 +864,8 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{ "all_apex_contributions", - "art-bootclasspath-fragment", "bar", + "com.android.art", "dex2oatd", "foo", }) @@ -875,7 +877,7 @@ func TestBootclasspathFragment_HiddenAPIList(t *testing.T) { quuzModuleLibStubs := getDexJarPath(result, "quuz.stubs.exportable.module_lib") // Make sure that the fragment uses the quuz stub dex jars when generating the hidden API flags. - fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex") + fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common_myapex") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command @@ -1039,8 +1041,8 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) { "android-non-updatable.stubs.module_lib", "android-non-updatable.stubs.system", "android-non-updatable.stubs.test", - "art-bootclasspath-fragment", "bar", + "com.android.art", "dex2oatd", "foo", }) @@ -1052,7 +1054,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromSource(t *testing.T) { // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. - fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex") + fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common_myapex") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command @@ -1213,8 +1215,8 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) { "android-non-updatable.stubs.system", "android-non-updatable.stubs.test", "android-non-updatable.stubs.test_module_lib", - "art-bootclasspath-fragment", "bar", + "com.android.art", "dex2oatd", "foo", }) @@ -1223,7 +1225,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_FromText(t *testing.T) { // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. - fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex") + fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common_myapex") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command @@ -1364,8 +1366,8 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test java.CheckModuleDependencies(t, result.TestContext, "mybootclasspathfragment", "android_common_myapex", []string{ "all_apex_contributions", - "art-bootclasspath-fragment", "bar", + "com.android.art", "dex2oatd", "foo", "prebuilt_sdk_module-lib_current_android-non-updatable", @@ -1381,7 +1383,7 @@ func TestBootclasspathFragment_AndroidNonUpdatable_AlwaysUsePrebuiltSdks(t *test // Make sure that the fragment uses the android-non-updatable modules when generating the hidden // API flags. - fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex") + fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common_myapex") rule := fragment.Rule("modularHiddenAPIStubFlagsFile") command := rule.RuleParams.Command @@ -1464,7 +1466,7 @@ func TestBootclasspathFragmentProtoContainsMinSdkVersion(t *testing.T) { } `) - fragment := result.ModuleForTests("mybootclasspathfragment", "android_common_myapex") + fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common_myapex") classPathProtoContent := android.ContentFromFileRuleForTests(t, result.TestContext, fragment.Output("bootclasspath.pb.textproto")) // foo ensureContains(t, classPathProtoContent, `jars { diff --git a/apex/builder.go b/apex/builder.go index b40fd0991..842771920 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -528,9 +528,10 @@ func markManifestTestOnly(ctx android.ModuleContext, androidManifestFile android }) } -func isVintfFragment(fi apexFile) bool { +func shouldApplyAssembleVintf(fi apexFile) bool { isVintfFragment, _ := path.Match("etc/vintf/*", fi.path()) - return isVintfFragment + _, fromVintfFragmentModule := fi.module.(*android.VintfFragmentModule) + return isVintfFragment && !fromVintfFragmentModule } func runAssembleVintf(ctx android.ModuleContext, vintfFragment android.Path) android.Path { @@ -639,7 +640,7 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath) } else { // Copy the file into APEX - if !a.testApex && isVintfFragment(fi) { + if !a.testApex && shouldApplyAssembleVintf(fi) { // copy the output of assemble_vintf instead of the original vintfFragment := runAssembleVintf(ctx, fi.builtFile) copyCommands = append(copyCommands, "cp -f "+vintfFragment.String()+" "+destPath) @@ -1104,7 +1105,7 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { } depInfos := android.DepNameToDepInfoMap{} - a.WalkPayloadDepsProxy(ctx, func(ctx android.BaseModuleContext, from, to android.ModuleProxy, externalDep bool) bool { + a.WalkPayloadDeps(ctx, func(ctx android.BaseModuleContext, from android.Module, to android.ApexModule, externalDep bool) bool { if from.Name() == to.Name() { // This can happen for cc.reuseObjTag. We are not interested in tracking this. // As soon as the dependency graph crosses the APEX boundary, don't go further. @@ -1131,10 +1132,9 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { depInfos[to.Name()] = info } else { toMinSdkVersion := "(no version)" - if info, ok := android.OtherModuleProvider(ctx, to, android.CommonModuleInfoKey); ok { - if v := info.MinSdkVersion; v != "" { - toMinSdkVersion = v - } + if info, ok := android.OtherModuleProvider(ctx, to, android.CommonModuleInfoKey); ok && + !info.MinSdkVersion.IsPlatform && info.MinSdkVersion.ApiLevel != nil { + toMinSdkVersion = info.MinSdkVersion.ApiLevel.String() } depInfos[to.Name()] = android.ApexModuleDepInfo{ To: to.Name(), diff --git a/apex/classpath_element_test.go b/apex/classpath_element_test.go index 55f1475f7..c2f2fc5b9 100644 --- a/apex/classpath_element_test.go +++ b/apex/classpath_element_test.go @@ -205,8 +205,6 @@ func TestCreateClasspathElements(t *testing.T) { myFragment := result.Module("mybootclasspath-fragment", "android_common_myapex") myBar := result.Module("bar", "android_common_apex10000") - other := result.Module("othersdklibrary", "android_common_apex10000") - otherApexLibrary := result.Module("otherapexlibrary", "android_common_apex10000") platformFoo := result.Module("quuz", "android_common") @@ -240,7 +238,11 @@ func TestCreateClasspathElements(t *testing.T) { t.Run("art:baz, art:quuz, my:bar, foo", func(t *testing.T) { t.Parallel() ctx := newCtx() - elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, artQuuz, myBar, platformFoo}, []android.Module{artFragment, myFragment}) + elements := java.CreateClasspathElements(ctx, + []android.Module{artBaz, artQuuz, myBar, platformFoo}, + []android.Module{artFragment, myFragment}, + map[android.Module]string{artBaz: "com.android.art", artQuuz: "com.android.art", myBar: "myapex"}, + map[string]android.Module{"com.android.art": artFragment, "myapex": myFragment}) expectedElements := java.ClasspathElements{ expectFragmentElement(artFragment, artBaz, artQuuz), expectFragmentElement(myFragment, myBar), @@ -249,32 +251,16 @@ func TestCreateClasspathElements(t *testing.T) { assertElementsEquals(t, "elements", expectedElements, elements) }) - // Verify that CreateClasspathElements detects when an apex has multiple fragments. - t.Run("multiple fragments for same apex", func(t *testing.T) { - t.Parallel() - ctx := newCtx() - elements := java.CreateClasspathElements(ctx, []android.Module{}, []android.Module{artFragment, artFragment}) - android.FailIfNoMatchingErrors(t, "apex com.android.art has multiple fragments, art-bootclasspath-fragment{.*} and art-bootclasspath-fragment{.*}", ctx.errs) - expectedElements := java.ClasspathElements{} - assertElementsEquals(t, "elements", expectedElements, elements) - }) - - // Verify that CreateClasspathElements detects when a library is in multiple fragments. - t.Run("library from multiple fragments", func(t *testing.T) { - t.Parallel() - ctx := newCtx() - elements := java.CreateClasspathElements(ctx, []android.Module{other}, []android.Module{artFragment, myFragment}) - android.FailIfNoMatchingErrors(t, "library othersdklibrary{.*} is in two separate fragments, art-bootclasspath-fragment{.*} and mybootclasspath-fragment{.*}", ctx.errs) - expectedElements := java.ClasspathElements{} - assertElementsEquals(t, "elements", expectedElements, elements) - }) - // Verify that CreateClasspathElements detects when a fragment's contents are not contiguous and // are separated by a library from another fragment. t.Run("discontiguous separated by fragment", func(t *testing.T) { t.Parallel() ctx := newCtx() - elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, myBar, artQuuz, platformFoo}, []android.Module{artFragment, myFragment}) + elements := java.CreateClasspathElements(ctx, + []android.Module{artBaz, myBar, artQuuz, platformFoo}, + []android.Module{artFragment, myFragment}, + map[android.Module]string{artBaz: "com.android.art", artQuuz: "com.android.art", myBar: "myapex"}, + map[string]android.Module{"com.android.art": artFragment, "myapex": myFragment}) expectedElements := java.ClasspathElements{ expectFragmentElement(artFragment, artBaz, artQuuz), expectFragmentElement(myFragment, myBar), @@ -289,7 +275,11 @@ func TestCreateClasspathElements(t *testing.T) { t.Run("discontiguous separated by library", func(t *testing.T) { t.Parallel() ctx := newCtx() - elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, platformFoo, artQuuz, myBar}, []android.Module{artFragment, myFragment}) + elements := java.CreateClasspathElements(ctx, + []android.Module{artBaz, platformFoo, artQuuz, myBar}, + []android.Module{artFragment, myFragment}, + map[android.Module]string{artBaz: "com.android.art", artQuuz: "com.android.art", myBar: "myapex"}, + map[string]android.Module{"com.android.art": artFragment, "myapex": myFragment}) expectedElements := java.ClasspathElements{ expectFragmentElement(artFragment, artBaz, artQuuz), expectLibraryElement(platformFoo), @@ -305,7 +295,11 @@ func TestCreateClasspathElements(t *testing.T) { t.Run("no fragment for apex", func(t *testing.T) { t.Parallel() ctx := newCtx() - elements := java.CreateClasspathElements(ctx, []android.Module{artBaz, otherApexLibrary}, []android.Module{artFragment}) + elements := java.CreateClasspathElements(ctx, + []android.Module{artBaz, otherApexLibrary}, + []android.Module{artFragment}, + map[android.Module]string{artBaz: "com.android.art", otherApexLibrary: "otherapex"}, + map[string]android.Module{"com.android.art": artFragment}) expectedElements := java.ClasspathElements{ expectFragmentElement(artFragment, artBaz), } diff --git a/apex/container_test.go b/apex/container_test.go index 395793f61..b19e0503f 100644 --- a/apex/container_test.go +++ b/apex/container_test.go @@ -29,6 +29,7 @@ var checkContainerMatch = func(t *testing.T, name string, container string, expe func TestApexDepsContainers(t *testing.T) { t.Parallel() + t.Skip("TODO(b/394955484): this probably has to be moved to a check by the apex") result := android.GroupFixturePreparers( prepareForApexTest, java.PrepareForTestWithJavaSdkLibraryFiles, @@ -156,7 +157,7 @@ func TestApexDepsContainers(t *testing.T) { } for _, c := range testcases { - m := result.ModuleForTests(c.moduleName, c.variant) + m := result.ModuleForTests(t, c.moduleName, c.variant) containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider) belongingContainers := containers.BelongingContainers() checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers)) @@ -166,6 +167,7 @@ func TestApexDepsContainers(t *testing.T) { func TestNonUpdatableApexDepsContainers(t *testing.T) { t.Parallel() + t.Skip("TODO(b/394955484): this probably has to be moved to a check by the apex") result := android.GroupFixturePreparers( prepareForApexTest, java.PrepareForTestWithJavaSdkLibraryFiles, @@ -271,7 +273,7 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) { } for _, c := range testcases { - m := result.ModuleForTests(c.moduleName, c.variant) + m := result.ModuleForTests(t, c.moduleName, c.variant) containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider) belongingContainers := containers.BelongingContainers() checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers)) @@ -281,6 +283,7 @@ func TestNonUpdatableApexDepsContainers(t *testing.T) { func TestUpdatableAndNonUpdatableApexesIdenticalMinSdkVersion(t *testing.T) { t.Parallel() + t.Skip("TODO(b/394955484): this probably has to be moved to a check by the apex") result := android.GroupFixturePreparers( prepareForApexTest, java.PrepareForTestWithJavaSdkLibraryFiles, @@ -334,7 +337,7 @@ func TestUpdatableAndNonUpdatableApexesIdenticalMinSdkVersion(t *testing.T) { } `) - fooApexVariant := result.ModuleForTests("foo", "android_common_apex30") + fooApexVariant := result.ModuleForTests(t, "foo", "android_common_apex30") containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), fooApexVariant.Module(), android.ContainersInfoProvider) belongingContainers := containers.BelongingContainers() checkContainerMatch(t, "foo", "system", true, android.InList(android.SystemContainer, belongingContainers)) diff --git a/apex/dexpreopt_bootjars_test.go b/apex/dexpreopt_bootjars_test.go index 6fa1fe225..2c7c4598a 100644 --- a/apex/dexpreopt_bootjars_test.go +++ b/apex/dexpreopt_bootjars_test.go @@ -151,7 +151,7 @@ func testDexpreoptBoot(t *testing.T, ruleFile string, expectedInputs, expectedOu } result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, preferPrebuilt)) - dexBootJars := result.ModuleForTests("dex_bootjars", "android_common") + dexBootJars := result.ModuleForTests(t, "dex_bootjars", "android_common") rule := dexBootJars.Output(ruleFile) inputs := rule.Implicits.Strings() @@ -215,7 +215,7 @@ func TestDexpreoptBootJarsWithPrebuiltArtApex(t *testing.T) { "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar", "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar", "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", - "out/soong/.intermediates/prebuilt_com.android.art/android_common_com.android.art/deapexer/etc/boot-image.prof", + "out/soong/.intermediates/prebuilt_com.android.art/android_common_prebuilt_com.android.art/deapexer/etc/boot-image.prof", "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof", "out/soong/dexpreopt/uffd_gc_flag.txt", } @@ -401,12 +401,12 @@ func TestDexpreoptProfileWithMultiplePrebuiltArtApexes(t *testing.T) { { desc: "Prebuilt apex prebuilt_com.android.art is selected, profile should come from .prof deapexed from the prebuilt", selectedArtApexContributions: "art.prebuilt.contributions", - expectedProfile: "out/soong/.intermediates/prebuilt_com.android.art/android_common_com.android.art/deapexer/etc/boot-image.prof", + expectedProfile: "out/soong/.intermediates/prebuilt_com.android.art/android_common_prebuilt_com.android.art/deapexer/etc/boot-image.prof", }, { desc: "Prebuilt apex prebuilt_com.android.art.v2 is selected, profile should come from .prof deapexed from the prebuilt", selectedArtApexContributions: "art.prebuilt.v2.contributions", - expectedProfile: "out/soong/.intermediates/com.android.art.v2/android_common_com.android.art/deapexer/etc/boot-image.prof", + expectedProfile: "out/soong/.intermediates/com.android.art.v2/android_common_prebuilt_com.android.art/deapexer/etc/boot-image.prof", }, } for _, tc := range testCases { @@ -419,7 +419,7 @@ func TestDexpreoptProfileWithMultiplePrebuiltArtApexes(t *testing.T) { android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", tc.selectedArtApexContributions), ).RunTestWithBp(t, bp) - dexBootJars := result.ModuleForTests("dex_bootjars", "android_common") + dexBootJars := result.ModuleForTests(t, "dex_bootjars", "android_common") rule := dexBootJars.Output(ruleFile) inputs := rule.Implicits.Strings() diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go index 8b5fce91c..d79af8660 100644 --- a/apex/platform_bootclasspath_test.go +++ b/apex/platform_bootclasspath_test.go @@ -23,7 +23,6 @@ import ( "android/soong/dexpreopt" "android/soong/java" - "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -240,8 +239,8 @@ func TestPlatformBootclasspath_LegacyPrebuiltFragment(t *testing.T) { pbcp := result.Module("myplatform-bootclasspath", "android_common") info, _ := android.OtherModuleProvider(result, pbcp, java.MonolithicHiddenAPIInfoProvider) - android.AssertArrayString(t, "stub flags", []string{"prebuilt-stub-flags.csv:out/soong/.intermediates/mybootclasspath-fragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv"}, info.StubFlagSubsets.RelativeToTop()) - android.AssertArrayString(t, "all flags", []string{"prebuilt-all-flags.csv:out/soong/.intermediates/mybootclasspath-fragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv"}, info.FlagSubsets.RelativeToTop()) + android.AssertArrayString(t, "stub flags", []string{"prebuilt-stub-flags.csv:out/soong/.intermediates/mybootclasspath-fragment/android_common_prebuilt_myapex/modular-hiddenapi/signature-patterns.csv"}, info.StubFlagSubsets.RelativeToTop()) + android.AssertArrayString(t, "all flags", []string{"prebuilt-all-flags.csv:out/soong/.intermediates/mybootclasspath-fragment/android_common_prebuilt_myapex/modular-hiddenapi/signature-patterns.csv"}, info.FlagSubsets.RelativeToTop()) } func TestPlatformBootclasspathDependencies(t *testing.T) { @@ -388,7 +387,7 @@ func TestPlatformBootclasspathDependencies(t *testing.T) { }) // Make sure that the myplatform-bootclasspath has the correct dependencies. - CheckModuleDependencies(t, result.TestContext, "myplatform-bootclasspath", "android_common", []string{ + java.CheckPlatformBootclasspathDependencies(t, result.TestContext, "myplatform-bootclasspath", "android_common", []string{ // source vs prebuilt selection metadata module `platform:all_apex_contributions`, @@ -401,17 +400,17 @@ func TestPlatformBootclasspathDependencies(t *testing.T) { // Needed for generating the boot image. `platform:dex2oatd`, - // The configured contents of BootJars. - `com.android.art:baz`, - `com.android.art:quuz`, + // The configured contents of BootJars, via their apexes if necessary. + `platform:com.android.art`, + `platform:com.android.art`, `platform:foo`, - // The configured contents of ApexBootJars. - `myapex:bar`, + // The configured contents of ApexBootJars, via their apex. + `platform:myapex`, - // The fragments. - `com.android.art:art-bootclasspath-fragment`, - `myapex:my-bootclasspath-fragment`, + // The fragments via their apexes. + `platform:com.android.art`, + `platform:myapex`, // Impl lib of sdk_library for transitive srcjar generation `platform:foo.impl`, @@ -429,7 +428,7 @@ func TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) { // of AlwaysUsePrebuiltsSdk(). The second is a normal library that is unaffected. The order // matters, so that the dependencies resolved by the platform_bootclasspath matches the // configured list. - java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"), + java.FixtureConfigureApexBootJars("myapex:foo"), java.PrepareForTestWithJavaSdkLibraryFiles, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) @@ -479,6 +478,7 @@ func TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) { name: "myapex", src: "myapex.apex", exported_bootclasspath_fragments: ["mybootclasspath-fragment"], + prefer: true, } // A prebuilt java_sdk_library_import that is not preferred by default but will be preferred @@ -544,12 +544,11 @@ func TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) { java.CheckPlatformBootclasspathModules(t, result, "myplatform-bootclasspath", []string{ // The configured contents of BootJars. - "myapex:prebuilt_foo", - "myapex:bar", + "prebuilt_myapex:prebuilt_foo", }) // Make sure that the myplatform-bootclasspath has the correct dependencies. - CheckModuleDependencies(t, result.TestContext, "myplatform-bootclasspath", "android_common", []string{ + java.CheckPlatformBootclasspathDependencies(t, result.TestContext, "myplatform-bootclasspath", "android_common", []string{ // source vs prebuilt selection metadata module `platform:all_apex_contributions`, @@ -561,39 +560,17 @@ func TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) { // Not a prebuilt as no prebuilt existed when it was added. "platform:legacy.core.platform.api.stubs.exportable", - // The platform_bootclasspath intentionally adds dependencies on both source and prebuilt - // modules when available as it does not know which one will be preferred. - "myapex:foo", - "myapex:prebuilt_foo", - - // Only a source module exists. - "myapex:bar", + // The prebuilt library via the apex. + "platform:prebuilt_myapex", - // The fragments. - "myapex:mybootclasspath-fragment", - "myapex:prebuilt_mybootclasspath-fragment", + // The fragments via the apex. + "platform:prebuilt_myapex", // Impl lib of sdk_library for transitive srcjar generation "platform:foo.impl", }) } -// CheckModuleDependencies checks the dependencies of the selected module against the expected list. -// -// The expected list must be a list of strings of the form "<apex>:<module>", where <apex> is the -// name of the apex, or platform is it is not part of an apex and <module> is the module name. -func CheckModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) { - t.Helper() - module := ctx.ModuleForTests(name, variant).Module() - modules := []android.Module{} - ctx.VisitDirectDeps(module, func(m blueprint.Module) { - modules = append(modules, m.(android.Module)) - }) - - pairs := java.ApexNamePairsFromModules(ctx, modules) - android.AssertDeepEquals(t, "module dependencies", expected, pairs) -} - // TestPlatformBootclasspath_IncludesRemainingApexJars verifies that any apex boot jar is present in // platform_bootclasspath's classpaths.proto config, if the apex does not generate its own config // by setting generate_classpaths_proto property to false. @@ -665,7 +642,7 @@ func TestBootJarNotInApex(t *testing.T) { prepareForTestWithMyapex, java.FixtureConfigureApexBootJars("myapex:foo"), ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( - `dependency "foo" of "myplatform-bootclasspath" missing variant`)). + `module "myplatform-bootclasspath" variant ".*": failed to find module "foo" in apex "myapex"`)). RunTestWithBp(t, ` apex { name: "myapex", diff --git a/apex/prebuilt.go b/apex/prebuilt.go index 4fa43bada..3daa4f81a 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -291,6 +291,7 @@ func (p *prebuiltCommon) prebuiltApexContentsDeps(ctx android.BottomUpMutatorCon for _, dep := range p.prebuiltCommonProperties.Exported_bootclasspath_fragments { prebuiltDep := android.PrebuiltNameFromSource(dep) ctx.AddDependency(module, exportedBootclasspathFragmentTag, prebuiltDep) + ctx.AddDependency(module, fragmentInApexTag, prebuiltDep) } for _, dep := range p.prebuiltCommonProperties.Exported_systemserverclasspath_fragments { @@ -300,98 +301,47 @@ func (p *prebuiltCommon) prebuiltApexContentsDeps(ctx android.BottomUpMutatorCon } // Implements android.DepInInSameApex -func (p *prebuiltCommon) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { - _, ok := tag.(exportedDependencyTag) - return ok +func (m *prebuiltCommon) GetDepInSameApexChecker() android.DepInSameApexChecker { + return ApexPrebuiltDepInSameApexChecker{} } -func (p *prebuiltCommon) IncomingDepIsInSameApex(tag blueprint.DependencyTag) bool { - return true +type ApexPrebuiltDepInSameApexChecker struct { + android.BaseDepInSameApexChecker } -// apexInfoMutator marks any modules for which this apex exports a file as requiring an apex -// specific variant and checks that they are supported. -// -// The apexMutator will ensure that the ApexInfo objects passed to BuildForApex(ApexInfo) are -// associated with the apex specific variant using the ApexInfoProvider for later retrieval. -// -// Unlike the source apex module type the prebuilt_apex module type cannot share compatible variants -// across prebuilt_apex modules. That is because there is no way to determine whether two -// prebuilt_apex modules that export files for the same module are compatible. e.g. they could have -// been built from different source at different times or they could have been built with different -// build options that affect the libraries. -// -// While it may be possible to provide sufficient information to determine whether two prebuilt_apex -// modules were compatible it would be a lot of work and would not provide much benefit for a couple -// of reasons: -// - The number of prebuilt_apex modules that will be exporting files for the same module will be -// low as the prebuilt_apex only exports files for the direct dependencies that require it and -// very few modules are direct dependencies of multiple prebuilt_apex modules, e.g. there are a -// few com.android.art* apex files that contain the same contents and could export files for the -// same modules but only one of them needs to do so. Contrast that with source apex modules which -// need apex specific variants for every module that contributes code to the apex, whether direct -// or indirect. -// - The build cost of a prebuilt_apex variant is generally low as at worst it will involve some -// extra copying of files. Contrast that with source apex modules that has to build each variant -// from source. -func (p *prebuiltCommon) apexInfoMutator(mctx android.TopDownMutatorContext) { - // Collect the list of dependencies. - var dependencies []android.ApexModule - mctx.WalkDeps(func(child, parent android.Module) bool { - // If the child is not in the same apex as the parent then exit immediately and do not visit - // any of the child's dependencies. - if !android.IsDepInSameApex(mctx, parent, child) { - return false - } +func (m ApexPrebuiltDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { + _, ok := tag.(exportedDependencyTag) + return ok +} - tag := mctx.OtherModuleDependencyTag(child) - depName := mctx.OtherModuleName(child) +func (p *prebuiltCommon) checkExportedDependenciesArePrebuilts(ctx android.ModuleContext) { + ctx.VisitDirectDeps(func(dep android.Module) { + tag := ctx.OtherModuleDependencyTag(dep) + depName := ctx.OtherModuleName(dep) if exportedTag, ok := tag.(exportedDependencyTag); ok { propertyName := exportedTag.name // It is an error if the other module is not a prebuilt. - if !android.IsModulePrebuilt(child) { - mctx.PropertyErrorf(propertyName, "%q is not a prebuilt module", depName) - return false + if !android.IsModulePrebuilt(dep) { + ctx.PropertyErrorf(propertyName, "%q is not a prebuilt module", depName) } // It is an error if the other module is not an ApexModule. - if _, ok := child.(android.ApexModule); !ok { - mctx.PropertyErrorf(propertyName, "%q is not usable within an apex", depName) - return false + if _, ok := dep.(android.ApexModule); !ok { + ctx.PropertyErrorf(propertyName, "%q is not usable within an apex", depName) } } - // Ignore any modules that do not implement ApexModule as they cannot have an APEX specific - // variant. - if _, ok := child.(android.ApexModule); !ok { - return false - } - - // Strip off the prebuilt_ prefix if present before storing content to ensure consistent - // behavior whether there is a corresponding source module present or not. - depName = android.RemoveOptionalPrebuiltPrefix(depName) - - // Add the module to the list of dependencies that need to have an APEX variant. - dependencies = append(dependencies, child.(android.ApexModule)) - - return true }) +} - android.SetProvider(mctx, android.ApexBundleInfoProvider, android.ApexBundleInfo{}) - - // Create an ApexInfo for the prebuilt_apex. - apexVariationName := p.ApexVariationName() - apexInfo := android.ApexInfo{ - ApexVariationName: apexVariationName, - InApexVariants: []string{apexVariationName}, +// generateApexInfo returns an android.ApexInfo configuration suitable for dependencies of this apex. +func (p *prebuiltCommon) generateApexInfo(ctx generateApexInfoContext) android.ApexInfo { + return android.ApexInfo{ + ApexVariationName: "prebuilt_" + p.ApexVariationName(), + BaseApexName: p.ApexVariationName(), ForPrebuiltApex: true, } - - // Mark the dependencies of this module as requiring a variant for this module. - for _, am := range dependencies { - am.BuildForApex(apexInfo) - } } type Prebuilt struct { @@ -595,10 +545,22 @@ func (p *Prebuilt) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { p.prebuiltApexContentsDeps(ctx) } -var _ ApexInfoMutator = (*Prebuilt)(nil) +var _ ApexTransitionMutator = (*Prebuilt)(nil) + +func (p *Prebuilt) ApexTransitionMutatorSplit(ctx android.BaseModuleContext) []android.ApexInfo { + return []android.ApexInfo{p.generateApexInfo(ctx)} +} + +func (p *Prebuilt) ApexTransitionMutatorOutgoing(ctx android.OutgoingTransitionContext, sourceInfo android.ApexInfo) android.ApexInfo { + return sourceInfo +} + +func (p *Prebuilt) ApexTransitionMutatorIncoming(ctx android.IncomingTransitionContext, outgoingInfo android.ApexInfo) android.ApexInfo { + return p.generateApexInfo(ctx) +} -func (p *Prebuilt) ApexInfoMutator(mctx android.TopDownMutatorContext) { - p.apexInfoMutator(mctx) +func (p *Prebuilt) ApexTransitionMutatorMutate(ctx android.BottomUpMutatorContext, info android.ApexInfo) { + android.SetProvider(ctx, android.ApexBundleInfoProvider, android.ApexBundleInfo{}) } // creates the build rules to deapex the prebuilt, and returns a deapexerInfo @@ -664,6 +626,8 @@ func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { validateApexClasspathFragments(ctx) } + p.checkExportedDependenciesArePrebuilts(ctx) + p.apexKeysPath = writeApexKeys(ctx, p) // TODO(jungjw): Check the key validity. p.inputApex = android.PathForModuleSrc(ctx, p.properties.prebuiltApexSelector(ctx, ctx.Module())) @@ -824,10 +788,22 @@ func (a *ApexSet) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { a.prebuiltApexContentsDeps(ctx) } -var _ ApexInfoMutator = (*ApexSet)(nil) +var _ ApexTransitionMutator = (*ApexSet)(nil) + +func (a *ApexSet) ApexTransitionMutatorSplit(ctx android.BaseModuleContext) []android.ApexInfo { + return []android.ApexInfo{a.generateApexInfo(ctx)} +} + +func (a *ApexSet) ApexTransitionMutatorOutgoing(ctx android.OutgoingTransitionContext, sourceInfo android.ApexInfo) android.ApexInfo { + return sourceInfo +} + +func (a *ApexSet) ApexTransitionMutatorIncoming(ctx android.IncomingTransitionContext, outgoingInfo android.ApexInfo) android.ApexInfo { + return a.generateApexInfo(ctx) +} -func (a *ApexSet) ApexInfoMutator(mctx android.TopDownMutatorContext) { - a.apexInfoMutator(mctx) +func (a *ApexSet) ApexTransitionMutatorMutate(ctx android.BottomUpMutatorContext, info android.ApexInfo) { + android.SetProvider(ctx, android.ApexBundleInfoProvider, android.ApexBundleInfo{}) } func (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { diff --git a/apex/systemserver_classpath_fragment_test.go b/apex/systemserver_classpath_fragment_test.go index c643a8c98..cf7ea8af9 100644 --- a/apex/systemserver_classpath_fragment_test.go +++ b/apex/systemserver_classpath_fragment_test.go @@ -280,19 +280,19 @@ func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) { ctx := result.TestContext - java.CheckModuleDependencies(t, ctx, "myapex", "android_common_myapex", []string{ + java.CheckModuleDependencies(t, ctx, "myapex", "android_common_prebuilt_myapex", []string{ `all_apex_contributions`, `dex2oatd`, `prebuilt_mysystemserverclasspathfragment`, }) - java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{ + java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_prebuilt_myapex", []string{ `all_apex_contributions`, `prebuilt_bar`, `prebuilt_foo`, }) - ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{ + ensureExactDeapexedContents(t, ctx, "myapex", "android_common_prebuilt_myapex", []string{ "javalib/foo.jar", "javalib/bar.jar", "javalib/bar.jar.prof", @@ -440,13 +440,13 @@ func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) { ctx := result.TestContext - java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_myapex", []string{ + java.CheckModuleDependencies(t, ctx, "mysystemserverclasspathfragment", "android_common_prebuilt_myapex", []string{ `all_apex_contributions`, `prebuilt_bar`, `prebuilt_foo`, }) - ensureExactDeapexedContents(t, ctx, "myapex", "android_common_myapex", []string{ + ensureExactDeapexedContents(t, ctx, "myapex", "android_common_prebuilt_myapex", []string{ "javalib/foo.jar", "javalib/bar.jar", "javalib/bar.jar.prof", @@ -457,7 +457,7 @@ func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) { } func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName string, variant string, expected bool) { - dexpreopt := ctx.ModuleForTests(moduleName, variant).Rule("dexpreopt") + dexpreopt := ctx.ModuleForTests(t, moduleName, variant).Rule("dexpreopt") actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=") if expected != actual { t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual) @@ -465,7 +465,7 @@ func assertProfileGuided(t *testing.T, ctx *android.TestContext, moduleName stri } func assertProfileGuidedPrebuilt(t *testing.T, ctx *android.TestContext, apexName string, moduleName string, expected bool) { - dexpreopt := ctx.ModuleForTests(apexName, "android_common_"+apexName).Rule("dexpreopt." + moduleName) + dexpreopt := ctx.ModuleForTests(t, apexName, "android_common_prebuilt_"+apexName).Rule("dexpreopt." + moduleName) actual := strings.Contains(dexpreopt.RuleParams.Command, "--profile-file=") if expected != actual { t.Fatalf("Expected profile-guided to be %v, got %v", expected, actual) diff --git a/bloaty/bloaty.go b/bloaty/bloaty.go index 8ecea98b4..26f2aa879 100644 --- a/bloaty/bloaty.go +++ b/bloaty/bloaty.go @@ -105,13 +105,11 @@ func (singleton *sizesSingleton) GenerateBuildActions(ctx android.SingletonConte } }) + protoFilenamePath := android.PathForOutput(ctx, protoFilename) ctx.Build(pctx, android.BuildParams{ Rule: bloatyMerger, Inputs: android.SortedUniquePaths(deps), - Output: android.PathForOutput(ctx, protoFilename), + Output: protoFilenamePath, }) -} - -func (singleton *sizesSingleton) MakeVars(ctx android.MakeVarsContext) { - ctx.DistForGoalWithFilename("checkbuild", android.PathForOutput(ctx, protoFilename), protoFilename) + ctx.DistForGoalWithFilename("checkbuild", protoFilenamePath, protoFilename) } diff --git a/cc/afdo_test.go b/cc/afdo_test.go index 0679d1386..d2d5584ff 100644 --- a/cc/afdo_test.go +++ b/cc/afdo_test.go @@ -94,9 +94,9 @@ func TestAfdoDeps(t *testing.T) { afdoLtoLdFlag := "-Wl,-plugin-opt,-import-instr-limit=40" noAfdoLtoLdFlag := "-Wl,-plugin-opt,-import-instr-limit=5" - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") - libFooAfdoVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libTest") - libBarAfdoVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_afdo-libTest") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") + libFooAfdoVariant := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static_afdo-libTest") + libBarAfdoVariant := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static_afdo-libTest") // Check cFlags of afdo-enabled module and the afdo-variant of its static deps cFlags := libTest.Rule("cc").Args["cFlags"] @@ -138,8 +138,8 @@ func TestAfdoDeps(t *testing.T) { } // Verify non-afdo variant exists and doesn't contain afdo - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static") cFlags = libFoo.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, profileSampleCFlag) { @@ -166,9 +166,9 @@ func TestAfdoDeps(t *testing.T) { } // Verify that the arm variant does not have FDO since the fdo_profile module only has a profile for arm64 - libTest32 := result.ModuleForTests("libTest", "android_arm_armv7-a-neon_shared") - libFooAfdoVariant32 := result.ModuleForTests("libFoo", "android_arm_armv7-a-neon_static_afdo-libTest_lto-thin") - libBarAfdoVariant32 := result.ModuleForTests("libBar", "android_arm_armv7-a-neon_static_afdo-libTest_lto-thin") + libTest32 := result.ModuleForTests(t, "libTest", "android_arm_armv7-a-neon_shared") + libFooAfdoVariant32 := result.ModuleForTests(t, "libFoo", "android_arm_armv7-a-neon_static_afdo-libTest_lto-thin") + libBarAfdoVariant32 := result.ModuleForTests(t, "libBar", "android_arm_armv7-a-neon_static_afdo-libTest_lto-thin") cFlags = libTest32.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, profileSampleCFlag) { @@ -215,9 +215,9 @@ func TestAfdoDeps(t *testing.T) { } // Verify that the host variants don't enable afdo - libTestHost := result.ModuleForTests("libTest", result.Config.BuildOSTarget.String()+"_shared") - libFooHost := result.ModuleForTests("libFoo", result.Config.BuildOSTarget.String()+"_static_lto-thin") - libBarHost := result.ModuleForTests("libBar", result.Config.BuildOSTarget.String()+"_static_lto-thin") + libTestHost := result.ModuleForTests(t, "libTest", result.Config.BuildOSTarget.String()+"_shared") + libFooHost := result.ModuleForTests(t, "libFoo", result.Config.BuildOSTarget.String()+"_static_lto-thin") + libBarHost := result.ModuleForTests(t, "libBar", result.Config.BuildOSTarget.String()+"_static_lto-thin") cFlags = libTestHost.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, profileSampleCFlag) { @@ -301,9 +301,9 @@ func TestAfdoEnabledOnStaticDepNoAfdo(t *testing.T) { }.AddToFixture(), ).RunTestWithBp(t, bp) - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared").Module() - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static").Module() + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared").Module() + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static").Module() if !hasDirectDep(result, libTest, libFoo.Module()) { t.Errorf("libTest missing dependency on non-afdo variant of libFoo") @@ -412,13 +412,13 @@ func TestAfdoEnabledWithMultiArchs(t *testing.T) { }.AddToFixture(), ).RunTestWithBp(t, bp) - fooArm := result.ModuleForTests("foo", "android_arm_armv7-a-neon_shared") + fooArm := result.ModuleForTests(t, "foo", "android_arm_armv7-a-neon_shared") fooArmCFlags := fooArm.Rule("cc").Args["cFlags"] if w := "-fprofile-sample-use=afdo_profiles_package/foo_arm.afdo"; !strings.Contains(fooArmCFlags, w) { t.Errorf("Expected 'foo' to enable afdo, but did not find %q in cflags %q", w, fooArmCFlags) } - fooArm64 := result.ModuleForTests("foo", "android_arm64_armv8-a_shared") + fooArm64 := result.ModuleForTests(t, "foo", "android_arm64_armv8-a_shared") fooArm64CFlags := fooArm64.Rule("cc").Args["cFlags"] if w := "-fprofile-sample-use=afdo_profiles_package/foo_arm64.afdo"; !strings.Contains(fooArm64CFlags, w) { t.Errorf("Expected 'foo' to enable afdo, but did not find %q in cflags %q", w, fooArm64CFlags) @@ -476,11 +476,11 @@ func TestMultipleAfdoRDeps(t *testing.T) { expectedCFlagLibTest := "-fprofile-sample-use=afdo_profiles_package/libTest.afdo" expectedCFlagLibBar := "-fprofile-sample-use=afdo_profiles_package/libBar.afdo" - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") - libFooAfdoVariantWithLibTest := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libTest") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") + libFooAfdoVariantWithLibTest := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static_afdo-libTest") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_shared") - libFooAfdoVariantWithLibBar := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libBar") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_shared") + libFooAfdoVariantWithLibBar := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static_afdo-libBar") // Check cFlags of afdo-enabled module and the afdo-variant of its static deps cFlags := libTest.Rule("cc").Args["cFlags"] @@ -543,9 +543,9 @@ func TestAfdoDepsWithoutProfile(t *testing.T) { // -funique-internal-linkage-names. expectedCFlag := "-funique-internal-linkage-names" - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") - libFooAfdoVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_afdo-libTest") - libBarAfdoVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_afdo-libTest") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") + libFooAfdoVariant := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static_afdo-libTest") + libBarAfdoVariant := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static_afdo-libTest") // Check cFlags of afdo-enabled module and the afdo-variant of its static deps cFlags := libTest.Rule("cc").Args["cFlags"] @@ -572,8 +572,8 @@ func TestAfdoDepsWithoutProfile(t *testing.T) { } // Verify non-afdo variant exists and doesn't contain afdo - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static") cFlags = libFoo.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, expectedCFlag) { diff --git a/cc/binary.go b/cc/binary.go index 4b77bea64..c4791c519 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -426,7 +426,7 @@ func (binary *binaryDecorator) link(ctx ModuleContext, validations = append(validations, objs.tidyDepFiles...) linkerDeps = append(linkerDeps, flags.LdFlagsDeps...) - if generatedLib := generateRustStaticlib(ctx, deps.RustRlibDeps); generatedLib != nil { + if generatedLib := GenerateRustStaticlib(ctx, deps.RustRlibDeps); generatedLib != nil { deps.StaticLibs = append(deps.StaticLibs, generatedLib) } diff --git a/cc/binary_test.go b/cc/binary_test.go index 3e18940fe..4f001d7c2 100644 --- a/cc/binary_test.go +++ b/cc/binary_test.go @@ -29,7 +29,7 @@ func TestBinaryLinkerScripts(t *testing.T) { linker_scripts: ["foo.ld", "bar.ld"], }`) - binFoo := result.ModuleForTests("foo", "android_arm64_armv8-a").Rule("ld") + binFoo := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Rule("ld") android.AssertStringListContains(t, "missing dependency on linker_scripts", binFoo.Implicits.Strings(), "foo.ld") diff --git a/cc/builder.go b/cc/builder.go index c94a6741c..f4f85962d 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -817,7 +817,7 @@ func transformObjToStaticLib(ctx android.ModuleContext, } // Generate a Rust staticlib from a list of rlibDeps. Returns nil if TransformRlibstoStaticlib is nil or rlibDeps is empty. -func generateRustStaticlib(ctx android.ModuleContext, rlibDeps []RustRlibDep) android.Path { +func GenerateRustStaticlib(ctx android.ModuleContext, rlibDeps []RustRlibDep) android.Path { if TransformRlibstoStaticlib == nil && len(rlibDeps) > 0 { // This should only be reachable if a module defines Rust deps in static_libs and // soong-rust hasn't been loaded alongside soong-cc (e.g. in soong-cc tests). @@ -974,13 +974,18 @@ func transformObjToDynamicBinary(ctx android.ModuleContext, func transformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path, baseName string, exportedIncludeDirs []string, symbolFile android.OptionalPath, excludedSymbolVersions, excludedSymbolTags, includedSymbolTags []string, - api string) android.Path { + api string, commonGlobalIncludes bool) android.Path { outputFile := android.PathForModuleOut(ctx, baseName+".lsdump") implicits := android.Paths{soFile} symbolFilterStr := "-so " + soFile.String() exportedHeaderFlags := android.JoinWithPrefix(exportedIncludeDirs, "-I") + // If this library does not export any include directory, do not append the flags + // so that the ABI tool dumps everything without filtering by the include directories. + if commonGlobalIncludes && len(exportedIncludeDirs) > 0 { + exportedHeaderFlags += " ${config.CommonGlobalIncludes}" + } if symbolFile.Valid() { implicits = append(implicits, symbolFile.Path()) @@ -66,19 +66,19 @@ type AidlInterfaceInfo struct { type CompilerInfo struct { Srcs android.Paths // list of module-specific flags that will be used for C and C++ compiles. - Cflags proptools.Configurable[[]string] + Cflags []string AidlInterfaceInfo AidlInterfaceInfo LibraryDecoratorInfo *LibraryDecoratorInfo } type LinkerInfo struct { - WholeStaticLibs proptools.Configurable[[]string] + WholeStaticLibs []string // list of modules that should be statically linked into this module. - StaticLibs proptools.Configurable[[]string] + StaticLibs []string // list of modules that should be dynamically linked into this module. - SharedLibs proptools.Configurable[[]string] + SharedLibs []string // list of modules that should only provide headers for this module. - HeaderLibs proptools.Configurable[[]string] + HeaderLibs []string ImplementationModuleName *string BinaryDecoratorInfo *BinaryDecoratorInfo @@ -91,7 +91,7 @@ type LinkerInfo struct { type BinaryDecoratorInfo struct{} type LibraryDecoratorInfo struct { - ExportIncludeDirs proptools.Configurable[[]string] + ExportIncludeDirs []string InjectBsslHash bool } @@ -2295,9 +2295,10 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { HasLlndkStubs: c.HasLlndkStubs(), } if c.compiler != nil { + cflags := c.compiler.baseCompilerProps().Cflags ccInfo.CompilerInfo = &CompilerInfo{ Srcs: c.compiler.(CompiledInterface).Srcs(), - Cflags: c.compiler.baseCompilerProps().Cflags, + Cflags: cflags.GetOrDefault(ctx, nil), AidlInterfaceInfo: AidlInterfaceInfo{ Sources: c.compiler.baseCompilerProps().AidlInterface.Sources, AidlRoot: c.compiler.baseCompilerProps().AidlInterface.AidlRoot, @@ -2308,16 +2309,17 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { switch decorator := c.compiler.(type) { case *libraryDecorator: ccInfo.CompilerInfo.LibraryDecoratorInfo = &LibraryDecoratorInfo{ - ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs, + ExportIncludeDirs: decorator.flagExporter.Properties.Export_include_dirs.GetOrDefault(ctx, nil), } } } if c.linker != nil { + baseLinkerProps := c.linker.baseLinkerProps() ccInfo.LinkerInfo = &LinkerInfo{ - WholeStaticLibs: c.linker.baseLinkerProps().Whole_static_libs, - StaticLibs: c.linker.baseLinkerProps().Static_libs, - SharedLibs: c.linker.baseLinkerProps().Shared_libs, - HeaderLibs: c.linker.baseLinkerProps().Header_libs, + WholeStaticLibs: baseLinkerProps.Whole_static_libs.GetOrDefault(ctx, nil), + StaticLibs: baseLinkerProps.Static_libs.GetOrDefault(ctx, nil), + SharedLibs: baseLinkerProps.Shared_libs.GetOrDefault(ctx, nil), + HeaderLibs: baseLinkerProps.Header_libs.GetOrDefault(ctx, nil), } switch decorator := c.linker.(type) { case *binaryDecorator: @@ -4054,7 +4056,23 @@ func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Write var _ android.ApexModule = (*Module)(nil) // Implements android.ApexModule -func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { +func (c *Module) GetDepInSameApexChecker() android.DepInSameApexChecker { + return CcDepInSameApexChecker{ + Static: c.static(), + HasStubsVariants: c.HasStubsVariants(), + IsLlndk: c.IsLlndk(), + Host: c.Host(), + } +} + +type CcDepInSameApexChecker struct { + Static bool + HasStubsVariants bool + IsLlndk bool + Host bool +} + +func (c CcDepInSameApexChecker) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { if depTag == StubImplDepTag { // We don't track from an implementation library to its stubs. return false @@ -4067,7 +4085,7 @@ func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { } libDepTag, isLibDepTag := depTag.(libraryDependencyTag) - if isLibDepTag && c.static() && libDepTag.shared() { + if isLibDepTag && c.Static && libDepTag.shared() { // shared_lib dependency from a static lib is considered as crossing // the APEX boundary because the dependency doesn't actually is // linked; the dependency is used only during the compilation phase. @@ -4081,8 +4099,11 @@ func (c *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { return true } -func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool { - if c.HasStubsVariants() { +func (c CcDepInSameApexChecker) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool { + if c.Host { + return false + } + if c.HasStubsVariants { if IsSharedDepTag(depTag) && !IsExplicitImplSharedDepTag(depTag) { // dynamic dep to a stubs lib crosses APEX boundary return false @@ -4095,7 +4116,7 @@ func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool { return false } } - if c.IsLlndk() { + if c.IsLlndk { return false } @@ -4103,20 +4124,19 @@ func (c *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool { } // Implements android.ApexModule -func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { +func (c *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { // We ignore libclang_rt.* prebuilt libs since they declare sdk_version: 14(b/121358700) if strings.HasPrefix(ctx.OtherModuleName(c), "libclang_rt") { - return nil + return android.MinApiLevel } // We don't check for prebuilt modules if _, ok := c.linker.(prebuiltLinkerInterface); ok { - return nil + return android.MinApiLevel } minSdkVersion := c.MinSdkVersion() if minSdkVersion == "apex_inherit" { - return nil + return android.MinApiLevel } if minSdkVersion == "" { // JNI libs within APK-in-APEX fall into here @@ -4125,14 +4145,16 @@ func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, // non-SDK variant resets sdk_version, which works too. minSdkVersion = c.SdkVersion() } + if minSdkVersion == "" { - return fmt.Errorf("neither min_sdk_version nor sdk_version specificed") + return android.NoneApiLevel } + // Not using nativeApiLevelFromUser because the context here is not // necessarily a native context. - ver, err := android.ApiLevelFromUser(ctx, minSdkVersion) + ver, err := android.ApiLevelFromUserWithConfig(ctx.Config(), minSdkVersion) if err != nil { - return err + return android.NoneApiLevel } // A dependency only needs to support a min_sdk_version at least @@ -4140,15 +4162,14 @@ func (c *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, // This allows introducing new architectures in the platform that // need to be included in apexes that normally require an older // min_sdk_version. - minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType) - if sdkVersion.LessThan(minApiForArch) { - sdkVersion = minApiForArch + if c.Enabled(ctx) { + minApiForArch := MinApiForArch(ctx, c.Target().Arch.ArchType) + if ver.LessThanOrEqualTo(minApiForArch) { + ver = android.MinApiLevel + } } - if ver.GreaterThan(sdkVersion) { - return fmt.Errorf("newer SDK(%v)", ver) - } - return nil + return ver } // Implements android.ApexModule @@ -4222,7 +4243,6 @@ func (c *Module) typ() moduleType { type Defaults struct { android.ModuleBase android.DefaultsModuleBase - android.ApexModuleBase } // cc_defaults provides a set of properties that can be inherited by other cc diff --git a/cc/cc_preprocess_no_configuration_test.go b/cc/cc_preprocess_no_configuration_test.go index c6eae4c3f..f09c44a46 100644 --- a/cc/cc_preprocess_no_configuration_test.go +++ b/cc/cc_preprocess_no_configuration_test.go @@ -36,7 +36,7 @@ func TestCcPreprocessNoConfiguration(t *testing.T) { result := fixture.RunTest(t) - foo := result.ModuleForTests("foo", "") + foo := result.ModuleForTests(t, "foo", "") actual := foo.Rule("cc").Args["cFlags"] expected := "-E -DANDROID -Ifoo/bar" android.AssertStringEquals(t, "cflags should be correct", expected, actual) diff --git a/cc/cc_test.go b/cc/cc_test.go index 98af7b655..2c06924ea 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -160,7 +160,7 @@ func TestVendorSrc(t *testing.T) { } `) - ld := ctx.ModuleForTests("libTest", vendorVariant).Rule("ld") + ld := ctx.ModuleForTests(t, "libTest", vendorVariant).Rule("ld") var objs []string for _, o := range ld.Inputs { objs = append(objs, o.Base()) @@ -171,7 +171,7 @@ func TestVendorSrc(t *testing.T) { } func checkInstallPartition(t *testing.T, ctx *android.TestContext, name, variant, expected string) { - mod := ctx.ModuleForTests(name, variant).Module().(*Module) + mod := ctx.ModuleForTests(t, name, variant).Module().(*Module) partitionDefined := false checkPartition := func(specific bool, partition string) { if specific { @@ -311,7 +311,7 @@ func TestDataLibs(t *testing.T) { config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) ctx := testCcWithConfig(t, config) - testingModule := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon") + testingModule := ctx.ModuleForTests(t, "main_test", "android_arm_armv7-a-neon") testBinary := testingModule.Module().(*Module).linker.(*testBinary) outputFiles := testingModule.OutputFiles(ctx, t, "") if len(outputFiles) != 1 { @@ -363,7 +363,7 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) ctx := testCcWithConfig(t, config) - testingModule := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon") + testingModule := ctx.ModuleForTests(t, "main_test", "android_arm_armv7-a-neon") module := testingModule.Module() testBinary := module.(*Module).linker.(*testBinary) outputFiles := testingModule.OutputFiles(ctx, t, "") @@ -405,7 +405,7 @@ func TestTestBinaryTestSuites(t *testing.T) { ` ctx := prepareForCcTest.RunTestWithBp(t, bp).TestContext - module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module() + module := ctx.ModuleForTests(t, "main_test", "android_arm_armv7-a-neon").Module() entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo compatEntries := entries.EntryMap["LOCAL_COMPATIBILITY_SUITE"] @@ -437,7 +437,7 @@ func TestTestLibraryTestSuites(t *testing.T) { ` ctx := prepareForCcTest.RunTestWithBp(t, bp).TestContext - module := ctx.ModuleForTests("main_test_lib", "android_arm_armv7-a-neon_shared").Module() + module := ctx.ModuleForTests(t, "main_test_lib", "android_arm_armv7-a-neon_shared").Module() entries := android.AndroidMkInfoForTest(t, ctx, module).PrimaryInfo compatEntries := entries.EntryMap["LOCAL_COMPATIBILITY_SUITE"] @@ -668,7 +668,7 @@ func TestMakeLinkType(t *testing.T) { } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - module := ctx.ModuleForTests(test.name, test.variant).Module().(*Module) + module := ctx.ModuleForTests(t, test.name, test.variant).Module().(*Module) assertString(t, module.makeLinkType, test.expected) }) } @@ -861,10 +861,10 @@ func TestStaticLibDepReordering(t *testing.T) { `) variant := "android_arm64_armv8-a_static" - moduleA := ctx.ModuleForTests("a", variant).Module().(*Module) + moduleA := ctx.ModuleForTests(t, "a", variant).Module().(*Module) staticLibInfo, _ := android.OtherModuleProvider(ctx, moduleA, StaticLibraryInfoProvider) actual := android.Paths(staticLibInfo.TransitiveStaticLibrariesForOrdering.ToList()).RelativeToTop() - expected := GetOutputPaths(ctx, variant, []string{"a", "c", "b", "d"}) + expected := GetOutputPaths(t, ctx, variant, []string{"a", "c", "b", "d"}) if !reflect.DeepEqual(actual, expected) { t.Errorf("staticDeps orderings were not propagated correctly"+ @@ -897,10 +897,10 @@ func TestStaticLibDepReorderingWithShared(t *testing.T) { `) variant := "android_arm64_armv8-a_static" - moduleA := ctx.ModuleForTests("a", variant).Module().(*Module) + moduleA := ctx.ModuleForTests(t, "a", variant).Module().(*Module) staticLibInfo, _ := android.OtherModuleProvider(ctx, moduleA, StaticLibraryInfoProvider) actual := android.Paths(staticLibInfo.TransitiveStaticLibrariesForOrdering.ToList()).RelativeToTop() - expected := GetOutputPaths(ctx, variant, []string{"a", "c", "b"}) + expected := GetOutputPaths(t, ctx, variant, []string{"a", "c", "b"}) if !reflect.DeepEqual(actual, expected) { t.Errorf("staticDeps orderings did not account for shared libs"+ @@ -1004,12 +1004,12 @@ func TestLlndkLibrary(t *testing.T) { } android.AssertArrayString(t, "variants for llndk stubs", expected, actual) - params := result.ModuleForTests("libllndk", "android_vendor_arm_armv7-a-neon_shared").Description("generate stub") + params := result.ModuleForTests(t, "libllndk", "android_vendor_arm_armv7-a-neon_shared").Description("generate stub") android.AssertSame(t, "use Vendor API level for default stubs", "35", params.Args["apiLevel"]) checkExportedIncludeDirs := func(module, variant string, expectedSystemDirs []string, expectedDirs ...string) { t.Helper() - m := result.ModuleForTests(module, variant).Module() + m := result.ModuleForTests(t, module, variant).Module() f, _ := android.OtherModuleProvider(result, m, FlagExporterInfoProvider) android.AssertPathsRelativeToTopEquals(t, "exported include dirs for "+module+"["+variant+"]", expectedDirs, f.IncludeDirs) @@ -1030,14 +1030,14 @@ func TestLlndkLibrary(t *testing.T) { checkAbiLinkerIncludeDirs := func(module string) { t.Helper() - coreModule := result.ModuleForTests(module, coreVariant) + coreModule := result.ModuleForTests(t, module, coreVariant) abiCheckFlags := "" for _, output := range coreModule.AllOutputs() { if strings.HasSuffix(output, ".so.llndk.lsdump") { abiCheckFlags = coreModule.Output(output).Args["exportedHeaderFlags"] } } - vendorModule := result.ModuleForTests(module, vendorVariant).Module() + vendorModule := result.ModuleForTests(t, module, vendorVariant).Module() vendorInfo, _ := android.OtherModuleProvider(result, vendorModule, FlagExporterInfoProvider) vendorDirs := android.Concat(vendorInfo.IncludeDirs, vendorInfo.SystemIncludeDirs) android.AssertStringEquals(t, module+" has different exported include dirs for vendor variant and ABI check", @@ -1078,7 +1078,7 @@ func TestLlndkHeaders(t *testing.T) { `) // _static variant is used since _shared reuses *.o from the static variant - cc := ctx.ModuleForTests("libvendor", "android_vendor_arm_armv7-a-neon_static").Rule("cc") + cc := ctx.ModuleForTests(t, "libvendor", "android_vendor_arm_armv7-a-neon_static").Rule("cc") cflags := cc.Args["cFlags"] if !strings.Contains(cflags, "-Imy_include") { t.Errorf("cflags for libvendor must contain -Imy_include, but was %#v.", cflags) @@ -1189,33 +1189,33 @@ func TestRuntimeLibs(t *testing.T) { // runtime_libs for core variants use the module names without suffixes. variant := "android_arm64_armv8-a_shared" - module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) + module := ctx.ModuleForTests(t, "libvendor_available1", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available"}, module) - module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libproduct_available1", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available"}, module) - module = ctx.ModuleForTests("libcore", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libcore", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available"}, module) // runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core // and vendor variants. variant = "android_vendor_arm64_armv8-a_shared" - module = ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libvendor_available1", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available.vendor"}, module) - module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libvendor2", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available.vendor", "libvendor1", "libproduct_vendor.vendor"}, module) // runtime_libs for product variants have '.product' suffixes if the modules have both core // and product variants. variant = "android_product_arm64_armv8-a_shared" - module = ctx.ModuleForTests("libproduct_available1", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libproduct_available1", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available.product"}, module) - module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libproduct2", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available.product", "libproduct1", "libproduct_vendor"}, module) } @@ -1224,11 +1224,11 @@ func TestExcludeRuntimeLibs(t *testing.T) { ctx := testCc(t, runtimeLibAndroidBp) variant := "android_arm64_armv8-a_shared" - module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) + module := ctx.ModuleForTests(t, "libvendor_available2", variant).Module().(*Module) checkRuntimeLibs(t, []string{"liball_available"}, module) variant = "android_vendor_arm64_armv8-a_shared" - module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "libvendor_available2", variant).Module().(*Module) checkRuntimeLibs(t, nil, module) } @@ -1261,12 +1261,12 @@ func TestStaticLibDepExport(t *testing.T) { // Check the shared version of lib2. variant := "android_arm64_armv8-a_shared" - module := ctx.ModuleForTests("lib2", variant).Module().(*Module) + module := ctx.ModuleForTests(t, "lib2", variant).Module().(*Module) checkStaticLibs(t, []string{"lib1", "libc++demangle", "libclang_rt.builtins"}, module) // Check the static version of lib2. variant = "android_arm64_armv8-a_static" - module = ctx.ModuleForTests("lib2", variant).Module().(*Module) + module = ctx.ModuleForTests(t, "lib2", variant).Module().(*Module) // libc++_static is linked additionally. checkStaticLibs(t, []string{"lib1", "libc++_static", "libc++demangle", "libclang_rt.builtins"}, module) } @@ -1387,7 +1387,7 @@ func TestRecovery(t *testing.T) { t.Errorf("multilib was set to 32 for librecovery32, but its variants has %s.", arm64) } - recoveryModule := ctx.ModuleForTests("libHalInRecovery", recoveryVariant).Module().(*Module) + recoveryModule := ctx.ModuleForTests(t, "libHalInRecovery", recoveryVariant).Module().(*Module) if !recoveryModule.Platform() { t.Errorf("recovery variant of libHalInRecovery must not specific to device, soc, or product") } @@ -1412,7 +1412,7 @@ func TestDataLibsPrebuiltSharedTestLibrary(t *testing.T) { config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) ctx := testCcWithConfig(t, config) - testingModule := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon") + testingModule := ctx.ModuleForTests(t, "main_test", "android_arm_armv7-a-neon") module := testingModule.Module() testBinary := module.(*Module).linker.(*testBinary) outputFiles := testingModule.OutputFiles(ctx, t, "") @@ -1487,14 +1487,14 @@ func TestVersionedStubs(t *testing.T) { } } - libBarLinkRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("ld") + libBarLinkRule := ctx.ModuleForTests(t, "libBar", "android_arm64_armv8-a_shared").Rule("ld") libFlags := libBarLinkRule.Args["libFlags"] libFoo1StubPath := "libFoo/android_arm64_armv8-a_shared_1/libFoo.so" if !strings.Contains(libFlags, libFoo1StubPath) { t.Errorf("%q is not found in %q", libFoo1StubPath, libFlags) } - libBarCompileRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("cc") + libBarCompileRule := ctx.ModuleForTests(t, "libBar", "android_arm64_armv8-a_shared").Rule("cc") cFlags := libBarCompileRule.Args["cFlags"] libFoo1VersioningMacro := "-D__LIBFOO_API__=1" if !strings.Contains(cFlags, libFoo1VersioningMacro) { @@ -1550,7 +1550,7 @@ func TestStaticLibArchiveArgs(t *testing.T) { }`) variant := "android_arm64_armv8-a_static" - arRule := ctx.ModuleForTests("baz", variant).Rule("ar") + arRule := ctx.ModuleForTests(t, "baz", variant).Rule("ar") // For static libraries, the object files of a whole static dep are included in the archive // directly @@ -1591,7 +1591,7 @@ func TestSharedLibLinkingArgs(t *testing.T) { }`) variant := "android_arm64_armv8-a_shared" - linkRule := ctx.ModuleForTests("baz", variant).Rule("ld") + linkRule := ctx.ModuleForTests(t, "baz", variant).Rule("ld") libFlags := linkRule.Args["libFlags"] // When dynamically linking, we expect static dependencies to be found on the command line if expected := "foo.a"; !strings.Contains(libFlags, expected) { @@ -1623,7 +1623,7 @@ func TestStaticExecutable(t *testing.T) { }`) variant := "android_arm64_armv8-a" - binModuleRule := ctx.ModuleForTests("static_test", variant).Rule("ld") + binModuleRule := ctx.ModuleForTests(t, "static_test", variant).Rule("ld") libFlags := binModuleRule.Args["libFlags"] systemStaticLibs := []string{"libc.a", "libm.a"} for _, lib := range systemStaticLibs { @@ -1666,9 +1666,9 @@ func TestStaticDepsOrderWithStubs(t *testing.T) { }, }`) - mybin := ctx.ModuleForTests("mybin", "android_arm64_armv8-a").Rule("ld") + mybin := ctx.ModuleForTests(t, "mybin", "android_arm64_armv8-a").Rule("ld") actual := mybin.Implicits[:2] - expected := GetOutputPaths(ctx, "android_arm64_armv8-a_static", []string{"libfooB", "libfooC"}) + expected := GetOutputPaths(t, ctx, "android_arm64_armv8-a_static", []string{"libfooB", "libfooC"}) if !reflect.DeepEqual(actual, expected) { t.Errorf("staticDeps orderings were not propagated correctly"+ @@ -1775,7 +1775,7 @@ func VerifyAFLFuzzTargetVariant(t *testing.T, variant string) { checkPcGuardFlag := func( modName string, variantName string, shouldHave bool) { - cc := ctx.ModuleForTests(modName, variantName).Rule("cc") + cc := ctx.ModuleForTests(t, modName, variantName).Rule("cc") cFlags, ok := cc.Args["cFlags"] if !ok { @@ -1802,9 +1802,9 @@ func VerifyAFLFuzzTargetVariant(t *testing.T, variant string) { checkPcGuardFlag(moduleName, variant+"_static", false) checkPcGuardFlag(moduleName, variant+"_static_fuzzer_afl", true) - ctx.ModuleForTests("afl_fuzz_shared_lib", + ctx.ModuleForTests(t, "afl_fuzz_shared_lib", "android_arm64_armv8-a_shared").Rule("cc") - ctx.ModuleForTests("afl_fuzz_shared_lib", + ctx.ModuleForTests(t, "afl_fuzz_shared_lib", "android_arm64_armv8-a_shared_fuzzer").Rule("cc") } @@ -1833,7 +1833,7 @@ func TestFuzzTarget(t *testing.T) { }`) variant := "android_arm64_armv8-a_fuzzer" - ctx.ModuleForTests("fuzz_smoke_test", variant).Rule("cc") + ctx.ModuleForTests(t, "fuzz_smoke_test", variant).Rule("cc") } func assertString(t *testing.T, got, expected string) { @@ -1897,24 +1897,24 @@ func TestDefaults(t *testing.T) { defaults: ["defaults"], }`) - shared := ctx.ModuleForTests("libshared", "android_arm64_armv8-a_shared").Rule("ld") + shared := ctx.ModuleForTests(t, "libshared", "android_arm64_armv8-a_shared").Rule("ld") if g, w := pathsToBase(shared.Inputs), []string{"foo.o", "baz.o"}; !reflect.DeepEqual(w, g) { t.Errorf("libshared ld rule wanted %q, got %q", w, g) } - bothShared := ctx.ModuleForTests("libboth", "android_arm64_armv8-a_shared").Rule("ld") + bothShared := ctx.ModuleForTests(t, "libboth", "android_arm64_armv8-a_shared").Rule("ld") if g, w := pathsToBase(bothShared.Inputs), []string{"foo.o", "baz.o"}; !reflect.DeepEqual(w, g) { t.Errorf("libboth ld rule wanted %q, got %q", w, g) } - binary := ctx.ModuleForTests("binary", "android_arm64_armv8-a").Rule("ld") + binary := ctx.ModuleForTests(t, "binary", "android_arm64_armv8-a").Rule("ld") if g, w := pathsToBase(binary.Inputs), []string{"foo.o"}; !reflect.DeepEqual(w, g) { t.Errorf("binary ld rule wanted %q, got %q", w, g) } - static := ctx.ModuleForTests("libstatic", "android_arm64_armv8-a_static").Rule("ar") + static := ctx.ModuleForTests(t, "libstatic", "android_arm64_armv8-a_static").Rule("ar") if g, w := pathsToBase(static.Inputs), []string{"foo.o", "bar.o"}; !reflect.DeepEqual(w, g) { t.Errorf("libstatic ar rule wanted %q, got %q", w, g) } - bothStatic := ctx.ModuleForTests("libboth", "android_arm64_armv8-a_static").Rule("ar") + bothStatic := ctx.ModuleForTests(t, "libboth", "android_arm64_armv8-a_static").Rule("ar") if g, w := pathsToBase(bothStatic.Inputs), []string{"foo.o", "bar.o"}; !reflect.DeepEqual(w, g) { t.Errorf("libboth ar rule wanted %q, got %q", w, g) } @@ -1973,12 +1973,12 @@ func TestEmptyWholeStaticLibsAllowMissingDependencies(t *testing.T) { android.PrepareForTestWithAllowMissingDependencies, ).RunTestWithBp(t, bp) - libbar := result.ModuleForTests("libbar", "android_arm64_armv8-a_static").Output("libbar.a") + libbar := result.ModuleForTests(t, "libbar", "android_arm64_armv8-a_static").Output("libbar.a") android.AssertDeepEquals(t, "libbar rule", android.ErrorRule, libbar.Rule) android.AssertStringDoesContain(t, "libbar error", libbar.Args["error"], "missing dependencies: libmissing") - libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Output("libfoo.a") + libfoo := result.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_static").Output("libfoo.a") android.AssertStringListContains(t, "libfoo.a dependencies", libfoo.Inputs.Strings(), libbar.Output.String()) } @@ -2025,11 +2025,11 @@ func TestInstallSharedLibs(t *testing.T) { config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) ctx := testCcWithConfig(t, config) - hostBin := ctx.ModuleForTests("bin", config.BuildOSTarget.String()).Description("install") - hostShared := ctx.ModuleForTests("libshared", config.BuildOSTarget.String()+"_shared").Description("install") - hostRuntime := ctx.ModuleForTests("libruntime", config.BuildOSTarget.String()+"_shared").Description("install") - hostTransitive := ctx.ModuleForTests("libtransitive", config.BuildOSTarget.String()+"_shared").Description("install") - hostTool := ctx.ModuleForTests("tool", config.BuildOSTarget.String()).Description("install") + hostBin := ctx.ModuleForTests(t, "bin", config.BuildOSTarget.String()).Description("install") + hostShared := ctx.ModuleForTests(t, "libshared", config.BuildOSTarget.String()+"_shared").Description("install") + hostRuntime := ctx.ModuleForTests(t, "libruntime", config.BuildOSTarget.String()+"_shared").Description("install") + hostTransitive := ctx.ModuleForTests(t, "libtransitive", config.BuildOSTarget.String()+"_shared").Description("install") + hostTool := ctx.ModuleForTests(t, "tool", config.BuildOSTarget.String()).Description("install") if g, w := hostBin.Implicits.Strings(), hostShared.Output.String(); !android.InList(w, g) { t.Errorf("expected host bin dependency %q, got %q", w, g) @@ -2051,10 +2051,10 @@ func TestInstallSharedLibs(t *testing.T) { t.Errorf("expected no host bin dependency %q, got %q", w, g) } - deviceBin := ctx.ModuleForTests("bin", "android_arm64_armv8-a").Description("install") - deviceShared := ctx.ModuleForTests("libshared", "android_arm64_armv8-a_shared").Description("install") - deviceTransitive := ctx.ModuleForTests("libtransitive", "android_arm64_armv8-a_shared").Description("install") - deviceRuntime := ctx.ModuleForTests("libruntime", "android_arm64_armv8-a_shared").Description("install") + deviceBin := ctx.ModuleForTests(t, "bin", "android_arm64_armv8-a").Description("install") + deviceShared := ctx.ModuleForTests(t, "libshared", "android_arm64_armv8-a_shared").Description("install") + deviceTransitive := ctx.ModuleForTests(t, "libtransitive", "android_arm64_armv8-a_shared").Description("install") + deviceRuntime := ctx.ModuleForTests(t, "libruntime", "android_arm64_armv8-a_shared").Description("install") if g, w := deviceBin.OrderOnly.Strings(), deviceShared.Output.String(); !android.InList(w, g) { t.Errorf("expected device bin dependency %q, got %q", w, g) @@ -2104,7 +2104,7 @@ func TestStubsLibReexportsHeaders(t *testing.T) { srcs: ["foo.c"], }`) - cFlags := ctx.ModuleForTests("libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + cFlags := ctx.ModuleForTests(t, "libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] if !strings.Contains(cFlags, "-Iinclude/libbar") { t.Errorf("expected %q in cflags, got %q", "-Iinclude/libbar", cFlags) @@ -2144,7 +2144,7 @@ func TestAidlLibraryWithHeaders(t *testing.T) { }.AddToFixture(), ).RunTest(t).TestContext - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_static") android.AssertPathsRelativeToTopEquals( t, @@ -2192,7 +2192,7 @@ func TestAidlFlagsPassedToTheAidlCompiler(t *testing.T) { } `) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_static") manifest := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, libfoo.Output("aidl.sbox.textproto")) aidlCommand := manifest.Commands[0].GetCommand() expectedAidlFlag := "-Werror" @@ -2243,7 +2243,7 @@ func TestAidlFlagsWithMinSdkVersion(t *testing.T) { `+tc.sdkVersion+` } `) - libfoo := ctx.ModuleForTests("libfoo", tc.variant) + libfoo := ctx.ModuleForTests(t, "libfoo", tc.variant) manifest := android.RuleBuilderSboxProtoForTests(t, ctx, libfoo.Output("aidl.sbox.textproto")) aidlCommand := manifest.Commands[0].GetCommand() expectedAidlFlag := "--min_sdk_version=" + tc.expected @@ -2312,7 +2312,7 @@ func TestMinSdkVersionInClangTriple(t *testing.T) { min_sdk_version: "29", }`) - cFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + cFlags := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] android.AssertStringDoesContain(t, "min sdk version", cFlags, "-target aarch64-linux-android29") } @@ -2332,7 +2332,7 @@ func TestNonDigitMinSdkVersionInClangTriple(t *testing.T) { }), ).RunTestWithBp(t, bp) ctx := result.TestContext - cFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + cFlags := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] android.AssertStringDoesContain(t, "min sdk version", cFlags, "-target aarch64-linux-android31") } @@ -2439,7 +2439,7 @@ func TestIncludeDirsExporting(t *testing.T) { export_generated_headers: ["genrule_bar"], } `) - foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() + foo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, foo, expectedIncludeDirs(` foo/standard @@ -2450,7 +2450,7 @@ func TestIncludeDirsExporting(t *testing.T) { expectedOrderOnlyDeps(`.intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h`), ) - bar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module() + bar := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, bar, expectedIncludeDirs(` bar/standard @@ -2483,7 +2483,7 @@ func TestIncludeDirsExporting(t *testing.T) { export_generated_headers: ["genrule_bar"], } `) - foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() + foo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, foo, expectedIncludeDirs(` foo/standard @@ -2494,7 +2494,7 @@ func TestIncludeDirsExporting(t *testing.T) { expectedOrderOnlyDeps(`.intermediates/genrule_foo/gen/generated_headers/foo/generated_header.h`), ) - bar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module() + bar := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, bar, expectedIncludeDirs(` bar/standard @@ -2540,7 +2540,7 @@ func TestIncludeDirsExporting(t *testing.T) { } } `).TestContext - foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() + foo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, foo, expectedIncludeDirs(` .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl @@ -2580,7 +2580,7 @@ func TestIncludeDirsExporting(t *testing.T) { } } `) - foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() + foo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, foo, expectedIncludeDirs(` .intermediates/libfoo/android_arm64_armv8-a_shared/gen/proto @@ -2607,7 +2607,7 @@ func TestIncludeDirsExporting(t *testing.T) { ], } `) - foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() + foo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() checkIncludeDirs(t, ctx, foo, expectedIncludeDirs(` .intermediates/libfoo/android_arm64_armv8-a_shared/gen/sysprop/include @@ -2877,7 +2877,7 @@ func TestIncludeDirectoryOrdering(t *testing.T) { PrepareForIntegrationTestWithCc, android.FixtureAddTextFile("external/foo/Android.bp", bp), ).RunTest(t) - cflags := ctx.ModuleForTests("libfoo", variant).Output("obj/external/foo/foo.o").Args["cFlags"] + cflags := ctx.ModuleForTests(t, "libfoo", variant).Output("obj/external/foo/foo.o").Args["cFlags"] var includes []string flags := strings.Split(cflags, " ") @@ -2931,7 +2931,7 @@ func TestAddnoOverride64GlobalCflags(t *testing.T) { srcs: ["foo.c"], }`) - cFlags := ctx.ModuleForTests("libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + cFlags := ctx.ModuleForTests(t, "libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] if !strings.Contains(cFlags, "${config.NoOverride64GlobalCflags}") { t.Errorf("expected %q in cflags, got %q", "${config.NoOverride64GlobalCflags}", cFlags) @@ -3095,7 +3095,7 @@ func TestStrippedAllOutputFile(t *testing.T) { ` config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) ctx := testCcWithConfig(t, config) - testingModule := ctx.ModuleForTests("test_lib", "android_arm_armv7-a-neon_shared") + testingModule := ctx.ModuleForTests(t, "test_lib", "android_arm_armv7-a-neon_shared") outputFile := testingModule.OutputFiles(ctx, t, "stripped_all") if !strings.HasSuffix(outputFile.Strings()[0], "/stripped_all/test_lib.so") { t.Errorf("Unexpected output file: %s", outputFile.Strings()[0]) @@ -3140,8 +3140,8 @@ func TestImageVariants(t *testing.T) { if imageVariant != "core" { imageVariantStr = "_" + imageVariant } - binFooModule := ctx.ModuleForTests("binfoo", "android"+imageVariantStr+"_arm64_armv8-a").Module() - libBarModule := ctx.ModuleForTests("libbar", "android"+imageVariantStr+"_arm64_armv8-a_shared").Module() + binFooModule := ctx.ModuleForTests(t, "binfoo", "android"+imageVariantStr+"_arm64_armv8-a").Module() + libBarModule := ctx.ModuleForTests(t, "libbar", "android"+imageVariantStr+"_arm64_armv8-a_shared").Module() android.AssertBoolEquals(t, "binfoo should have dependency on libbar with image variant "+imageVariant, true, hasDep(binFooModule, libBarModule)) } @@ -3172,7 +3172,7 @@ func TestVendorOrProductVariantUsesPlatformSdkVersionAsDefault(t *testing.T) { ctx := prepareForCcTest.RunTestWithBp(t, bp) testSdkVersionFlag := func(module, variant, version string) { - flags := ctx.ModuleForTests(module, "android_"+variant+"_arm64_armv8-a_static").Rule("cc").Args["cFlags"] + flags := ctx.ModuleForTests(t, module, "android_"+variant+"_arm64_armv8-a_static").Rule("cc").Args["cFlags"] android.AssertStringDoesContain(t, "target SDK version", flags, "-target aarch64-linux-android"+version) } @@ -3199,14 +3199,14 @@ func TestClangVerify(t *testing.T) { } `) - module := ctx.ModuleForTests("lib_no_clang_verify", "android_arm64_armv8-a_shared") + module := ctx.ModuleForTests(t, "lib_no_clang_verify", "android_arm64_armv8-a_shared") cFlags_no_cv := module.Rule("cc").Args["cFlags"] if strings.Contains(cFlags_no_cv, "-Xclang") || strings.Contains(cFlags_no_cv, "-verify") { t.Errorf("expected %q not in cflags, got %q", "-Xclang -verify", cFlags_no_cv) } - cFlags_cv := ctx.ModuleForTests("lib_clang_verify", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + cFlags_cv := ctx.ModuleForTests(t, "lib_clang_verify", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] if strings.Contains(cFlags_cv, "-Xclang") && strings.Contains(cFlags_cv, "-verify") { t.Errorf("expected %q in cflags, got %q", "-Xclang -verify", cFlags_cv) } diff --git a/cc/cc_test_only_property_test.go b/cc/cc_test_only_property_test.go index 972e86bc5..a178cad68 100644 --- a/cc/cc_test_only_property_test.go +++ b/cc/cc_test_only_property_test.go @@ -173,7 +173,7 @@ func TestInvalidTestOnlyTargets(t *testing.T) { func getTeamProtoOutput(t *testing.T, ctx *android.TestResult) *team_proto.AllTeams { teams := new(team_proto.AllTeams) - config := ctx.SingletonForTests("all_teams") + config := ctx.SingletonForTests(t, "all_teams") allOutputs := config.AllOutputs() protoPath := allOutputs[0] diff --git a/cc/ccdeps.go b/cc/ccdeps.go index 469fe31fa..4247778e8 100644 --- a/cc/ccdeps.go +++ b/cc/ccdeps.go @@ -41,8 +41,6 @@ type ccdepsGeneratorSingleton struct { outputPath android.Path } -var _ android.SingletonMakeVarsProvider = (*ccdepsGeneratorSingleton)(nil) - const ( ccdepsJsonFileName = "module_bp_cc_deps.json" cClang = "clang" @@ -114,13 +112,6 @@ func (c *ccdepsGeneratorSingleton) GenerateBuildActions(ctx android.SingletonCon Rule: android.Touch, Output: ccfpath, }) -} - -func (c *ccdepsGeneratorSingleton) MakeVars(ctx android.MakeVarsContext) { - if c.outputPath == nil { - return - } - ctx.DistForGoal("general-tests", c.outputPath) } diff --git a/cc/cmake_snapshot.go b/cc/cmake_snapshot.go index 71fbcceda..3f6a01d1b 100644 --- a/cc/cmake_snapshot.go +++ b/cc/cmake_snapshot.go @@ -204,24 +204,19 @@ func parseTemplate(templateContents string) *template.Template { return info.CompilerInfo.AidlInterfaceInfo }, "getCflagsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { - prop := info.CompilerInfo.Cflags - return prop.GetOrDefault(ctx, nil) + return info.CompilerInfo.Cflags }, "getWholeStaticLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { - prop := info.LinkerInfo.WholeStaticLibs - return prop.GetOrDefault(ctx, nil) + return info.LinkerInfo.WholeStaticLibs }, "getStaticLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { - prop := info.LinkerInfo.StaticLibs - return prop.GetOrDefault(ctx, nil) + return info.LinkerInfo.StaticLibs }, "getSharedLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { - prop := info.LinkerInfo.SharedLibs - return prop.GetOrDefault(ctx, nil) + return info.LinkerInfo.SharedLibs }, "getHeaderLibsProperty": func(ctx android.ModuleContext, info *CcInfo) []string { - prop := info.LinkerInfo.HeaderLibs - return prop.GetOrDefault(ctx, nil) + return info.LinkerInfo.HeaderLibs }, "getExtraLibs": getExtraLibs, "getIncludeDirs": getIncludeDirs, @@ -552,7 +547,7 @@ func getExtraLibs(info *CcInfo) []string { func getIncludeDirs(ctx android.ModuleContext, m android.ModuleProxy, info *CcInfo) []string { moduleDir := ctx.OtherModuleDir(m) + string(filepath.Separator) if info.CompilerInfo.LibraryDecoratorInfo != nil { - return sliceWithPrefix(moduleDir, info.CompilerInfo.LibraryDecoratorInfo.ExportIncludeDirs.GetOrDefault(ctx, nil)) + return sliceWithPrefix(moduleDir, info.CompilerInfo.LibraryDecoratorInfo.ExportIncludeDirs) } return nil } diff --git a/cc/cmake_snapshot_test.go b/cc/cmake_snapshot_test.go index b6f4369b0..d08096a82 100644 --- a/cc/cmake_snapshot_test.go +++ b/cc/cmake_snapshot_test.go @@ -49,7 +49,7 @@ func TestEmptyCmakeSnapshot(t *testing.T) { t.Skip("CMake snapshots are only supported on Linux") } - snapshotModule := result.ModuleForTests("foo", "linux_glibc_x86_64") + snapshotModule := result.ModuleForTests(t, "foo", "linux_glibc_x86_64") wasGenerated(t, &snapshotModule, "CMakeLists.txt", "rawFileCopy") wasGenerated(t, &snapshotModule, "foo.zip", "") @@ -77,7 +77,7 @@ func TestCmakeSnapshotWithBinary(t *testing.T) { t.Skip("CMake snapshots are only supported on Linux") } - snapshotModule := result.ModuleForTests("foo", "linux_glibc_x86_64") + snapshotModule := result.ModuleForTests(t, "foo", "linux_glibc_x86_64") wasGenerated(t, &snapshotModule, "some/module/CMakeLists.txt", "rawFileCopy") } @@ -110,7 +110,7 @@ func TestCmakeSnapshotAsTestData(t *testing.T) { t.Skip("CMake snapshots are only supported on Linux") } - snapshotModule := result.ModuleForTests("foo", "linux_glibc_x86_64") + snapshotModule := result.ModuleForTests(t, "foo", "linux_glibc_x86_64") wasGenerated(t, &snapshotModule, "CMakeLists.txt", "rawFileCopy") wasGenerated(t, &snapshotModule, "foo.zip", "") diff --git a/cc/compiler.go b/cc/compiler.go index 3730bbe66..949603e40 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -324,6 +324,10 @@ func addToModuleList(ctx ModuleContext, key android.OnceKey, module string) { getNamedMapForConfig(ctx.Config(), key).Store(module, true) } +func requiresGlobalIncludes(ctx ModuleContext) bool { + return !(ctx.useSdk() || ctx.InVendorOrProduct()) || ctx.Host() +} + func useGnuExtensions(gnuExtensions *bool) bool { return proptools.BoolDefault(gnuExtensions, true) } @@ -452,7 +456,7 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps flags.Local.YasmFlags = append(flags.Local.YasmFlags, "-I"+modulePath) } - if !(ctx.useSdk() || ctx.InVendorOrProduct()) || ctx.Host() { + if requiresGlobalIncludes(ctx) { flags.SystemIncludeFlags = append(flags.SystemIncludeFlags, "${config.CommonGlobalIncludes}", tc.IncludeFlags()) diff --git a/cc/config/global.go b/cc/config/global.go index 44079678a..7bea124ea 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -382,8 +382,8 @@ var ( // prebuilts/clang default settings. ClangDefaultBase = "prebuilts/clang/host" - ClangDefaultVersion = "clang-r536225" - ClangDefaultShortVersion = "19" + ClangDefaultVersion = "clang-r547379" + ClangDefaultShortVersion = "20" // Directories with warnings from Android.bp files. WarningAllowedProjects = []string{ diff --git a/cc/config/x86_linux_host.go b/cc/config/x86_linux_host.go index 287967c12..c070050b7 100644 --- a/cc/config/x86_linux_host.go +++ b/cc/config/x86_linux_host.go @@ -41,7 +41,6 @@ var ( } linuxMuslCflags = []string{ - "-D_LIBCPP_HAS_MUSL_LIBC", "-DANDROID_HOST_MUSL", "-nostdlibinc", "--sysroot /dev/null", diff --git a/cc/gen_test.go b/cc/gen_test.go index 439f0a996..dde0dcfa0 100644 --- a/cc/gen_test.go +++ b/cc/gen_test.go @@ -33,8 +33,8 @@ func TestGen(t *testing.T) { ], }`) - aidl := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("aidl") - libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) + aidl := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("aidl") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) expected := "-I" + filepath.Dir(aidl.Output.String()) actual := android.StringsRelativeToTop(ctx.Config(), libfoo.flags.Local.CommonFlags) @@ -59,9 +59,9 @@ func TestGen(t *testing.T) { ], }`) - aidl := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("aidl") - aidlManifest := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Output("aidl.sbox.textproto") - libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) + aidl := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("aidl") + aidlManifest := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Output("aidl.sbox.textproto") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) if !inList("-I"+filepath.Dir(aidl.Output.String()), android.StringsRelativeToTop(ctx.Config(), libfoo.flags.Local.CommonFlags)) { t.Errorf("missing aidl includes in global flags") @@ -84,7 +84,7 @@ func TestGen(t *testing.T) { }`) outDir := "out/soong/.intermediates/libsysprop/android_arm64_armv8-a_static/gen" - syspropBuildParams := ctx.ModuleForTests("libsysprop", "android_arm64_armv8-a_static").Rule("sysprop") + syspropBuildParams := ctx.ModuleForTests(t, "libsysprop", "android_arm64_armv8-a_static").Rule("sysprop") android.AssertStringEquals(t, "header output directory does not match", outDir+"/sysprop/include/path/to", syspropBuildParams.Args["headerOutDir"]) android.AssertStringEquals(t, "public output directory does not match", outDir+"/sysprop/public/include/path/to", syspropBuildParams.Args["publicOutDir"]) diff --git a/cc/genrule_test.go b/cc/genrule_test.go index 9a8049b2c..438eb9880 100644 --- a/cc/genrule_test.go +++ b/cc/genrule_test.go @@ -64,13 +64,13 @@ func TestArchGenruleCmd(t *testing.T) { t.Fatal(errs) } - gen := ctx.ModuleForTests("gen", "android_arm_armv7-a-neon").Output("out_arm") + gen := ctx.ModuleForTests(t, "gen", "android_arm_armv7-a-neon").Output("out_arm") expected := []string{"foo"} if !reflect.DeepEqual(expected, gen.Implicits.Strings()[:len(expected)]) { t.Errorf(`want arm inputs %v, got %v`, expected, gen.Implicits.Strings()) } - gen = ctx.ModuleForTests("gen", "android_arm64_armv8-a").Output("out_arm") + gen = ctx.ModuleForTests(t, "gen", "android_arm64_armv8-a").Output("out_arm") expected = []string{"bar"} if !reflect.DeepEqual(expected, gen.Implicits.Strings()[:len(expected)]) { t.Errorf(`want arm64 inputs %v, got %v`, expected, gen.Implicits.Strings()) @@ -105,7 +105,7 @@ func TestLibraryGenruleCmd(t *testing.T) { ` ctx := testCc(t, bp) - gen := ctx.ModuleForTests("gen", "android_arm_armv7-a-neon").Output("out") + gen := ctx.ModuleForTests(t, "gen", "android_arm_armv7-a-neon").Output("out") expected := []string{"libboth.so", "libshared.so", "libstatic.a"} var got []string for _, input := range gen.Implicits { @@ -178,7 +178,7 @@ func TestCmdPrefix(t *testing.T) { PrepareForIntegrationTestWithCc, android.OptionalFixturePreparer(tt.preparer), ).RunTestWithBp(t, bp) - gen := result.ModuleForTests("gen", tt.variant) + gen := result.ModuleForTests(t, "gen", tt.variant) sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, gen.Output("genrule.sbox.textproto")) cmd := *sboxProto.Commands[0].Command android.AssertStringDoesContain(t, "incorrect CC_ARCH", cmd, "CC_ARCH="+tt.arch+" ") @@ -236,7 +236,7 @@ func TestMultilibGenruleOut(t *testing.T) { } ` result := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp) - gen_32bit := result.ModuleForTests("gen", "android_arm_armv7-a-neon").OutputFiles(result.TestContext, t, "") + gen_32bit := result.ModuleForTests(t, "gen", "android_arm_armv7-a-neon").OutputFiles(result.TestContext, t, "") android.AssertPathsEndWith(t, "genrule_out", []string{ @@ -245,7 +245,7 @@ func TestMultilibGenruleOut(t *testing.T) { gen_32bit, ) - gen_64bit := result.ModuleForTests("gen", "android_arm64_armv8-a").OutputFiles(result.TestContext, t, "") + gen_64bit := result.ModuleForTests(t, "gen", "android_arm64_armv8-a").OutputFiles(result.TestContext, t, "") android.AssertPathsEndWith(t, "genrule_out", []string{ diff --git a/cc/installer.go b/cc/installer.go index 30f9612d3..d7d8c6d22 100644 --- a/cc/installer.go +++ b/cc/installer.go @@ -107,6 +107,10 @@ func (installer *baseInstaller) installTestData(ctx ModuleContext, data []androi installer.installDeps = append(installer.installDeps, installedData...) } +func (installer *baseInstaller) installStandaloneTestDep(ctx ModuleContext, standaloneTestDep android.PackagingSpec) { + installer.installTestData(ctx, []android.DataPath{{SrcPath: standaloneTestDep.ToGob().SrcPath, RelativeInstallPath: "standalone-libs"}}) +} + func (installer *baseInstaller) everInstallable() bool { // Most cc modules are installable. return true diff --git a/cc/library.go b/cc/library.go index 950ea9134..532b7e9aa 100644 --- a/cc/library.go +++ b/cc/library.go @@ -630,10 +630,17 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa } if library.sabi.shouldCreateSourceAbiDump() { dirs := library.exportedIncludeDirsForAbiCheck(ctx) - flags.SAbiFlags = make([]string, 0, len(dirs)) + flags.SAbiFlags = make([]string, 0, len(dirs)+1) for _, dir := range dirs { flags.SAbiFlags = append(flags.SAbiFlags, "-I"+dir) } + // If this library does not export any include directory, do not append the flags + // so that the ABI tool dumps everything without filtering by the include directories. + // requiresGlobalIncludes returns whether this library can include CommonGlobalIncludes. + // If the library cannot include them, it cannot export them. + if len(dirs) > 0 && requiresGlobalIncludes(ctx) { + flags.SAbiFlags = append(flags.SAbiFlags, "${config.CommonGlobalIncludes}") + } totalLength := len(srcs) + len(deps.GeneratedSources) + len(sharedSrcs) + len(staticSrcs) if totalLength > 0 { @@ -1230,7 +1237,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, linkerDeps = append(linkerDeps, deps.SharedLibsDeps...) linkerDeps = append(linkerDeps, deps.LateSharedLibsDeps...) - if generatedLib := generateRustStaticlib(ctx, deps.RustRlibDeps); generatedLib != nil && !library.BuildStubs() { + if generatedLib := GenerateRustStaticlib(ctx, deps.RustRlibDeps); generatedLib != nil && !library.BuildStubs() { if ctx.Module().(*Module).WholeRustStaticlib { deps.WholeStaticLibs = append(deps.WholeStaticLibs, generatedLib) } else { @@ -1362,13 +1369,15 @@ func (library *libraryDecorator) linkLlndkSAbiDumpFiles(ctx ModuleContext, deps PathDeps, sAbiDumpFiles android.Paths, soFile android.Path, libFileName string, excludeSymbolVersions, excludeSymbolTags []string, sdkVersionForVendorApiLevel string) android.Path { + // Though LLNDK is implemented in system, the callers in vendor cannot include CommonGlobalIncludes, + // so commonGlobalIncludes is false. return transformDumpToLinkedDump(ctx, sAbiDumpFiles, soFile, libFileName+".llndk", library.llndkIncludeDirsForAbiCheck(ctx, deps), android.OptionalPathForModuleSrc(ctx, library.Properties.Llndk.Symbol_file), append([]string{"*_PLATFORM", "*_PRIVATE"}, excludeSymbolVersions...), append([]string{"platform-only"}, excludeSymbolTags...), - []string{"llndk"}, sdkVersionForVendorApiLevel) + []string{"llndk"}, sdkVersionForVendorApiLevel, false /* commonGlobalIncludes */) } func (library *libraryDecorator) linkApexSAbiDumpFiles(ctx ModuleContext, @@ -1381,7 +1390,7 @@ func (library *libraryDecorator) linkApexSAbiDumpFiles(ctx ModuleContext, android.OptionalPathForModuleSrc(ctx, library.Properties.Stubs.Symbol_file), append([]string{"*_PLATFORM", "*_PRIVATE"}, excludeSymbolVersions...), append([]string{"platform-only"}, excludeSymbolTags...), - []string{"apex", "systemapi"}, sdkVersion) + []string{"apex", "systemapi"}, sdkVersion, requiresGlobalIncludes(ctx)) } func getRefAbiDumpFile(ctx android.ModuleInstallPathContext, @@ -1524,7 +1533,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, deps PathD android.OptionalPathForModuleSrc(ctx, library.symbolFileForAbiCheck(ctx)), headerAbiChecker.Exclude_symbol_versions, headerAbiChecker.Exclude_symbol_tags, - []string{} /* includeSymbolTags */, currSdkVersion) + []string{} /* includeSymbolTags */, currSdkVersion, requiresGlobalIncludes(ctx)) var llndkDump, apexVariantDump android.Path tags := classifySourceAbiDump(ctx.Module().(*Module)) @@ -2220,6 +2229,9 @@ func (linkageTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (linkageTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } @@ -2276,11 +2288,13 @@ func (linkageTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, varia library.setStatic() if !library.buildStatic() { library.disablePrebuilt() + ctx.Module().(*Module).Prebuilt().SetUsePrebuilt(false) } } else if variation == "shared" { library.setShared() if !library.buildShared() { library.disablePrebuilt() + ctx.Module().(*Module).Prebuilt().SetUsePrebuilt(false) } } } else if library, ok := ctx.Module().(LinkableInterface); ok && library.CcLibraryInterface() { @@ -2393,6 +2407,9 @@ func (versionTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (versionTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } diff --git a/cc/library_headers_test.go b/cc/library_headers_test.go index 5a4576703..88ccd4303 100644 --- a/cc/library_headers_test.go +++ b/cc/library_headers_test.go @@ -41,11 +41,11 @@ func TestLibraryHeaders(t *testing.T) { ctx := testCc(t, fmt.Sprintf(bp, headerModule)) // test if header search paths are correctly added - cc := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static").Rule("cc") + cc := ctx.ModuleForTests(t, "lib", "android_arm64_armv8-a_static").Rule("cc") android.AssertStringDoesContain(t, "cFlags for lib module", cc.Args["cFlags"], " -Imy_include ") // Test that there's a valid AndroidMk entry. - headers := ctx.ModuleForTests("headers", "android_arm64_armv8-a").Module() + headers := ctx.ModuleForTests(t, "headers", "android_arm64_armv8-a").Module() e := android.AndroidMkInfoForTest(t, ctx, headers).PrimaryInfo // This duplicates the tests done in AndroidMkEntries.write. It would be @@ -80,9 +80,9 @@ func TestPrebuiltLibraryHeadersPreferred(t *testing.T) { for _, prebuiltPreferred := range []bool{false, true} { t.Run(fmt.Sprintf("prebuilt prefer %t", prebuiltPreferred), func(t *testing.T) { ctx := testCc(t, fmt.Sprintf(bp, prebuiltPreferred)) - lib := ctx.ModuleForTests("lib", "android_arm64_armv8-a_static") - sourceDep := ctx.ModuleForTests("headers", "android_arm64_armv8-a") - prebuiltDep := ctx.ModuleForTests("prebuilt_headers", "android_arm64_armv8-a") + lib := ctx.ModuleForTests(t, "lib", "android_arm64_armv8-a_static") + sourceDep := ctx.ModuleForTests(t, "headers", "android_arm64_armv8-a") + prebuiltDep := ctx.ModuleForTests(t, "prebuilt_headers", "android_arm64_armv8-a") hasSourceDep := false hasPrebuiltDep := false ctx.VisitDirectDeps(lib.Module(), func(dep blueprint.Module) { diff --git a/cc/library_test.go b/cc/library_test.go index 2ed2d761c..8b7fed2dc 100644 --- a/cc/library_test.go +++ b/cc/library_test.go @@ -30,8 +30,8 @@ func TestLibraryReuse(t *testing.T) { srcs: ["foo.c", "baz.o"], }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") if len(libfooShared.Inputs) != 2 { t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) @@ -59,8 +59,8 @@ func TestLibraryReuse(t *testing.T) { }, }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") if len(libfooShared.Inputs) != 1 { t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) @@ -85,8 +85,8 @@ func TestLibraryReuse(t *testing.T) { }, }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") if len(libfooShared.Inputs) != 2 { t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) @@ -111,8 +111,8 @@ func TestLibraryReuse(t *testing.T) { }, }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") if len(libfooShared.Inputs) != 1 { t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) @@ -137,8 +137,8 @@ func TestLibraryReuse(t *testing.T) { }, }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") if len(libfooShared.Inputs) != 1 { t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) @@ -168,8 +168,8 @@ func TestLibraryReuse(t *testing.T) { }, }`) - libfooShared := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libfooStatic := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") + libfooShared := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_static").Output("libfoo.a") if len(libfooShared.Inputs) != 3 { t.Fatalf("unexpected inputs to libfoo shared: %#v", libfooShared.Inputs.Strings()) @@ -183,7 +183,7 @@ func TestLibraryReuse(t *testing.T) { t.Errorf("static objects not reused for shared library") } - libfoo := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Module().(*Module) if !inList("-DGOOGLE_PROTOBUF_NO_RTTI", libfoo.flags.Local.CFlags) { t.Errorf("missing protobuf cflags") } @@ -254,7 +254,7 @@ func TestLibraryVersionScript(t *testing.T) { version_script: "foo.map.txt", }`) - libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld") + libfoo := result.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Rule("ld") android.AssertStringListContains(t, "missing dependency on version_script", libfoo.Implicits.Strings(), "foo.map.txt") @@ -272,7 +272,7 @@ func TestLibraryDynamicList(t *testing.T) { dynamic_list: "foo.dynamic.txt", }`) - libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld") + libfoo := result.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Rule("ld") android.AssertStringListContains(t, "missing dependency on dynamic_list", libfoo.Implicits.Strings(), "foo.dynamic.txt") @@ -312,14 +312,14 @@ func TestWholeStaticLibPrebuilts(t *testing.T) { } `) - libdirect := result.ModuleForTests("libdirect", "android_arm64_armv8-a_static").Rule("arWithLibs") - libtransitive := result.ModuleForTests("libtransitive", "android_arm64_armv8-a_static").Rule("arWithLibs") + libdirect := result.ModuleForTests(t, "libdirect", "android_arm64_armv8-a_static").Rule("arWithLibs") + libtransitive := result.ModuleForTests(t, "libtransitive", "android_arm64_armv8-a_static").Rule("arWithLibs") - libdirectWithSrcs := result.ModuleForTests("libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs") - libtransitiveWithSrcs := result.ModuleForTests("libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs") + libdirectWithSrcs := result.ModuleForTests(t, "libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs") + libtransitiveWithSrcs := result.ModuleForTests(t, "libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("arWithLibs") - barObj := result.ModuleForTests("libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("cc") - bazObj := result.ModuleForTests("libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("cc") + barObj := result.ModuleForTests(t, "libdirect_with_srcs", "android_arm64_armv8-a_static").Rule("cc") + bazObj := result.ModuleForTests(t, "libtransitive_with_srcs", "android_arm64_armv8-a_static").Rule("cc") android.AssertStringListContains(t, "missing dependency on foo.a", libdirect.Inputs.Strings(), "foo.a") diff --git a/cc/lto_test.go b/cc/lto_test.go index e4b5a3a01..3fb1f3c06 100644 --- a/cc/lto_test.go +++ b/cc/lto_test.go @@ -70,24 +70,24 @@ func TestThinLtoDeps(t *testing.T) { result := LTOPreparer.RunTestWithBp(t, bp) - libLto := result.ModuleForTests("lto_enabled", "android_arm64_armv8-a_shared").Module() + libLto := result.ModuleForTests(t, "lto_enabled", "android_arm64_armv8-a_shared").Module() - libFoo := result.ModuleForTests("foo", "android_arm64_armv8-a_static").Module() + libFoo := result.ModuleForTests(t, "foo", "android_arm64_armv8-a_static").Module() if !hasDep(result, libLto, libFoo) { t.Errorf("'lto_enabled' missing dependency on the default variant of 'foo'") } - libBaz := result.ModuleForTests("baz", "android_arm64_armv8-a_static").Module() + libBaz := result.ModuleForTests(t, "baz", "android_arm64_armv8-a_static").Module() if !hasDep(result, libFoo, libBaz) { t.Errorf("'foo' missing dependency on the default variant of transitive dep 'baz'") } - libNeverLto := result.ModuleForTests("lib_never_lto", "android_arm64_armv8-a_static").Module() + libNeverLto := result.ModuleForTests(t, "lib_never_lto", "android_arm64_armv8-a_static").Module() if !hasDep(result, libLto, libNeverLto) { t.Errorf("'lto_enabled' missing dependency on the default variant of 'lib_never_lto'") } - libBar := result.ModuleForTests("bar", "android_arm64_armv8-a_shared").Module() + libBar := result.ModuleForTests(t, "bar", "android_arm64_armv8-a_shared").Module() if !hasDep(result, libLto, libBar) { t.Errorf("'lto_enabled' missing dependency on the default variant of 'bar'") } @@ -138,15 +138,15 @@ func TestThinLtoOnlyOnStaticDep(t *testing.T) { result := LTOPreparer.RunTestWithBp(t, bp) - libRoot := result.ModuleForTests("root", "android_arm64_armv8-a_shared").Module() - libRootLtoNever := result.ModuleForTests("root_no_lto", "android_arm64_armv8-a_shared").Module() + libRoot := result.ModuleForTests(t, "root", "android_arm64_armv8-a_shared").Module() + libRootLtoNever := result.ModuleForTests(t, "root_no_lto", "android_arm64_armv8-a_shared").Module() - libFoo := result.ModuleForTests("foo", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "foo", "android_arm64_armv8-a_static") if !hasDep(result, libRoot, libFoo.Module()) { t.Errorf("'root' missing dependency on the default variant of 'foo'") } - libFooNoLto := result.ModuleForTests("foo", "android_arm64_armv8-a_static_lto-none") + libFooNoLto := result.ModuleForTests(t, "foo", "android_arm64_armv8-a_static_lto-none") if !hasDep(result, libRootLtoNever, libFooNoLto.Module()) { t.Errorf("'root_no_lto' missing dependency on the lto_none variant of 'foo'") } @@ -156,7 +156,7 @@ func TestThinLtoOnlyOnStaticDep(t *testing.T) { t.Errorf("'foo' expected to have flags %q, but got %q", w, libFooCFlags) } - libBaz := result.ModuleForTests("baz", "android_arm64_armv8-a_static") + libBaz := result.ModuleForTests(t, "baz", "android_arm64_armv8-a_static") if !hasDep(result, libFoo.Module(), libBaz.Module()) { t.Errorf("'foo' missing dependency on the default variant of transitive dep 'baz'") } @@ -187,8 +187,8 @@ func TestLtoDisabledButEnabledForArch(t *testing.T) { }` result := LTOPreparer.RunTestWithBp(t, bp) - libFooWithLto := result.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libFooWithoutLto := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("ld") + libFooWithLto := result.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libFooWithoutLto := result.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Rule("ld") android.AssertStringDoesContain(t, "missing flag for LTO in variant that expects it", libFooWithLto.Args["ldFlags"], "-flto=thin") @@ -215,8 +215,8 @@ func TestLtoDoesNotPropagateToRuntimeLibs(t *testing.T) { result := LTOPreparer.RunTestWithBp(t, bp) - libFoo := result.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") - libBar := result.ModuleForTests("runtime_libbar", "android_arm_armv7-a-neon_shared").Rule("ld") + libFoo := result.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Rule("ld") + libBar := result.ModuleForTests(t, "runtime_libbar", "android_arm_armv7-a-neon_shared").Rule("ld") android.AssertStringDoesContain(t, "missing flag for LTO in LTO enabled library", libFoo.Args["ldFlags"], "-flto=thin") diff --git a/cc/makevars.go b/cc/makevars.go index ca97b76f3..c94510280 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -175,16 +175,18 @@ func makeVarsProvider(ctx android.MakeVarsContext) { sort.Strings(ndkKnownLibs) ctx.Strict("NDK_KNOWN_LIBS", strings.Join(ndkKnownLibs, " ")) - hostTargets := ctx.Config().Targets[ctx.Config().BuildOS] - makeVarsToolchain(ctx, "", hostTargets[0]) - if len(hostTargets) > 1 { - makeVarsToolchain(ctx, "2ND_", hostTargets[1]) + if hostTargets := ctx.Config().Targets[ctx.Config().BuildOS]; len(hostTargets) > 0 { + makeVarsToolchain(ctx, "", hostTargets[0]) + if len(hostTargets) > 1 { + makeVarsToolchain(ctx, "2ND_", hostTargets[1]) + } } - deviceTargets := ctx.Config().Targets[android.Android] - makeVarsToolchain(ctx, "", deviceTargets[0]) - if len(deviceTargets) > 1 { - makeVarsToolchain(ctx, "2ND_", deviceTargets[1]) + if deviceTargets := ctx.Config().Targets[android.Android]; len(deviceTargets) > 0 { + makeVarsToolchain(ctx, "", deviceTargets[0]) + if len(deviceTargets) > 1 { + makeVarsToolchain(ctx, "2ND_", deviceTargets[1]) + } } } diff --git a/cc/ndk_test.go b/cc/ndk_test.go index f20d3c61f..8574bf148 100644 --- a/cc/ndk_test.go +++ b/cc/ndk_test.go @@ -50,7 +50,7 @@ func TestNdkHeaderDependency(t *testing.T) { } ` ctx := prepareForCcTest.RunTestWithBp(t, bp) - libfoo := ctx.ModuleForTests("libfoo.ndk", "android_arm64_armv8-a_sdk_shared") - libfoo_headers := ctx.ModuleForTests("libfoo_headers", "") + libfoo := ctx.ModuleForTests(t, "libfoo.ndk", "android_arm64_armv8-a_sdk_shared") + libfoo_headers := ctx.ModuleForTests(t, "libfoo_headers", "") android.AssertBoolEquals(t, "Could not find headers of ndk_library", true, isDep(ctx, libfoo.Module(), libfoo_headers.Module())) } diff --git a/cc/object_test.go b/cc/object_test.go index 004dfd3e7..6d8226560 100644 --- a/cc/object_test.go +++ b/cc/object_test.go @@ -46,13 +46,13 @@ func TestMinSdkVersionsOfCrtObjects(t *testing.T) { ctx := prepareForCcTest.RunTestWithBp(t, bp) for _, v := range variants { - cflags := ctx.ModuleForTests("crt_foo", v.variant).Rule("cc").Args["cFlags"] + cflags := ctx.ModuleForTests(t, "crt_foo", v.variant).Rule("cc").Args["cFlags"] expected := "-target aarch64-linux-android" + v.num + " " android.AssertStringDoesContain(t, "cflag", cflags, expected) } ctx = prepareForCcTest.RunTestWithBp(t, bp) android.AssertStringDoesContain(t, "cflag", - ctx.ModuleForTests("crt_foo", "android_vendor_arm64_armv8-a").Rule("cc").Args["cFlags"], + ctx.ModuleForTests(t, "crt_foo", "android_vendor_arm64_armv8-a").Rule("cc").Args["cFlags"], "-target aarch64-linux-android10000 ") } @@ -69,13 +69,13 @@ func TestUseCrtObjectOfCorrectVersion(t *testing.T) { // Sdk variant uses the crt object of the matching min_sdk_version variant := "android_arm64_armv8-a_sdk" - crt := ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"] + crt := ctx.ModuleForTests(t, "bin", variant).Rule("ld").Args["crtBegin"] android.AssertStringDoesContain(t, "crt dep of sdk variant", crt, "29/crtbegin_dynamic.o") // platform variant uses the crt object built for platform variant = "android_arm64_armv8-a" - crt = ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"] + crt = ctx.ModuleForTests(t, "bin", variant).Rule("ld").Args["crtBegin"] android.AssertStringDoesContain(t, "crt dep of platform variant", crt, variant+"/crtbegin_dynamic.o") } @@ -147,7 +147,7 @@ func TestCcObjectOutputFile(t *testing.T) { ctx := PrepareForIntegrationTestWithCc.RunTestWithBp(t, bp) android.AssertPathRelativeToTopEquals(t, "expected output file foo.o", fmt.Sprintf("out/soong/.intermediates/%s/android_arm64_armv8-a/foo.o", testcase.moduleName), - ctx.ModuleForTests(testcase.moduleName, "android_arm64_armv8-a").Output("foo.o").Output) + ctx.ModuleForTests(t, testcase.moduleName, "android_arm64_armv8-a").Output("foo.o").Output) }) } diff --git a/cc/orderfile_test.go b/cc/orderfile_test.go index 3486f964c..41253adc6 100644 --- a/cc/orderfile_test.go +++ b/cc/orderfile_test.go @@ -41,7 +41,7 @@ func TestOrderfileProfileSharedLibrary(t *testing.T) { expectedCFlag := "-forder-file-instrumentation" - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") // Check cFlags of orderfile-enabled module cFlags := libTest.Rule("cc").Args["cFlags"] @@ -77,7 +77,7 @@ func TestOrderfileLoadSharedLibrary(t *testing.T) { expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/libTest.orderfile" - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") // Check ldFlags of orderfile-enabled module ldFlags := libTest.Rule("ld").Args["ldFlags"] @@ -106,7 +106,7 @@ func TestOrderfileProfileBinary(t *testing.T) { expectedCFlag := "-forder-file-instrumentation" - test := result.ModuleForTests("test", "android_arm64_armv8-a") + test := result.ModuleForTests(t, "test", "android_arm64_armv8-a") // Check cFlags of orderfile-enabled module cFlags := test.Rule("cc").Args["cFlags"] @@ -142,7 +142,7 @@ func TestOrderfileLoadBinary(t *testing.T) { expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/test.orderfile" - test := result.ModuleForTests("test", "android_arm64_armv8-a") + test := result.ModuleForTests(t, "test", "android_arm64_armv8-a") // Check ldFlags of orderfile-enabled module ldFlags := test.Rule("ld").Args["ldFlags"] @@ -185,7 +185,7 @@ func TestOrderfileProfilePropagateStaticDeps(t *testing.T) { expectedCFlag := "-forder-file-instrumentation" // Check cFlags of orderfile-enabled module - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") cFlags := libTest.Rule("cc").Args["cFlags"] if !strings.Contains(cFlags, expectedCFlag) { @@ -193,8 +193,8 @@ func TestOrderfileProfilePropagateStaticDeps(t *testing.T) { } // Check cFlags of orderfile variant static libraries - libFooOfVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_orderfile") - libBarOfVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_orderfile") + libFooOfVariant := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static_orderfile") + libBarOfVariant := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static_orderfile") cFlags = libFooOfVariant.Rule("cc").Args["cFlags"] if !strings.Contains(cFlags, expectedCFlag) { @@ -216,8 +216,8 @@ func TestOrderfileProfilePropagateStaticDeps(t *testing.T) { } // Check cFlags of the non-orderfile variant static libraries - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static") cFlags = libFoo.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, expectedCFlag) { @@ -274,15 +274,15 @@ func TestOrderfileLoadPropagateStaticDeps(t *testing.T) { expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/test.orderfile" // Check ldFlags of orderfile-enabled module - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") ldFlags := libTest.Rule("ld").Args["ldFlags"] if !strings.Contains(ldFlags, expectedCFlag) { t.Errorf("Expected 'libTest' to load orderfile, but did not find %q in ldFlags %q", expectedCFlag, ldFlags) } - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static") // Check dependency edge from orderfile-enabled module to non-orderfile variant static libraries if !hasDirectDep(result, libTest.Module(), libFoo.Module()) { @@ -343,7 +343,7 @@ func TestOrderfileProfilePropagateSharedDeps(t *testing.T) { expectedCFlag := "-forder-file-instrumentation" // Check cFlags of orderfile-enabled module - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_shared") cFlags := libTest.Rule("cc").Args["cFlags"] if !strings.Contains(cFlags, expectedCFlag) { @@ -351,8 +351,8 @@ func TestOrderfileProfilePropagateSharedDeps(t *testing.T) { } // Check cFlags of the static and shared libraries - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_shared") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_shared") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static") cFlags = libFoo.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, expectedCFlag) { @@ -423,7 +423,7 @@ func TestOrderfileProfileStaticLibrary(t *testing.T) { expectedCFlag := "-forder-file-instrumentation" // Check cFlags of module - libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_static") + libTest := result.ModuleForTests(t, "libTest", "android_arm64_armv8-a_static") cFlags := libTest.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, expectedCFlag) { @@ -431,8 +431,8 @@ func TestOrderfileProfileStaticLibrary(t *testing.T) { } // Check cFlags of the static libraries - libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static") - libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static") + libFoo := result.ModuleForTests(t, "libFoo", "android_arm64_armv8-a_static") + libBar := result.ModuleForTests(t, "libBar", "android_arm64_armv8-a_static") cFlags = libFoo.Rule("cc").Args["cFlags"] if strings.Contains(cFlags, expectedCFlag) { diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go index 3214fb4a7..af68ca6bf 100644 --- a/cc/prebuilt_test.go +++ b/cc/prebuilt_test.go @@ -116,21 +116,21 @@ func TestPrebuilt(t *testing.T) { }) // Verify that all the modules exist and that their dependencies were connected correctly - liba := ctx.ModuleForTests("liba", "android_arm64_armv8-a_shared").Module() - libb := ctx.ModuleForTests("libb", "android_arm64_armv8-a_static").Module() - libd := ctx.ModuleForTests("libd", "android_arm64_armv8-a_shared").Module() - libe := ctx.ModuleForTests("libe", "android_arm64_armv8-a_static").Module() - libfStatic := ctx.ModuleForTests("libf", "android_arm64_armv8-a_static").Module() - libfShared := ctx.ModuleForTests("libf", "android_arm64_armv8-a_shared").Module() - crtx := ctx.ModuleForTests("crtx", "android_arm64_armv8-a").Module() - - prebuiltLiba := ctx.ModuleForTests("prebuilt_liba", "android_arm64_armv8-a_shared").Module() - prebuiltLibb := ctx.ModuleForTests("prebuilt_libb", "android_arm64_armv8-a_static").Module() - prebuiltLibd := ctx.ModuleForTests("prebuilt_libd", "android_arm64_armv8-a_shared").Module() - prebuiltLibe := ctx.ModuleForTests("prebuilt_libe", "android_arm64_armv8-a_static").Module() - prebuiltLibfStatic := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_static").Module() - prebuiltLibfShared := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_shared").Module() - prebuiltCrtx := ctx.ModuleForTests("prebuilt_crtx", "android_arm64_armv8-a").Module() + liba := ctx.ModuleForTests(t, "liba", "android_arm64_armv8-a_shared").Module() + libb := ctx.ModuleForTests(t, "libb", "android_arm64_armv8-a_static").Module() + libd := ctx.ModuleForTests(t, "libd", "android_arm64_armv8-a_shared").Module() + libe := ctx.ModuleForTests(t, "libe", "android_arm64_armv8-a_static").Module() + libfStatic := ctx.ModuleForTests(t, "libf", "android_arm64_armv8-a_static").Module() + libfShared := ctx.ModuleForTests(t, "libf", "android_arm64_armv8-a_shared").Module() + crtx := ctx.ModuleForTests(t, "crtx", "android_arm64_armv8-a").Module() + + prebuiltLiba := ctx.ModuleForTests(t, "prebuilt_liba", "android_arm64_armv8-a_shared").Module() + prebuiltLibb := ctx.ModuleForTests(t, "prebuilt_libb", "android_arm64_armv8-a_static").Module() + prebuiltLibd := ctx.ModuleForTests(t, "prebuilt_libd", "android_arm64_armv8-a_shared").Module() + prebuiltLibe := ctx.ModuleForTests(t, "prebuilt_libe", "android_arm64_armv8-a_static").Module() + prebuiltLibfStatic := ctx.ModuleForTests(t, "prebuilt_libf", "android_arm64_armv8-a_static").Module() + prebuiltLibfShared := ctx.ModuleForTests(t, "prebuilt_libf", "android_arm64_armv8-a_shared").Module() + prebuiltCrtx := ctx.ModuleForTests(t, "prebuilt_crtx", "android_arm64_armv8-a").Module() hasDep := func(m android.Module, wantDep android.Module) bool { t.Helper() @@ -190,7 +190,7 @@ func TestPrebuiltLibraryShared(t *testing.T) { "libf.so": nil, }) - shared := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared").Module().(*Module) + shared := ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_shared").Module().(*Module) assertString(t, shared.OutputFile().Path().Base(), "libtest.so") } @@ -204,7 +204,7 @@ func TestPrebuiltLibraryStatic(t *testing.T) { "libf.a": nil, }) - static := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static").Module().(*Module) + static := ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_static").Module().(*Module) assertString(t, static.OutputFile().Path().Base(), "libf.a") } @@ -227,10 +227,10 @@ func TestPrebuiltLibrary(t *testing.T) { "libf.so": nil, }) - shared := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared").Module().(*Module) + shared := ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_shared").Module().(*Module) assertString(t, shared.OutputFile().Path().Base(), "libtest.so") - static := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static").Module().(*Module) + static := ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_static").Module().(*Module) assertString(t, static.OutputFile().Path().Base(), "libf.a") } @@ -254,10 +254,10 @@ func TestPrebuiltLibraryStem(t *testing.T) { "libfoo.so": nil, }) - static := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*Module) + static := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_static").Module().(*Module) assertString(t, static.OutputFile().Path().Base(), "libfoo.a") - shared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*Module) + shared := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module().(*Module) assertString(t, shared.OutputFile().Path().Base(), "libbar.so") } @@ -275,7 +275,7 @@ func TestPrebuiltLibrarySharedStem(t *testing.T) { "libfoo.so": nil, }) - shared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*Module) + shared := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module().(*Module) assertString(t, shared.OutputFile().Path().Base(), "libbar.so") } @@ -312,7 +312,7 @@ func TestPrebuiltSymlinkedHostBinary(t *testing.T) { "foo": nil, }) - fooRule := ctx.ModuleForTests("foo", "linux_glibc_x86_64").Rule("Symlink") + fooRule := ctx.ModuleForTests(t, "foo", "linux_glibc_x86_64").Rule("Symlink") assertString(t, fooRule.Output.String(), "out/soong/.intermediates/foo/linux_glibc_x86_64/foo") assertString(t, fooRule.Args["fromPath"], "$$PWD/linux_glibc_x86_64/bin/foo") @@ -355,16 +355,16 @@ func TestPrebuiltLibrarySanitized(t *testing.T) { // Without SANITIZE_TARGET. ctx := testPrebuilt(t, bp, fs) - shared_rule := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared").Rule("android/soong/cc.strip") + shared_rule := ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_shared").Rule("android/soong/cc.strip") assertString(t, shared_rule.Input.String(), "libf.so") - static := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static").Module().(*Module) + static := ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_static").Module().(*Module) assertString(t, static.OutputFile().Path().Base(), "libf.a") - shared_rule2 := ctx.ModuleForTests("libtest_shared", "android_arm64_armv8-a_shared").Rule("android/soong/cc.strip") + shared_rule2 := ctx.ModuleForTests(t, "libtest_shared", "android_arm64_armv8-a_shared").Rule("android/soong/cc.strip") assertString(t, shared_rule2.Input.String(), "libf.so") - static2 := ctx.ModuleForTests("libtest_static", "android_arm64_armv8-a_static").Module().(*Module) + static2 := ctx.ModuleForTests(t, "libtest_static", "android_arm64_armv8-a_static").Module().(*Module) assertString(t, static2.OutputFile().Path().Base(), "libf.a") // With SANITIZE_TARGET=hwaddress @@ -374,16 +374,16 @@ func TestPrebuiltLibrarySanitized(t *testing.T) { }), ) - shared_rule = ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip") + shared_rule = ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip") assertString(t, shared_rule.Input.String(), "hwasan/libf.so") - static = ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static_hwasan").Module().(*Module) + static = ctx.ModuleForTests(t, "libtest", "android_arm64_armv8-a_static_hwasan").Module().(*Module) assertString(t, static.OutputFile().Path().Base(), "libf.hwasan.a") - shared_rule2 = ctx.ModuleForTests("libtest_shared", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip") + shared_rule2 = ctx.ModuleForTests(t, "libtest_shared", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip") assertString(t, shared_rule2.Input.String(), "hwasan/libf.so") - static2 = ctx.ModuleForTests("libtest_static", "android_arm64_armv8-a_static_hwasan").Module().(*Module) + static2 = ctx.ModuleForTests(t, "libtest_static", "android_arm64_armv8-a_static_hwasan").Module().(*Module) assertString(t, static2.OutputFile().Path().Base(), "libf.hwasan.a") } @@ -394,7 +394,7 @@ cc_prebuilt_binary { srcs: [], }` ctx := testPrebuilt(t, bp, map[string][]byte{}) - mod := ctx.ModuleForTests("bintest", "android_arm64_armv8-a").Module().(*Module) + mod := ctx.ModuleForTests(t, "bintest", "android_arm64_armv8-a").Module().(*Module) android.AssertBoolEquals(t, `expected no srcs to yield no output file`, false, mod.OutputFile().Valid()) } @@ -484,8 +484,8 @@ func TestMultiplePrebuilts(t *testing.T) { "libbar.so": nil, "crtx.o": nil, }, preparer) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() - expectedDependency := ctx.ModuleForTests(tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module() + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() + expectedDependency := ctx.ModuleForTests(t, tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module() android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from %s to %s\n", libfoo.Name(), tc.expectedDependencyName), true, hasDep(ctx, libfoo, expectedDependency)) // check that LOCAL_SHARED_LIBRARIES contains libbar and not libbar.v<N> entries := android.AndroidMkInfoForTest(t, ctx, libfoo).PrimaryInfo @@ -493,7 +493,7 @@ func TestMultiplePrebuilts(t *testing.T) { // check installation rules // the selected soong module should be exported to make - libbar := ctx.ModuleForTests(tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module() + libbar := ctx.ModuleForTests(t, tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module() android.AssertBoolEquals(t, fmt.Sprintf("dependency %s should be exported to make\n", expectedDependency), true, !libbar.IsHideFromMake()) // check LOCAL_MODULE of the selected module name @@ -585,8 +585,8 @@ func TestMultiplePrebuiltsPreferredUsingLegacyFlags(t *testing.T) { if tc.expectedErr != "" { return // the fixture will assert that the excepted err has been raised } - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() - expectedDependency := ctx.ModuleForTests(tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module() + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() + expectedDependency := ctx.ModuleForTests(t, tc.expectedDependencyName, "android_arm64_armv8-a_shared").Module() android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from %s to %s\n", libfoo.Name(), tc.expectedDependencyName), true, hasDep(ctx, libfoo, expectedDependency)) } } @@ -638,8 +638,8 @@ func TestMissingVariantInModuleSdk(t *testing.T) { "libbar.so": nil, "crtx.o": nil, }, preparer) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module() - sourceLibBar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_static").Module() + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Module() + sourceLibBar := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_static").Module() // Even though the prebuilt is listed in apex_contributions, the prebuilt does not have a static variant. // Therefore source of libbar should be used. android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from libfoo to source libbar"), true, hasDep(ctx, libfoo, sourceLibBar)) diff --git a/cc/proto_test.go b/cc/proto_test.go index a905ea889..47b7e1770 100644 --- a/cc/proto_test.go +++ b/cc/proto_test.go @@ -29,7 +29,7 @@ func TestProto(t *testing.T) { srcs: ["a.proto"], }`) - proto := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Output("proto/a.pb.cc") + proto := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Output("proto/a.pb.cc") if cmd := proto.RuleParams.Command; !strings.Contains(cmd, "--cpp_out=") { t.Errorf("expected '--cpp_out' in %q", cmd) @@ -53,8 +53,8 @@ func TestProto(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - proto := ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_shared").Output("proto/a.pb.cc") - foobar := ctx.ModuleForTests("protoc-gen-foobar", buildOS+"_x86_64") + proto := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_shared").Output("proto/a.pb.cc") + foobar := ctx.ModuleForTests(t, "protoc-gen-foobar", buildOS+"_x86_64") cmd := proto.RuleParams.Command if w := "--foobar_out="; !strings.Contains(cmd, w) { @@ -85,8 +85,8 @@ func TestProto(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - proto := ctx.ModuleForTests("libgrpc", "android_arm_armv7-a-neon_shared").Output("proto/a.grpc.pb.cc") - grpcCppPlugin := ctx.ModuleForTests("protoc-gen-grpc-cpp-plugin", buildOS+"_x86_64") + proto := ctx.ModuleForTests(t, "libgrpc", "android_arm_armv7-a-neon_shared").Output("proto/a.grpc.pb.cc") + grpcCppPlugin := ctx.ModuleForTests(t, "protoc-gen-grpc-cpp-plugin", buildOS+"_x86_64") cmd := proto.RuleParams.Command if w := "--grpc-cpp-plugin_out="; !strings.Contains(cmd, w) { diff --git a/cc/sabi_test.go b/cc/sabi_test.go index 6b8cc1759..3d2a98ca7 100644 --- a/cc/sabi_test.go +++ b/cc/sabi_test.go @@ -48,16 +48,16 @@ func TestSabi(t *testing.T) { PrepareForTestWithCcDefaultModules, ).RunTestWithBp(t, bp) - libsabiStatic := result.ModuleForTests("libsabi", "android_arm64_armv8-a_static_sabi") + libsabiStatic := result.ModuleForTests(t, "libsabi", "android_arm64_armv8-a_static_sabi") sabiObjSDump := libsabiStatic.Output("obj/sabi.sdump") - libDirect := result.ModuleForTests("libdirect", "android_arm64_armv8-a_static_sabi") + libDirect := result.ModuleForTests(t, "libdirect", "android_arm64_armv8-a_static_sabi") directObjSDump := libDirect.Output("obj/direct.sdump") - libTransitive := result.ModuleForTests("libtransitive", "android_arm64_armv8-a_static_sabi") + libTransitive := result.ModuleForTests(t, "libtransitive", "android_arm64_armv8-a_static_sabi") transitiveObjSDump := libTransitive.Output("obj/transitive.sdump") - libsabiShared := result.ModuleForTests("libsabi", "android_arm64_armv8-a_shared") + libsabiShared := result.ModuleForTests(t, "libsabi", "android_arm64_armv8-a_shared") sabiLink := libsabiShared.Rule("sAbiLink") android.AssertStringListContains(t, "sabi link inputs", sabiLink.Inputs.Strings(), sabiObjSDump.Output.String()) diff --git a/cc/sanitize.go b/cc/sanitize.go index d8d8c7aef..e7598e709 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -79,7 +79,7 @@ var ( minimalRuntimeFlags = []string{"-fsanitize-minimal-runtime", "-fno-sanitize-trap=integer,undefined", "-fno-sanitize-recover=integer,undefined"} - memtagStackCommonFlags = []string{"-march=armv8-a+memtag"} + memtagStackCommonFlags = []string{"-Xclang -target-feature -Xclang +mte"} memtagStackLlvmFlags = []string{"-dom-tree-reachability-max-bbs-to-explore=128"} hostOnlySanitizeFlags = []string{"-fno-sanitize-recover=all"} diff --git a/cc/sanitize_test.go b/cc/sanitize_test.go index a1cfb5c36..543e80836 100644 --- a/cc/sanitize_test.go +++ b/cc/sanitize_test.go @@ -222,31 +222,31 @@ func TestAsan(t *testing.T) { staticAsanVariant := staticVariant + "_asan" // The binaries, one with asan and one without - binWithAsan := result.ModuleForTests("bin_with_asan", asanVariant) - binNoAsan := result.ModuleForTests("bin_no_asan", variant) + binWithAsan := result.ModuleForTests(t, "bin_with_asan", asanVariant) + binNoAsan := result.ModuleForTests(t, "bin_no_asan", variant) // Shared libraries that don't request asan - libShared := result.ModuleForTests("libshared", sharedVariant) - libTransitive := result.ModuleForTests("libtransitive", sharedVariant) + libShared := result.ModuleForTests(t, "libshared", sharedVariant) + libTransitive := result.ModuleForTests(t, "libtransitive", sharedVariant) // Shared library that requests asan - libAsan := result.ModuleForTests("libasan", sharedAsanVariant) + libAsan := result.ModuleForTests(t, "libasan", sharedAsanVariant) // Static library that uses an asan variant for bin_with_asan and a non-asan variant // for bin_no_asan. - libStaticAsanVariant := result.ModuleForTests("libstatic", staticAsanVariant) - libStaticNoAsanVariant := result.ModuleForTests("libstatic", staticVariant) + libStaticAsanVariant := result.ModuleForTests(t, "libstatic", staticAsanVariant) + libStaticNoAsanVariant := result.ModuleForTests(t, "libstatic", staticVariant) // Static library that never uses asan. - libNoAsan := result.ModuleForTests("libnoasan", staticVariant) + libNoAsan := result.ModuleForTests(t, "libnoasan", staticVariant) // Static library that specifies asan - libStaticAsan := result.ModuleForTests("libstatic_asan", staticAsanVariant) - libStaticAsanNoAsanVariant := result.ModuleForTests("libstatic_asan", staticVariant) + libStaticAsan := result.ModuleForTests(t, "libstatic_asan", staticAsanVariant) + libStaticAsanNoAsanVariant := result.ModuleForTests(t, "libstatic_asan", staticVariant) - libAsanSharedRuntime := result.ModuleForTests("libclang_rt.asan", sharedVariant) - libAsanStaticRuntime := result.ModuleForTests("libclang_rt.asan.static", staticVariant) - libAsanStaticCxxRuntime := result.ModuleForTests("libclang_rt.asan_cxx.static", staticVariant) + libAsanSharedRuntime := result.ModuleForTests(t, "libclang_rt.asan", sharedVariant) + libAsanStaticRuntime := result.ModuleForTests(t, "libclang_rt.asan.static", staticVariant) + libAsanStaticCxxRuntime := result.ModuleForTests(t, "libclang_rt.asan_cxx.static", staticVariant) expectSharedLinkDep(t, ctx, binWithAsan, libShared) expectSharedLinkDep(t, ctx, binWithAsan, libAsan) @@ -386,15 +386,15 @@ func TestTsan(t *testing.T) { sharedTsanVariant := sharedVariant + "_tsan" // The binaries, one with tsan and one without - binWithTsan := result.ModuleForTests("bin_with_tsan", tsanVariant) - binNoTsan := result.ModuleForTests("bin_no_tsan", variant) + binWithTsan := result.ModuleForTests(t, "bin_with_tsan", tsanVariant) + binNoTsan := result.ModuleForTests(t, "bin_no_tsan", variant) // Shared libraries that don't request tsan - libShared := result.ModuleForTests("libshared", sharedVariant) - libTransitive := result.ModuleForTests("libtransitive", sharedVariant) + libShared := result.ModuleForTests(t, "libshared", sharedVariant) + libTransitive := result.ModuleForTests(t, "libtransitive", sharedVariant) // Shared library that requests tsan - libTsan := result.ModuleForTests("libtsan", sharedTsanVariant) + libTsan := result.ModuleForTests(t, "libtsan", sharedTsanVariant) expectSharedLinkDep(t, ctx, binWithTsan, libShared) expectSharedLinkDep(t, ctx, binWithTsan, libTsan) @@ -479,16 +479,16 @@ func TestMiscUndefined(t *testing.T) { staticVariant := variant + "_static" // The binaries, one with ubsan and one without - binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant) - binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant) + binWithUbsan := result.ModuleForTests(t, "bin_with_ubsan", variant) + binNoUbsan := result.ModuleForTests(t, "bin_no_ubsan", variant) // Static libraries that don't request ubsan - libStatic := result.ModuleForTests("libstatic", staticVariant) - libTransitive := result.ModuleForTests("libtransitive", staticVariant) + libStatic := result.ModuleForTests(t, "libstatic", staticVariant) + libTransitive := result.ModuleForTests(t, "libtransitive", staticVariant) - libUbsan := result.ModuleForTests("libubsan", staticVariant) + libUbsan := result.ModuleForTests(t, "libubsan", staticVariant) - libUbsanMinimal := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant) + libUbsanMinimal := result.ModuleForTests(t, "libclang_rt.ubsan_minimal", staticVariant) expectStaticLinkDep(t, ctx, binWithUbsan, libStatic) expectStaticLinkDep(t, ctx, binWithUbsan, libUbsan) @@ -610,31 +610,31 @@ func TestFuzz(t *testing.T) { staticFuzzerVariant := staticVariant + "_fuzzer" // The binaries, one with fuzzer and one without - binWithFuzzer := result.ModuleForTests("bin_with_fuzzer", fuzzerVariant) - binNoFuzzer := result.ModuleForTests("bin_no_fuzzer", variant) + binWithFuzzer := result.ModuleForTests(t, "bin_with_fuzzer", fuzzerVariant) + binNoFuzzer := result.ModuleForTests(t, "bin_no_fuzzer", variant) // Shared libraries that don't request fuzzer - libShared := result.ModuleForTests("libshared", sharedVariant) - libTransitive := result.ModuleForTests("libtransitive", sharedVariant) + libShared := result.ModuleForTests(t, "libshared", sharedVariant) + libTransitive := result.ModuleForTests(t, "libtransitive", sharedVariant) // Shared libraries that don't request fuzzer - libSharedFuzzer := result.ModuleForTests("libshared", sharedFuzzerVariant) - libTransitiveFuzzer := result.ModuleForTests("libtransitive", sharedFuzzerVariant) + libSharedFuzzer := result.ModuleForTests(t, "libshared", sharedFuzzerVariant) + libTransitiveFuzzer := result.ModuleForTests(t, "libtransitive", sharedFuzzerVariant) // Shared library that requests fuzzer - libFuzzer := result.ModuleForTests("libfuzzer", sharedFuzzerVariant) + libFuzzer := result.ModuleForTests(t, "libfuzzer", sharedFuzzerVariant) // Static library that uses an fuzzer variant for bin_with_fuzzer and a non-fuzzer variant // for bin_no_fuzzer. - libStaticFuzzerVariant := result.ModuleForTests("libstatic", staticFuzzerVariant) - libStaticNoFuzzerVariant := result.ModuleForTests("libstatic", staticVariant) + libStaticFuzzerVariant := result.ModuleForTests(t, "libstatic", staticFuzzerVariant) + libStaticNoFuzzerVariant := result.ModuleForTests(t, "libstatic", staticVariant) // Static library that never uses fuzzer. - libNoFuzzer := result.ModuleForTests("libnofuzzer", staticVariant) + libNoFuzzer := result.ModuleForTests(t, "libnofuzzer", staticVariant) // Static library that specifies fuzzer - libStaticFuzzer := result.ModuleForTests("libstatic_fuzzer", staticFuzzerVariant) - libStaticFuzzerNoFuzzerVariant := result.ModuleForTests("libstatic_fuzzer", staticVariant) + libStaticFuzzer := result.ModuleForTests(t, "libstatic_fuzzer", staticFuzzerVariant) + libStaticFuzzerNoFuzzerVariant := result.ModuleForTests(t, "libstatic_fuzzer", staticVariant) expectSharedLinkDep(t, ctx, binWithFuzzer, libSharedFuzzer) expectSharedLinkDep(t, ctx, binWithFuzzer, libFuzzer) @@ -781,16 +781,16 @@ func TestUbsan(t *testing.T) { staticVariant := variant + "_static" sharedVariant := variant + "_shared" - minimalRuntime := result.ModuleForTests("libclang_rt.ubsan_minimal", staticVariant) - standaloneRuntime := result.ModuleForTests("libclang_rt.ubsan_standalone.static", staticVariant) + minimalRuntime := result.ModuleForTests(t, "libclang_rt.ubsan_minimal", staticVariant) + standaloneRuntime := result.ModuleForTests(t, "libclang_rt.ubsan_standalone.static", staticVariant) // The binaries, one with ubsan and one without - binWithUbsan := result.ModuleForTests("bin_with_ubsan", variant) - binDependsUbsan := result.ModuleForTests("bin_depends_ubsan_static", variant) - libSharedUbsan := result.ModuleForTests("libsharedubsan", sharedVariant) - binDependsUbsanShared := result.ModuleForTests("bin_depends_ubsan_shared", variant) - binNoUbsan := result.ModuleForTests("bin_no_ubsan", variant) - staticBin := result.ModuleForTests("static_bin_with_ubsan_dep", variant) + binWithUbsan := result.ModuleForTests(t, "bin_with_ubsan", variant) + binDependsUbsan := result.ModuleForTests(t, "bin_depends_ubsan_static", variant) + libSharedUbsan := result.ModuleForTests(t, "libsharedubsan", sharedVariant) + binDependsUbsanShared := result.ModuleForTests(t, "bin_depends_ubsan_shared", variant) + binNoUbsan := result.ModuleForTests(t, "bin_no_ubsan", variant) + staticBin := result.ModuleForTests(t, "static_bin_with_ubsan_dep", variant) android.AssertStringListContains(t, "missing libclang_rt.ubsan_minimal in bin_with_ubsan static libs", strings.Split(binWithUbsan.Rule("ld").Args["libFlags"], " "), @@ -979,67 +979,67 @@ func TestSanitizeMemtagHeap(t *testing.T) { ).RunTest(t) ctx := result.TestContext - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_sync", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_async", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_sync", variant), Sync) } func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) { @@ -1055,66 +1055,66 @@ func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) { ).RunTest(t) ctx := result.TestContext - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_async", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_sync", variant), Sync) } func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) { @@ -1131,66 +1131,66 @@ func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) { ).RunTest(t) ctx := result.TestContext - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_async", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_sync", variant), Sync) } func TestCfi(t *testing.T) { @@ -1250,14 +1250,14 @@ func TestCfi(t *testing.T) { cfi_suffix := "_cfi" static_suffix := "_static" - sharedWithCfiLib := result.ModuleForTests("shared_with_cfi", buildOs+shared_suffix+cfi_suffix) - sharedNoCfiLib := result.ModuleForTests("shared_no_cfi", buildOs+shared_suffix) - staticWithCfiLib := result.ModuleForTests("static_dep_with_cfi", buildOs+static_suffix) - staticWithCfiLibCfiVariant := result.ModuleForTests("static_dep_with_cfi", buildOs+static_suffix+cfi_suffix) - staticNoCfiLib := result.ModuleForTests("static_dep_no_cfi", buildOs+static_suffix) - staticNoCfiLibCfiVariant := result.ModuleForTests("static_dep_no_cfi", buildOs+static_suffix+cfi_suffix) - sharedRdepNoCfi := result.ModuleForTests("shared_rdep_no_cfi", buildOs+shared_suffix) - staticDepWithCfi2Lib := result.ModuleForTests("static_dep_with_cfi_2", buildOs+static_suffix) + sharedWithCfiLib := result.ModuleForTests(t, "shared_with_cfi", buildOs+shared_suffix+cfi_suffix) + sharedNoCfiLib := result.ModuleForTests(t, "shared_no_cfi", buildOs+shared_suffix) + staticWithCfiLib := result.ModuleForTests(t, "static_dep_with_cfi", buildOs+static_suffix) + staticWithCfiLibCfiVariant := result.ModuleForTests(t, "static_dep_with_cfi", buildOs+static_suffix+cfi_suffix) + staticNoCfiLib := result.ModuleForTests(t, "static_dep_no_cfi", buildOs+static_suffix) + staticNoCfiLibCfiVariant := result.ModuleForTests(t, "static_dep_no_cfi", buildOs+static_suffix+cfi_suffix) + sharedRdepNoCfi := result.ModuleForTests(t, "shared_rdep_no_cfi", buildOs+shared_suffix) + staticDepWithCfi2Lib := result.ModuleForTests(t, "static_dep_with_cfi_2", buildOs+static_suffix) // Confirm assumptions about propagation of CFI enablement expectStaticLinkDep(t, ctx, sharedWithCfiLib, staticWithCfiLibCfiVariant) diff --git a/cc/sdk_test.go b/cc/sdk_test.go index 61925e30c..664a7c6e6 100644 --- a/cc/sdk_test.go +++ b/cc/sdk_test.go @@ -81,16 +81,16 @@ func TestSdkMutator(t *testing.T) { ctx := testCc(t, bp) - libsdkNDK := ctx.ModuleForTests("libsdk", "android_arm64_armv8-a_sdk_shared") - libsdkPlatform := ctx.ModuleForTests("libsdk", "android_arm64_armv8-a_shared") - libsdkdepNDK := ctx.ModuleForTests("libsdkdep", "android_arm64_armv8-a_sdk_shared") - libsdkdepPlatform := ctx.ModuleForTests("libsdkdep", "android_arm64_armv8-a_shared") - libplatform := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared") - platformbinary := ctx.ModuleForTests("platformbinary", "android_arm64_armv8-a") - sdkbinary := ctx.ModuleForTests("sdkbinary", "android_arm64_armv8-a_sdk") - - libcxxNDK := ctx.ModuleForTests("ndk_libc++_shared", "android_arm64_armv8-a_sdk_shared") - libcxxPlatform := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared") + libsdkNDK := ctx.ModuleForTests(t, "libsdk", "android_arm64_armv8-a_sdk_shared") + libsdkPlatform := ctx.ModuleForTests(t, "libsdk", "android_arm64_armv8-a_shared") + libsdkdepNDK := ctx.ModuleForTests(t, "libsdkdep", "android_arm64_armv8-a_sdk_shared") + libsdkdepPlatform := ctx.ModuleForTests(t, "libsdkdep", "android_arm64_armv8-a_shared") + libplatform := ctx.ModuleForTests(t, "libplatform", "android_arm64_armv8-a_shared") + platformbinary := ctx.ModuleForTests(t, "platformbinary", "android_arm64_armv8-a") + sdkbinary := ctx.ModuleForTests(t, "sdkbinary", "android_arm64_armv8-a_sdk") + + libcxxNDK := ctx.ModuleForTests(t, "ndk_libc++_shared", "android_arm64_armv8-a_sdk_shared") + libcxxPlatform := ctx.ModuleForTests(t, "libc++", "android_arm64_armv8-a_shared") assertDep(t, libsdkNDK, libsdkdepNDK) assertDep(t, libsdkPlatform, libsdkdepPlatform) diff --git a/cc/test.go b/cc/test.go index dad4afa47..b3b2ae8c4 100644 --- a/cc/test.go +++ b/cc/test.go @@ -18,6 +18,7 @@ import ( "path/filepath" "strconv" + "github.com/google/blueprint/depset" "github.com/google/blueprint/proptools" "android/soong/android" @@ -128,6 +129,13 @@ type TestBinaryProperties struct { // Install the test into a folder named for the module in all test suites. Per_testcase_directory *bool + + // Install the test's dependencies into a folder named standalone-libs relative to the + // test's installation path. ld-library-path will be set to this path in the test's + // auto-generated config. This way the dependencies can be used by the test without having + // to manually install them to the device. See more details in + // go/standalone-native-device-tests. + Standalone_test *bool } func init() { @@ -380,6 +388,7 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) { TestInstallBase: testInstallBase, DeviceTemplate: "${NativeTestConfigTemplate}", HostTemplate: "${NativeHostTestConfigTemplate}", + StandaloneTest: test.Properties.Standalone_test, }) test.extraTestConfigs = android.PathsForModuleSrc(ctx, test.Properties.Test_options.Extra_test_configs) @@ -421,6 +430,24 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) { test.binaryDecorator.baseInstaller.installTestData(ctx, test.data) test.binaryDecorator.baseInstaller.install(ctx, file) + if Bool(test.Properties.Standalone_test) { + packagingSpecsBuilder := depset.NewBuilder[android.PackagingSpec](depset.TOPOLOGICAL) + + ctx.VisitDirectDeps(func(dep android.Module) { + deps := android.OtherModuleProviderOrDefault(ctx, dep, android.InstallFilesProvider) + packagingSpecsBuilder.Transitive(deps.TransitivePackagingSpecs) + }) + + for _, standaloneTestDep := range packagingSpecsBuilder.Build().ToList() { + if standaloneTestDep.ToGob().SrcPath == nil { + continue + } + if standaloneTestDep.SkipInstall() { + continue + } + test.binaryDecorator.baseInstaller.installStandaloneTestDep(ctx, standaloneTestDep) + } + } } func getTestInstallBase(useVendor bool) string { diff --git a/cc/test_data_test.go b/cc/test_data_test.go index a62116677..2c03ca4d5 100644 --- a/cc/test_data_test.go +++ b/cc/test_data_test.go @@ -132,7 +132,7 @@ func TestDataTests(t *testing.T) { _, errs = ctx.PrepareBuildActions(config) android.FailIfErrored(t, errs) - foo := ctx.ModuleForTests("foo", "") + foo := ctx.ModuleForTests(t, "foo", "") got := foo.Module().(*testDataTest).data if len(got) != len(test.data) { diff --git a/cc/testing.go b/cc/testing.go index 14a6b7a6a..69ae11dfd 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -193,7 +193,7 @@ func commonDefaultModules() string { }, apex_available: [ "//apex_available:platform", - "myapex" + "//apex_available:anyapex", ], llndk: { symbol_file: "libm.map.txt", @@ -253,7 +253,7 @@ func commonDefaultModules() string { }, apex_available: [ "//apex_available:platform", - "myapex" + "//apex_available:anyapex", ], llndk: { symbol_file: "libdl.map.txt", @@ -708,7 +708,7 @@ func CreateTestContext(config android.Config) *android.TestContext { func checkSnapshotIncludeExclude(t *testing.T, ctx *android.TestContext, singleton android.TestingSingleton, moduleName, snapshotFilename, subDir, variant string, include bool, fake bool) { t.Helper() - mod := ctx.ModuleForTests(moduleName, variant) + mod := ctx.ModuleForTests(t, moduleName, variant) outputFiles := mod.OutputFiles(ctx, t, "") if len(outputFiles) != 1 { t.Errorf("%q must have single output\n", moduleName) @@ -750,9 +750,10 @@ func CheckSnapshotRule(t *testing.T, ctx *android.TestContext, singleton android checkSnapshotIncludeExclude(t, ctx, singleton, moduleName, snapshotFilename, subDir, variant, true, true) } -func GetOutputPaths(ctx *android.TestContext, variant string, moduleNames []string) (paths android.Paths) { +func GetOutputPaths(t *testing.T, ctx *android.TestContext, variant string, moduleNames []string) (paths android.Paths) { + t.Helper() for _, moduleName := range moduleNames { - module := ctx.ModuleForTests(moduleName, variant).Module().(*Module) + module := ctx.ModuleForTests(t, moduleName, variant).Module().(*Module) output := module.outputFile.Path().RelativeToTop() paths = append(paths, output) } diff --git a/cc/tidy_test.go b/cc/tidy_test.go index 9481778a2..afc12b8d9 100644 --- a/cc/tidy_test.go +++ b/cc/tidy_test.go @@ -83,7 +83,7 @@ func TestTidyFlagsWarningsAsErrors(t *testing.T) { variant := "android_arm64_armv8-a_shared" ctx := testCc(t, test.bp) t.Run("caseTidyFlags", func(t *testing.T) { - flags := ctx.ModuleForTests(test.libName, variant).Rule("clangTidy").Args["tidyFlags"] + flags := ctx.ModuleForTests(t, test.libName, variant).Rule("clangTidy").Args["tidyFlags"] for _, flag := range test.flags { if !strings.Contains(flags, flag) { t.Errorf("tidyFlags %v for %s does not contain %s.", flags, test.libName, flag) @@ -143,7 +143,7 @@ func TestTidyChecks(t *testing.T) { variant := "android_arm64_armv8-a_shared" for _, test := range testCases { libName := fmt.Sprintf("libfoo_%d", test.libNumber) - flags := ctx.ModuleForTests(libName, variant).Rule("clangTidy").Args["tidyFlags"] + flags := ctx.ModuleForTests(t, libName, variant).Rule("clangTidy").Args["tidyFlags"] splitFlags := strings.Split(flags, " ") foundCheckFlag := false for _, flag := range splitFlags { @@ -231,7 +231,7 @@ func TestWithTidy(t *testing.T) { checkLibraryRule := func(foo, variant, ruleName string) { libName := fmt.Sprintf("lib%s_%d", foo, n) tidyFile := "out/soong/.intermediates/" + libName + "/" + variant + "/obj/" + foo + ".tidy" - depFiles := ctx.ModuleForTests(libName, variant).Rule(ruleName).Validations.Strings() + depFiles := ctx.ModuleForTests(t, libName, variant).Rule(ruleName).Validations.Strings() if test.needTidyFile[n] { android.AssertStringListContains(t, libName+" needs .tidy file", depFiles, tidyFile) } else { @@ -262,7 +262,7 @@ func TestWithGeneratedCode(t *testing.T) { ctx := android.GroupFixturePreparers(prepareForCcTest, android.FixtureMergeEnv(testEnv)).RunTestWithBp(t, bp) t.Run("tidy should be only run for source code, not for generated code", func(t *testing.T) { - depFiles := ctx.ModuleForTests("libfoo", variant).Rule("ld").Validations.Strings() + depFiles := ctx.ModuleForTests(t, "libfoo", variant).Rule("ld").Validations.Strings() tidyFileForCpp := "out/soong/.intermediates/libfoo/" + variant + "/obj/foo_src.tidy" diff --git a/cc/vendor_public_library_test.go b/cc/vendor_public_library_test.go index 7385f2b88..797bb251c 100644 --- a/cc/vendor_public_library_test.go +++ b/cc/vendor_public_library_test.go @@ -70,32 +70,32 @@ func TestVendorPublicLibraries(t *testing.T) { // test if header search paths are correctly added // _static variant is used since _shared reuses *.o from the static variant - cc := ctx.ModuleForTests("libsystem", strings.Replace(coreVariant, "_shared", "_static", 1)).Rule("cc") + cc := ctx.ModuleForTests(t, "libsystem", strings.Replace(coreVariant, "_shared", "_static", 1)).Rule("cc") cflags := cc.Args["cFlags"] if !strings.Contains(cflags, "-Imy_include") { t.Errorf("cflags for libsystem must contain -Imy_include, but was %#v.", cflags) } // test if libsystem is linked to the stub - ld := ctx.ModuleForTests("libsystem", coreVariant).Rule("ld") + ld := ctx.ModuleForTests(t, "libsystem", coreVariant).Rule("ld") libflags := ld.Args["libFlags"] - stubPaths := GetOutputPaths(ctx, coreVariant, []string{"libvendorpublic"}) + stubPaths := GetOutputPaths(t, ctx, coreVariant, []string{"libvendorpublic"}) if !strings.Contains(libflags, stubPaths[0].String()) { t.Errorf("libflags for libsystem must contain %#v, but was %#v", stubPaths[0], libflags) } // test if libsystem is linked to the stub - ld = ctx.ModuleForTests("libproduct", productVariant).Rule("ld") + ld = ctx.ModuleForTests(t, "libproduct", productVariant).Rule("ld") libflags = ld.Args["libFlags"] - stubPaths = GetOutputPaths(ctx, productVariant, []string{"libvendorpublic"}) + stubPaths = GetOutputPaths(t, ctx, productVariant, []string{"libvendorpublic"}) if !strings.Contains(libflags, stubPaths[0].String()) { t.Errorf("libflags for libproduct must contain %#v, but was %#v", stubPaths[0], libflags) } // test if libvendor is linked to the real shared lib - ld = ctx.ModuleForTests("libvendor", vendorVariant).Rule("ld") + ld = ctx.ModuleForTests(t, "libvendor", vendorVariant).Rule("ld") libflags = ld.Args["libFlags"] - stubPaths = GetOutputPaths(ctx, vendorVariant, []string{"libvendorpublic"}) + stubPaths = GetOutputPaths(t, ctx, vendorVariant, []string{"libvendorpublic"}) if !strings.Contains(libflags, stubPaths[0].String()) { t.Errorf("libflags for libvendor must contain %#v, but was %#v", stubPaths[0], libflags) diff --git a/cmd/javac_wrapper/javac_wrapper.go b/cmd/javac_wrapper/javac_wrapper.go index 4679906d5..49bcedf9e 100644 --- a/cmd/javac_wrapper/javac_wrapper.go +++ b/cmd/javac_wrapper/javac_wrapper.go @@ -200,6 +200,9 @@ var warningCount = regexp.MustCompile(`^([0-9]+) warning(s)?$`) var warningFilters = []*regexp.Regexp{ regexp.MustCompile(`bootstrap class path not set in conjunction with -source`), + regexp.MustCompile(`source value 8 is obsolete and will be removed in a future release`), + regexp.MustCompile(`target value 8 is obsolete and will be removed in a future release`), + regexp.MustCompile(`To suppress warnings about obsolete options, use -Xlint:-options.`), } var filters = []*regexp.Regexp{ diff --git a/cmd/javac_wrapper/javac_wrapper_test.go b/cmd/javac_wrapper/javac_wrapper_test.go index ad230012e..5e2678672 100644 --- a/cmd/javac_wrapper/javac_wrapper_test.go +++ b/cmd/javac_wrapper/javac_wrapper_test.go @@ -90,6 +90,15 @@ warning: [options] bootstrap class path not set in conjunction with -source 1.9\ `, out: "\n\x1b[1m\x1b[35mwarning:\x1b[0m\x1b[1m foo\x1b[0m\n1 warning\n", }, + { + in: ` +warning: [options] source value 8 is obsolete and will be removed in a future release +warning: [options] target value 8 is obsolete and will be removed in a future release +warning: [options] To suppress warnings about obsolete options, use -Xlint:-options. +3 warnings +`, + out: "\n", + }, } func TestJavacColorize(t *testing.T) { diff --git a/dexpreopt/dexpreopt_test.go b/dexpreopt/dexpreopt_test.go index f9b8880f5..500b2ff8c 100644 --- a/dexpreopt/dexpreopt_test.go +++ b/dexpreopt/dexpreopt_test.go @@ -377,7 +377,7 @@ func TestUffdGcFlagForce(t *testing.T) { result := preparers.RunTest(t) ctx := result.TestContext - ctx.SingletonForTests("dexpreopt-soong-config").Output("out/soong/dexpreopt/uffd_gc_flag.txt") + ctx.SingletonForTests(t, "dexpreopt-soong-config").Output("out/soong/dexpreopt/uffd_gc_flag.txt") }) } } @@ -394,7 +394,7 @@ func TestUffdGcFlagDefault(t *testing.T) { ctx := result.TestContext config := ctx.Config() - rule := ctx.SingletonForTests("dexpreopt-soong-config").Rule("dexpreopt_uffd_gc_flag") + rule := ctx.SingletonForTests(t, "dexpreopt-soong-config").Rule("dexpreopt_uffd_gc_flag") android.AssertStringDoesContain(t, "", rule.RuleParams.Command, "construct_uffd_gc_flag") android.AssertStringPathsRelativeToTopEquals(t, "", config, []string{ diff --git a/etc/install_symlink_test.go b/etc/install_symlink_test.go index c97d97c65..dce687381 100644 --- a/etc/install_symlink_test.go +++ b/etc/install_symlink_test.go @@ -39,7 +39,7 @@ func TestInstallSymlinkBasic(t *testing.T) { t.Fatalf("expected 1 variant, got %#v", foo_variants) } - foo := result.ModuleForTests("foo", "android_common").Module() + foo := result.ModuleForTests(t, "foo", "android_common").Module() androidMkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, foo) if len(androidMkEntries) != 1 { t.Fatalf("expected 1 androidmkentry, got %d", len(androidMkEntries)) @@ -70,7 +70,7 @@ func TestInstallSymlinkToRecovery(t *testing.T) { t.Fatalf("expected 1 variant, got %#v", foo_variants) } - foo := result.ModuleForTests("foo", "android_common").Module() + foo := result.ModuleForTests(t, "foo", "android_common").Module() androidMkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, foo) if len(androidMkEntries) != 1 { t.Fatalf("expected 1 androidmkentry, got %d", len(androidMkEntries)) @@ -149,7 +149,7 @@ func TestInstallSymlinkHostBasic(t *testing.T) { `) buildOS := result.Config.BuildOS.String() - foo := result.ModuleForTests("foo", buildOS+"_common").Module() + foo := result.ModuleForTests(t, "foo", buildOS+"_common").Module() androidMkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, foo) if len(androidMkEntries) != 1 { diff --git a/etc/prebuilt_etc.go b/etc/prebuilt_etc.go index 2bcbde12d..bf54c0941 100644 --- a/etc/prebuilt_etc.go +++ b/etc/prebuilt_etc.go @@ -499,9 +499,21 @@ func (p *PrebuiltEtc) GenerateAndroidBuildActions(ctx android.ModuleContext) { ip.addInstallRules(ctx) } + p.updateModuleInfoJSON(ctx) + ctx.SetOutputFiles(p.outputFilePaths.Paths(), "") } +func (p *PrebuiltEtc) updateModuleInfoJSON(ctx android.ModuleContext) { + moduleInfoJSON := ctx.ModuleInfoJSON() + moduleInfoJSON.Class = []string{"ETC"} + if p.makeClass != "" { + moduleInfoJSON.Class = []string{p.makeClass} + } + moduleInfoJSON.SystemSharedLibs = []string{"none"} + moduleInfoJSON.Tags = []string{"optional"} +} + type installProperties struct { filename string sourceFilePath android.Path diff --git a/etc/prebuilt_etc_test.go b/etc/prebuilt_etc_test.go index 70b54629f..eb722b457 100644 --- a/etc/prebuilt_etc_test.go +++ b/etc/prebuilt_etc_test.go @@ -324,7 +324,7 @@ func TestPrebuiltEtcAllowMissingDependencies(t *testing.T) { `) android.AssertStringEquals(t, "expected error rule", "android/soong/android.Error", - result.ModuleForTests("foo.conf", "android_arm64_armv8-a").Output("foo.conf").Rule.String()) + result.ModuleForTests(t, "foo.conf", "android_arm64_armv8-a").Output("foo.conf").Rule.String()) } func TestPrebuiltRootInstallDirPath(t *testing.T) { diff --git a/filesystem/aconfig_files.go b/filesystem/aconfig_files.go index 6d034027d..b4173d784 100644 --- a/filesystem/aconfig_files.go +++ b/filesystem/aconfig_files.go @@ -22,6 +22,17 @@ import ( "github.com/google/blueprint/proptools" ) +func init() { + pctx.HostBinToolVariable("aconfig", "aconfig") +} + +var ( + aconfigCreateStorage = pctx.AndroidStaticRule("aconfig_create_storage", blueprint.RuleParams{ + Command: `$aconfig create-storage --container $container --file $fileType --out $out --cache $in --version $version`, + CommandDeps: []string{"$aconfig"}, + }, "container", "fileType", "version") +) + type installedAconfigFlagsInfo struct { aconfigFiles android.Paths } @@ -66,45 +77,57 @@ func (f *filesystem) buildAconfigFlagsFiles( container := f.PartitionType() - installAconfigFlagsPath := dir.Join(ctx, "etc", "aconfig_flags.pb") - cmd := builder.Command(). + aconfigFlagsPb := android.PathForModuleOut(ctx, "aconfig", "aconfig_flags.pb") + aconfigFlagsPbBuilder := android.NewRuleBuilder(pctx, ctx) + cmd := aconfigFlagsPbBuilder.Command(). BuiltTool("aconfig"). Text(" dump-cache --dedup --format protobuf --out"). - Output(installAconfigFlagsPath). + Output(aconfigFlagsPb). Textf("--filter container:%s+state:ENABLED", container). Textf("--filter container:%s+permission:READ_WRITE", container) for _, cache := range caches { cmd.FlagWithInput("--cache ", cache) } + aconfigFlagsPbBuilder.Build("aconfig_flags_pb", "build aconfig_flags.pb") + + installAconfigFlagsPath := dir.Join(ctx, "etc", "aconfig_flags.pb") + builder.Command().Text("mkdir -p ").Text(dir.Join(ctx, "etc").String()) + builder.Command().Text("cp").Input(aconfigFlagsPb).Text(installAconfigFlagsPath.String()) *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), "etc/aconfig_flags.pb"), - SourcePath: installAconfigFlagsPath, + SourcePath: aconfigFlagsPb, }) f.appendToEntry(ctx, installAconfigFlagsPath) - installAconfigStorageDir := dir.Join(ctx, "etc", "aconfig") - builder.Command().Text("mkdir -p").Text(installAconfigStorageDir.String()) - // To enable fingerprint, we need to have v2 storage files. The default version is 1. storageFilesVersion := 1 if ctx.Config().ReleaseFingerprintAconfigPackages() { storageFilesVersion = 2 } + installAconfigStorageDir := dir.Join(ctx, "etc", "aconfig") + builder.Command().Text("mkdir -p").Text(installAconfigStorageDir.String()) + generatePartitionAconfigStorageFile := func(fileType, fileName string) { - outputPath := installAconfigStorageDir.Join(ctx, fileName) + outPath := android.PathForModuleOut(ctx, "aconfig", fileName) + installPath := installAconfigStorageDir.Join(ctx, fileName) + ctx.Build(pctx, android.BuildParams{ + Rule: aconfigCreateStorage, + Input: aconfigFlagsPb, + Output: outPath, + Args: map[string]string{ + "container": container, + "fileType": fileType, + "version": strconv.Itoa(storageFilesVersion), + }, + }) builder.Command(). - BuiltTool("aconfig"). - FlagWithArg("create-storage --container ", container). - FlagWithArg("--file ", fileType). - FlagWithOutput("--out ", outputPath). - FlagWithArg("--cache ", installAconfigFlagsPath.String()). - FlagWithArg("--version ", strconv.Itoa(storageFilesVersion)) + Text("cp").Input(outPath).Text(installPath.String()) *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ + SourcePath: outPath, FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), "etc/aconfig", fileName), - SourcePath: outputPath, }) - f.appendToEntry(ctx, outputPath) + f.appendToEntry(ctx, installPath) } if ctx.Config().ReleaseCreateAconfigStorageFile() { diff --git a/filesystem/android_device.go b/filesystem/android_device.go index 6c048287b..8d7f92f7d 100644 --- a/filesystem/android_device.go +++ b/filesystem/android_device.go @@ -70,7 +70,13 @@ type DeviceProperties struct { // blueprint:"mutated" and still set it from filesystem_creator Main_device *bool - Ab_ota_updater *bool + Ab_ota_updater *bool + Ab_ota_partitions []string + Ab_ota_keys []string + Ab_ota_postinstall_config []string + + Ramdisk_node_list *string `android:"path"` + Releasetools_extension *string `android:"path"` } type androidDevice struct { @@ -79,6 +85,8 @@ type androidDevice struct { partitionProps PartitionNameProperties deviceProps DeviceProperties + + allImagesZip android.Path } func AndroidDeviceFactory() android.Module { @@ -151,7 +159,7 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) { } } - //a.buildTargetFilesZip(ctx) TODO(b/393203512): re-enable target_files.zip + a.buildTargetFilesZip(ctx) var deps []android.Path if proptools.String(a.partitionProps.Super_partition_name) != "" { superImage := ctx.GetDirectDepProxyWithTag(*a.partitionProps.Super_partition_name, superPartitionDepTag) @@ -202,6 +210,17 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) { deps = append(deps, imageOutput.DefaultOutputFiles[0]) }) + allImagesZip := android.PathForModuleOut(ctx, "all_images.zip") + allImagesZipBuilder := android.NewRuleBuilder(pctx, ctx) + cmd := allImagesZipBuilder.Command().BuiltTool("soong_zip").Flag("--sort_entries") + for _, dep := range deps { + cmd.FlagWithArg("-e ", dep.Base()) + cmd.FlagWithInput("-f ", dep) + } + cmd.FlagWithOutput("-o ", allImagesZip) + allImagesZipBuilder.Build("soong_all_images_zip", "all_images.zip") + a.allImagesZip = allImagesZip + allImagesStamp := android.PathForModuleOut(ctx, "all_images_stamp") var validations android.Paths if !ctx.Config().KatiEnabled() && proptools.Bool(a.deviceProps.Main_device) { @@ -224,6 +243,32 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.CheckbuildFile(allImagesStamp) a.setVbmetaPhonyTargets(ctx) + + a.distFiles(ctx) +} + +func (a *androidDevice) distFiles(ctx android.ModuleContext) { + if !ctx.Config().KatiEnabled() { + if proptools.Bool(a.deviceProps.Main_device) { + fsInfoMap := a.getFsInfos(ctx) + for _, partition := range android.SortedKeys(fsInfoMap) { + fsInfo := fsInfoMap[partition] + if fsInfo.InstalledFiles.Json != nil { + ctx.DistForGoal("droidcore-unbundled", fsInfo.InstalledFiles.Json) + } + if fsInfo.InstalledFiles.Txt != nil { + ctx.DistForGoal("droidcore-unbundled", fsInfo.InstalledFiles.Txt) + } + } + } + } + +} + +func (a *androidDevice) MakeVars(ctx android.MakeVarsModuleContext) { + if proptools.Bool(a.deviceProps.Main_device) { + ctx.StrictRaw("SOONG_ONLY_ALL_IMAGES_ZIP", a.allImagesZip.String()) + } } // Helper structs for target_files.zip creation @@ -379,8 +424,12 @@ func (a *androidDevice) copyImagesToTargetZip(ctx android.ModuleContext, builder superPartition := ctx.GetDirectDepProxyWithTag(*a.partitionProps.Super_partition_name, superPartitionDepTag) if info, ok := android.OtherModuleProvider(ctx, superPartition, SuperImageProvider); ok { for _, partition := range android.SortedKeys(info.SubImageInfo) { - builder.Command().Textf("cp ").Input(info.SubImageInfo[partition].OutputHermetic).Textf(" %s/IMAGES/", targetFilesDir.String()) - builder.Command().Textf("cp ").Input(info.SubImageInfo[partition].MapFile).Textf(" %s/IMAGES/", targetFilesDir.String()) + if info.SubImageInfo[partition].OutputHermetic != nil { + builder.Command().Textf("cp ").Input(info.SubImageInfo[partition].OutputHermetic).Textf(" %s/IMAGES/", targetFilesDir.String()) + } + if info.SubImageInfo[partition].MapFile != nil { + builder.Command().Textf("cp ").Input(info.SubImageInfo[partition].MapFile).Textf(" %s/IMAGES/", targetFilesDir.String()) + } } } else { ctx.ModuleErrorf("Super partition %s does set SuperImageProvider\n", superPartition.Name()) @@ -396,9 +445,58 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build info, _ := android.OtherModuleProvider(ctx, child, android.OutputFilesProvider) builder.Command().Textf("cp").Inputs(info.DefaultOutputFiles).Textf(" %s/META/", targetFilesDir.String()) }) + builder.Command().Textf("cp").Input(android.PathForSource(ctx, "external/zucchini/version_info.h")).Textf(" %s/META/zucchini_config.txt", targetFilesDir.String()) + builder.Command().Textf("cp").Input(android.PathForSource(ctx, "system/update_engine/update_engine.conf")).Textf(" %s/META/update_engine_config.txt", targetFilesDir.String()) + if a.getFsInfos(ctx)["system"].ErofsCompressHints != nil { + builder.Command().Textf("cp").Input(a.getFsInfos(ctx)["system"].ErofsCompressHints).Textf(" %s/META/erofs_default_compress_hints.txt", targetFilesDir.String()) + } + // ab_partitions.txt + abPartitionsSorted := android.SortedUniqueStrings(a.deviceProps.Ab_ota_partitions) + abPartitionsSortedString := proptools.ShellEscape(strings.Join(abPartitionsSorted, "\\n")) + builder.Command().Textf("echo -e").Flag(abPartitionsSortedString).Textf(" > %s/META/ab_partitions.txt", targetFilesDir.String()) + // otakeys.txt + abOtaKeysSorted := android.SortedUniqueStrings(a.deviceProps.Ab_ota_keys) + abOtaKeysSortedString := proptools.ShellEscape(strings.Join(abOtaKeysSorted, "\\n")) + builder.Command().Textf("echo -e").Flag(abOtaKeysSortedString).Textf(" > %s/META/otakeys.txt", targetFilesDir.String()) + // postinstall_config.txt + abOtaPostInstallConfigString := proptools.ShellEscape(strings.Join(a.deviceProps.Ab_ota_postinstall_config, "\\n")) + builder.Command().Textf("echo -e").Flag(abOtaPostInstallConfigString).Textf(" > %s/META/postinstall_config.txt", targetFilesDir.String()) + // selinuxfc + if a.getFsInfos(ctx)["system"].SelinuxFc != nil { + builder.Command().Textf("cp").Input(a.getFsInfos(ctx)["system"].SelinuxFc).Textf(" %s/META/file_contexts.bin", targetFilesDir.String()) + } + } + // Copy $partition_filesystem_config.txt + fsInfos := a.getFsInfos(ctx) + for _, partition := range android.SortedKeys(fsInfos) { + if fsInfos[partition].FilesystemConfig == nil { + continue + } + if android.InList(partition, []string{"userdata"}) { + continue + } + builder.Command().Textf("cp").Input(fsInfos[partition].FilesystemConfig).Textf(" %s/META/%s", targetFilesDir.String(), a.filesystemConfigNameForTargetFiles(partition)) + } + // Copy ramdisk_node_list + if ramdiskNodeList := android.PathForModuleSrc(ctx, proptools.String(a.deviceProps.Ramdisk_node_list)); ramdiskNodeList != nil { + builder.Command().Textf("cp").Input(ramdiskNodeList).Textf(" %s/META/", targetFilesDir.String()) + } + // Copy releasetools.py + if releaseTools := android.PathForModuleSrc(ctx, proptools.String(a.deviceProps.Releasetools_extension)); releaseTools != nil { + builder.Command().Textf("cp").Input(releaseTools).Textf(" %s/META/", targetFilesDir.String()) + } +} + +// Filenames for the partition specific fs_config files. +// Hardcode the ramdisk files to their boot image prefix +func (a *androidDevice) filesystemConfigNameForTargetFiles(partition string) string { + name := partition + "_filesystem_config.txt" + if partition == "system" { + name = "filesystem_config.txt" + } else if partition == "ramdisk" { + name = "init_boot_filesystem_config.txt" } - builder.Command().Textf("cp").Input(android.PathForSource(ctx, "external/zucchini/version_info.h")).Textf(" %s/META/zucchini_config.txt", targetFilesDir.String()) - builder.Command().Textf("cp").Input(android.PathForSource(ctx, "system/update_engine/update_engine.conf")).Textf(" %s/META/update_engine_config.txt", targetFilesDir.String()) + return name } func (a *androidDevice) getFilesystemInfo(ctx android.ModuleContext, depName string) FilesystemInfo { diff --git a/filesystem/android_device_product_out.go b/filesystem/android_device_product_out.go index c06715ab8..7d37f1ee7 100644 --- a/filesystem/android_device_product_out.go +++ b/filesystem/android_device_product_out.go @@ -70,9 +70,15 @@ func (a *androidDevice) copyFilesToProductOutForSoongOnly(ctx android.ModuleCont // if that's the case. if fip.SymlinkTarget == "" { ctx.Build(pctx, android.BuildParams{ - Rule: android.Cp, + Rule: android.CpWithBash, Input: fip.SourcePath, Output: fip.FullInstallPath, + Args: map[string]string{ + // Preserve timestamps for adb sync, so that this installed file's + // timestamp matches the timestamp in the filesystem's intermediate + // staging dir + "cpFlags": "-p", + }, }) } else { ctx.Build(pctx, android.BuildParams{ @@ -177,6 +183,17 @@ func (a *androidDevice) copyFilesToProductOutForSoongOnly(ctx android.ModuleCont Implicits: deps, }) + emptyFile := android.PathForModuleOut(ctx, "empty_file") + android.WriteFileRule(ctx, emptyFile, "") + + // TODO: We don't have these tests building in soong yet. Add phonies for them so that CI builds + // that try to build them don't error out. + ctx.Phony("continuous_instrumentation_tests", emptyFile) + ctx.Phony("continuous_native_tests", emptyFile) + ctx.Phony("device-tests", emptyFile) + ctx.Phony("device-platinum-tests", emptyFile) + ctx.Phony("platform_tests", emptyFile) + return copyToProductOutTimestamp } diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 0ce31b293..f84993de7 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -36,6 +36,8 @@ import ( func init() { registerBuildComponents(android.InitRegistrationContext) registerMutators(android.InitRegistrationContext) + pctx.HostBinToolVariable("fileslist", "fileslist") + pctx.HostBinToolVariable("fs_config", "fs_config") } func registerBuildComponents(ctx android.RegistrationContext) { @@ -54,11 +56,28 @@ func registerMutators(ctx android.RegistrationContext) { }) } -// Remember to add referenced files to implicits! -var textFileProcessorRule = pctx.AndroidStaticRule("text_file_processing", blueprint.RuleParams{ - Command: "build/soong/scripts/text_file_processor.py $in $out", - CommandDeps: []string{"build/soong/scripts/text_file_processor.py"}, -}) +var ( + // Remember to add referenced files to implicits! + textFileProcessorRule = pctx.AndroidStaticRule("text_file_processing", blueprint.RuleParams{ + Command: "build/soong/scripts/text_file_processor.py $in $out", + CommandDeps: []string{"build/soong/scripts/text_file_processor.py"}, + }) + + // Remember to add the output image file as an implicit dependency! + installedFilesJsonRule = pctx.AndroidStaticRule("installed_files_json", blueprint.RuleParams{ + Command: `${fileslist} ${rootDir} > ${out}`, + CommandDeps: []string{"${fileslist}"}, + }, "rootDir") + + installedFilesTxtRule = pctx.AndroidStaticRule("installed_files_txt", blueprint.RuleParams{ + Command: `build/make/tools/fileslist_util.py -c ${in} > ${out}`, + CommandDeps: []string{"build/make/tools/fileslist_util.py"}, + }) + fsConfigRule = pctx.AndroidStaticRule("fs_config_rule", blueprint.RuleParams{ + Command: `(cd ${rootDir}; find . -type d | sed 's,$$,/,'; find . \! -type d) | cut -c 3- | sort | sed 's,^,${prefix},' | ${fs_config} -C -D ${rootDir} -R "${prefix}" > ${out}`, + CommandDeps: []string{"${fs_config}"}, + }, "rootDir", "prefix") +) type filesystem struct { android.ModuleBase @@ -76,6 +95,8 @@ type filesystem struct { entries []string filesystemBuilder filesystemBuilder + + selinuxFc android.Path } type filesystemBuilder interface { @@ -131,7 +152,7 @@ type FilesystemProperties struct { // The index used to prevent rollback of the image. Only used if use_avb is true. Rollback_index *int64 - // Rollback index location of this image. Must be 0, 1, 2, etc. + // Rollback index location of this image. Must be 1, 2, 3, etc. Rollback_index_location *int64 // Name of the partition stored in vbmeta desc. Defaults to the name of this module. @@ -358,6 +379,11 @@ func (fs fsType) IsUnknown() bool { return fs == unknown } +type InstalledFilesStruct struct { + Txt android.Path + Json android.Path +} + type FilesystemInfo struct { // The built filesystem image Output android.Path @@ -391,6 +417,17 @@ type FilesystemInfo struct { SpecsForSystemOther map[string]android.PackagingSpec FullInstallPaths []FullInstallPathInfo + + // Installed files list + InstalledFiles InstalledFilesStruct + + // Path to compress hints file for erofs filesystems + // This will be nil for other fileystems like ext4 + ErofsCompressHints android.Path + + SelinuxFc android.Path + + FilesystemConfig android.Path } // FullInstallPathInfo contains information about the "full install" paths of all the files @@ -498,6 +535,34 @@ func (f *filesystem) ModifyPackagingSpec(ps *android.PackagingSpec) { } } +func buildInstalledFiles(ctx android.ModuleContext, partition string, rootDir android.Path, image android.Path) (txt android.ModuleOutPath, json android.ModuleOutPath) { + fileName := "installed-files" + if len(partition) > 0 { + fileName += fmt.Sprintf("-%s", partition) + } + txt = android.PathForModuleOut(ctx, fmt.Sprintf("%s.txt", fileName)) + json = android.PathForModuleOut(ctx, fmt.Sprintf("%s.json", fileName)) + + ctx.Build(pctx, android.BuildParams{ + Rule: installedFilesJsonRule, + Implicit: image, + Output: json, + Description: "Installed file list json", + Args: map[string]string{ + "rootDir": rootDir.String(), + }, + }) + + ctx.Build(pctx, android.BuildParams{ + Rule: installedFilesTxtRule, + Input: json, + Output: txt, + Description: "Installed file list txt", + }) + + return txt, json +} + var pctx = android.NewPackageContext("android/soong/filesystem") func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -537,14 +602,27 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { f.buildEventLogtagsFile(ctx, builder, rebasedDir, &fullInstallPaths) f.buildAconfigFlagsFiles(ctx, builder, specs, rebasedDir, &fullInstallPaths) f.filesystemBuilder.BuildLinkerConfigFile(ctx, builder, rebasedDir, &fullInstallPaths) + // Assemeble the staging dir and output a timestamp + builder.Command().Text("touch").Output(f.fileystemStagingDirTimestamp(ctx)) + builder.Build("assemble_filesystem_staging_dir", fmt.Sprintf("Assemble filesystem staging dir %s", f.BaseModuleName())) + // Create a new rule builder for build_image + builder = android.NewRuleBuilder(pctx, ctx) var mapFile android.Path - var outputHermetic android.Path + var outputHermetic android.WritablePath var buildImagePropFile android.Path var buildImagePropFileDeps android.Paths switch f.fsType(ctx) { case ext4Type, erofsType, f2fsType: - f.output, outputHermetic, buildImagePropFile, buildImagePropFileDeps = f.buildImageUsingBuildImage(ctx, builder, rootDir, rebasedDir) + buildImagePropFile, buildImagePropFileDeps = f.buildPropFile(ctx) + output := android.PathForModuleOut(ctx, f.installFileName()) + f.buildImageUsingBuildImage(ctx, builder, buildImageParams{rootDir, buildImagePropFile, buildImagePropFileDeps, output}) + f.output = output + // Create the hermetic img file using a separate rule builder so that it can be built independently + hermeticBuilder := android.NewRuleBuilder(pctx, ctx) + outputHermetic = android.PathForModuleOut(ctx, "for_target_files", f.installFileName()) + propFileHermetic := f.propFileForHermeticImg(ctx, hermeticBuilder, buildImagePropFile) + f.buildImageUsingBuildImage(ctx, hermeticBuilder, buildImageParams{rootDir, propFileHermetic, buildImagePropFileDeps, outputHermetic}) mapFile = f.getMapFile(ctx) case compressedCpioType: f.output = f.buildCpioImage(ctx, builder, rootDir, true) @@ -565,6 +643,17 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { fileListFile := android.PathForModuleOut(ctx, "fileList") android.WriteFileRule(ctx, fileListFile, f.installedFilesList()) + partitionName := f.partitionName() + if partitionName == "system" { + partitionName = "" + } + installedFileTxt, installedFileJson := buildInstalledFiles(ctx, partitionName, rootDir, f.output) + + var erofsCompressHints android.Path + if f.properties.Erofs.Compress_hints != nil { + erofsCompressHints = android.PathForModuleSrc(ctx, *f.properties.Erofs.Compress_hints) + } + fsInfo := FilesystemInfo{ Output: f.output, OutputHermetic: outputHermetic, @@ -577,6 +666,13 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { BuildImagePropFileDeps: buildImagePropFileDeps, SpecsForSystemOther: f.systemOtherFiles(ctx), FullInstallPaths: fullInstallPaths, + InstalledFiles: InstalledFilesStruct{ + Txt: installedFileTxt, + Json: installedFileJson, + }, + ErofsCompressHints: erofsCompressHints, + SelinuxFc: f.selinuxFc, + FilesystemConfig: f.generateFilesystemConfig(ctx, rootDir, rebasedDir), } android.SetProvider(ctx, FilesystemProvider, fsInfo) @@ -590,6 +686,34 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { f.setVbmetaPartitionProvider(ctx) } +func (f *filesystem) fileystemStagingDirTimestamp(ctx android.ModuleContext) android.WritablePath { + return android.PathForModuleOut(ctx, "staging_dir.timestamp") +} + +func (f *filesystem) generateFilesystemConfig(ctx android.ModuleContext, rootDir android.Path, rebasedDir android.Path) android.Path { + rootDirString := rootDir.String() + prefix := f.partitionName() + "/" + if f.partitionName() == "system" { + rootDirString = rebasedDir.String() + } + if f.partitionName() == "ramdisk" || f.partitionName() == "recovery" { + // Hardcoded to match make behavior. + // https://cs.android.com/android/_/android/platform/build/+/2a0ef42a432d4da00201e8eb7697dcaa68fd2389:core/Makefile;l=6957-6962;drc=9ea8ad9232cef4d0a24d70133b1b9d2ce2defe5f;bpv=1;bpt=0 + prefix = "" + } + out := android.PathForModuleOut(ctx, "filesystem_config.txt") + ctx.Build(pctx, android.BuildParams{ + Rule: fsConfigRule, + Input: f.fileystemStagingDirTimestamp(ctx), // assemble the staging directory + Output: out, + Args: map[string]string{ + "rootDir": rootDirString, + "prefix": prefix, + }, + }) + return out +} + func (f *filesystem) setVbmetaPartitionProvider(ctx android.ModuleContext) { var extractedPublicKey android.ModuleOutPath if f.properties.Avb_private_key != nil { @@ -776,28 +900,35 @@ func (f *filesystem) copyPackagingSpecs(ctx android.ModuleContext, builder *andr dirsToSpecs[rootDir] = rootDirSpecs dirsToSpecs[rebasedDir] = rebasedDirSpecs - return f.CopySpecsToDirs(ctx, builder, dirsToSpecs) + // Preserve timestamps for adb sync, so that this staging dir file matches the timestamp in the + // out/target/product staging directory. + return f.CopySpecsToDirs(ctx, builder, dirsToSpecs, true) } func (f *filesystem) rootDirString() string { return f.partitionName() } +type buildImageParams struct { + // inputs + rootDir android.OutputPath + propFile android.Path + toolDeps android.Paths + // outputs + output android.WritablePath +} + func (f *filesystem) buildImageUsingBuildImage( ctx android.ModuleContext, builder *android.RuleBuilder, - rootDir android.OutputPath, - rebasedDir android.OutputPath, -) (android.Path, android.Path, android.Path, android.Paths) { + params buildImageParams) { // run host_init_verifier // Ideally we should have a concept of pluggable linters that verify the generated image. // While such concept is not implement this will do. // TODO(b/263574231): substitute with pluggable linter. builder.Command(). BuiltTool("host_init_verifier"). - FlagWithArg("--out_system=", rootDir.String()+"/system") - - propFile, toolDeps := f.buildPropFile(ctx) + FlagWithArg("--out_system=", params.rootDir.String()+"/system") // Most of the time, if build_image were to call a host tool, it accepts the path to the // host tool in a field in the prop file. However, it doesn't have that option for fec, which @@ -805,44 +936,32 @@ func (f *filesystem) buildImageUsingBuildImage( fec := ctx.Config().HostToolPath(ctx, "fec") pathToolDirs := []string{filepath.Dir(fec.String())} - output := android.PathForModuleOut(ctx, f.installFileName()) - builder.Command().Text("touch").Output(f.getMapFile(ctx)) builder.Command(). Textf("PATH=%s:$PATH", strings.Join(pathToolDirs, ":")). BuiltTool("build_image"). - Text(rootDir.String()). // input directory - Input(propFile). - Implicits(toolDeps). + Text(params.rootDir.String()). // input directory + Input(params.propFile). + Implicits(params.toolDeps). Implicit(fec). - Output(output). - Text(rootDir.String()) // directory where to find fs_config_files|dirs - - // TODO (b/393203512): Re-enable hermetic img file creation for target_files.zip - // Add an additional cmd to create a hermetic img file. This will contain pinned timestamps e.g. - //propFilePinnedTimestamp := android.PathForModuleOut(ctx, "for_target_files", "prop") - //builder.Command().Textf("cat").Input(propFile).Flag(">").Output(propFilePinnedTimestamp). - // Textf(" && echo use_fixed_timestamp=true >> %s", propFilePinnedTimestamp). - // Textf(" && echo block_list=%s >> %s", f.getMapFile(ctx).String(), propFilePinnedTimestamp) // mapfile will be an implicit output - - //outputHermetic := android.PathForModuleOut(ctx, "for_target_files", f.installFileName()) - //builder.Command(). - // Textf("PATH=%s:$PATH", strings.Join(pathToolDirs, ":")). - // BuiltTool("build_image"). - // Text(rootDir.String()). // input directory - // Flag(propFilePinnedTimestamp.String()). - // Implicits(toolDeps). - // Implicit(fec). - // Output(outputHermetic). - // Text(rootDir.String()) // directory where to find fs_config_files|dirs + Implicit(f.fileystemStagingDirTimestamp(ctx)). // assemble the staging directory + Output(params.output). + Text(params.rootDir.String()) // directory where to find fs_config_files|dirs if f.properties.Partition_size != nil { - assertMaxImageSize(builder, output, *f.properties.Partition_size, false) + assertMaxImageSize(builder, params.output, *f.properties.Partition_size, false) } // rootDir is not deleted. Might be useful for quick inspection. - builder.Build("build_filesystem_image", fmt.Sprintf("Creating filesystem %s", f.BaseModuleName())) + builder.Build("build_"+params.output.String(), fmt.Sprintf("Creating filesystem %s", f.BaseModuleName())) +} - return output, nil, propFile, toolDeps +func (f *filesystem) propFileForHermeticImg(ctx android.ModuleContext, builder *android.RuleBuilder, inputPropFile android.Path) android.Path { + propFilePinnedTimestamp := android.PathForModuleOut(ctx, "for_target_files", "prop") + builder.Command().Textf("cat").Input(inputPropFile).Flag(">").Output(propFilePinnedTimestamp). + Textf(" && echo use_fixed_timestamp=true >> %s", propFilePinnedTimestamp). + Textf(" && echo block_list=%s >> %s", f.getMapFile(ctx).String(), propFilePinnedTimestamp) // mapfile will be an implicit output + builder.Command().Text("touch").Output(f.getMapFile(ctx)) + return propFilePinnedTimestamp } func (f *filesystem) buildFileContexts(ctx android.ModuleContext) android.Path { @@ -926,12 +1045,12 @@ func (f *filesystem) buildPropFile(ctx android.ModuleContext) (android.Path, and if f.properties.File_contexts != nil && f.properties.Precompiled_file_contexts != nil { ctx.ModuleErrorf("file_contexts and precompiled_file_contexts cannot both be set") } else if f.properties.File_contexts != nil { - addPath("selinux_fc", f.buildFileContexts(ctx)) + f.selinuxFc = f.buildFileContexts(ctx) } else if f.properties.Precompiled_file_contexts != nil { - src := android.PathForModuleSrc(ctx, *f.properties.Precompiled_file_contexts) - if src != nil { - addPath("selinux_fc", src) - } + f.selinuxFc = android.PathForModuleSrc(ctx, *f.properties.Precompiled_file_contexts) + } + if f.selinuxFc != nil { + addPath("selinux_fc", f.selinuxFc) } if timestamp := proptools.String(f.properties.Fake_timestamp); timestamp != "" { addStr("timestamp", timestamp) @@ -1053,6 +1172,7 @@ func (f *filesystem) buildCpioImage( output := android.PathForModuleOut(ctx, f.installFileName()) cmd := builder.Command(). BuiltTool("mkbootfs"). + Implicit(f.fileystemStagingDirTimestamp(ctx)). Text(rootDir.String()) // input directory for i := range len(rootDirs) { @@ -1373,3 +1493,9 @@ func addAutogeneratedRroDeps(ctx android.BottomUpMutatorContext) { return true }) } + +func (f *filesystem) MakeVars(ctx android.MakeVarsModuleContext) { + if f.Name() == ctx.Config().SoongDefinedSystemImage() { + ctx.StrictRaw("SOONG_DEFINED_SYSTEM_IMAGE_PATH", f.output.String()) + } +} diff --git a/filesystem/filesystem_test.go b/filesystem/filesystem_test.go index d9bf24299..6d0b49016 100644 --- a/filesystem/filesystem_test.go +++ b/filesystem/filesystem_test.go @@ -118,9 +118,9 @@ func TestFileSystemDeps(t *testing.T) { `) // produces "myfilesystem.img" - result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img") + result.ModuleForTests(t, "myfilesystem", "android_common").Output("myfilesystem.img") - fs := result.ModuleForTests("myfilesystem", "android_common").Module().(*filesystem) + fs := result.ModuleForTests(t, "myfilesystem", "android_common").Module().(*filesystem) expected := []string{ "app/myapp/myapp.apk", "bin/foo", @@ -163,7 +163,7 @@ func TestFileSystemFillsLinkerConfigWithStubLibs(t *testing.T) { } `) - module := result.ModuleForTests("myfilesystem", "android_common") + module := result.ModuleForTests(t, "myfilesystem", "android_common") output := module.Output("out/soong/.intermediates/myfilesystem/android_common/linker.config.pb") linkerConfigCommand := output.RuleParams.Command @@ -224,7 +224,7 @@ func TestFileSystemGathersItemsOnlyInSystemPartition(t *testing.T) { } `) - module := result.ModuleForTests("myfilesystem", "android_common").Module().(*systemImage) + module := result.ModuleForTests(t, "myfilesystem", "android_common").Module().(*systemImage) android.AssertDeepEquals(t, "entries should have foo and not bar", []string{"components/foo", "etc/linker.config.pb"}, module.entries) } @@ -236,7 +236,7 @@ func TestAvbGenVbmetaImage(t *testing.T) { partition_name: "input_partition_name", salt: "2222", }`) - cmd := result.ModuleForTests("input_hashdesc", "android_arm64_armv8-a").Rule("avbGenVbmetaImage").RuleParams.Command + cmd := result.ModuleForTests(t, "input_hashdesc", "android_arm64_armv8-a").Rule("avbGenVbmetaImage").RuleParams.Command android.AssertStringDoesContain(t, "Can't find correct --partition_name argument", cmd, "--partition_name input_partition_name") android.AssertStringDoesContain(t, "Can't find --do_not_append_vbmeta_image", @@ -276,7 +276,7 @@ func TestAvbAddHashFooter(t *testing.T) { include_descriptors_from_images: ["input_hashdesc"], } `) - cmd := result.ModuleForTests("myfooter", "android_arm64_armv8-a").Rule("avbAddHashFooter").RuleParams.Command + cmd := result.ModuleForTests(t, "myfooter", "android_arm64_armv8-a").Rule("avbAddHashFooter").RuleParams.Command android.AssertStringDoesContain(t, "Can't find correct --partition_name argument", cmd, "--partition_name mypartition") android.AssertStringDoesContain(t, "Can't find correct --key argument", @@ -331,8 +331,8 @@ func TestFileSystemWithCoverageVariants(t *testing.T) { } `) - filesystem := result.ModuleForTests("myfilesystem", "android_common_cov") - inputs := filesystem.Output("myfilesystem.img").Implicits + filesystem := result.ModuleForTests(t, "myfilesystem", "android_common_cov") + inputs := filesystem.Output("staging_dir.timestamp").Implicits android.AssertStringListContains(t, "filesystem should have libfoo(cov)", inputs.Strings(), "out/soong/.intermediates/libfoo/android_arm64_armv8-a_shared_cov/libfoo.so") @@ -341,7 +341,7 @@ func TestFileSystemWithCoverageVariants(t *testing.T) { "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared_cov/libbar.so") filesystemOutput := filesystem.OutputFiles(result.TestContext, t, "")[0] - prebuiltInput := result.ModuleForTests("prebuilt", "android_arm64_armv8-a").Rule("Cp").Input + prebuiltInput := result.ModuleForTests(t, "prebuilt", "android_arm64_armv8-a").Rule("Cp").Input if filesystemOutput != prebuiltInput { t.Error("prebuilt should use cov variant of filesystem") } @@ -403,7 +403,7 @@ func TestSystemImageDefaults(t *testing.T) { } `) - fs := result.ModuleForTests("system", "android_common").Module().(*systemImage) + fs := result.ModuleForTests(t, "system", "android_common").Module().(*systemImage) expected := []string{ "bin/foo", "lib/libbar.so", @@ -483,7 +483,7 @@ func TestTrackPhonyAsRequiredDep(t *testing.T) { } `) - fs := result.ModuleForTests("fs", "android_common").Module().(*filesystem) + fs := result.ModuleForTests(t, "fs", "android_common").Module().(*filesystem) expected := []string{ "bin/foo", "lib64/libbar.so", @@ -546,7 +546,7 @@ func TestFilterOutUnsupportedArches(t *testing.T) { }, } for _, c := range testcases { - fs := result.ModuleForTests(c.fsName, "android_common").Module().(*filesystem) + fs := result.ModuleForTests(t, c.fsName, "android_common").Module().(*filesystem) for _, e := range c.expected { android.AssertStringListContains(t, "missing entry", fs.entries, e) } @@ -573,7 +573,7 @@ func TestErofsPartition(t *testing.T) { } `) - partition := result.ModuleForTests("erofs_partition", "android_common") + partition := result.ModuleForTests(t, "erofs_partition", "android_common") buildImageConfig := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("prop_pre_processing")) android.AssertStringDoesContain(t, "erofs fs type", buildImageConfig, "fs_type=erofs") android.AssertStringDoesContain(t, "erofs fs type compress algorithm", buildImageConfig, "erofs_default_compressor=lz4hc,9") @@ -589,7 +589,7 @@ func TestF2fsPartition(t *testing.T) { } `) - partition := result.ModuleForTests("f2fs_partition", "android_common") + partition := result.ModuleForTests(t, "f2fs_partition", "android_common") buildImageConfig := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("prop_pre_processing")) android.AssertStringDoesContain(t, "f2fs fs type", buildImageConfig, "fs_type=f2fs") android.AssertStringDoesContain(t, "f2fs fs type sparse", buildImageConfig, "f2fs_sparse_flag=-S") @@ -631,7 +631,7 @@ func TestDoNotPackageCrossPartitionDependencies(t *testing.T) { } `) - partition := result.ModuleForTests("myfilesystem", "android_common") + partition := result.ModuleForTests(t, "myfilesystem", "android_common") fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList")) android.AssertDeepEquals(t, "filesystem with dependencies on different partition", "bin/binfoo\n", fileList) } @@ -650,7 +650,7 @@ func TestUseSharedVariationOfNativeLib(t *testing.T) { } `) - partition := result.ModuleForTests("myfilesystem", "android_common") + partition := result.ModuleForTests(t, "myfilesystem", "android_common") fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList")) android.AssertDeepEquals(t, "cc_library listed in deps", "lib64/bootstrap/libc.so\nlib64/bootstrap/libdl.so\nlib64/bootstrap/libm.so\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo.so\nlib64/libm.so\n", @@ -687,7 +687,7 @@ cc_library { } `) - partition := result.ModuleForTests("myfilesystem", "android_common") + partition := result.ModuleForTests(t, "myfilesystem", "android_common") fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList")) android.AssertDeepEquals(t, "Shared library dep of overridden binary should not be installed", "bin/binfoo1\nlib64/bootstrap/libc.so\nlib64/bootstrap/libdl.so\nlib64/bootstrap/libm.so\nlib64/libc++.so\nlib64/libc.so\nlib64/libdl.so\nlib64/libfoo2.so\nlib64/libm.so\n", @@ -716,7 +716,7 @@ cc_library { } `) - linkerConfigCmd := result.ModuleForTests("myfilesystem", "android_common").Output("out/soong/.intermediates/myfilesystem/android_common/linker.config.pb").RuleParams.Command + linkerConfigCmd := result.ModuleForTests(t, "myfilesystem", "android_common").Output("out/soong/.intermediates/myfilesystem/android_common/linker.config.pb").RuleParams.Command android.AssertStringDoesContain(t, "Could not find linker.config.json file in cmd", linkerConfigCmd, "conv_linker_config proto --force -s linker.config.json") android.AssertStringDoesContain(t, "Could not find stub in `provideLibs`", linkerConfigCmd, "--key provideLibs --value libfoo_has_stubs.so") } @@ -740,7 +740,7 @@ func TestOverrideModulesInDeps(t *testing.T) { } `) - partition := result.ModuleForTests("myfilesystem", "android_common") + partition := result.ModuleForTests(t, "myfilesystem", "android_common") fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList")) android.AssertStringEquals(t, "filesystem with override app", "app/myoverrideapp/myoverrideapp.apk\n", fileList) } diff --git a/filesystem/fsverity_metadata.go b/filesystem/fsverity_metadata.go index a3a2086ce..89da3182a 100644 --- a/filesystem/fsverity_metadata.go +++ b/filesystem/fsverity_metadata.go @@ -21,9 +21,27 @@ import ( "android/soong/android" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) +func init() { + pctx.HostBinToolVariable("fsverity_metadata_generator", "fsverity_metadata_generator") + pctx.HostBinToolVariable("fsverity_manifest_generator", "fsverity_manifest_generator") + pctx.HostBinToolVariable("fsverity", "fsverity") +} + +var ( + buildFsverityMeta = pctx.AndroidStaticRule("build_fsverity_meta", blueprint.RuleParams{ + Command: `$fsverity_metadata_generator --fsverity-path $fsverity --signature none --hash-alg sha256 --output $out $in`, + CommandDeps: []string{"$fsverity_metadata_generator", "$fsverity"}, + }) + buildFsverityManifest = pctx.AndroidStaticRule("build_fsverity_manifest", blueprint.RuleParams{ + Command: `$fsverity_manifest_generator --fsverity-path $fsverity --output $out @$in`, + CommandDeps: []string{"$fsverity_manifest_generator", "$fsverity"}, + }) +) + type fsverityProperties struct { // Patterns of files for fsverity metadata generation. For each matched file, a .fsv_meta file // will be generated and included to the filesystem image. @@ -35,13 +53,57 @@ type fsverityProperties struct { Libs proptools.Configurable[[]string] `android:"path"` } -func (f *filesystem) writeManifestGeneratorListFile(ctx android.ModuleContext, outputPath android.WritablePath, matchedSpecs []android.PackagingSpec, rebasedDir android.OutputPath) { +// Mapping of a given fsverity file, which may be a real file or a symlink, and the on-device +// path it should have relative to the filesystem root. +type fsveritySrcDest struct { + src android.Path + dest string +} + +func (f *filesystem) writeManifestGeneratorListFile( + ctx android.ModuleContext, + outputPath android.WritablePath, + matchedFiles []fsveritySrcDest, + rootDir android.OutputPath, + rebasedDir android.OutputPath, +) []android.Path { + prefix, err := filepath.Rel(rootDir.String(), rebasedDir.String()) + if err != nil { + panic("rebasedDir should be relative to rootDir") + } + if prefix == "." { + prefix = "" + } + if f.PartitionType() == "system_ext" { + // Use the equivalent of $PRODUCT_OUT as the base dir. + // This ensures that the paths in build_manifest.pb contain on-device paths + // e.g. system_ext/framework/javalib.jar + // and not framework/javalib.jar. + // + // Although base-dir is outside the rootdir provided for packaging, this action + // is hermetic since it uses `manifestGeneratorListPath` to filter the files to be written to build_manifest.pb + prefix = "system_ext" + } + + var deps []android.Path var buf strings.Builder - for _, spec := range matchedSpecs { - buf.WriteString(rebasedDir.Join(ctx, spec.RelPathInPackage()).String()) - buf.WriteRune('\n') + for _, spec := range matchedFiles { + src := spec.src.String() + dst := filepath.Join(prefix, spec.dest) + if strings.Contains(src, ",") { + ctx.ModuleErrorf("Path cannot contain a comma: %s", src) + } + if strings.Contains(dst, ",") { + ctx.ModuleErrorf("Path cannot contain a comma: %s", dst) + } + buf.WriteString(src) + buf.WriteString(",") + buf.WriteString(dst) + buf.WriteString("\n") + deps = append(deps, spec.src) } android.WriteFileRuleVerbatim(ctx, outputPath, buf.String()) + return deps } func (f *filesystem) buildFsverityMetadataFiles( @@ -64,69 +126,98 @@ func (f *filesystem) buildFsverityMetadataFiles( return false } - var matchedSpecs []android.PackagingSpec + var matchedFiles []android.PackagingSpec + var matchedSymlinks []android.PackagingSpec for _, relPath := range android.SortedKeys(specs) { if match(relPath) { - matchedSpecs = append(matchedSpecs, specs[relPath]) + spec := specs[relPath] + if spec.SrcPath() != nil { + matchedFiles = append(matchedFiles, spec) + } else if spec.SymlinkTarget() != "" { + matchedSymlinks = append(matchedSymlinks, spec) + } else { + ctx.ModuleErrorf("Expected a file or symlink for fsverity packaging spec") + } } } - if len(matchedSpecs) == 0 { + if len(matchedFiles) == 0 && len(matchedSymlinks) == 0 { return } - fsverityPath := ctx.Config().HostToolPath(ctx, "fsverity") - // STEP 1: generate .fsv_meta - var sb strings.Builder - sb.WriteString("set -e\n") - for _, spec := range matchedSpecs { + var fsverityFileSpecs []fsveritySrcDest + for _, spec := range matchedFiles { + rel := spec.RelPathInPackage() + ".fsv_meta" + outPath := android.PathForModuleOut(ctx, "fsverity/meta_files", rel) + destPath := rebasedDir.Join(ctx, rel) // srcPath is copied by CopySpecsToDir() - srcPath := rebasedDir.Join(ctx, spec.RelPathInPackage()) - destPath := rebasedDir.Join(ctx, spec.RelPathInPackage()+".fsv_meta") - builder.Command(). - BuiltTool("fsverity_metadata_generator"). - FlagWithInput("--fsverity-path ", fsverityPath). - FlagWithArg("--signature ", "none"). - FlagWithArg("--hash-alg ", "sha256"). - FlagWithOutput("--output ", destPath). - Text(srcPath.String()) + ctx.Build(pctx, android.BuildParams{ + Rule: buildFsverityMeta, + Input: spec.SrcPath(), + Output: outPath, + }) + builder.Command().Textf("cp").Input(outPath).Output(destPath) f.appendToEntry(ctx, destPath) *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ SourcePath: destPath, - FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), spec.RelPathInPackage()+".fsv_meta"), + FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), rel), + }) + fsverityFileSpecs = append(fsverityFileSpecs, fsveritySrcDest{ + src: spec.SrcPath(), + dest: spec.RelPathInPackage(), }) } - - fsVerityBaseDir := rootDir.String() - if f.PartitionType() == "system_ext" { - // Use the equivalent of $PRODUCT_OUT as the base dir. - // This ensures that the paths in build_manifest.pb contain on-device paths - // e.g. system_ext/framework/javalib.jar - // and not framework/javalib.jar. - // - // Although base-dir is outside the rootdir provided for packaging, this action - // is hermetic since it uses `manifestGeneratorListPath` to filter the files to be written to build_manifest.pb - fsVerityBaseDir = filepath.Dir(rootDir.String()) + for _, spec := range matchedSymlinks { + rel := spec.RelPathInPackage() + ".fsv_meta" + outPath := android.PathForModuleOut(ctx, "fsverity/meta_files", rel) + destPath := rebasedDir.Join(ctx, rel) + target := spec.SymlinkTarget() + ".fsv_meta" + ctx.Build(pctx, android.BuildParams{ + Rule: android.Symlink, + Output: outPath, + Args: map[string]string{ + "fromPath": target, + }, + }) + builder.Command(). + Textf("cp"). + Flag(ctx.Config().CpPreserveSymlinksFlags()). + Input(outPath). + Output(destPath) + f.appendToEntry(ctx, destPath) + *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ + SymlinkTarget: target, + FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), rel), + }) + // The fsverity manifest tool needs to actually look at the symlink. But symlink + // packagingSpecs are not actually created on disk, at least until the staging dir is + // built for the partition. Create a fake one now so the tool can see it. + realizedSymlink := android.PathForModuleOut(ctx, "fsverity/realized_symlinks", spec.RelPathInPackage()) + ctx.Build(pctx, android.BuildParams{ + Rule: android.Symlink, + Output: realizedSymlink, + Args: map[string]string{ + "fromPath": spec.SymlinkTarget(), + }, + }) + fsverityFileSpecs = append(fsverityFileSpecs, fsveritySrcDest{ + src: realizedSymlink, + dest: spec.RelPathInPackage(), + }) } // STEP 2: generate signed BuildManifest.apk // STEP 2-1: generate build_manifest.pb - manifestGeneratorListPath := android.PathForModuleOut(ctx, "fsverity_manifest.list") - f.writeManifestGeneratorListFile(ctx, manifestGeneratorListPath, matchedSpecs, rebasedDir) - assetsPath := android.PathForModuleOut(ctx, "fsverity_manifest/assets") - manifestPbPath := assetsPath.Join(ctx, "build_manifest.pb") - builder.Command().Text("rm -rf " + assetsPath.String()) - builder.Command().Text("mkdir -p " + assetsPath.String()) - builder.Command(). - BuiltTool("fsverity_manifest_generator"). - FlagWithInput("--fsverity-path ", fsverityPath). - FlagWithArg("--base-dir ", fsVerityBaseDir). - FlagWithArg("--output ", manifestPbPath.String()). - FlagWithInput("@", manifestGeneratorListPath) - - f.appendToEntry(ctx, manifestPbPath) - f.appendToEntry(ctx, manifestGeneratorListPath) + manifestGeneratorListPath := android.PathForModuleOut(ctx, "fsverity/fsverity_manifest.list") + manifestDeps := f.writeManifestGeneratorListFile(ctx, manifestGeneratorListPath, fsverityFileSpecs, rootDir, rebasedDir) + manifestPbPath := android.PathForModuleOut(ctx, "fsverity/build_manifest.pb") + ctx.Build(pctx, android.BuildParams{ + Rule: buildFsverityManifest, + Input: manifestGeneratorListPath, + Implicits: manifestDeps, + Output: manifestPbPath, + }) // STEP 2-2: generate BuildManifest.apk (unsigned) apkNameSuffix := "" @@ -134,8 +225,8 @@ func (f *filesystem) buildFsverityMetadataFiles( //https://source.corp.google.com/h/googleplex-android/platform/build/+/e392d2b486c2d4187b20a72b1c67cc737ecbcca5:core/Makefile;l=3410;drc=ea8f34bc1d6e63656b4ec32f2391e9d54b3ebb6b;bpv=1;bpt=0 apkNameSuffix = "SystemExt" } - apkPath := rebasedDir.Join(ctx, "etc", "security", "fsverity", fmt.Sprintf("BuildManifest%s.apk", apkNameSuffix)) - idsigPath := rebasedDir.Join(ctx, "etc", "security", "fsverity", fmt.Sprintf("BuildManifest%s.apk.idsig", apkNameSuffix)) + apkPath := android.PathForModuleOut(ctx, "fsverity", fmt.Sprintf("BuildManifest%s.apk", apkNameSuffix)) + idsigPath := android.PathForModuleOut(ctx, "fsverity", fmt.Sprintf("BuildManifest%s.apk.idsig", apkNameSuffix)) manifestTemplatePath := android.PathForSource(ctx, "system/security/fsverity/AndroidManifest.xml") libs := android.PathsForModuleSrc(ctx, f.properties.Fsverity.Libs.GetOrDefault(ctx, nil)) @@ -144,12 +235,23 @@ func (f *filesystem) buildFsverityMetadataFiles( minSdkVersion = ctx.Config().PlatformSdkVersion().String() } - unsignedApkCommand := builder.Command(). - Textf("mkdir -p %s && ", filepath.Dir(apkPath.String())). + apkBuilder := android.NewRuleBuilder(pctx, ctx) + + // aapt2 doesn't support adding individual asset files. Create a temp directory to hold asset + // files and pass it to aapt2. + tmpAssetDir := android.PathForModuleOut(ctx, "fsverity/tmp_asset_dir") + stagedManifestPbPath := tmpAssetDir.Join(ctx, "build_manifest.pb") + apkBuilder.Command(). + Text("rm -rf").Text(tmpAssetDir.String()). + Text("&&"). + Text("mkdir -p").Text(tmpAssetDir.String()) + apkBuilder.Command().Text("cp").Input(manifestPbPath).Output(stagedManifestPbPath) + + unsignedApkCommand := apkBuilder.Command(). BuiltTool("aapt2"). Text("link"). FlagWithOutput("-o ", apkPath). - FlagWithArg("-A ", assetsPath.String()) + FlagWithArg("-A ", tmpAssetDir.String()).Implicit(stagedManifestPbPath) for _, lib := range libs { unsignedApkCommand.FlagWithInput("-I ", lib) } @@ -159,26 +261,36 @@ func (f *filesystem) buildFsverityMetadataFiles( FlagWithArg("--version-name ", ctx.Config().AppsDefaultVersionName()). FlagWithInput("--manifest ", manifestTemplatePath). Text(" --rename-manifest-package com.android.security.fsverity_metadata." + f.partitionName()) - *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ - SourcePath: apkPath, - FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), fmt.Sprintf("etc/security/fsverity/BuildManifest%s.apk", apkNameSuffix)), - }) - - f.appendToEntry(ctx, apkPath) // STEP 2-3: sign BuildManifest.apk pemPath, keyPath := ctx.Config().DefaultAppCertificate(ctx) - builder.Command(). + apkBuilder.Command(). BuiltTool("apksigner"). Text("sign"). FlagWithArg("--in ", apkPath.String()). FlagWithInput("--cert ", pemPath). FlagWithInput("--key ", keyPath). ImplicitOutput(idsigPath) + apkBuilder.Build(fmt.Sprintf("%s_fsverity_apk", ctx.ModuleName()), "build fsverity apk") + + // STEP 2-4: Install the apk into the staging directory + installedApkPath := rebasedDir.Join(ctx, "etc", "security", "fsverity", fmt.Sprintf("BuildManifest%s.apk", apkNameSuffix)) + installedIdsigPath := rebasedDir.Join(ctx, "etc", "security", "fsverity", fmt.Sprintf("BuildManifest%s.apk.idsig", apkNameSuffix)) + builder.Command().Text("mkdir -p").Text(filepath.Dir(installedApkPath.String())) + builder.Command().Text("cp").Input(apkPath).Text(installedApkPath.String()) + builder.Command().Text("cp").Input(idsigPath).Text(installedIdsigPath.String()) + + *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ + SourcePath: apkPath, + FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), fmt.Sprintf("etc/security/fsverity/BuildManifest%s.apk", apkNameSuffix)), + }) + + f.appendToEntry(ctx, installedApkPath) + *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{ SourcePath: idsigPath, FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), fmt.Sprintf("etc/security/fsverity/BuildManifest%s.apk.idsig", apkNameSuffix)), }) - f.appendToEntry(ctx, idsigPath) + f.appendToEntry(ctx, installedIdsigPath) } diff --git a/filesystem/super_image.go b/filesystem/super_image.go index 533246220..58c938aee 100644 --- a/filesystem/super_image.go +++ b/filesystem/super_image.go @@ -181,7 +181,7 @@ func (s *superImage) GenerateAndroidBuildActions(ctx android.ModuleContext) { } func (s *superImage) installFileName() string { - return s.BaseModuleName() + ".img" + return "super.img" } func (s *superImage) buildMiscInfo(ctx android.ModuleContext) (android.Path, android.Paths, map[string]FilesystemInfo) { @@ -291,8 +291,6 @@ func (s *superImage) buildMiscInfo(ctx android.ModuleContext) (android.Path, and switch p { case "system": handleSubPartition("system", s.partitionProps.System_partition) - // TODO: add system_other to deps after it can be generated - //getFsInfo("system_other", s.partitionProps.System_other_partition, &subImageInfo.System_other) case "system_dlkm": handleSubPartition("system_dlkm", s.partitionProps.System_dlkm_partition) case "system_ext": @@ -321,8 +319,7 @@ func (s *superImage) buildMiscInfo(ctx android.ModuleContext) (android.Path, and if len(systemOtherFiles) != 1 { ctx.PropertyErrorf("system_other_partition", "Expected 1 output file from module %q", *&s.properties.System_other_partition) } else { - addStr("system_other_image", systemOtherFiles[0].String()) - deps = append(deps, systemOtherFiles[0]) + handleSubPartition("system_other", s.partitionProps.System_other_partition) } } diff --git a/filesystem/system_other.go b/filesystem/system_other.go index 28fe1ce49..1c00dd35e 100644 --- a/filesystem/system_other.go +++ b/filesystem/system_other.go @@ -85,6 +85,7 @@ func (m *systemOtherImage) GenerateAndroidBuildActions(ctx android.ModuleContext output := android.PathForModuleOut(ctx, "system_other.img") stagingDir := android.PathForModuleOut(ctx, "staging_dir") + stagingDirTimestamp := android.PathForModuleOut(ctx, "staging_dir.timestamp") builder := android.NewRuleBuilder(pctx, ctx) builder.Command().Textf("rm -rf %s && mkdir -p %s", stagingDir, stagingDir) @@ -113,6 +114,8 @@ func (m *systemOtherImage) GenerateAndroidBuildActions(ctx android.ModuleContext if len(m.properties.Preinstall_dexpreopt_files_from) > 0 { builder.Command().Textf("touch %s", filepath.Join(stagingDir.String(), "system-other-odex-marker")) } + builder.Command().Textf("touch").Output(stagingDirTimestamp) + builder.Build("assemble_filesystem_staging_dir", "Assemble filesystem staging dir") // Most of the time, if build_image were to call a host tool, it accepts the path to the // host tool in a field in the prop file. However, it doesn't have that option for fec, which @@ -120,6 +123,7 @@ func (m *systemOtherImage) GenerateAndroidBuildActions(ctx android.ModuleContext fec := ctx.Config().HostToolPath(ctx, "fec") pathToolDirs := []string{filepath.Dir(fec.String())} + builder = android.NewRuleBuilder(pctx, ctx) builder.Command(). Textf("PATH=%s:$PATH", strings.Join(pathToolDirs, ":")). BuiltTool("build_image"). @@ -127,11 +131,44 @@ func (m *systemOtherImage) GenerateAndroidBuildActions(ctx android.ModuleContext Input(systemInfo.BuildImagePropFile). Implicits(systemInfo.BuildImagePropFileDeps). Implicit(fec). + Implicit(stagingDirTimestamp). Output(output). Text(stagingDir.String()) builder.Build("build_system_other", "build system other") + // Create a hermetic system_other.img with pinned timestamps + builder = android.NewRuleBuilder(pctx, ctx) + outputHermetic := android.PathForModuleOut(ctx, "for_target_files", "system_other.img") + outputHermeticPropFile := m.propFileForHermeticImg(ctx, builder, systemInfo.BuildImagePropFile) + builder.Command(). + Textf("PATH=%s:$PATH", strings.Join(pathToolDirs, ":")). + BuiltTool("build_image"). + Text(stagingDir.String()). // input directory + Input(outputHermeticPropFile). + Implicits(systemInfo.BuildImagePropFileDeps). + Implicit(fec). + Implicit(stagingDirTimestamp). + Output(outputHermetic). + Text(stagingDir.String()) + + builder.Build("build_system_other_hermetic", "build system other") + + fsInfo := FilesystemInfo{ + Output: output, + OutputHermetic: outputHermetic, + RootDir: stagingDir, + } + + android.SetProvider(ctx, FilesystemProvider, fsInfo) + ctx.SetOutputFiles(android.Paths{output}, "") ctx.CheckbuildFile(output) } + +func (f *systemOtherImage) propFileForHermeticImg(ctx android.ModuleContext, builder *android.RuleBuilder, inputPropFile android.Path) android.Path { + propFilePinnedTimestamp := android.PathForModuleOut(ctx, "for_target_files", "prop") + builder.Command().Textf("cat").Input(inputPropFile).Flag(">").Output(propFilePinnedTimestamp). + Textf(" && echo use_fixed_timestamp=true >> %s", propFilePinnedTimestamp) + return propFilePinnedTimestamp +} diff --git a/filesystem/vbmeta.go b/filesystem/vbmeta.go index 91826b244..e5809d31b 100644 --- a/filesystem/vbmeta.go +++ b/filesystem/vbmeta.go @@ -97,7 +97,7 @@ type ChainedPartitionProperties struct { // Name of the chained partition Name *string - // Rollback index location of the chained partition. Must be 0, 1, 2, etc. Default is the + // Rollback index location of the chained partition. Must be 1, 2, 3, etc. Default is the // index of this partition in the list + 1. Rollback_index_location *int64 @@ -225,8 +225,8 @@ func (v *vbmeta) GenerateAndroidBuildActions(ctx android.ModuleContext) { } ril := info.RollbackIndexLocation - if ril < 0 { - ctx.PropertyErrorf("chained_partitions", "rollback index location must be 0, 1, 2, ...") + if ril < 1 { + ctx.PropertyErrorf("chained_partitions", "rollback index location must be 1, 2, 3, ...") continue } else if seenRils[ril] { ctx.PropertyErrorf("chained_partitions", "Multiple chained partitions with the same rollback index location %d", ril) @@ -241,13 +241,13 @@ func (v *vbmeta) GenerateAndroidBuildActions(ctx android.ModuleContext) { for _, cpm := range v.properties.Chained_partition_metadata { name := proptools.String(cpm.Name) if name == "" { - ctx.PropertyErrorf("chained_partitions", "name must be specified") + ctx.PropertyErrorf("chained_partition_metadata", "name must be specified") continue } - ril := proptools.IntDefault(cpm.Rollback_index_location, -1) - if ril < 0 { - ctx.PropertyErrorf("chained_partition_metadata", "rollback index location must be 0, 1, 2, ...") + ril := proptools.IntDefault(cpm.Rollback_index_location, 0) + if ril < 1 { + ctx.PropertyErrorf("chained_partition_metadata", "rollback index location must be 1, 2, 3, ...") continue } else if seenRils[ril] { ctx.PropertyErrorf("chained_partition_metadata", "Multiple chained partitions with the same rollback index location %d", ril) diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index 63d079125..c2721d29f 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -320,6 +320,26 @@ func (f *filesystemCreator) createBootloaderFilegroup(ctx android.LoadHookContex return bootloaderFilegroupName, true } +func (f *filesystemCreator) createReleaseToolsFilegroup(ctx android.LoadHookContext) (string, bool) { + releaseToolsDir := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse.ReleaseToolsExtensionDir + if releaseToolsDir == "" { + return "", false + } + + releaseToolsFilegroupName := generatedModuleName(ctx.Config(), "releasetools") + filegroupProps := &struct { + Name *string + Srcs []string + Visibility []string + }{ + Name: proptools.StringPtr(releaseToolsFilegroupName), + Srcs: []string{"releasetools.py"}, + Visibility: []string{"//visibility:public"}, + } + ctx.CreateModuleInDirectory(android.FileGroupFactory, releaseToolsDir, filegroupProps) + return releaseToolsFilegroupName, true +} + func (f *filesystemCreator) createDeviceModule( ctx android.LoadHookContext, partitions allGeneratedPartitionData, @@ -381,12 +401,19 @@ func (f *filesystemCreator) createDeviceModule( partitionProps.Vbmeta_partitions = vbmetaPartitions deviceProps := &filesystem.DeviceProperties{ - Main_device: proptools.BoolPtr(true), - Ab_ota_updater: proptools.BoolPtr(ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse.AbOtaUpdater), + Main_device: proptools.BoolPtr(true), + Ab_ota_updater: proptools.BoolPtr(ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse.AbOtaUpdater), + Ab_ota_partitions: ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse.AbOtaPartitions, + Ab_ota_postinstall_config: ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse.AbOtaPostInstallConfig, + Ramdisk_node_list: proptools.StringPtr(":ramdisk_node_list"), } + if bootloader, ok := f.createBootloaderFilegroup(ctx); ok { deviceProps.Bootloader = proptools.StringPtr(":" + bootloader) } + if releaseTools, ok := f.createReleaseToolsFilegroup(ctx); ok { + deviceProps.Releasetools_extension = proptools.StringPtr(":" + releaseTools) + } ctx.CreateModule(filesystem.AndroidDeviceFactory, baseProps, partitionProps, deviceProps) } @@ -1037,13 +1064,6 @@ func getAvbInfo(config android.Config, partitionType string) avbInfo { } result.avbRollbackIndex = &parsed } - if specificPartitionVars.BoardAvbRollbackIndex != "" { - parsed, err := strconv.ParseInt(specificPartitionVars.BoardAvbRollbackIndex, 10, 64) - if err != nil { - panic(fmt.Sprintf("Rollback index must be an int, got %s", specificPartitionVars.BoardAvbRollbackIndex)) - } - result.avbRollbackIndex = &parsed - } if specificPartitionVars.BoardAvbRollbackIndexLocation != "" { parsed, err := strconv.ParseInt(specificPartitionVars.BoardAvbRollbackIndexLocation, 10, 64) if err != nil { diff --git a/fsgen/filesystem_creator_test.go b/fsgen/filesystem_creator_test.go index 565760882..418e48bcd 100644 --- a/fsgen/filesystem_creator_test.go +++ b/fsgen/filesystem_creator_test.go @@ -15,17 +15,29 @@ package fsgen import ( + "strings" + "testing" + "android/soong/android" "android/soong/etc" "android/soong/filesystem" "android/soong/java" - "testing" "github.com/google/blueprint/proptools" ) var prepareForTestWithFsgenBuildComponents = android.FixtureRegisterWithContext(registerBuildComponents) +var prepareMockRamdiksNodeList = android.FixtureMergeMockFs(android.MockFS{ + "ramdisk_node_list/ramdisk_node_list": nil, + "ramdisk_node_list/Android.bp": []byte(` + filegroup { + name: "ramdisk_node_list", + srcs: ["ramdisk_node_list"], + } + `), +}) + func TestFileSystemCreatorSystemImageProps(t *testing.T) { result := android.GroupFixturePreparers( android.PrepareForIntegrationTestWithAndroid, @@ -45,6 +57,7 @@ func TestFileSystemCreatorSystemImageProps(t *testing.T) { }, } }), + prepareMockRamdiksNodeList, android.FixtureMergeMockFs(android.MockFS{ "external/avb/test/data/testkey_rsa4096.pem": nil, "external/avb/test/Android.bp": []byte(` @@ -61,7 +74,7 @@ func TestFileSystemCreatorSystemImageProps(t *testing.T) { }), ).RunTest(t) - fooSystem := result.ModuleForTests("test_product_generated_system_image", "android_common").Module().(interface { + fooSystem := result.ModuleForTests(t, "test_product_generated_system_image", "android_common").Module().(interface { FsProps() filesystem.FilesystemProperties }) android.AssertBoolEquals( @@ -114,6 +127,7 @@ func TestFileSystemCreatorSetPartitionDeps(t *testing.T) { }, } }), + prepareMockRamdiksNodeList, android.FixtureMergeMockFs(android.MockFS{ "external/avb/test/data/testkey_rsa4096.pem": nil, "build/soong/fsgen/Android.bp": []byte(` @@ -170,6 +184,7 @@ func TestFileSystemCreatorDepsWithNamespace(t *testing.T) { } }), android.PrepareForNativeBridgeEnabled, + prepareMockRamdiksNodeList, android.FixtureMergeMockFs(android.MockFS{ "external/avb/test/data/testkey_rsa4096.pem": nil, "build/soong/fsgen/Android.bp": []byte(` @@ -198,14 +213,14 @@ func TestFileSystemCreatorDepsWithNamespace(t *testing.T) { ).RunTest(t) var packagingProps android.PackagingProperties - for _, prop := range result.ModuleForTests("test_product_generated_system_image", "android_common").Module().GetProperties() { + for _, prop := range result.ModuleForTests(t, "test_product_generated_system_image", "android_common").Module().GetProperties() { if packagingPropStruct, ok := prop.(*android.PackagingProperties); ok { packagingProps = *packagingPropStruct } } moduleDeps := packagingProps.Multilib.Lib64.Deps - eval := result.ModuleForTests("test_product_generated_system_image", "android_common").Module().ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext)) + eval := result.ModuleForTests(t, "test_product_generated_system_image", "android_common").Module().ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext)) android.AssertStringListContains( t, "Generated system image expected to depend on \"bar\" defined in \"a/b\" namespace", @@ -227,6 +242,7 @@ func TestRemoveOverriddenModulesFromDeps(t *testing.T) { android.PrepareForTestWithAllowMissingDependencies, prepareForTestWithFsgenBuildComponents, java.PrepareForTestWithJavaBuildComponents, + prepareMockRamdiksNodeList, android.FixtureMergeMockFs(android.MockFS{ "external/avb/test/data/testkey_rsa4096.pem": nil, "build/soong/fsgen/Android.bp": []byte(` @@ -279,6 +295,7 @@ func TestPrebuiltEtcModuleGen(t *testing.T) { }, } }), + prepareMockRamdiksNodeList, android.FixtureMergeMockFs(android.MockFS{ "external/avb/test/data/testkey_rsa4096.pem": nil, "build/soong/fsgen/Android.bp": []byte(` @@ -304,7 +321,7 @@ func TestPrebuiltEtcModuleGen(t *testing.T) { } // check generated prebuilt_* module type install path and install partition - generatedModule := result.ModuleForTests("system-frameworks_base_config-etc-0", "android_arm64_armv8-a").Module() + generatedModule := result.ModuleForTests(t, "system-frameworks_base_config-etc-0", "android_arm64_armv8-a").Module() etcModule, _ := generatedModule.(*etc.PrebuiltEtc) android.AssertStringEquals( t, @@ -322,7 +339,7 @@ func TestPrebuiltEtcModuleGen(t *testing.T) { ) // check generated prebuilt_* module specifies correct relative_install_path property - generatedModule = result.ModuleForTests("system-frameworks_base_data_keyboards-usr_keylayout_subdir-0", "android_arm64_armv8-a").Module() + generatedModule = result.ModuleForTests(t, "system-frameworks_base_data_keyboards-usr_keylayout_subdir-0", "android_arm64_armv8-a").Module() etcModule, _ = generatedModule.(*etc.PrebuiltEtc) android.AssertStringEquals( t, @@ -332,16 +349,16 @@ func TestPrebuiltEtcModuleGen(t *testing.T) { ) // check that prebuilt_* module is not generated for non existing source file - android.AssertPanicMessageContains( + android.AssertStringEquals( t, "prebuilt_* module not generated for non existing source file", - "failed to find module \"system-some_non_existing-etc-0\"", - func() { result.ModuleForTests("system-some_non_existing-etc-0", "android_arm64_armv8-a") }, + "", + strings.Join(result.ModuleVariantsForTests("system-some_non_existing-etc-0"), ","), ) // check that duplicate src file can exist in PRODUCT_COPY_FILES and generates separate modules - generatedModule0 := result.ModuleForTests("product-device_sample_etc-etc-0", "android_arm64_armv8-a").Module() - generatedModule1 := result.ModuleForTests("product-device_sample_etc-etc-1", "android_arm64_armv8-a").Module() + generatedModule0 := result.ModuleForTests(t, "product-device_sample_etc-etc-0", "android_arm64_armv8-a").Module() + generatedModule1 := result.ModuleForTests(t, "product-device_sample_etc-etc-1", "android_arm64_armv8-a").Module() // check that generated prebuilt_* module sets correct srcs and dsts property eval := generatedModule0.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext)) diff --git a/genrule/genrule.go b/genrule/genrule.go index 65f74ce0f..6bd1fcc8d 100644 --- a/genrule/genrule.go +++ b/genrule/genrule.go @@ -281,6 +281,7 @@ func isModuleInBuildNumberAllowlist(ctx android.ModuleContext) bool { "hardware/google/camera/common/hal/aidl_service:aidl_camera_build_version", "tools/tradefederation/core:tradefed_zip", "vendor/google/services/LyricCameraHAL/src/apex:com.google.pixel.camera.hal.manifest", + "vendor/google_tradefederation/core:gen_google_tradefed_zip", // go/keep-sorted end } allowlistMap := make(map[string]bool, len(allowlist)) @@ -726,11 +727,8 @@ func (g *Module) AndroidMk() android.AndroidMkData { var _ android.ApexModule = (*Module)(nil) // Implements android.ApexModule -func (g *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - // Because generated outputs are checked by client modules(e.g. cc_library, ...) - // we can safely ignore the check here. - return nil +func (m *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } func generatorFactory(taskGenerator taskFunc, props ...interface{}) *Module { diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go index 688db0761..dcec2971b 100644 --- a/genrule/genrule_test.go +++ b/genrule/genrule_test.go @@ -515,7 +515,7 @@ func TestGenruleHashInputs(t *testing.T) { for _, test := range testcases { t.Run(test.name, func(t *testing.T) { - gen := result.ModuleForTests(test.name, "") + gen := result.ModuleForTests(t, test.name, "") manifest := android.RuleBuilderSboxProtoForTests(t, result.TestContext, gen.Output("genrule.sbox.textproto")) hash := manifest.Commands[0].GetInputHash() @@ -643,7 +643,7 @@ func TestGenSrcs(t *testing.T) { ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(expectedErrors)). RunTestWithBp(t, testGenruleBp()+bp) - mod := result.ModuleForTests("gen", "") + mod := result.ModuleForTests(t, "gen", "") if expectedErrors != nil { return } @@ -719,7 +719,7 @@ func TestGenruleAllowMissingDependencies(t *testing.T) { ctx.SetAllowMissingDependencies(true) })).RunTestWithBp(t, bp) - gen := result.ModuleForTests("gen", "").Output("out") + gen := result.ModuleForTests(t, "gen", "").Output("out") if gen.Rule != android.ErrorRule { t.Errorf("Expected missing dependency error rule for gen, got %q", gen.Rule.String()) } @@ -750,15 +750,15 @@ func TestGenruleOutputFiles(t *testing.T) { android.AssertPathsRelativeToTopEquals(t, "genrule.tag with output", []string{"out/soong/.intermediates/gen/gen/foo"}, - result.ModuleForTests("gen_foo", "").Module().(*useSource).srcs) + result.ModuleForTests(t, "gen_foo", "").Module().(*useSource).srcs) android.AssertPathsRelativeToTopEquals(t, "genrule.tag with output in subdir", []string{"out/soong/.intermediates/gen/gen/sub/bar"}, - result.ModuleForTests("gen_bar", "").Module().(*useSource).srcs) + result.ModuleForTests(t, "gen_bar", "").Module().(*useSource).srcs) android.AssertPathsRelativeToTopEquals(t, "genrule.tag with all", []string{"out/soong/.intermediates/gen/gen/foo", "out/soong/.intermediates/gen/gen/sub/bar"}, - result.ModuleForTests("gen_all", "").Module().(*useSource).srcs) + result.ModuleForTests(t, "gen_all", "").Module().(*useSource).srcs) } func TestGenruleInterface(t *testing.T) { diff --git a/golang/golang_test.go b/golang/golang_test.go index d555d144c..89a8761a5 100644 --- a/golang/golang_test.go +++ b/golang/golang_test.go @@ -45,7 +45,7 @@ func TestGolang(t *testing.T) { }), ).RunTestWithBp(t, bp) - bin := result.ModuleForTests("gobin", result.Config.BuildOSTarget.String()) + bin := result.ModuleForTests(t, "gobin", result.Config.BuildOSTarget.String()) expected := "^out/host/" + result.Config.PrebuiltOS() + "/bin/go/gobin/?[^/]*/obj/gobin$" actual := android.PathsRelativeToTop(bin.OutputFiles(result.TestContext, t, "")) diff --git a/java/Android.bp b/java/Android.bp index 885e6825a..911af8336 100644 --- a/java/Android.bp +++ b/java/Android.bp @@ -51,6 +51,7 @@ bootstrap_go_package { "gen.go", "generated_java_library.go", "genrule.go", + "genrule_combiner.go", "hiddenapi.go", "hiddenapi_modular.go", "hiddenapi_monolithic.go", @@ -95,6 +96,7 @@ bootstrap_go_package { "droiddoc_test.go", "droidstubs_test.go", "fuzz_test.go", + "genrule_combiner_test.go", "genrule_test.go", "generated_java_library_test.go", "hiddenapi_singleton_test.go", diff --git a/java/aar.go b/java/aar.go index 0a5a4c4d7..f7c5c13de 100644 --- a/java/aar.go +++ b/java/aar.go @@ -1625,14 +1625,21 @@ var _ UsesLibraryDependency = (*AARImport)(nil) var _ android.ApexModule = (*AARImport)(nil) // Implements android.ApexModule -func (a *AARImport) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { - return a.depIsInSameApex(tag) +func (m *AARImport) GetDepInSameApexChecker() android.DepInSameApexChecker { + return AARImportDepInSameApexChecker{} +} + +type AARImportDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m AARImportDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { + return depIsInSameApex(tag) } // Implements android.ApexModule -func (a *AARImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - return nil +func (a *AARImport) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } var _ android.PrebuiltInterface = (*AARImport)(nil) diff --git a/java/aar_test.go b/java/aar_test.go index 3ac228d35..088ad6c92 100644 --- a/java/aar_test.go +++ b/java/aar_test.go @@ -53,7 +53,7 @@ func TestAarImportProducesJniPackages(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() appMod := ctx.Module(tc.name, "android_common") - appTestMod := ctx.ModuleForTests(tc.name, "android_common") + appTestMod := ctx.ModuleForTests(t, tc.name, "android_common") info, ok := android.OtherModuleProvider(ctx, appMod, JniPackageProvider) if !ok { @@ -117,7 +117,7 @@ func TestLibraryFlagsPackages(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") // android_library module depends on aconfig_declarations listed in flags_packages android.AssertBoolEquals(t, "foo expected to depend on bar", true, @@ -159,9 +159,9 @@ func TestAndroidLibraryOutputFilesRel(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") - bar := result.ModuleForTests("bar", "android_common") - baz := result.ModuleForTests("baz", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") + bar := result.ModuleForTests(t, "bar", "android_common") + baz := result.ModuleForTests(t, "baz", "android_common") fooOutputPaths := foo.OutputFiles(result.TestContext, t, "") barOutputPaths := bar.OutputFiles(result.TestContext, t, "") diff --git a/java/android_manifest_test.go b/java/android_manifest_test.go index edb22fcb7..ce227b9c8 100644 --- a/java/android_manifest_test.go +++ b/java/android_manifest_test.go @@ -81,7 +81,7 @@ func TestManifestMerger(t *testing.T) { result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, bp) - manifestMergerRule := result.ModuleForTests("app", "android_common").Rule("manifestMerger") + manifestMergerRule := result.ModuleForTests(t, "app", "android_common").Rule("manifestMerger") android.AssertPathRelativeToTopEquals(t, "main manifest", "out/soong/.intermediates/app/android_common/manifest_fixer/AndroidManifest.xml", manifestMergerRule.Input) @@ -129,7 +129,7 @@ func TestManifestValuesApplicationIdSetsPackageName(t *testing.T) { result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, bp) - manifestMergerRule := result.ModuleForTests("test", "android_common").Rule("manifestMerger") + manifestMergerRule := result.ModuleForTests(t, "test", "android_common").Rule("manifestMerger") android.AssertStringMatches(t, "manifest merger args", manifestMergerRule.Args["args"], diff --git a/java/androidmk.go b/java/androidmk.go index f069e7590..c9de7e6d2 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -120,6 +120,14 @@ func (library *Library) AndroidMkEntries() []android.AndroidMkEntries { } }, }, + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string) { + if library.apiXmlFile != nil { + fmt.Fprintf(w, "$(call declare-1p-target,%s,)\n", library.apiXmlFile.String()) + fmt.Fprintf(w, "$(eval $(call copy-one-file,%s,$(TARGET_OUT_COMMON_INTERMEDIATES)/%s))\n", library.apiXmlFile.String(), library.apiXmlFile.Base()) + } + }, + }, }) } @@ -552,8 +560,6 @@ func (dstubs *Droidstubs) AndroidMkEntries() []android.AndroidMkEntries { func(w io.Writer, name, prefix, moduleDir string) { if dstubs.apiLintTimestamp != nil { 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") fmt.Fprintf(w, "$(call declare-0p-target,%s)\n", dstubs.apiLintReport.String()) } } diff --git a/java/androidmk_test.go b/java/androidmk_test.go index 9306e72a3..b4b13b11a 100644 --- a/java/androidmk_test.go +++ b/java/androidmk_test.go @@ -32,7 +32,7 @@ func TestRequired(t *testing.T) { } `) - mod := ctx.ModuleForTests("foo", "android_common").Module() + mod := ctx.ModuleForTests(t, "foo", "android_common").Module() entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0] expected := []string{"libfoo"} @@ -52,7 +52,7 @@ func TestHostdex(t *testing.T) { } `) - mod := ctx.ModuleForTests("foo", "android_common").Module() + mod := ctx.ModuleForTests(t, "foo", "android_common").Module() entriesList := android.AndroidMkEntriesForTest(t, ctx, mod) if len(entriesList) != 2 { t.Errorf("two entries are expected, but got %d", len(entriesList)) @@ -84,7 +84,7 @@ func TestHostdexRequired(t *testing.T) { } `) - mod := ctx.ModuleForTests("foo", "android_common").Module() + mod := ctx.ModuleForTests(t, "foo", "android_common").Module() entriesList := android.AndroidMkEntriesForTest(t, ctx, mod) if len(entriesList) != 2 { t.Errorf("two entries are expected, but got %d", len(entriesList)) @@ -120,7 +120,7 @@ func TestHostdexSpecificRequired(t *testing.T) { } `) - mod := ctx.ModuleForTests("foo", "android_common").Module() + mod := ctx.ModuleForTests(t, "foo", "android_common").Module() entriesList := android.AndroidMkEntriesForTest(t, ctx, mod) if len(entriesList) != 2 { t.Errorf("two entries are expected, but got %d", len(entriesList)) @@ -158,7 +158,7 @@ func TestJavaSdkLibrary_RequireXmlPermissionFile(t *testing.T) { `) // Verify the existence of internal modules - result.ModuleForTests("foo-shared_library.xml", "android_common") + result.ModuleForTests(t, "foo-shared_library.xml", "android_common") testCases := []struct { moduleName string @@ -168,7 +168,7 @@ func TestJavaSdkLibrary_RequireXmlPermissionFile(t *testing.T) { {"foo-no_shared_library", []string{"foo-no_shared_library.impl"}}, } for _, tc := range testCases { - mod := result.ModuleForTests(tc.moduleName, "android_common").Module() + mod := result.ModuleForTests(t, tc.moduleName, "android_common").Module() entries := android.AndroidMkEntriesForTest(t, result.TestContext, mod)[0] actual := entries.EntryMap["LOCAL_REQUIRED_MODULES"] if !reflect.DeepEqual(tc.expected, actual) { @@ -205,7 +205,7 @@ func TestAndroidTestHelperApp_LocalDisableTestConfig(t *testing.T) { } `) - mod := ctx.ModuleForTests("foo", "android_common").Module() + mod := ctx.ModuleForTests(t, "foo", "android_common").Module() entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0] expected := []string{"true"} @@ -254,7 +254,7 @@ func TestGetOverriddenPackages(t *testing.T) { } for _, expected := range expectedVariants { - mod := ctx.ModuleForTests(expected.name, expected.variantName).Module() + mod := ctx.ModuleForTests(t, expected.name, expected.variantName).Module() entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0] actual := entries.EntryMap["LOCAL_OVERRIDES_PACKAGES"] @@ -304,7 +304,7 @@ func TestJniAsRequiredDeps(t *testing.T) { } for _, tc := range testcases { - mod := ctx.ModuleForTests(tc.name, "android_common").Module() + mod := ctx.ModuleForTests(t, tc.name, "android_common").Module() entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, mod)[0] required := entries.EntryMap["LOCAL_REQUIRED_MODULES"] android.AssertDeepEquals(t, "unexpected required deps", tc.expected, required) diff --git a/java/app.go b/java/app.go index abbf034fa..89d688d62 100644 --- a/java/app.go +++ b/java/app.go @@ -512,10 +512,14 @@ func (a *AndroidApp) checkJniLibsSdkVersion(ctx android.ModuleContext, minSdkVer // The domain of cc.sdk_version is "current" and <number> // We can rely on android.SdkSpec to convert it to <number> so that "current" is // handled properly regardless of sdk finalization. - jniSdkVersion, err := android.SdkSpecFrom(ctx, commonInfo.MinSdkVersion).EffectiveVersion(ctx) + ver := "" + if !commonInfo.MinSdkVersion.IsPlatform { + ver = commonInfo.MinSdkVersion.ApiLevel.String() + } + jniSdkVersion, err := android.SdkSpecFrom(ctx, ver).EffectiveVersion(ctx) if err != nil || minSdkVersion.LessThan(jniSdkVersion) { ctx.OtherModuleErrorf(m, "min_sdk_version(%v) is higher than min_sdk_version(%v) of the containing android_app(%v)", - commonInfo.MinSdkVersion, minSdkVersion, ctx.ModuleName()) + ver, minSdkVersion, ctx.ModuleName()) return } @@ -1256,7 +1260,7 @@ func (a *AndroidApp) WalkPayloadDeps(ctx android.BaseModuleContext, do android.P // TODO(ccross): Should this use android.DepIsInSameApex? Right now it is applying the android app // heuristics to every transitive dependency, when it should probably be using the heuristics of the // immediate parent. - isExternal := !a.OutgoingDepIsInSameApex(ctx.OtherModuleDependencyTag(child)) + isExternal := !a.GetDepInSameApexChecker().OutgoingDepIsInSameApex(ctx.OtherModuleDependencyTag(child)) if am, ok := child.(android.ApexModule); ok { if !do(ctx, parent, am, isExternal) { return false @@ -1277,7 +1281,7 @@ func (a *AndroidApp) buildAppDependencyInfo(ctx android.ModuleContext) { // Skip dependencies that are only available to APEXes; they are developed with updatability // in mind and don't need manual approval. - if to.(android.ApexModule).NotAvailableForPlatform() { + if android.OtherModuleProviderOrDefault(ctx, to, android.CommonModuleInfoKey).NotAvailableForPlatform { return true } @@ -1287,18 +1291,9 @@ func (a *AndroidApp) buildAppDependencyInfo(ctx android.ModuleContext) { depsInfo[depName] = info } else { toMinSdkVersion := "(no version)" - if m, ok := to.(interface { - MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel - }); ok { - if v := m.MinSdkVersion(ctx); !v.IsNone() { - toMinSdkVersion = v.String() - } - } else if m, ok := to.(interface{ MinSdkVersion() string }); ok { - // TODO(b/175678607) eliminate the use of MinSdkVersion returning - // string - if v := m.MinSdkVersion(); v != "" { - toMinSdkVersion = v - } + if info, ok := android.OtherModuleProvider(ctx, to, android.CommonModuleInfoKey); ok && + !info.MinSdkVersion.IsPlatform && info.MinSdkVersion.ApiLevel != nil { + toMinSdkVersion = info.MinSdkVersion.ApiLevel.String() } depsInfo[depName] = android.ApexModuleDepInfo{ To: depName, @@ -1333,11 +1328,19 @@ func (a *AndroidApp) getCertString(ctx android.BaseModuleContext) string { return a.overridableAppProperties.Certificate.GetOrDefault(ctx, "") } -func (a *AndroidApp) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { +func (m *AndroidApp) GetDepInSameApexChecker() android.DepInSameApexChecker { + return AppDepInSameApexChecker{} +} + +type AppDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m AppDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { if IsJniDepTag(tag) { return true } - return a.Library.OutgoingDepIsInSameApex(tag) + return depIsInSameApex(tag) } func (a *AndroidApp) Privileged() bool { diff --git a/java/app_import.go b/java/app_import.go index 352e995e2..919266f28 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -628,7 +628,15 @@ func (a *AndroidAppImport) Privileged() bool { return Bool(a.properties.Privileged) } -func (a *AndroidAppImport) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { +func (m *AndroidAppImport) GetDepInSameApexChecker() android.DepInSameApexChecker { + return AppImportDepInSameApexChecker{} +} + +type AppImportDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m AppImportDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { // android_app_import might have extra dependencies via uses_libs property. // Don't track the dependency as we don't automatically add those libraries // to the classpath. It should be explicitly added to java_libs property of APEX @@ -646,10 +654,8 @@ func (a *AndroidAppImport) MinSdkVersion(ctx android.EarlyModuleContext) android var _ android.ApexModule = (*AndroidAppImport)(nil) // Implements android.ApexModule -func (j *AndroidAppImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - // Do not check for prebuilts against the min_sdk_version of enclosing APEX - return nil +func (m *AndroidAppImport) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } func createVariantGroupType(variants []string, variantGroupName string) reflect.Type { @@ -772,9 +778,27 @@ type AndroidTestImport struct { func (a *AndroidTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.generateAndroidBuildActions(ctx) + a.updateModuleInfoJSON(ctx) + a.data = android.PathsForModuleSrc(ctx, a.testProperties.Data) } +func (a *AndroidTestImport) updateModuleInfoJSON(ctx android.ModuleContext) { + moduleInfoJSON := ctx.ModuleInfoJSON() + moduleInfoJSON.Class = []string{"APPS"} + moduleInfoJSON.CompatibilitySuites = []string{"null-suite"} + if len(a.testProperties.Test_suites) > 0 { + moduleInfoJSON.CompatibilitySuites = a.testProperties.Test_suites + } + moduleInfoJSON.SystemSharedLibs = []string{"none"} + moduleInfoJSON.Tags = []string{"tests"} + moduleInfoJSON.RegisterNameOverride = a.BaseModuleName() + testConfig := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "AndroidTest.xml") + if testConfig.Valid() { + moduleInfoJSON.TestConfig = []string{testConfig.String()} + } +} + func (a *AndroidTestImport) InstallInTestcases() bool { return true } diff --git a/java/app_import_test.go b/java/app_import_test.go index 52ae71979..2600767c1 100644 --- a/java/app_import_test.go +++ b/java/app_import_test.go @@ -38,7 +38,7 @@ func TestAndroidAppImport(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") // Check dexpreopt outputs. if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || @@ -78,7 +78,7 @@ func TestAndroidAppImportWithDefaults(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") // Check dexpreopt outputs. if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || @@ -113,7 +113,7 @@ func TestAndroidAppImport_NoDexPreopt(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") // Check dexpreopt outputs. They shouldn't exist. if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule != nil || @@ -141,7 +141,7 @@ func TestAndroidAppImport_Presigned(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") // Check dexpreopt outputs. if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || @@ -181,7 +181,7 @@ func TestAndroidAppImport_SigningLineage(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") signedApk := variant.Output("signed/foo.apk") // Check certificates @@ -223,7 +223,7 @@ func TestAndroidAppImport_SigningLineageFilegroup(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") signedApk := variant.Output("signed/foo.apk") // Check cert signing lineage flag. @@ -253,7 +253,7 @@ func TestAndroidAppImport_DefaultDevCert(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") // Check dexpreopt outputs. if variant.MaybeOutput("dexpreopt/foo/oat/arm64/package.vdex").Rule == nil || @@ -349,7 +349,7 @@ func TestAndroidAppImport_DpiVariants(t *testing.T) { }), ).RunTestWithBp(t, bp) - variant := result.ModuleForTests("foo", "android_common") + variant := result.ModuleForTests(t, "foo", "android_common") input := variant.Output("jnis-uncompressed/foo.apk").Input.String() if strings.HasSuffix(input, test.expected) { t.Errorf("wrong src apk, expected: %q got: %q", test.expected, input) @@ -433,7 +433,7 @@ func TestAndroidAppImport_Filename(t *testing.T) { } for _, test := range testCases { - variant := ctx.ModuleForTests(test.name, "android_common") + variant := ctx.ModuleForTests(t, test.name, "android_common") if variant.MaybeOutput(test.expected).Rule == nil { t.Errorf("can't find output named %q - all outputs: %v", test.expected, variant.AllOutputs()) } @@ -586,7 +586,7 @@ func TestAndroidAppImport_ArchVariants(t *testing.T) { t.Parallel() ctx, _ := testJava(t, test.bp) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") if test.expected == "" { if variant.Module().Enabled(android.PanickingConfigAndErrorContext(ctx)) { t.Error("module should have been disabled, but wasn't") @@ -665,7 +665,7 @@ func TestAndroidAppImport_SoongConfigVariables(t *testing.T) { }), ).RunTestWithBp(t, test.bp).TestContext - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") if test.expected == "" { if variant.Module().Enabled(android.PanickingConfigAndErrorContext(ctx)) { t.Error("module should have been disabled, but wasn't") @@ -704,7 +704,7 @@ func TestAndroidAppImport_overridesDisabledAndroidApp(t *testing.T) { } `) - variant := ctx.ModuleForTests("prebuilt_foo", "android_common") + variant := ctx.ModuleForTests(t, "prebuilt_foo", "android_common") a := variant.Module().(*AndroidAppImport) // The prebuilt module should still be enabled and active even if the source-based counterpart // is disabled. @@ -765,7 +765,7 @@ func TestAndroidAppImport_relativeInstallPath(t *testing.T) { t.Run(testCase.name, func(t *testing.T) { t.Parallel() ctx, _ := testJava(t, bp) - mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*AndroidAppImport) + mod := ctx.ModuleForTests(t, testCase.name, "android_common").Module().(*AndroidAppImport) android.AssertPathRelativeToTopEquals(t, testCase.errorMessage, testCase.expectedInstallPath, mod.installPath) }) } @@ -782,7 +782,7 @@ func TestAndroidAppImport_ExtractApk(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") extractRuleArgs := variant.Output("extract-apk/foo.apk").BuildParams.Args if extractRuleArgs["extract_apk"] != "extract_path/sub_app.apk" { t.Errorf("Unexpected extract apk args: %s", extractRuleArgs["extract_apk"]) @@ -801,7 +801,7 @@ func TestAndroidTestImport(t *testing.T) { } `) - test := ctx.ModuleForTests("foo", "android_common").Module().(*AndroidTestImport) + test := ctx.ModuleForTests(t, "foo", "android_common").Module().(*AndroidTestImport) // Check android mks. entries := android.AndroidMkEntriesForTest(t, ctx, test)[0] @@ -839,13 +839,13 @@ func TestAndroidTestImport_NoJinUncompressForPresigned(t *testing.T) { } `) - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") jniRule := variant.Output("jnis-uncompressed/foo.apk").BuildParams.Rule.String() if jniRule == android.Cp.String() { t.Errorf("Unexpected JNI uncompress rule command: %s", jniRule) } - variant = ctx.ModuleForTests("foo_presigned", "android_common") + variant = ctx.ModuleForTests(t, "foo_presigned", "android_common") jniRule = variant.Output("jnis-uncompressed/foo_presigned.apk").BuildParams.Rule.String() if jniRule != android.Cp.String() { t.Errorf("Unexpected JNI uncompress rule: %s", jniRule) @@ -867,7 +867,7 @@ func TestAndroidTestImport_Preprocessed(t *testing.T) { `) apkName := "foo.apk" - variant := ctx.ModuleForTests("foo", "android_common") + variant := ctx.ModuleForTests(t, "foo", "android_common") jniRule := variant.Output("jnis-uncompressed/" + apkName).BuildParams.Rule.String() if jniRule != android.Cp.String() { t.Errorf("Unexpected JNI uncompress rule: %s", jniRule) @@ -912,7 +912,7 @@ func TestAndroidAppImport_Preprocessed(t *testing.T) { // non-privileged app apkName := "foo.apk" - variant := result.ModuleForTests("foo", "android_common") + variant := result.ModuleForTests(t, "foo", "android_common") outputBuildParams := variant.Output(apkName).BuildParams if outputBuildParams.Rule.String() != android.Cp.String() { t.Errorf("Unexpected prebuilt android_app_import rule: %s", outputBuildParams.Rule.String()) @@ -934,7 +934,7 @@ func TestAndroidAppImport_Preprocessed(t *testing.T) { // privileged app apkName = "bar.apk" - variant = result.ModuleForTests("bar", "android_common") + variant = result.ModuleForTests(t, "bar", "android_common") outputBuildParams = variant.Output(apkName).BuildParams if outputBuildParams.Rule.String() != android.Cp.String() { t.Errorf("Unexpected prebuilt android_app_import rule: %s", outputBuildParams.Rule.String()) @@ -1003,7 +1003,7 @@ func TestAndroidTestImport_UncompressDex(t *testing.T) { }), ).RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") actual := foo.MaybeRule("uncompress-dex").Rule != nil expect := !unbundled @@ -1047,7 +1047,7 @@ func TestAppImportMissingCertificateAllowMissingDependencies(t *testing.T) { certificate: ":missing_certificate", }`) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") fooApk := foo.Output("signed/foo.apk") if fooApk.Rule != android.ErrorRule { t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String()) diff --git a/java/app_set_test.go b/java/app_set_test.go index cc7af042b..9b4c44bc9 100644 --- a/java/app_set_test.go +++ b/java/app_set_test.go @@ -31,7 +31,7 @@ func TestAndroidAppSet(t *testing.T) { set: "prebuilts/apks/app.apks", prerelease: true, }`) - module := result.ModuleForTests("foo", "android_common") + module := result.ModuleForTests(t, "foo", "android_common") const packedSplitApks = "foo.zip" params := module.Output(packedSplitApks) if params.Rule == nil { @@ -127,7 +127,7 @@ func TestAndroidAppSet_Variants(t *testing.T) { }), ).RunTestWithBp(t, bp) - module := ctx.ModuleForTests("foo", "android_common") + module := ctx.ModuleForTests(t, "foo", "android_common") const packedSplitApks = "foo.zip" params := module.Output(packedSplitApks) for k, v := range test.expected { diff --git a/java/app_test.go b/java/app_test.go index 701fc3594..4f23f61a4 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -72,14 +72,14 @@ func TestApp(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") var expectedLinkImplicits []string manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml") expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String()) - frameworkRes := result.ModuleForTests("framework-res", "android_common") + frameworkRes := result.ModuleForTests(t, "framework-res", "android_common") expectedLinkImplicits = append(expectedLinkImplicits, frameworkRes.Output("package-res.apk").Output.String()) @@ -96,7 +96,7 @@ func TestApp(t *testing.T) { expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String()) // Check that the link rule uses - res := result.ModuleForTests("foo", "android_common").Output("package-res.apk") + res := result.ModuleForTests(t, "foo", "android_common").Output("package-res.apk") android.AssertDeepEquals(t, "aapt2 link implicits", expectedLinkImplicits, res.Implicits.Strings()) }) } @@ -112,7 +112,7 @@ func TestAppSplits(t *testing.T) { sdk_version: "current" }`) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") expectedOutputs := []string{ "out/soong/.intermediates/foo/android_common/foo.apk", @@ -448,11 +448,11 @@ func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) { ctx, _ := testJavaWithFS(t, bp, fs) - inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits + inputs := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits var crtbeginFound, crtendFound bool - expectedCrtBegin := ctx.ModuleForTests("crtbegin_so", + expectedCrtBegin := ctx.ModuleForTests(t, "crtbegin_so", "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output - expectedCrtEnd := ctx.ModuleForTests("crtend_so", + expectedCrtEnd := ctx.ModuleForTests(t, "crtend_so", "android_arm64_armv8-a_sdk_29").Rule("noAddrSig").Output implicits := []string{} for _, input := range inputs { @@ -542,7 +542,7 @@ func TestUpdatableApps_ApplyDefaultUpdatableModuleVersion(t *testing.T) { updatable: true, } `) - foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") + foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer") android.AssertStringDoesContain(t, "com.android.foo: expected manifest fixer to set override-placeholder-version to RELEASE_DEFAULT_UPDATABLE_MODULE_VERSION", foo.BuildParams.Args["args"], @@ -566,7 +566,7 @@ func TestUpdatableApps_ApplyOverrideApexManifestDefaultVersion(t *testing.T) { updatable: true, } `) - foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") + foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer") android.AssertStringDoesContain(t, "com.android.foo: expected manifest fixer to set override-placeholder-version to 1234", foo.BuildParams.Args["args"], @@ -618,7 +618,7 @@ func TestResourceDirs(t *testing.T) { fs.AddToFixture(), ).RunTestWithBp(t, fmt.Sprintf(bp, testCase.prop)) - module := result.ModuleForTests("foo", "android_common") + module := result.ModuleForTests(t, "foo", "android_common") resourceList := module.MaybeOutput("aapt2/res.list") var resources []string @@ -730,7 +730,7 @@ func TestLibraryAssets(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { t.Parallel() - m := ctx.ModuleForTests(test.name, "android_common") + m := ctx.ModuleForTests(t, test.name, "android_common") // Check asset flag in aapt2 link flags var aapt2link android.TestingBuildParams @@ -783,7 +783,7 @@ func TestAppJavaResources(t *testing.T) { ctx := testApp(t, bp) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") fooResources := foo.Output("res/foo.jar") fooDexJar := foo.Output("dex-withres/foo.jar") fooDexJarAligned := foo.Output("dex-withres-aligned/foo.jar") @@ -801,7 +801,7 @@ func TestAppJavaResources(t *testing.T) { t.Errorf("expected aligned dex jar %q in foo apk inputs %q", w, g) } - bar := ctx.ModuleForTests("bar", "android_common") + bar := ctx.ModuleForTests(t, "bar", "android_common") barResources := bar.Output("res/bar.jar") barApk := bar.Rule("combineApk") @@ -1352,7 +1352,7 @@ func TestAndroidResourceProcessor(t *testing.T) { } getAaptInfo := func(moduleName string) (aaptInfo aaptInfo) { - mod := result.ModuleForTests(moduleName, "android_common") + mod := result.ModuleForTests(t, moduleName, "android_common") resourceListRule := mod.MaybeOutput("aapt2/res.list") overlayListRule := mod.MaybeOutput("aapt2/overlay.list") aaptRule := mod.Rule("aapt2Link") @@ -1670,7 +1670,7 @@ func TestAndroidResourceOverlays(t *testing.T) { } getResources := func(moduleName, variantName string) (resourceFiles, overlayFiles, rroDirs []string) { - module := result.ModuleForTests(moduleName, variantName) + module := result.ModuleForTests(t, moduleName, variantName) resourceList := module.MaybeOutput("aapt2/res.list") if resourceList.Rule != nil { resourceFiles = resourceListToFiles(module, android.PathsRelativeToTop(resourceList.Inputs)) @@ -1729,7 +1729,7 @@ func TestAndroidResourceOverlays(t *testing.T) { } func checkSdkVersion(t *testing.T, result *android.TestResult, expectedSdkVersion string) { - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") link := foo.Output("package-res.apk") linkFlags := strings.Split(link.Args["flags"], " ") min := android.IndexList("--min-sdk-version", linkFlags) @@ -1986,7 +1986,7 @@ func TestJNIABI(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { t.Parallel() - app := ctx.ModuleForTests(test.name, "android_common") + app := ctx.ModuleForTests(t, test.name, "android_common") jniLibZip := app.Output("jnilibs.zip") var abis []string args := strings.Fields(jniLibZip.Args["jarArgs"]) @@ -2122,7 +2122,7 @@ func TestJNIPackaging(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { t.Parallel() - app := ctx.ModuleForTests(test.name, "android_common") + app := ctx.ModuleForTests(t, test.name, "android_common") jniLibZip := app.MaybeOutput("jnilibs.zip") if g, w := (jniLibZip.Rule != nil), test.packaged; g != w { t.Errorf("expected jni packaged %v, got %v", w, g) @@ -2204,17 +2204,17 @@ func TestJNISDK(t *testing.T) { {name: "app_vendor", vendorJNI: true}, } - platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared"). + platformJNI := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_shared"). Output("libjni.so").Output.String() - sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared"). + sdkJNI := ctx.ModuleForTests(t, "libjni", "android_arm64_armv8-a_sdk_shared"). Output("libjni.so").Output.String() - vendorJNI := ctx.ModuleForTests("libvendorjni", "android_vendor_arm64_armv8-a_shared"). + vendorJNI := ctx.ModuleForTests(t, "libvendorjni", "android_vendor_arm64_armv8-a_shared"). Output("libvendorjni.so").Output.String() for _, test := range testCases { t.Run(test.name, func(t *testing.T) { t.Parallel() - app := ctx.ModuleForTests(test.name, "android_common") + app := ctx.ModuleForTests(t, test.name, "android_common") jniLibZip := app.MaybeOutput("jnilibs.zip") if len(jniLibZip.Implicits) != 1 { @@ -2417,7 +2417,7 @@ func TestCertificates(t *testing.T) { }), ).RunTestWithBp(t, test.bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") certificate := foo.Module().(*AndroidApp).certificate android.AssertPathRelativeToTopEquals(t, "certificates key", test.expectedCertificate+".pk8", certificate.Key) @@ -2489,7 +2489,7 @@ func TestRequestV4SigningFlag(t *testing.T) { PrepareForTestWithJavaDefaultModules, ).RunTestWithBp(t, test.bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") signapk := foo.Output("foo.apk") signFlags := signapk.Args["flags"] @@ -2567,7 +2567,7 @@ func TestPackageNameOverride(t *testing.T) { }), ).RunTestWithBp(t, test.bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") outSoongDir := result.Config.SoongOutDir() @@ -2608,7 +2608,7 @@ func TestInstrumentationTargetOverridden(t *testing.T) { }), ).RunTestWithBp(t, bp) - bar := result.ModuleForTests("bar", "android_common") + bar := result.ModuleForTests(t, "bar", "android_common") res := bar.Output("package-res.apk") aapt2Flags := res.Args["flags"] e := "--rename-instrumentation-target-package org.dandroid.bp" @@ -2766,7 +2766,7 @@ func TestOverrideAndroidApp(t *testing.T) { }, } for _, expected := range expectedVariants { - variant := result.ModuleForTests(expected.name, expected.variantName) + variant := result.ModuleForTests(t, expected.name, expected.variantName) // Check the final apk name variant.Output(expected.apkPath) @@ -2851,7 +2851,7 @@ func TestOverrideAndroidAppOverrides(t *testing.T) { }, } for _, expected := range expectedVariants { - variant := ctx.ModuleForTests(expected.name, expected.variantName) + variant := ctx.ModuleForTests(t, expected.name, expected.variantName) // Check if the overrides field values are correctly aggregated. mod := variant.Module().(*AndroidApp) @@ -2883,13 +2883,13 @@ func TestOverrideAndroidAppWithPrebuilt(t *testing.T) { `) // An app that has an override that also has a prebuilt should not be hidden. - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") if foo.Module().IsHideFromMake() { t.Errorf("expected foo to have HideFromMake false") } // An override that also has a prebuilt should be hidden. - barOverride := result.ModuleForTests("foo", "android_common_bar") + barOverride := result.ModuleForTests(t, "foo", "android_common_bar") if !barOverride.Module().IsHideFromMake() { t.Errorf("expected bar override variant of foo to have HideFromMake true") } @@ -2965,7 +2965,7 @@ func TestOverrideAndroidAppStem(t *testing.T) { apkPath: "out/target/product/test_device/system/app/baz2_stem/baz2_stem.apk", }, } { - variant := ctx.ModuleForTests(expected.moduleName, expected.variantName) + variant := ctx.ModuleForTests(t, expected.moduleName, expected.variantName) variant.Output(expected.apkPath) } } @@ -2999,14 +2999,14 @@ func TestOverrideAndroidAppDependency(t *testing.T) { `) // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg. - javac := ctx.ModuleForTests("baz", "android_common").Rule("javac") + javac := ctx.ModuleForTests(t, "baz", "android_common").Rule("javac") fooTurbine := "out/soong/.intermediates/foo/android_common/turbine-combined/foo.jar" if !strings.Contains(javac.Args["classpath"], fooTurbine) { t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine) } // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg. - javac = ctx.ModuleForTests("qux", "android_common").Rule("javac") + javac = ctx.ModuleForTests(t, "qux", "android_common").Rule("javac") barTurbine := "out/soong/.intermediates/foo/android_common_bar/turbine-combined/foo.jar" if !strings.Contains(javac.Args["classpath"], barTurbine) { t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine) @@ -3070,7 +3070,7 @@ func TestOverrideAndroidTest(t *testing.T) { }, } for _, expected := range expectedVariants { - variant := ctx.ModuleForTests("foo_test", expected.variantName) + variant := ctx.ModuleForTests(t, "foo_test", expected.variantName) // Check the final apk name variant.Output("out" + expected.apkPath) @@ -3161,7 +3161,7 @@ func TestAndroidTest_FixTestConfig(t *testing.T) { } for _, test := range testCases { - variant := ctx.ModuleForTests(test.moduleName, test.variantName) + variant := ctx.ModuleForTests(t, test.moduleName, test.variantName) params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml") if len(test.expectedFlags) > 0 { @@ -3251,7 +3251,7 @@ func TestStl(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { t.Parallel() - app := ctx.ModuleForTests(test.name, "android_common") + app := ctx.ModuleForTests(t, test.name, "android_common") jniLibZip := app.Output("jnilibs.zip") var jnis []string args := strings.Fields(jniLibZip.Args["jarArgs"]) @@ -3428,8 +3428,8 @@ func TestUsesLibraries(t *testing.T) { }), ).RunTestWithBp(t, bp) - app := result.ModuleForTests("app", "android_common") - prebuilt := result.ModuleForTests("prebuilt", "android_common") + app := result.ModuleForTests(t, "app", "android_common") + prebuilt := result.ModuleForTests(t, "prebuilt", "android_common") // Test that implicit dependencies on java_sdk_library instances are passed to the manifest. // These also include explicit `uses_libs`/`optional_uses_libs` entries, as they may be @@ -3534,7 +3534,7 @@ func TestDexpreoptBcp(t *testing.T) { dexpreopt.FixtureSetPreoptWithUpdatableBcp(test.with), ).RunTestWithBp(t, bp) - app := result.ModuleForTests("app", "android_common") + app := result.ModuleForTests(t, "app", "android_common") cmd := app.Rule("dexpreopt").RuleParams.Command bcp := " -Xbootclasspath-locations:" + test.expect + " " // space at the end matters android.AssertStringDoesContain(t, "dexpreopt app bcp", cmd, bcp) @@ -3611,7 +3611,7 @@ func TestCodelessApp(t *testing.T) { t.Parallel() ctx := testApp(t, test.bp) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode { t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs) @@ -3709,7 +3709,7 @@ func TestUncompressDex(t *testing.T) { }), ).RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") dex := foo.Rule("r8") uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0") aligned := foo.MaybeRule("zipalign").Rule != nil @@ -3795,7 +3795,7 @@ func TestExportedProguardFlagFiles(t *testing.T) { `) - m := ctx.ModuleForTests("foo", "android_common") + m := ctx.ModuleForTests(t, "foo", "android_common") r8 := m.Rule("java.r8") implicits := r8.Implicits.RelativeToTop().Strings() android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg") @@ -3895,7 +3895,7 @@ func TestTargetSdkVersionManifestFixer(t *testing.T) { ) result := fixture.RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) @@ -3993,7 +3993,7 @@ func TestDefaultAppTargetSdkVersionForUpdatableModules(t *testing.T) { ) result := fixture.RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+*testCase.targetSdkVersionExpected) @@ -4082,7 +4082,7 @@ func TestEnforceDefaultAppTargetSdkVersionFlag(t *testing.T) { result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp) if !errExpected { - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) } @@ -4157,7 +4157,7 @@ func TestEnforceDefaultAppTargetSdkVersionFlagForTests(t *testing.T) { result := fixture.ExtendWithErrorHandler(errorHandler).RunTestWithBp(t, bp) if !errExpected { - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) } @@ -4187,7 +4187,7 @@ func TestAppMissingCertificateAllowMissingDependencies(t *testing.T) { sdk_version: "current", }`) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") fooApk := foo.Output("foo.apk") if fooApk.Rule != android.ErrorRule { t.Fatalf("expected ErrorRule for foo.apk, got %s", fooApk.Rule.String()) @@ -4260,7 +4260,7 @@ func TestAppIncludesJniPackages(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { t.Parallel() - app := ctx.ModuleForTests(tc.name, "android_common") + app := ctx.ModuleForTests(t, tc.name, "android_common") outputFile := "jnilibs.zip" jniOutputLibZip := app.MaybeOutput(outputFile) @@ -4343,7 +4343,7 @@ func TestTargetSdkVersionMtsTests(t *testing.T) { t.Run(testCase.desc, func(t *testing.T) { t.Parallel() result := fixture.RunTestWithBp(t, fmt.Sprintf(bpTemplate, testCase.moduleType, testCase.targetSdkVersionInBp, testCase.testSuites)) - mytest := result.ModuleForTests("mytest", "android_common") + mytest := result.ModuleForTests(t, "mytest", "android_common") manifestFixerArgs := mytest.Output("manifest_fixer/AndroidManifest.xml").Args["args"] android.AssertStringDoesContain(t, testCase.desc, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) }) @@ -4377,8 +4377,8 @@ func TestPrivappAllowlist(t *testing.T) { } `, ) - app := result.ModuleForTests("foo", "android_common") - overrideApp := result.ModuleForTests("foo", "android_common_bar") + app := result.ModuleForTests(t, "foo", "android_common") + overrideApp := result.ModuleForTests(t, "foo", "android_common_bar") // verify that privapp allowlist is created for override apps overrideApp.Output("out/soong/.intermediates/foo/android_common_bar/privapp_allowlist_com.google.android.foo.xml") @@ -4415,8 +4415,8 @@ func TestPrivappAllowlistAndroidMk(t *testing.T) { } `, ) - baseApp := result.ModuleForTests("foo", "android_common") - overrideApp := result.ModuleForTests("foo", "android_common_bar") + baseApp := result.ModuleForTests(t, "foo", "android_common") + overrideApp := result.ModuleForTests(t, "foo", "android_common_bar") baseAndroidApp := baseApp.Module().(*AndroidApp) baseEntries := android.AndroidMkEntriesForTest(t, result.TestContext, baseAndroidApp)[0] @@ -4512,7 +4512,7 @@ func TestAppFlagsPackages(t *testing.T) { } `) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") // android_app module depends on aconfig_declarations listed in flags_packages android.AssertBoolEquals(t, "foo expected to depend on bar", true, @@ -4597,7 +4597,7 @@ func TestAppFlagsPackagesPropagation(t *testing.T) { } `) - bazApp := ctx.ModuleForTests("baz_app", "android_common") + bazApp := ctx.ModuleForTests(t, "baz_app", "android_common") // android_app module depends on aconfig_declarations listed in flags_packages // and that of static libs, but not libs @@ -4635,7 +4635,7 @@ func TestNoDexpreoptOptionalUsesLibDoesNotHaveImpl(t *testing.T) { } ` result := prepareForJavaTest.RunTestWithBp(t, bp) - dexpreopt := result.ModuleForTests("app", "android_common").MaybeRule("dexpreopt").Rule + dexpreopt := result.ModuleForTests(t, "app", "android_common").MaybeRule("dexpreopt").Rule android.AssertBoolEquals(t, "dexpreopt should be disabled if optional_uses_libs does not have an implementation", true, dexpreopt == nil) } @@ -4731,7 +4731,7 @@ func TestTestConfigTemplate(t *testing.T) { } return ret } - rule := ctx.ModuleForTests("android-test", "android_common").Rule("autogenInstrumentationTest") + rule := ctx.ModuleForTests(t, "android-test", "android_common").Rule("autogenInstrumentationTest") android.AssertSameArray(t, "extraConfigs mismatch", []option{ {"name1", "key1", "value1"}, @@ -4756,7 +4756,7 @@ func TestAppStem(t *testing.T) { sdk_version: "current", }`) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") outputs := fmt.Sprint(foo.AllOutputs()) if !strings.Contains(outputs, "foo-new.apk") { @@ -4782,8 +4782,8 @@ func TestAppMinSdkVersionOverride(t *testing.T) { min_sdk_version: "33", } `) - foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") - fooOverride := result.ModuleForTests("com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer") + foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer") + fooOverride := result.ModuleForTests(t, "com.android.foo", "android_common_com.android.go.foo").Rule("manifestFixer") android.AssertStringDoesContain(t, "com.android.foo: expected manifest fixer to set minSdkVersion to T", @@ -4810,7 +4810,7 @@ func TestNotApplyDefaultUpdatableModuleVersion(t *testing.T) { min_sdk_version: "31", } `) - foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") + foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer") android.AssertStringDoesNotContain(t, "com.android.foo: expected manifest fixer to not set override-placeholder-version", foo.BuildParams.Args["args"], @@ -4833,7 +4833,7 @@ func TestNotApplyOverrideApexManifestDefaultVersion(t *testing.T) { min_sdk_version: "31", } `) - foo := result.ModuleForTests("com.android.foo", "android_common").Rule("manifestFixer") + foo := result.ModuleForTests(t, "com.android.foo", "android_common").Rule("manifestFixer") android.AssertStringDoesNotContain(t, "com.android.foo: expected manifest fixer to not set override-placeholder-version", foo.BuildParams.Args["args"], @@ -4861,7 +4861,7 @@ func TestResourcesWithFlagDirectories(t *testing.T) { ], } `) - fooModule := result.ModuleForTests("foo", "android_common") + fooModule := result.ModuleForTests(t, "foo", "android_common") compileOutputPaths := fooModule.Rule("aapt2Compile").Outputs.Strings() android.AssertStringListContains( @@ -4956,9 +4956,9 @@ override_android_app { }), android.OptionalFixturePreparer(tc.preparer), ).RunTestWithBp(t, bp) - vendorOverlayApk := result.ModuleForTests("foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk") + vendorOverlayApk := result.ModuleForTests(t, "foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("foo__test_product__auto_generated_rro_vendor.apk") android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, vendorOverlayApk.Rule != nil) - overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("override_foo__test_product__auto_generated_rro_vendor.apk") + overrideVendorOverlayApk := result.ModuleForTests(t, "override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").MaybeOutput("override_foo__test_product__auto_generated_rro_vendor.apk") android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.Rule != nil) }) } @@ -5034,7 +5034,7 @@ my_custom_override_android_app { }.AddToFixture(), android.OptionalFixturePreparer(tc.preparer), ).RunTestWithBp(t, bp) - overrideVendorOverlayApk := result.ModuleForTests("override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay) + overrideVendorOverlayApk := result.ModuleForTests(t, "override_foo__test_product__auto_generated_rro_vendor", "android_arm64_armv8-a").Module().(*AutogenRuntimeResourceOverlay) android.AssertBoolEquals(t, tc.desc, tc.overlayApkExpected, overrideVendorOverlayApk.exportPackage != nil) }) } diff --git a/java/base.go b/java/base.go index d89c324a5..21ad73f84 100644 --- a/java/base.go +++ b/java/base.go @@ -377,7 +377,7 @@ func (e *embeddableInModuleAndImport) initModuleAndImport(module android.Module) // // This cannot implement OutgoingDepIsInSameApex(...) directly as that leads to ambiguity with // the one provided by ApexModuleBase. -func (e *embeddableInModuleAndImport) depIsInSameApex(tag blueprint.DependencyTag) bool { +func depIsInSameApex(tag blueprint.DependencyTag) bool { // dependencies other than the static linkage are all considered crossing APEX boundary if tag == staticLibTag { return true @@ -2254,25 +2254,29 @@ func (j *Module) hasCode(ctx android.ModuleContext) bool { } // Implements android.ApexModule -func (j *Module) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { - return j.depIsInSameApex(tag) +func (m *Module) GetDepInSameApexChecker() android.DepInSameApexChecker { + return JavaDepInSameApexChecker{} +} + +type JavaDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m JavaDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { + return depIsInSameApex(tag) } // Implements android.ApexModule -func (j *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { +func (j *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { sdkVersionSpec := j.SdkVersion(ctx) minSdkVersion := j.MinSdkVersion(ctx) - if !minSdkVersion.Specified() { - return fmt.Errorf("min_sdk_version is not specified") - } + // If the module is compiling against core (via sdk_version), skip comparison check. if sdkVersionSpec.Kind == android.SdkCore { - return nil - } - if minSdkVersion.GreaterThan(sdkVersion) { - return fmt.Errorf("newer SDK(%v)", minSdkVersion) + return android.MinApiLevel } - return nil + + return minSdkVersion } func (j *Module) Stem() string { @@ -2948,14 +2952,18 @@ func (module *Module) collectJarJarRules(ctx android.ModuleContext) *JarJarProvi // Get the jarjar rule text for a given provider for the fully resolved rules. Classes that map // to "" won't be in this list because they shouldn't be renamed yet. func getJarJarRuleText(provider *JarJarProviderData) string { - result := "" + result := strings.Builder{} for _, orig := range android.SortedKeys(provider.Rename) { renamed := provider.Rename[orig] if renamed != "" { - result += "rule " + orig + " " + renamed + "\n" + result.WriteString("rule ") + result.WriteString(orig) + result.WriteString(" ") + result.WriteString(renamed) + result.WriteString("\n") } } - return result + return result.String() } // Repackage the flags if the jarjar rule txt for the flags is generated diff --git a/java/bootclasspath.go b/java/bootclasspath.go index 3413cf350..98fb417d0 100644 --- a/java/bootclasspath.go +++ b/java/bootclasspath.go @@ -15,6 +15,8 @@ package java import ( + "fmt" + "android/soong/android" "github.com/google/blueprint" @@ -23,36 +25,9 @@ import ( // Contains code that is common to both platform_bootclasspath and bootclasspath_fragment. -func init() { - registerBootclasspathBuildComponents(android.InitRegistrationContext) -} - -func registerBootclasspathBuildComponents(ctx android.RegistrationContext) { - ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) { - ctx.BottomUp("bootclasspath_deps", bootclasspathDepsMutator) - }) -} - -// BootclasspathDepsMutator is the interface that a module must implement if it wants to add -// dependencies onto APEX specific variants of bootclasspath fragments or bootclasspath contents. -type BootclasspathDepsMutator interface { - // BootclasspathDepsMutator implementations should add dependencies using - // addDependencyOntoApexModulePair and addDependencyOntoApexVariants. - BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) -} - -// bootclasspathDepsMutator is called during the final deps phase after all APEX variants have -// been created so can add dependencies onto specific APEX variants of modules. -func bootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { - m := ctx.Module() - if p, ok := m.(BootclasspathDepsMutator); ok { - p.BootclasspathDepsMutator(ctx) - } -} - // addDependencyOntoApexVariants adds dependencies onto the appropriate apex specific variants of // the module as specified in the ApexVariantReference list. -func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyName string, refs []ApexVariantReference, tag blueprint.DependencyTag) { +func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyName string, refs []ApexVariantReference, tagType bootclasspathDependencyTagType) { for i, ref := range refs { apex := proptools.StringDefault(ref.Apex, "platform") @@ -62,7 +37,7 @@ func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyN } name := proptools.String(ref.Module) - addDependencyOntoApexModulePair(ctx, apex, name, tag) + addDependencyOntoApexModulePair(ctx, apex, name, tagType) } } @@ -75,68 +50,154 @@ func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyN // module when both source and prebuilt modules are available. // // Use gatherApexModulePairDepsWithTag to retrieve the dependencies. -func addDependencyOntoApexModulePair(ctx android.BottomUpMutatorContext, apex string, name string, tag blueprint.DependencyTag) { - var variations []blueprint.Variation - if !android.IsConfiguredJarForPlatform(apex) { - // Pick the correct apex variant. - variations = []blueprint.Variation{ - {Mutator: "apex", Variation: apex}, - } +func addDependencyOntoApexModulePair(ctx android.BottomUpMutatorContext, apex string, name string, tagType bootclasspathDependencyTagType) { + tag := bootclasspathDependencyTag{ + typ: tagType, } - target := ctx.Module().Target() - variations = append(variations, target.Variations()...) - - addedDep := false - if ctx.OtherModuleDependencyVariantExists(variations, name) { - ctx.AddFarVariationDependencies(variations, tag, name) - addedDep = true + if android.IsConfiguredJarForPlatform(apex) { + // Platform variant, add a direct dependency. + ctx.AddFarVariationDependencies(target.Variations(), tag, name) + } else { + // A module in an apex. Dependencies can't be added directly onto an apex variation, as that would + // require constructing a full ApexInfo configuration, which can't be predicted here. Add a dependency + // on the apex instead, and annotate the dependency tag with the desired module in the apex. + tag.moduleInApex = name + ctx.AddFarVariationDependencies(target.Variations(), tag, apex) } - // Add a dependency on the prebuilt module if it exists. - prebuiltName := android.PrebuiltNameFromSource(name) - if ctx.OtherModuleDependencyVariantExists(variations, prebuiltName) { - ctx.AddVariationDependencies(variations, tag, prebuiltName) - addedDep = true +} + +// gatherFragments collects fragments that are direct dependencies of this module, as well as +// any fragments in apexes via the dependency on the apex. It returns a list of the fragment +// modules and map from apex name to the fragment in that apex. +func gatherFragments(ctx android.BaseModuleContext) ([]android.Module, map[string]android.Module) { + var fragments []android.Module + + type fragmentInApex struct { + module string + apex string } - // If no appropriate variant existing for this, so no dependency could be added, then it is an - // error, unless missing dependencies are allowed. The simplest way to handle that is to add a - // dependency that will not be satisfied and the default behavior will handle it. - if !addedDep { - // Add dependency on the unprefixed (i.e. source or renamed prebuilt) module which we know does - // not exist. The resulting error message will contain useful information about the available - // variants. - reportMissingVariationDependency(ctx, variations, name) - - // Add dependency on the missing prefixed prebuilt variant too if a module with that name exists - // so that information about its available variants will be reported too. - if ctx.OtherModuleExists(prebuiltName) { - reportMissingVariationDependency(ctx, variations, prebuiltName) + var fragmentsInApexes []fragmentInApex + + // Find any direct dependencies, as well as a list of the modules in apexes. + ctx.VisitDirectDeps(func(module android.Module) { + t := ctx.OtherModuleDependencyTag(module) + if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == fragment { + if bcpTag.moduleInApex != "" { + fragmentsInApexes = append(fragmentsInApexes, fragmentInApex{bcpTag.moduleInApex, ctx.OtherModuleName(module)}) + } else { + fragments = append(fragments, module) + } } - } -} + }) -// reportMissingVariationDependency intentionally adds a dependency on a missing variation in order -// to generate an appropriate error message with information about the available variations. -func reportMissingVariationDependency(ctx android.BottomUpMutatorContext, variations []blueprint.Variation, name string) { - ctx.AddFarVariationDependencies(variations, nil, name) + fragmentsMap := make(map[string]android.Module) + for _, fragmentInApex := range fragmentsInApexes { + var found android.Module + // Find a desired module in an apex. + ctx.WalkDeps(func(child, parent android.Module) bool { + t := ctx.OtherModuleDependencyTag(child) + if parent == ctx.Module() { + if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == fragment && ctx.OtherModuleName(child) == fragmentInApex.apex { + // This is the dependency from this module to the apex, recurse into it. + return true + } + } else if android.IsDontReplaceSourceWithPrebuiltTag(t) { + return false + } else if t == android.PrebuiltDepTag { + return false + } else if IsBootclasspathFragmentContentDepTag(t) { + return false + } else if android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) == fragmentInApex.module { + // This is the desired module inside the apex. + if found != nil && child != found { + panic(fmt.Errorf("found two conflicting modules %q in apex %q: %s and %s", + fragmentInApex.module, fragmentInApex.apex, found, child)) + } + found = child + } + return false + }) + if found != nil { + if existing, exists := fragmentsMap[fragmentInApex.apex]; exists { + ctx.ModuleErrorf("apex %s has multiple fragments, %s and %s", fragmentInApex.apex, fragmentInApex.module, existing) + } else { + fragmentsMap[fragmentInApex.apex] = found + fragments = append(fragments, found) + } + } else if !ctx.Config().AllowMissingDependencies() { + ctx.ModuleErrorf("failed to find fragment %q in apex %q\n", + fragmentInApex.module, fragmentInApex.apex) + } + } + return fragments, fragmentsMap } // gatherApexModulePairDepsWithTag returns the list of dependencies with the supplied tag that was // added by addDependencyOntoApexModulePair. -func gatherApexModulePairDepsWithTag(ctx android.BaseModuleContext, tag blueprint.DependencyTag) []android.Module { +func gatherApexModulePairDepsWithTag(ctx android.BaseModuleContext, tagType bootclasspathDependencyTagType) ([]android.Module, map[android.Module]string) { var modules []android.Module - isActiveModulePred := func(module android.Module) bool { - return isActiveModule(ctx, module) + modulesToApex := make(map[android.Module]string) + + type moduleInApex struct { + module string + apex string } - ctx.VisitDirectDepsIf(isActiveModulePred, func(module android.Module) { + + var modulesInApexes []moduleInApex + + ctx.VisitDirectDeps(func(module android.Module) { t := ctx.OtherModuleDependencyTag(module) - if t == tag { - modules = append(modules, module) + if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == tagType { + if bcpTag.moduleInApex != "" { + modulesInApexes = append(modulesInApexes, moduleInApex{bcpTag.moduleInApex, ctx.OtherModuleName(module)}) + } else { + modules = append(modules, module) + } } }) - return modules + + for _, moduleInApex := range modulesInApexes { + var found android.Module + ctx.WalkDeps(func(child, parent android.Module) bool { + t := ctx.OtherModuleDependencyTag(child) + if parent == ctx.Module() { + if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == tagType && ctx.OtherModuleName(child) == moduleInApex.apex { + // recurse into the apex + return true + } + } else if tagType != fragment && android.IsFragmentInApexTag(t) { + return true + } else if android.IsDontReplaceSourceWithPrebuiltTag(t) { + return false + } else if t == android.PrebuiltDepTag { + return false + } else if IsBootclasspathFragmentContentDepTag(t) { + return false + } else if android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) == moduleInApex.module { + if found != nil && child != found { + panic(fmt.Errorf("found two conflicting modules %q in apex %q: %s and %s", + moduleInApex.module, moduleInApex.apex, found, child)) + } + found = child + } + return false + }) + if found != nil { + modules = append(modules, found) + if existing, exists := modulesToApex[found]; exists && existing != moduleInApex.apex { + ctx.ModuleErrorf("module %s is in two apexes, %s and %s", moduleInApex.module, existing, moduleInApex.apex) + } else { + modulesToApex[found] = moduleInApex.apex + } + } else if !ctx.Config().AllowMissingDependencies() { + ctx.ModuleErrorf("failed to find module %q in apex %q\n", + moduleInApex.module, moduleInApex.apex) + } + } + return modules, modulesToApex } // ApexVariantReference specifies a particular apex variant of a module. @@ -165,7 +226,7 @@ type BootclasspathFragmentsDepsProperties struct { // addDependenciesOntoFragments adds dependencies to the fragments specified in this properties // structure. func (p *BootclasspathFragmentsDepsProperties) addDependenciesOntoFragments(ctx android.BottomUpMutatorContext) { - addDependencyOntoApexVariants(ctx, "fragments", p.Fragments, bootclasspathFragmentDepTag) + addDependencyOntoApexVariants(ctx, "fragments", p.Fragments, fragment) } // bootclasspathDependencyTag defines dependencies from/to bootclasspath_fragment, @@ -174,23 +235,38 @@ func (p *BootclasspathFragmentsDepsProperties) addDependenciesOntoFragments(ctx type bootclasspathDependencyTag struct { blueprint.BaseDependencyTag - name string + typ bootclasspathDependencyTagType + + // moduleInApex is set to the name of the desired module when this dependency points + // to the apex that the modules is contained in. + moduleInApex string } +type bootclasspathDependencyTagType int + +const ( + // The tag used for dependencies onto bootclasspath_fragments. + fragment bootclasspathDependencyTagType = iota + // The tag used for dependencies onto platform_bootclasspath. + platform + dexpreoptBootJar + artBootJar + platformBootJar + apexBootJar +) + func (t bootclasspathDependencyTag) ExcludeFromVisibilityEnforcement() { } +func (t bootclasspathDependencyTag) LicenseAnnotations() []android.LicenseAnnotation { + return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency} +} + // Dependencies that use the bootclasspathDependencyTag instances are only added after all the // visibility checking has been done so this has no functional effect. However, it does make it // clear that visibility is not being enforced on these tags. var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathDependencyTag{} -// The tag used for dependencies onto bootclasspath_fragments. -var bootclasspathFragmentDepTag = bootclasspathDependencyTag{name: "fragment"} - -// The tag used for dependencies onto platform_bootclasspath. -var platformBootclasspathDepTag = bootclasspathDependencyTag{name: "platform"} - // BootclasspathNestedAPIProperties defines properties related to the API provided by parts of the // bootclasspath that are nested within the main BootclasspathAPIProperties. type BootclasspathNestedAPIProperties struct { diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index f6d6cad4a..7a3c21e44 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -89,6 +89,19 @@ func (b bootclasspathFragmentContentDependencyTag) RequiresFilesFromPrebuiltApex // The tag used for the dependency between the bootclasspath_fragment module and its contents. var bootclasspathFragmentContentDepTag = bootclasspathFragmentContentDependencyTag{} +type moduleInFragmentDependencyTag struct { + blueprint.DependencyTag +} + +func (m moduleInFragmentDependencyTag) ExcludeFromVisibilityEnforcement() { +} + +// moduleInFragmentDepTag is added alongside bootclasspathFragmentContentDependencyTag, +// but doesn't set ReplaceSourceWithPrebuilt. It is used to find modules in the fragment +// by traversing from the apex to the fragment to the module, which prevents having to +// construct a dependency on the apex variant of the fragment directly. +var moduleInFragmentDepTag = moduleInFragmentDependencyTag{} + var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathFragmentContentDepTag var _ android.ReplaceSourceWithPrebuilt = bootclasspathFragmentContentDepTag var _ android.SdkMemberDependencyTag = bootclasspathFragmentContentDepTag @@ -239,6 +252,8 @@ type BootclasspathFragmentModule struct { profilePathErr error } +var _ android.ApexModule = (*BootclasspathFragmentModule)(nil) + // commonBootclasspathFragment defines the methods that are implemented by both source and prebuilt // bootclasspath fragment modules. type commonBootclasspathFragment interface { @@ -397,7 +412,15 @@ func (i BootclasspathFragmentApexContentInfo) ProfileInstallPathInApex() string return i.profileInstallPathInApex } -func (b *BootclasspathFragmentModule) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { +func (m *BootclasspathFragmentModule) GetDepInSameApexChecker() android.DepInSameApexChecker { + return BootclasspathFragmentDepInSameApexChecker{} +} + +type BootclasspathFragmentDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (b BootclasspathFragmentDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { // If the module is a default module, do not check the tag if tag == android.DefaultsDepTag { return true @@ -410,17 +433,31 @@ func (b *BootclasspathFragmentModule) OutgoingDepIsInSameApex(tag blueprint.Depe // Cross-cutting metadata dependencies are metadata. return false } + if tag == moduleInFragmentDepTag { + return true + } // Dependency to the bootclasspath fragment of another apex // e.g. concsrypt-bootclasspath-fragment --> art-bootclasspath-fragment - if tag == bootclasspathFragmentDepTag { + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok && bcpTag.typ == fragment { + return false + } + if tag == moduleInFragmentDepTag { + return false + } + if tag == dexpreopt.Dex2oatDepTag { + return false + } + if tag == android.PrebuiltDepTag { + return false + } + if _, ok := tag.(hiddenAPIStubsDependencyTag); ok { return false - } - panic(fmt.Errorf("boot_image module %q should not have a dependency tag %s", b, android.PrettyPrintTag(tag))) + panic(fmt.Errorf("boot_image module should not have a dependency tag %s", android.PrettyPrintTag(tag))) } -func (b *BootclasspathFragmentModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { - return nil +func (m *BootclasspathFragmentModule) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } // ComponentDepsMutator adds dependencies onto modules before any prebuilt modules without a @@ -458,24 +495,24 @@ func (b *BootclasspathFragmentModule) DepsMutator(ctx android.BottomUpMutatorCon } } - if !dexpreopt.IsDex2oatNeeded(ctx) { - return + if dexpreopt.IsDex2oatNeeded(ctx) { + // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The + // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). + dexpreopt.RegisterToolDeps(ctx) } - // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The - // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). - dexpreopt.RegisterToolDeps(ctx) - // Add a dependency to `all_apex_contributions` to determine if prebuilts are active. // If prebuilts are active, `contents` validation on the source bootclasspath fragment should be disabled. if _, isPrebuiltModule := ctx.Module().(*PrebuiltBootclasspathFragmentModule); !isPrebuiltModule { ctx.AddDependency(b, android.AcDepTag, "all_apex_contributions") } -} -func (b *BootclasspathFragmentModule) BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies on all the fragments. b.properties.BootclasspathFragmentsDepsProperties.addDependenciesOntoFragments(ctx) + + for _, name := range b.properties.Contents.GetOrDefault(ctx, nil) { + ctx.AddDependency(ctx.Module(), moduleInFragmentDepTag, name) + } } func (b *BootclasspathFragmentModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -498,7 +535,7 @@ func (b *BootclasspathFragmentModule) GenerateAndroidBuildActions(ctx android.Mo } }) - fragments := gatherApexModulePairDepsWithTag(ctx, bootclasspathFragmentDepTag) + fragments, _ := gatherFragments(ctx) // Perform hidden API processing. hiddenAPIOutput := b.generateHiddenAPIBuildActions(ctx, contents, fragments) @@ -606,7 +643,7 @@ func (b *BootclasspathFragmentModule) configuredJars(ctx android.ModuleContext) if android.IsModulePrebuilt(ctx.Module()) { // prebuilt bcpf. the validation of this will be done at the top-level apex providerClasspathFragmentValidationInfoProvider(ctx, unknown) - } else if !disableSourceApexVariant(ctx) { + } else if !disableSourceApexVariant(ctx) && android.IsModulePreferred(ctx.Module()) { // source bcpf, and prebuilt apex are not selected. ctx.ModuleErrorf("%s in contents must also be declared in PRODUCT_APEX_BOOT_JARS", unknown) } @@ -1142,6 +1179,13 @@ func prebuiltBootclasspathFragmentFactory() android.Module { android.InitPrebuiltModule(m, &[]string{"placeholder"}) android.InitApexModule(m) android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibCommon) + android.InitDefaultableModule(m) + + m.SetDefaultableHook(func(mctx android.DefaultableHookContext) { + if mctx.Config().AlwaysUsePrebuiltSdks() { + m.prebuilt.ForcePrefer() + } + }) return m } diff --git a/java/bootclasspath_fragment_test.go b/java/bootclasspath_fragment_test.go index d181ce060..87b853c56 100644 --- a/java/bootclasspath_fragment_test.go +++ b/java/bootclasspath_fragment_test.go @@ -371,7 +371,7 @@ func TestFromTextWidestApiScope(t *testing.T) { } `) - fragment := result.ModuleForTests("myfragment", "android_common") + fragment := result.ModuleForTests(t, "myfragment", "android_common") dependencyStubDexFlag := "--dependency-stub-dex=out/soong/.intermediates/default/java/android-non-updatable.stubs.test_module_lib/android_common/dex/android-non-updatable.stubs.test_module_lib.jar" stubFlagsCommand := fragment.Output("modular-hiddenapi/stub-flags.csv").RuleParams.Command android.AssertStringDoesContain(t, @@ -479,7 +479,7 @@ func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { // Make sure that the signature-patterns.csv is passed all the appropriate package properties // from the bootclasspath_fragment and its contents. - fragment := result.ModuleForTests("mybootclasspathfragment", "android_common") + fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common") rule := fragment.Output("modular-hiddenapi/signature-patterns.csv") expectedCommand := strings.Join([]string{ "--split-package newlibrary", diff --git a/java/builder.go b/java/builder.go index 22dad103b..ade978450 100644 --- a/java/builder.go +++ b/java/builder.go @@ -323,6 +323,13 @@ var ( Command: `${keep-flagged-apis} ${in} > ${out}`, CommandDeps: []string{"${keep-flagged-apis}"}, }) + + generateApiXMLRule = pctx.AndroidStaticRule("generateApiXMLRule", + blueprint.RuleParams{ + Command: `${config.JavaCmd} ${config.JavaVmFlags} -Xmx4g -jar ${config.MetalavaJar} jar-to-jdiff ${in} ${out}`, + CommandDeps: []string{"${config.JavaCmd}", "${config.MetalavaJar}"}, + Description: "Converting API file to XML", + }) ) func init() { diff --git a/java/classpath_element.go b/java/classpath_element.go index abbcae7a3..4af277012 100644 --- a/java/classpath_element.go +++ b/java/classpath_element.go @@ -108,33 +108,18 @@ type ClasspathElementContext interface { // // e.g. Given the following input: // -// libraries: com.android.art:core-oj, com.android.art:core-libart, framework, ext -// fragments: com.android.art:art-bootclasspath-fragment +// libraries: core-oj, core-libart, framework, ext +// fragments: art-bootclasspath-fragment +// libraryToApex: core-oj: com.android.art, core-libart: com.android.art +// apexNameToFragment: com.android.art: art-bootclasspath-fragment // // Then this will return: // // ClasspathFragmentElement(art-bootclasspath-fragment, [core-oj, core-libart]), // ClasspathLibraryElement(framework), // ClasspathLibraryElement(ext), -func CreateClasspathElements(ctx ClasspathElementContext, libraries []android.Module, fragments []android.Module) ClasspathElements { - // Create a map from apex name to the fragment module. This makes it easy to find the fragment - // associated with a particular apex. - apexToFragment := map[string]android.Module{} - for _, fragment := range fragments { - apexInfo, ok := android.OtherModuleProvider(ctx, fragment, android.ApexInfoProvider) - if !ok { - ctx.ModuleErrorf("fragment %s is not part of an apex", fragment) - continue - } - - for _, apex := range apexInfo.InApexVariants { - if existing, ok := apexToFragment[apex]; ok { - ctx.ModuleErrorf("apex %s has multiple fragments, %s and %s", apex, fragment, existing) - continue - } - apexToFragment[apex] = fragment - } - } +func CreateClasspathElements(ctx ClasspathElementContext, libraries []android.Module, fragments []android.Module, + libraryToApex map[android.Module]string, apexNameToFragment map[string]android.Module) ClasspathElements { fragmentToElement := map[android.Module]*ClasspathFragmentElement{} elements := []ClasspathElement{} @@ -144,31 +129,28 @@ skipLibrary: // Iterate over the libraries to construct the ClasspathElements list. for _, library := range libraries { var element ClasspathElement - if apexInfo, ok := android.OtherModuleProvider(ctx, library, android.ApexInfoProvider); ok { - + if libraryApex, ok := libraryToApex[library]; ok { var fragment android.Module // Make sure that the library is in only one fragment of the classpath. - for _, apex := range apexInfo.InApexVariants { - if f, ok := apexToFragment[apex]; ok { - if fragment == nil { - // This is the first fragment so just save it away. - fragment = f - } else if f != fragment { - // This apex variant of the library is in a different fragment. - ctx.ModuleErrorf("library %s is in two separate fragments, %s and %s", library, fragment, f) - // Skip over this library entirely as otherwise the resulting classpath elements would - // be invalid. - continue skipLibrary - } - } else { - // There is no fragment associated with the library's apex. + if f, ok := apexNameToFragment[libraryApex]; ok { + if fragment == nil { + // This is the first fragment so just save it away. + fragment = f + } else if f != fragment { + // This apex variant of the library is in a different fragment. + ctx.ModuleErrorf("library %s is in two separate fragments, %s and %s", library, fragment, f) + // Skip over this library entirely as otherwise the resulting classpath elements would + // be invalid. + continue skipLibrary } + } else { + // There is no fragment associated with the library's apex. } if fragment == nil { ctx.ModuleErrorf("library %s is from apexes %s which have no corresponding fragment in %s", - library, apexInfo.InApexVariants, fragments) + library, []string{libraryApex}, fragments) // Skip over this library entirely as otherwise the resulting classpath elements would // be invalid. continue skipLibrary diff --git a/java/container_test.go b/java/container_test.go index 515236d7d..35a3020ec 100644 --- a/java/container_test.go +++ b/java/container_test.go @@ -155,7 +155,7 @@ func TestJavaContainersModuleProperties(t *testing.T) { } for _, c := range testcases { - m := result.ModuleForTests(c.moduleName, "android_common") + m := result.ModuleForTests(t, c.moduleName, "android_common") containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider) belongingContainers := containers.BelongingContainers() checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers)) diff --git a/java/device_host_converter_test.go b/java/device_host_converter_test.go index 45369e2d6..197bb9f95 100644 --- a/java/device_host_converter_test.go +++ b/java/device_host_converter_test.go @@ -53,15 +53,15 @@ func TestDeviceForHost(t *testing.T) { ctx, config := testJava(t, bp) - deviceModule := ctx.ModuleForTests("device_module", "android_common") + deviceModule := ctx.ModuleForTests(t, "device_module", "android_common") deviceTurbineCombined := deviceModule.Output("turbine-combined/device_module.jar") deviceJavac := deviceModule.Output("javac/device_module.jar") deviceRes := deviceModule.Output("res/device_module.jar") - deviceImportModule := ctx.ModuleForTests("device_import_module", "android_common") + deviceImportModule := ctx.ModuleForTests(t, "device_import_module", "android_common") deviceImportCombined := deviceImportModule.Output("combined/device_import_module.jar") - hostModule := ctx.ModuleForTests("host_module", config.BuildOSCommonTarget.String()) + hostModule := ctx.ModuleForTests(t, "host_module", config.BuildOSCommonTarget.String()) hostJavac := hostModule.Output("javac/host_module.jar") hostRes := hostModule.Output("res/host_module.jar") combined := hostModule.Output("combined/host_module.jar") @@ -135,15 +135,15 @@ func TestHostForDevice(t *testing.T) { ctx, config := testJava(t, bp) - hostModule := ctx.ModuleForTests("host_module", config.BuildOSCommonTarget.String()) + hostModule := ctx.ModuleForTests(t, "host_module", config.BuildOSCommonTarget.String()) hostJavac := hostModule.Output("javac/host_module.jar") hostJavacHeader := hostModule.Output("javac-header/host_module.jar") hostRes := hostModule.Output("res/host_module.jar") - hostImportModule := ctx.ModuleForTests("host_import_module", config.BuildOSCommonTarget.String()) + hostImportModule := ctx.ModuleForTests(t, "host_import_module", config.BuildOSCommonTarget.String()) hostImportCombined := hostImportModule.Output("combined/host_import_module.jar") - deviceModule := ctx.ModuleForTests("device_module", "android_common") + deviceModule := ctx.ModuleForTests(t, "device_module", "android_common") deviceJavac := deviceModule.Output("javac/device_module.jar") deviceRes := deviceModule.Output("res/device_module.jar") combined := deviceModule.Output("combined/device_module.jar") diff --git a/java/dex_test.go b/java/dex_test.go index 4e515b403..2126e42e8 100644 --- a/java/dex_test.go +++ b/java/dex_test.go @@ -60,11 +60,11 @@ func TestR8(t *testing.T) { } `) - app := result.ModuleForTests("app", "android_common") - stableApp := result.ModuleForTests("stable_app", "android_common") - corePlatformApp := result.ModuleForTests("core_platform_app", "android_common") - lib := result.ModuleForTests("lib", "android_common") - staticLib := result.ModuleForTests("static_lib", "android_common") + app := result.ModuleForTests(t, "app", "android_common") + stableApp := result.ModuleForTests(t, "stable_app", "android_common") + corePlatformApp := result.ModuleForTests(t, "core_platform_app", "android_common") + lib := result.ModuleForTests(t, "lib", "android_common") + staticLib := result.ModuleForTests(t, "static_lib", "android_common") appJavac := app.Rule("javac") appR8 := app.Rule("r8") @@ -210,14 +210,14 @@ func TestR8TransitiveDeps(t *testing.T) { result := fixturePreparer.RunTestWithBp(t, bp) getHeaderJar := func(name string) android.Path { - mod := result.ModuleForTests(name, "android_common") + mod := result.ModuleForTests(t, name, "android_common") return mod.Output("turbine-combined/" + name + ".jar").Output } - appR8 := result.ModuleForTests("app", "android_common").Rule("r8") - overrideAppR8 := result.ModuleForTests("app", "android_common_override_app").Rule("r8") + appR8 := result.ModuleForTests(t, "app", "android_common").Rule("r8") + overrideAppR8 := result.ModuleForTests(t, "app", "android_common_override_app").Rule("r8") appHeader := getHeaderJar("app") - overrideAppHeader := result.ModuleForTests("app", "android_common_override_app").Output("turbine-combined/app.jar").Output + overrideAppHeader := result.ModuleForTests(t, "app", "android_common_override_app").Output("turbine-combined/app.jar").Output libHeader := getHeaderJar("lib") transitiveLibHeader := getHeaderJar("transitive_lib") transitiveLib2Header := getHeaderJar("transitive_lib_2") @@ -226,7 +226,7 @@ func TestR8TransitiveDeps(t *testing.T) { repeatedDepHeader := getHeaderJar("repeated_dep") usesLibHeader := getHeaderJar("uses_lib") optionalUsesLibHeader := getHeaderJar("optional_uses_lib") - prebuiltLibHeader := result.ModuleForTests("prebuilt_lib", "android_common").Output("combined/lib.jar").Output + prebuiltLibHeader := result.ModuleForTests(t, "prebuilt_lib", "android_common").Output("combined/lib.jar").Output for _, rule := range []android.TestingBuildParams{appR8, overrideAppR8} { android.AssertStringDoesNotContain(t, "expected no app header jar in app r8 classpath", @@ -278,7 +278,7 @@ func TestR8Flags(t *testing.T) { } `) - app := result.ModuleForTests("app", "android_common") + app := result.ModuleForTests(t, "app", "android_common") appR8 := app.Rule("r8") android.AssertStringDoesContain(t, "expected -dontshrink in app r8 flags", appR8.Args["r8Flags"], "-dontshrink") @@ -323,10 +323,10 @@ func TestD8(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") - lib := result.ModuleForTests("lib", "android_common") - app := result.ModuleForTests("app", "android_common") - staticLib := result.ModuleForTests("static_lib", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") + lib := result.ModuleForTests(t, "lib", "android_common") + app := result.ModuleForTests(t, "app", "android_common") + staticLib := result.ModuleForTests(t, "static_lib", "android_common") fooJavac := foo.Rule("javac") fooD8 := foo.Rule("d8") @@ -398,7 +398,7 @@ func TestProguardFlagsInheritanceStatic(t *testing.T) { } `) - app := result.ModuleForTests("app", "android_common") + app := result.ModuleForTests(t, "app", "android_common") appR8 := app.Rule("r8") android.AssertStringDoesContain(t, "expected primary_lib's proguard flags from direct dep", appR8.Args["r8Flags"], "primary.flags") @@ -647,7 +647,7 @@ func TestProguardFlagsInheritance(t *testing.T) { tc.transitiveDepExportsFlagsFiles, ), ) - appR8 := result.ModuleForTests("app", "android_common").Rule("r8") + appR8 := result.ModuleForTests(t, "app", "android_common").Rule("r8") shouldHaveDepFlags := android.InList(directDepFlagsFileName, tc.expectedFlagsFiles) if shouldHaveDepFlags { @@ -689,7 +689,7 @@ func TestProguardFlagsInheritanceAppImport(t *testing.T) { PrepareForTestWithJavaDefaultModules, ).RunTestWithBp(t, bp) - appR8 := result.ModuleForTests("app", "android_common").Rule("r8") + appR8 := result.ModuleForTests(t, "app", "android_common").Rule("r8") android.AssertStringDoesContain(t, "expected aarimports's proguard flags", appR8.Args["r8Flags"], "proguard.txt") } @@ -709,7 +709,7 @@ func TestR8FlagsArtProfile(t *testing.T) { } `) - app := result.ModuleForTests("app", "android_common") + app := result.ModuleForTests(t, "app", "android_common") appR8 := app.Rule("r8") android.AssertStringDoesContain(t, "expected --art-profile in app r8 flags", appR8.Args["r8Flags"], "--art-profile") @@ -847,7 +847,7 @@ func TestDebugReleaseFlags(t *testing.T) { dexRuleKey = "d8" } dexFlagsKey := dexRuleKey + "Flags" - appDex := result.ModuleForTests("app", "android_common").Rule(dexRuleKey) + appDex := result.ModuleForTests(t, "app", "android_common").Rule(dexRuleKey) android.AssertStringDoesContain(t, "expected flag in dex flags", appDex.Args[dexFlagsKey], tc.expectedFlags) diff --git a/java/dexpreopt.go b/java/dexpreopt.go index 15e40ba0d..5755dec23 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -177,10 +177,7 @@ func disableSourceApexVariant(ctx android.BaseModuleContext) bool { // Find the apex variant for this module apexVariants := []string{} if apexInfo.BaseApexName != "" { - // This is a transitive dependency of an override_apex apexVariants = append(apexVariants, apexInfo.BaseApexName) - } else { - apexVariants = append(apexVariants, apexInfo.InApexVariants...) } if apexInfo.ApexAvailableName != "" { apexVariants = append(apexVariants, apexInfo.ApexAvailableName) diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 093cc876b..27027f07d 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -15,6 +15,7 @@ package java import ( + "fmt" "path/filepath" "strings" @@ -225,7 +226,6 @@ var artApexNames = []string{ } var ( - dexpreoptBootJarDepTag = bootclasspathDependencyTag{name: "dexpreopt-boot-jar"} dexBootJarsFragmentsKey = android.NewOnceKey("dexBootJarsFragments") apexContributionsMetadataDepTag = dependencyTag{name: "all_apex_contributions"} ) @@ -467,9 +467,6 @@ func dexpreoptBootJarsFactory() android.SingletonModule { func RegisterDexpreoptBootJarsComponents(ctx android.RegistrationContext) { ctx.RegisterParallelSingletonModuleType("dex_bootjars", dexpreoptBootJarsFactory) ctx.RegisterModuleType("art_boot_images", artBootImagesFactory) - ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) { - ctx.BottomUp("dex_bootjars_deps", DexpreoptBootJarsMutator) - }) } func SkipDexpreoptBootJars(ctx android.PathContext) bool { @@ -505,12 +502,6 @@ type dexpreoptBootJars struct { func (dbj *dexpreoptBootJars) DepsMutator(ctx android.BottomUpMutatorContext) { // Create a dependency on all_apex_contributions to determine the selected mainline module ctx.AddDependency(ctx.Module(), apexContributionsMetadataDepTag, "all_apex_contributions") -} - -func DexpreoptBootJarsMutator(ctx android.BottomUpMutatorContext) { - if _, ok := ctx.Module().(*dexpreoptBootJars); !ok { - return - } if dexpreopt.IsDex2oatNeeded(ctx) { // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The @@ -524,7 +515,7 @@ func DexpreoptBootJarsMutator(ctx android.BottomUpMutatorContext) { continue } // For accessing the boot jars. - addDependenciesOntoBootImageModules(ctx, config.modules, dexpreoptBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, config.modules, dexpreoptBootJar) // Create a dependency on the apex selected using RELEASE_APEX_CONTRIBUTIONS_* // TODO: b/308174306 - Remove the direct depedendency edge to the java_library (source/prebuilt) once all mainline modules // have been flagged using RELEASE_APEX_CONTRIBUTIONS_* @@ -537,11 +528,11 @@ func DexpreoptBootJarsMutator(ctx android.BottomUpMutatorContext) { if ctx.OtherModuleExists("platform-bootclasspath") { // For accessing all bootclasspath fragments. - addDependencyOntoApexModulePair(ctx, "platform", "platform-bootclasspath", platformBootclasspathDepTag) + addDependencyOntoApexModulePair(ctx, "platform", "platform-bootclasspath", platform) } else if ctx.OtherModuleExists("art-bootclasspath-fragment") { // For accessing the ART bootclasspath fragment on a thin manifest (e.g., master-art) where // platform-bootclasspath doesn't exist. - addDependencyOntoApexModulePair(ctx, "com.android.art", "art-bootclasspath-fragment", bootclasspathFragmentDepTag) + addDependencyOntoApexModulePair(ctx, "com.android.art", "art-bootclasspath-fragment", fragment) } } @@ -559,17 +550,11 @@ func addDependenciesOntoSelectedBootImageApexes(ctx android.BottomUpMutatorConte // We need to add a dep on only the apex listed in `contents` of the selected apex_contributions module // This is not available in a structured format in `apex_contributions`, so this hack adds a dep on all `contents` // (some modules like art.module.public.api do not have an apex variation since it is a pure stub module that does not get installed) - apexVariationOfSelected := append(ctx.Target().Variations(), blueprint.Variation{Mutator: "apex", Variation: apex}) - if ctx.OtherModuleDependencyVariantExists(apexVariationOfSelected, selected) { - ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, selected) - } else if ctx.OtherModuleDependencyVariantExists(apexVariationOfSelected, android.RemoveOptionalPrebuiltPrefix(selected)) { - // The prebuilt might have been renamed by prebuilt_rename mutator if the source module does not exist. - // Remove the prebuilt_ prefix. - ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, android.RemoveOptionalPrebuiltPrefix(selected)) - } else { - // Couldn't find a dependency, do it again to report an error. - ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, selected) + tag := bootclasspathDependencyTag{ + typ: dexpreoptBootJar, } + + ctx.AddFarVariationDependencies(ctx.Target().Variations(), tag, android.RemoveOptionalPrebuiltPrefix(selected)) } } } @@ -577,23 +562,55 @@ func addDependenciesOntoSelectedBootImageApexes(ctx android.BottomUpMutatorConte func gatherBootclasspathFragments(ctx android.ModuleContext) map[string]android.Module { return ctx.Config().Once(dexBootJarsFragmentsKey, func() interface{} { fragments := make(map[string]android.Module) + + type moduleInApexPair struct { + module string + apex string + } + + var modulesInApexes []moduleInApexPair + + // Find the list of modules in apexes. ctx.WalkDeps(func(child, parent android.Module) bool { if !isActiveModule(ctx, child) { return false } tag := ctx.OtherModuleDependencyTag(child) - if tag == platformBootclasspathDepTag { - return true - } - if tag == bootclasspathFragmentDepTag { - apexInfo, _ := android.OtherModuleProvider(ctx, child, android.ApexInfoProvider) - for _, apex := range apexInfo.InApexVariants { - fragments[apex] = child + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok { + if bcpTag.typ == platform { + return true + } + if bcpTag.typ == fragment { + if bcpTag.moduleInApex == "" { + panic(fmt.Errorf("expected fragment to be in apex")) + } + modulesInApexes = append(modulesInApexes, moduleInApexPair{bcpTag.moduleInApex, ctx.OtherModuleName(child)}) + return true } - return false } return false }) + + for _, moduleInApex := range modulesInApexes { + // Find a desired module in an apex. + ctx.WalkDeps(func(child, parent android.Module) bool { + t := ctx.OtherModuleDependencyTag(child) + if bcpTag, ok := t.(bootclasspathDependencyTag); ok { + if bcpTag.typ == platform { + return true + } + if bcpTag.typ == fragment && ctx.OtherModuleName(child) == moduleInApex.apex { + // This is the dependency from this module to the apex, recurse into it. + return true + } + } else if android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) == moduleInApex.module { + // This is the desired module inside the apex. + fragments[android.RemoveOptionalPrebuiltPrefix(moduleInApex.apex)] = child + } + return false + }) + } + return fragments }).(map[string]android.Module) } @@ -717,7 +734,8 @@ func getModulesForImage(ctx android.ModuleContext, imageConfig *bootImageConfig) modules := make([]apexJarModulePair, 0, imageConfig.modules.Len()) for i := 0; i < imageConfig.modules.Len(); i++ { found := false - for _, module := range gatherApexModulePairDepsWithTag(ctx, dexpreoptBootJarDepTag) { + dexpreoptBootJarModules, _ := gatherApexModulePairDepsWithTag(ctx, dexpreoptBootJar) + for _, module := range dexpreoptBootJarModules { name := android.RemoveOptionalPrebuiltPrefix(module.Name()) if name == imageConfig.modules.Jar(i) { modules = append(modules, apexJarModulePair{ @@ -800,11 +818,16 @@ func getDexJarForApex(ctx android.ModuleContext, pair apexJarModulePair, apexNam "APEX '%[2]s' doesn't exist or is not added as a dependency of dex_bootjars", pair.jarModule.Name(), pair.apex) + return nil } bootclasspathFragmentInfo, _ := android.OtherModuleProvider(ctx, fragment, BootclasspathFragmentApexContentInfoProvider) jar, err := bootclasspathFragmentInfo.DexBootJarPathForContentModule(pair.jarModule) if err != nil { - ctx.ModuleErrorf("%s", err) + if ctx.Config().AllowMissingDependencies() { + ctx.AddMissingDependencies([]string{pair.jarModule.String()}) + } else { + ctx.ModuleErrorf("%s", err) + } } return jar } @@ -963,9 +986,16 @@ func getProfilePathForApex(ctx android.ModuleContext, apexName string, apexNameT func getApexNameToApexExportsInfoMap(ctx android.ModuleContext) apexNameToApexExportsInfoMap { apexNameToApexExportsInfoMap := apexNameToApexExportsInfoMap{} - ctx.VisitDirectDepsWithTag(dexpreoptBootJarDepTag, func(am android.Module) { - if info, exists := android.OtherModuleProvider(ctx, am, android.ApexExportsInfoProvider); exists { - apexNameToApexExportsInfoMap[info.ApexName] = info + + ctx.VisitDirectDeps(func(am android.Module) { + tag := ctx.OtherModuleDependencyTag(am) + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok && bcpTag.typ == dexpreoptBootJar { + if bcpTag.moduleInApex == "" { + info, exists := android.OtherModuleProvider(ctx, am, android.ApexExportsInfoProvider) + if exists { + apexNameToApexExportsInfoMap[info.ApexName] = info + } + } } }) return apexNameToApexExportsInfoMap @@ -1448,24 +1478,33 @@ func artBootImagesFactory() android.Module { func (dbj *artBootImages) DepsMutator(ctx android.BottomUpMutatorContext) { // Create a dependency on `dex_bootjars` to access the intermediate locations of host art boot image. - ctx.AddVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(), dexpreoptBootJarDepTag, "dex_bootjars") + tag := bootclasspathDependencyTag{ + typ: dexpreoptBootJar, + } + ctx.AddVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(), tag, "dex_bootjars") } func (d *artBootImages) GenerateAndroidBuildActions(ctx android.ModuleContext) { - ctx.VisitDirectDepsWithTag(dexpreoptBootJarDepTag, func(m android.Module) { - hostInstallsInfo, ok := android.OtherModuleProvider(ctx, m, artBootImageHostInfoProvider) - if !ok { - ctx.ModuleErrorf("Could not find information about the host variant of ART boot image") - } - installs := d.installFile(ctx, hostInstallsInfo.installs) - if len(installs) > 0 { - d.outputFile = android.OptionalPathForPath(installs[0]) - // Create a phony target that can ART run-tests can depend on. - ctx.Phony(d.Name(), installs...) - } else { - // this might be true e.g. when building with `WITH_DEXPREOPT=false` - // create an empty file so that the `art_boot_images` is known to the packaging system. - d.outputFile = android.OptionalPathForPath(android.PathForModuleOut(ctx, "undefined_art_boot_images")) + ctx.VisitDirectDeps(func(m android.Module) { + tag := ctx.OtherModuleDependencyTag(m) + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok && bcpTag.typ == dexpreoptBootJar { + if bcpTag.moduleInApex != "" { + panic("unhandled moduleInApex") + } + hostInstallsInfo, ok := android.OtherModuleProvider(ctx, m, artBootImageHostInfoProvider) + if !ok { + ctx.ModuleErrorf("Could not find information about the host variant of ART boot image") + } + installs := d.installFile(ctx, hostInstallsInfo.installs) + if len(installs) > 0 { + d.outputFile = android.OptionalPathForPath(installs[0]) + // Create a phony target that can ART run-tests can depend on. + ctx.Phony(d.Name(), installs...) + } else { + // this might be true e.g. when building with `WITH_DEXPREOPT=false` + // create an empty file so that the `art_boot_images` is known to the packaging system. + d.outputFile = android.OptionalPathForPath(android.PathForModuleOut(ctx, "undefined_art_boot_images")) + } } }) } diff --git a/java/dexpreopt_config_testing.go b/java/dexpreopt_config_testing.go index fbdb7b028..241941eb8 100644 --- a/java/dexpreopt_config_testing.go +++ b/java/dexpreopt_config_testing.go @@ -1237,7 +1237,7 @@ func nestedCheckBootImageConfig(t *testing.T, result *android.TestResult, imageC android.AssertPathRelativeToTopEquals(t, "zip", expected.zip, imageConfig.zip) if !mutated { - dexBootJarModule := result.ModuleForTests("dex_bootjars", "android_common") + dexBootJarModule := result.ModuleForTests(t, "dex_bootjars", "android_common") profileInstallInfo, _ := android.OtherModuleProvider(result, dexBootJarModule.Module(), profileInstallInfoProvider) assertInstallsEqual(t, "profileInstalls", expected.profileInstalls, profileInstallInfo.profileInstalls) android.AssertStringEquals(t, "profileLicenseMetadataFile", expected.profileLicenseMetadataFile, profileInstallInfo.profileLicenseMetadataFile.RelativeToTop().String()) @@ -1281,7 +1281,7 @@ func CheckMutatedFrameworkBootImageConfig(t *testing.T, result *android.TestResu // checkDexpreoptMakeVars checks the DEXPREOPT_ prefixed make vars produced by dexpreoptBootJars // singleton. func checkDexpreoptMakeVars(t *testing.T, result *android.TestResult, expectedLicenseMetadataFile string) { - vars := result.MakeVarsForTesting(func(variable android.MakeVarVariable) bool { + vars := result.MakeVarsForTesting(t, func(variable android.MakeVarVariable) bool { return strings.HasPrefix(variable.Name(), "DEXPREOPT_") }) diff --git a/java/dexpreopt_test.go b/java/dexpreopt_test.go index bf660475f..f437da02c 100644 --- a/java/dexpreopt_test.go +++ b/java/dexpreopt_test.go @@ -239,7 +239,7 @@ func TestDexpreoptEnabled(t *testing.T) { variant += "_apex1000" } - dexpreopt := ctx.ModuleForTests(moduleName, variant).MaybeRule("dexpreopt") + dexpreopt := ctx.ModuleForTests(t, moduleName, variant).MaybeRule("dexpreopt") enabled := dexpreopt.Rule != nil if enabled != test.enabled { @@ -325,7 +325,7 @@ func TestApexSystemServerDexpreoptInstalls(t *testing.T) { sdk_version: "current", }`) ctx := result.TestContext - module := ctx.ModuleForTests("service-foo", "android_common_apex1000") + module := ctx.ModuleForTests(t, "service-foo", "android_common_apex1000") library := module.Module().(*Library) installs := library.dexpreopter.ApexSystemServerDexpreoptInstalls() @@ -367,7 +367,7 @@ func TestApexSystemServerDexpreoptInstalls(t *testing.T) { sdk_version: "current", }`) ctx = result.TestContext - module = ctx.ModuleForTests("foo", "android_common") + module = ctx.ModuleForTests(t, "foo", "android_common") library = module.Module().(*Library) installs = library.dexpreopter.ApexSystemServerDexpreoptInstalls() @@ -396,7 +396,7 @@ func TestGenerateProfileEvenIfDexpreoptIsDisabled(t *testing.T) { }`) ctx := result.TestContext - dexpreopt := ctx.ModuleForTests("foo", "android_common").MaybeRule("dexpreopt") + dexpreopt := ctx.ModuleForTests(t, "foo", "android_common").MaybeRule("dexpreopt") expected := []string{"out/soong/.intermediates/foo/android_common/dexpreopt/foo/profile.prof"} diff --git a/java/droiddoc_test.go b/java/droiddoc_test.go index 2256f1e23..0c977bceb 100644 --- a/java/droiddoc_test.go +++ b/java/droiddoc_test.go @@ -70,13 +70,13 @@ func TestDroiddoc(t *testing.T) { "bar-doc/a.java": nil, "bar-doc/b.java": nil, }) - barStubsOutputs := ctx.ModuleForTests("bar-stubs", "android_common").OutputFiles(ctx, t, "") + barStubsOutputs := ctx.ModuleForTests(t, "bar-stubs", "android_common").OutputFiles(ctx, t, "") if len(barStubsOutputs) != 1 { t.Errorf("Expected one output from \"bar-stubs\" got %s", barStubsOutputs) } barStubsOutput := barStubsOutputs[0] - barDoc := ctx.ModuleForTests("bar-doc", "android_common") + barDoc := ctx.ModuleForTests(t, "bar-doc", "android_common") javaDoc := barDoc.Rule("javadoc") if g, w := android.PathsRelativeToTop(javaDoc.Implicits), android.PathRelativeToTop(barStubsOutput); !inList(w, g) { t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g) diff --git a/java/droidstubs.go b/java/droidstubs.go index 22f4d981d..caad6883e 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -1429,6 +1429,16 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) { d.setOutputFiles(ctx) d.setPhonyRules(ctx) + + if d.apiLintTimestamp != nil { + if d.apiLintReport != nil { + ctx.DistForGoalsWithFilename( + []string{fmt.Sprintf("%s-api-lint", d.Name()), "droidcore"}, + d.apiLintReport, + fmt.Sprintf("apilint/%s-lint-report.txt", d.Name()), + ) + } + } } func setDroidInfo(ctx android.ModuleContext, d *Droidstubs, info *StubsInfo, typ StubsType) { diff --git a/java/droidstubs_test.go b/java/droidstubs_test.go index faa9a1539..dfdf87703 100644 --- a/java/droidstubs_test.go +++ b/java/droidstubs_test.go @@ -83,7 +83,7 @@ func TestDroidstubs(t *testing.T) { }, } for _, c := range testcases { - m := ctx.ModuleForTests(c.moduleName, "android_common") + m := ctx.ModuleForTests(t, c.moduleName, "android_common") manifest := m.Output("metalava.sbox.textproto") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, manifest) cmdline := String(sboxProto.Commands[0].Command) @@ -132,7 +132,7 @@ func getAndroidJarPatternsForDroidstubs(t *testing.T, sdkType string) []string { "foo-doc/a.java": nil, }) - m := ctx.ModuleForTests("foo-stubs", "android_common") + m := ctx.ModuleForTests(t, "foo-stubs", "android_common") manifest := m.Output("metalava.sbox.textproto") cmd := String(android.RuleBuilderSboxProtoForTests(t, ctx, manifest).Commands[0].Command) r := regexp.MustCompile(`--android-jar-pattern [^ ]+/android.jar`) @@ -210,7 +210,7 @@ func TestDroidstubsSandbox(t *testing.T) { "bar-doc/a.java": nil, }) - m := ctx.ModuleForTests("bar-stubs", "android_common") + m := ctx.ModuleForTests(t, "bar-stubs", "android_common") metalava := m.Rule("metalava") if g, w := metalava.Inputs.Strings(), []string{"bar-doc/a.java"}; !reflect.DeepEqual(w, g) { t.Errorf("Expected inputs %q, got %q", w, g) @@ -271,7 +271,7 @@ func TestDroidstubsWithSystemModules(t *testing.T) { } func checkSystemModulesUseByDroidstubs(t *testing.T, ctx *android.TestContext, moduleName string, systemJar string) { - metalavaRule := ctx.ModuleForTests(moduleName, "android_common").Rule("metalava") + metalavaRule := ctx.ModuleForTests(t, moduleName, "android_common").Rule("metalava") var systemJars []string for _, i := range metalavaRule.Implicits { systemJars = append(systemJars, i.Base()) @@ -304,7 +304,7 @@ func TestDroidstubsWithSdkExtensions(t *testing.T) { "sdk/extensions/1/public/some-mainline-module-stubs.jar": nil, "sdk/extensions/info.txt": nil, }) - m := ctx.ModuleForTests("baz-stubs", "android_common") + m := ctx.ModuleForTests(t, "baz-stubs", "android_common") manifest := m.Output("metalava.sbox.textproto") cmdline := String(android.RuleBuilderSboxProtoForTests(t, ctx, manifest).Commands[0].Command) android.AssertStringDoesContain(t, "android-jar-pattern present", cmdline, "--android-jar-pattern sdk/extensions/{version:extension}/public/{module}.jar") @@ -332,7 +332,7 @@ func TestDroidStubsApiContributionGeneration(t *testing.T) { }, ) - ctx.ModuleForTests("foo.api.contribution", "") + ctx.ModuleForTests(t, "foo.api.contribution", "") } func TestGeneratedApiContributionVisibilityTest(t *testing.T) { @@ -366,7 +366,7 @@ func TestGeneratedApiContributionVisibilityTest(t *testing.T) { }, ) - ctx.ModuleForTests("bar", "android_common") + ctx.ModuleForTests(t, "bar", "android_common") } func TestAconfigDeclarations(t *testing.T) { @@ -408,7 +408,7 @@ func TestAconfigDeclarations(t *testing.T) { android.AssertBoolEquals(t, "foo expected to depend on bar", CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"), true) - m := result.ModuleForTests("foo", "android_common") + m := result.ModuleForTests(t, "foo", "android_common") android.AssertStringDoesContain(t, "foo generates revert annotations file", strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt") @@ -458,7 +458,7 @@ func TestReleaseExportRuntimeApis(t *testing.T) { } `) - m := result.ModuleForTests("foo", "android_common") + m := result.ModuleForTests(t, "foo", "android_common") rule := m.Output("released-flagged-apis-exportable.txt") exposeWritableApisFilter := "--filter='state:ENABLED+permission:READ_ONLY' --filter='permission:READ_WRITE'" diff --git a/java/fuzz_test.go b/java/fuzz_test.go index 40adae0cb..8cbe873ad 100644 --- a/java/fuzz_test.go +++ b/java/fuzz_test.go @@ -64,14 +64,14 @@ func TestJavaFuzz(t *testing.T) { osCommonTarget := result.Config.BuildOSCommonTarget.String() - javac := result.ModuleForTests("foo", osCommonTarget).Rule("javac") - combineJar := result.ModuleForTests("foo", osCommonTarget).Description("for javac") + javac := result.ModuleForTests(t, "foo", osCommonTarget).Rule("javac") + combineJar := result.ModuleForTests(t, "foo", osCommonTarget).Description("for javac") if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" { t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs) } - baz := result.ModuleForTests("baz", osCommonTarget).Rule("javac").Output.String() + baz := result.ModuleForTests(t, "baz", osCommonTarget).Rule("javac").Output.String() barOut := filepath.Join("out", "soong", ".intermediates", "bar", osCommonTarget, "javac-header", "bar.jar") bazOut := filepath.Join("out", "soong", ".intermediates", "baz", osCommonTarget, "javac-header", "baz.jar") @@ -83,7 +83,7 @@ func TestJavaFuzz(t *testing.T) { } ctx := result.TestContext - foo := ctx.ModuleForTests("foo", osCommonTarget).Module().(*JavaFuzzTest) + foo := ctx.ModuleForTests(t, "foo", osCommonTarget).Module().(*JavaFuzzTest) expected := "lib64/libjni.so" if runtime.GOOS == "darwin" { diff --git a/java/generated_java_library_test.go b/java/generated_java_library_test.go index 7efd54b39..e5ee5861e 100644 --- a/java/generated_java_library_test.go +++ b/java/generated_java_library_test.go @@ -61,6 +61,6 @@ func TestGenLib(t *testing.T) { ` result := testGenLib(t, android.FixtureExpectsNoErrors, bp) - javagenlibtest := result.ModuleForTests("javagenlibtest", "android_common").Module().(*GeneratedJavaLibraryModule) + javagenlibtest := result.ModuleForTests(t, "javagenlibtest", "android_common").Module().(*GeneratedJavaLibraryModule) android.AssertPathsEndWith(t, "Generated_srcjars", []string{"/blah.srcjar"}, javagenlibtest.Library.properties.Generated_srcjars) } diff --git a/java/genrule_combiner.go b/java/genrule_combiner.go new file mode 100644 index 000000000..357dc2c76 --- /dev/null +++ b/java/genrule_combiner.go @@ -0,0 +1,252 @@ +// Copyright 2019 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package java + +import ( + "fmt" + "io" + + "android/soong/android" + "android/soong/dexpreopt" + + "github.com/google/blueprint/depset" + "github.com/google/blueprint/proptools" +) + +type GenruleCombiner struct { + android.ModuleBase + android.DefaultableModuleBase + + genruleCombinerProperties GenruleCombinerProperties + + headerJars android.Paths + implementationJars android.Paths + implementationAndResourceJars android.Paths + resourceJars android.Paths + aconfigProtoFiles android.Paths + + srcJarArgs []string + srcJarDeps android.Paths + + headerDirs android.Paths + + combinedHeaderJar android.Path + combinedImplementationJar android.Path +} + +type GenruleCombinerProperties struct { + // List of modules whose implementation (and resources) jars will be visible to modules + // that depend on this module. + Static_libs proptools.Configurable[[]string] `android:"arch_variant"` + + // List of modules whose header jars will be visible to modules that depend on this module. + Headers proptools.Configurable[[]string] `android:"arch_variant"` +} + +// java_genrule_combiner provides the implementation and resource jars from `static_libs`, with +// the header jars from `headers`. +// +// This is useful when a java_genrule is used to change the implementation of a java library +// without requiring a change in the header jars. +func GenruleCombinerFactory() android.Module { + module := &GenruleCombiner{} + + module.AddProperties(&module.genruleCombinerProperties) + InitJavaModule(module, android.HostAndDeviceSupported) + return module +} + +var genruleCombinerHeaderDepTag = dependencyTag{name: "genrule_combiner_header"} + +func (j *GenruleCombiner) DepsMutator(ctx android.BottomUpMutatorContext) { + ctx.AddVariationDependencies(nil, staticLibTag, + j.genruleCombinerProperties.Static_libs.GetOrDefault(ctx, nil)...) + ctx.AddVariationDependencies(nil, genruleCombinerHeaderDepTag, + j.genruleCombinerProperties.Headers.GetOrDefault(ctx, nil)...) +} + +func (j *GenruleCombiner) GenerateAndroidBuildActions(ctx android.ModuleContext) { + if len(j.genruleCombinerProperties.Static_libs.GetOrDefault(ctx, nil)) < 1 { + ctx.PropertyErrorf("static_libs", "at least one dependency is required") + } + + if len(j.genruleCombinerProperties.Headers.GetOrDefault(ctx, nil)) < 1 { + ctx.PropertyErrorf("headers", "at least one dependency is required") + } + + var transitiveHeaderJars []depset.DepSet[android.Path] + var transitiveImplementationJars []depset.DepSet[android.Path] + var transitiveResourceJars []depset.DepSet[android.Path] + var sdkVersion android.SdkSpec + var stubsLinkType StubsLinkType + moduleWithSdkDepInfo := &ModuleWithSdkDepInfo{} + + // Collect the headers first, so that aconfig flag values for the libraries will override + // values from the headers (if they are different). + ctx.VisitDirectDepsWithTag(genruleCombinerHeaderDepTag, func(m android.Module) { + if dep, ok := android.OtherModuleProvider(ctx, m, JavaInfoProvider); ok { + j.headerJars = append(j.headerJars, dep.HeaderJars...) + + j.srcJarArgs = append(j.srcJarArgs, dep.SrcJarArgs...) + j.srcJarDeps = append(j.srcJarDeps, dep.SrcJarDeps...) + j.aconfigProtoFiles = append(j.aconfigProtoFiles, dep.AconfigIntermediateCacheOutputPaths...) + sdkVersion = dep.SdkVersion + stubsLinkType = dep.StubsLinkType + *moduleWithSdkDepInfo = *dep.ModuleWithSdkDepInfo + + transitiveHeaderJars = append(transitiveHeaderJars, dep.TransitiveStaticLibsHeaderJars) + } else if dep, ok := android.OtherModuleProvider(ctx, m, android.CodegenInfoProvider); ok { + j.aconfigProtoFiles = append(j.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...) + } else { + ctx.PropertyErrorf("headers", "module %q cannot be used as a dependency", ctx.OtherModuleName(m)) + } + }) + ctx.VisitDirectDepsWithTag(staticLibTag, func(m android.Module) { + if dep, ok := android.OtherModuleProvider(ctx, m, JavaInfoProvider); ok { + j.implementationJars = append(j.implementationJars, dep.ImplementationJars...) + j.implementationAndResourceJars = append(j.implementationAndResourceJars, dep.ImplementationAndResourcesJars...) + j.resourceJars = append(j.resourceJars, dep.ResourceJars...) + + transitiveImplementationJars = append(transitiveImplementationJars, dep.TransitiveStaticLibsImplementationJars) + transitiveResourceJars = append(transitiveResourceJars, dep.TransitiveStaticLibsResourceJars) + j.aconfigProtoFiles = append(j.aconfigProtoFiles, dep.AconfigIntermediateCacheOutputPaths...) + } else if dep, ok := android.OtherModuleProvider(ctx, m, android.OutputFilesProvider); ok { + // This is provided by `java_genrule` modules. + j.implementationJars = append(j.implementationJars, dep.DefaultOutputFiles...) + j.implementationAndResourceJars = append(j.implementationAndResourceJars, dep.DefaultOutputFiles...) + stubsLinkType = Implementation + } else { + ctx.PropertyErrorf("static_libs", "module %q cannot be used as a dependency", ctx.OtherModuleName(m)) + } + }) + + jarName := ctx.ModuleName() + ".jar" + + if len(j.implementationAndResourceJars) > 1 { + outputFile := android.PathForModuleOut(ctx, "combined", jarName) + TransformJarsToJar(ctx, outputFile, "combine", j.implementationAndResourceJars, + android.OptionalPath{}, false, nil, nil) + j.combinedImplementationJar = outputFile + } else if len(j.implementationAndResourceJars) == 1 { + j.combinedImplementationJar = j.implementationAndResourceJars[0] + } + + if len(j.headerJars) > 1 { + outputFile := android.PathForModuleOut(ctx, "turbine-combined", jarName) + TransformJarsToJar(ctx, outputFile, "turbine combine", j.headerJars, + android.OptionalPath{}, false, nil, []string{"META-INF/TRANSITIVE"}) + j.combinedHeaderJar = outputFile + j.headerDirs = append(j.headerDirs, android.PathForModuleOut(ctx, "turbine-combined")) + } else if len(j.headerJars) == 1 { + j.combinedHeaderJar = j.headerJars[0] + } + + javaInfo := &JavaInfo{ + HeaderJars: android.Paths{j.combinedHeaderJar}, + LocalHeaderJars: android.Paths{j.combinedHeaderJar}, + TransitiveStaticLibsHeaderJars: depset.New(depset.PREORDER, android.Paths{j.combinedHeaderJar}, transitiveHeaderJars), + TransitiveStaticLibsImplementationJars: depset.New(depset.PREORDER, android.Paths{j.combinedImplementationJar}, transitiveImplementationJars), + TransitiveStaticLibsResourceJars: depset.New(depset.PREORDER, nil, transitiveResourceJars), + GeneratedSrcjars: android.Paths{j.combinedImplementationJar}, + ImplementationAndResourcesJars: android.Paths{j.combinedImplementationJar}, + ImplementationJars: android.Paths{j.combinedImplementationJar}, + ModuleWithSdkDepInfo: moduleWithSdkDepInfo, + ResourceJars: j.resourceJars, + OutputFile: j.combinedImplementationJar, + SdkVersion: sdkVersion, + SrcJarArgs: j.srcJarArgs, + SrcJarDeps: j.srcJarDeps, + StubsLinkType: stubsLinkType, + AconfigIntermediateCacheOutputPaths: j.aconfigProtoFiles, + } + setExtraJavaInfo(ctx, j, javaInfo) + ctx.SetOutputFiles(android.Paths{javaInfo.OutputFile}, "") + ctx.SetOutputFiles(android.Paths{javaInfo.OutputFile}, android.DefaultDistTag) + ctx.SetOutputFiles(javaInfo.ImplementationAndResourcesJars, ".jar") + ctx.SetOutputFiles(javaInfo.HeaderJars, ".hjar") + android.SetProvider(ctx, JavaInfoProvider, javaInfo) + +} + +func (j *GenruleCombiner) GeneratedSourceFiles() android.Paths { + return append(android.Paths{}, j.combinedImplementationJar) +} + +func (j *GenruleCombiner) GeneratedHeaderDirs() android.Paths { + return append(android.Paths{}, j.headerDirs...) +} + +func (j *GenruleCombiner) GeneratedDeps() android.Paths { + return append(android.Paths{}, j.combinedImplementationJar) +} + +func (j *GenruleCombiner) Srcs() android.Paths { + return append(android.Paths{}, j.implementationAndResourceJars...) +} + +func (j *GenruleCombiner) HeaderJars() android.Paths { + return j.headerJars +} + +func (j *GenruleCombiner) ImplementationAndResourcesJars() android.Paths { + return j.implementationAndResourceJars +} + +func (j *GenruleCombiner) DexJarBuildPath(ctx android.ModuleErrorfContext) android.Path { + return nil +} + +func (j *GenruleCombiner) DexJarInstallPath() android.Path { + return nil +} + +func (j *GenruleCombiner) AidlIncludeDirs() android.Paths { + return nil +} + +func (j *GenruleCombiner) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { + return nil +} + +func (j *GenruleCombiner) JacocoReportClassesFile() android.Path { + return nil +} + +func (j *GenruleCombiner) AndroidMk() android.AndroidMkData { + return android.AndroidMkData{ + Class: "JAVA_LIBRARIES", + OutputFile: android.OptionalPathForPath(j.combinedImplementationJar), + // Make does not support Windows Java modules + Disabled: j.Os() == android.Windows, + 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 :=", j.combinedHeaderJar.String()) + fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", j.combinedImplementationJar.String()) + }, + }, + } +} + +// implement the following interface for IDE completion. +var _ android.IDEInfo = (*GenruleCombiner)(nil) + +func (j *GenruleCombiner) IDEInfo(ctx android.BaseModuleContext, ideInfo *android.IdeInfo) { + ideInfo.Deps = append(ideInfo.Deps, j.genruleCombinerProperties.Static_libs.GetOrDefault(ctx, nil)...) + ideInfo.Libs = append(ideInfo.Libs, j.genruleCombinerProperties.Static_libs.GetOrDefault(ctx, nil)...) + ideInfo.Deps = append(ideInfo.Deps, j.genruleCombinerProperties.Headers.GetOrDefault(ctx, nil)...) + ideInfo.Libs = append(ideInfo.Libs, j.genruleCombinerProperties.Headers.GetOrDefault(ctx, nil)...) +} diff --git a/java/genrule_combiner_test.go b/java/genrule_combiner_test.go new file mode 100644 index 000000000..7d024cfec --- /dev/null +++ b/java/genrule_combiner_test.go @@ -0,0 +1,237 @@ +// Copyright 2018 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package java + +import ( + "reflect" + "testing" + + "android/soong/android" +) + +func TestJarGenruleCombinerSingle(t *testing.T) { + t.Parallel() + t.Helper() + ctx := prepareForJavaTest.RunTestWithBp(t, ` + java_library { + name: "foo", + srcs: ["a.java"], + } + + java_genrule { + name: "gen", + tool_files: ["b.java"], + cmd: "$(location b.java) $(in) $(out)", + out: ["gen.jar"], + srcs: [":foo"], + } + + java_genrule_combiner { + name: "jarcomb", + static_libs: ["gen"], + headers: ["foo"], + } + + java_library { + name: "bar", + static_libs: ["jarcomb"], + srcs: ["c.java"], + } + + java_library { + name: "baz", + libs: ["jarcomb"], + srcs: ["c.java"], + } + `).TestContext + + fooMod := ctx.ModuleForTests(t, "foo", "android_common") + fooCombined := fooMod.Output("turbine-combined/foo.jar") + fooOutputFiles, _ := android.OtherModuleProvider(ctx.OtherModuleProviderAdaptor(), fooMod.Module(), android.OutputFilesProvider) + fooHeaderJars := fooOutputFiles.TaggedOutputFiles[".hjar"] + + genMod := ctx.ModuleForTests(t, "gen", "android_common") + gen := genMod.Output("gen.jar") + + jarcombMod := ctx.ModuleForTests(t, "jarcomb", "android_common") + jarcombInfo, _ := android.OtherModuleProvider(ctx.OtherModuleProviderAdaptor(), jarcombMod.Module(), JavaInfoProvider) + jarcombOutputFiles, _ := android.OtherModuleProvider(ctx.OtherModuleProviderAdaptor(), jarcombMod.Module(), android.OutputFilesProvider) + + // Confirm that jarcomb simply forwards the jarcomb implementation and the foo headers. + if len(jarcombOutputFiles.DefaultOutputFiles) != 1 || + android.PathRelativeToTop(jarcombOutputFiles.DefaultOutputFiles[0]) != android.PathRelativeToTop(gen.Output) { + t.Errorf("jarcomb Implementation %v is not [%q]", + android.PathsRelativeToTop(jarcombOutputFiles.DefaultOutputFiles), android.PathRelativeToTop(gen.Output)) + } + jarcombHeaderJars := jarcombOutputFiles.TaggedOutputFiles[".hjar"] + if !reflect.DeepEqual(jarcombHeaderJars, fooHeaderJars) { + t.Errorf("jarcomb Header jar %v is not %q", + jarcombHeaderJars, fooHeaderJars) + } + + // Confirm that JavaInfoProvider agrees. + if len(jarcombInfo.ImplementationJars) != 1 || + android.PathRelativeToTop(jarcombInfo.ImplementationJars[0]) != android.PathRelativeToTop(gen.Output) { + t.Errorf("jarcomb ImplementationJars %v is not [%q]", + android.PathsRelativeToTop(jarcombInfo.ImplementationJars), android.PathRelativeToTop(gen.Output)) + } + if len(jarcombInfo.HeaderJars) != 1 || + android.PathRelativeToTop(jarcombInfo.HeaderJars[0]) != android.PathRelativeToTop(fooCombined.Output) { + t.Errorf("jarcomb HeaderJars %v is not [%q]", + android.PathsRelativeToTop(jarcombInfo.HeaderJars), android.PathRelativeToTop(fooCombined.Output)) + } + + barMod := ctx.ModuleForTests(t, "bar", "android_common") + bar := barMod.Output("javac/bar.jar") + barCombined := barMod.Output("combined/bar.jar") + + // Confirm that bar uses the Implementation from gen and headerJars from foo. + if len(barCombined.Inputs) != 2 || + barCombined.Inputs[0].String() != bar.Output.String() || + barCombined.Inputs[1].String() != gen.Output.String() { + t.Errorf("bar combined jar inputs %v is not [%q, %q]", + barCombined.Inputs.Strings(), bar.Output.String(), gen.Output.String()) + } + + bazMod := ctx.ModuleForTests(t, "baz", "android_common") + baz := bazMod.Output("javac/baz.jar") + + string_in_list := func(s string, l []string) bool { + for _, v := range l { + if s == v { + return true + } + } + return false + } + + // Confirm that baz uses the headerJars from foo. + bazImplicitsRel := android.PathsRelativeToTop(baz.Implicits) + for _, v := range android.PathsRelativeToTop(fooHeaderJars) { + if !string_in_list(v, bazImplicitsRel) { + t.Errorf("baz Implicits %v does not contain %q", bazImplicitsRel, v) + } + } +} + +func TestJarGenruleCombinerMulti(t *testing.T) { + t.Parallel() + t.Helper() + ctx := prepareForJavaTest.RunTestWithBp(t, ` + java_library { + name: "foo1", + srcs: ["foo1_a.java"], + } + + java_library { + name: "foo2", + srcs: ["foo2_a.java"], + } + + java_genrule { + name: "gen1", + tool_files: ["b.java"], + cmd: "$(location b.java) $(in) $(out)", + out: ["gen1.jar"], + srcs: [":foo1"], + } + + java_genrule { + name: "gen2", + tool_files: ["b.java"], + cmd: "$(location b.java) $(in) $(out)", + out: ["gen2.jar"], + srcs: [":foo2"], + } + + // Combine multiple java_genrule modules. + java_genrule_combiner { + name: "jarcomb", + static_libs: ["gen1", "gen2"], + headers: ["foo1", "foo2"], + } + + java_library { + name: "bar", + static_libs: ["jarcomb"], + srcs: ["c.java"], + } + + java_library { + name: "baz", + libs: ["jarcomb"], + srcs: ["c.java"], + } + `).TestContext + + gen1Mod := ctx.ModuleForTests(t, "gen1", "android_common") + gen1 := gen1Mod.Output("gen1.jar") + gen2Mod := ctx.ModuleForTests(t, "gen2", "android_common") + gen2 := gen2Mod.Output("gen2.jar") + + jarcombMod := ctx.ModuleForTests(t, "jarcomb", "android_common") + jarcomb := jarcombMod.Output("combined/jarcomb.jar") + jarcombTurbine := jarcombMod.Output("turbine-combined/jarcomb.jar") + _ = jarcombTurbine + jarcombInfo, _ := android.OtherModuleProvider(ctx.OtherModuleProviderAdaptor(), jarcombMod.Module(), JavaInfoProvider) + _ = jarcombInfo + jarcombOutputFiles, _ := android.OtherModuleProvider(ctx.OtherModuleProviderAdaptor(), jarcombMod.Module(), android.OutputFilesProvider) + jarcombHeaderJars := jarcombOutputFiles.TaggedOutputFiles[".hjar"] + + if len(jarcomb.Inputs) != 2 || + jarcomb.Inputs[0].String() != gen1.Output.String() || + jarcomb.Inputs[1].String() != gen2.Output.String() { + t.Errorf("jarcomb inputs %v are not [%q, %q]", + jarcomb.Inputs.Strings(), gen1.Output.String(), gen2.Output.String()) + } + + if len(jarcombHeaderJars) != 1 || + android.PathRelativeToTop(jarcombHeaderJars[0]) != android.PathRelativeToTop(jarcombTurbine.Output) { + t.Errorf("jarcomb Header jars %v is not [%q]", + android.PathsRelativeToTop(jarcombHeaderJars), android.PathRelativeToTop(jarcombTurbine.Output)) + } + + barMod := ctx.ModuleForTests(t, "bar", "android_common") + bar := barMod.Output("javac/bar.jar") + barCombined := barMod.Output("combined/bar.jar") + + // Confirm that bar uses the Implementation and Headers from jarcomb. + if len(barCombined.Inputs) != 2 || + barCombined.Inputs[0].String() != bar.Output.String() || + barCombined.Inputs[1].String() != jarcomb.Output.String() { + t.Errorf("bar combined jar inputs %v is not [%q, %q]", + barCombined.Inputs.Strings(), bar.Output.String(), jarcomb.Output.String()) + } + + bazMod := ctx.ModuleForTests(t, "baz", "android_common") + baz := bazMod.Output("javac/baz.jar") + + string_in_list := func(s string, l []string) bool { + for _, v := range l { + if s == v { + return true + } + } + return false + } + + // Confirm that baz uses the headerJars from foo. + bazImplicitsRel := android.PathsRelativeToTop(baz.Implicits) + for _, v := range android.PathsRelativeToTop(jarcombHeaderJars) { + if !string_in_list(v, bazImplicitsRel) { + t.Errorf("baz Implicits %v does not contain %q", bazImplicitsRel, v) + } + } +} diff --git a/java/genrule_test.go b/java/genrule_test.go index b4e9d218d..c112e4503 100644 --- a/java/genrule_test.go +++ b/java/genrule_test.go @@ -57,7 +57,7 @@ func TestGenruleCmd(t *testing.T) { t.Fatal(errs) } - gen := ctx.ModuleForTests("gen", "android_common").Output("out") + gen := ctx.ModuleForTests(t, "gen", "android_common").Output("out") expected := []string{"foo"} if !reflect.DeepEqual(expected, gen.Implicits.Strings()[:len(expected)]) { t.Errorf(`want arm inputs %v, got %v`, expected, gen.Implicits.Strings()) @@ -93,11 +93,11 @@ func TestJarGenrules(t *testing.T) { } `) - foo := ctx.ModuleForTests("foo", "android_common").Output("javac/foo.jar") - jargen := ctx.ModuleForTests("jargen", "android_common").Output("jargen.jar") - bar := ctx.ModuleForTests("bar", "android_common").Output("javac/bar.jar") - baz := ctx.ModuleForTests("baz", "android_common").Output("javac/baz.jar") - barCombined := ctx.ModuleForTests("bar", "android_common").Output("combined/bar.jar") + foo := ctx.ModuleForTests(t, "foo", "android_common").Output("javac/foo.jar") + jargen := ctx.ModuleForTests(t, "jargen", "android_common").Output("jargen.jar") + bar := ctx.ModuleForTests(t, "bar", "android_common").Output("javac/bar.jar") + baz := ctx.ModuleForTests(t, "baz", "android_common").Output("javac/baz.jar") + barCombined := ctx.ModuleForTests(t, "bar", "android_common").Output("combined/bar.jar") if g, w := jargen.Implicits.Strings(), foo.Output.String(); !android.InList(w, g) { t.Errorf("expected jargen inputs [%q], got %q", w, g) diff --git a/java/hiddenapi_singleton.go b/java/hiddenapi_singleton.go index 7d21b7a61..2c8694237 100644 --- a/java/hiddenapi_singleton.go +++ b/java/hiddenapi_singleton.go @@ -171,11 +171,11 @@ func isModuleInConfiguredList(ctx android.BaseModuleContext, module android.Modu // Now match the apex part of the boot image configuration. requiredApex := configuredBootJars.Apex(index) if android.IsConfiguredJarForPlatform(requiredApex) { - if len(apexInfo.InApexVariants) != 0 { + if apexInfo.ApexVariationName != "" { // A platform variant is required but this is for an apex so ignore it. return false } - } else if !apexInfo.InApexVariant(requiredApex) { + } else if apexInfo.BaseApexName != requiredApex { // An apex variant for a specific apex is required but this is the wrong apex. return false } diff --git a/java/hiddenapi_singleton_test.go b/java/hiddenapi_singleton_test.go index c14fdb7bb..147f326c7 100644 --- a/java/hiddenapi_singleton_test.go +++ b/java/hiddenapi_singleton_test.go @@ -57,7 +57,7 @@ func TestHiddenAPISingleton(t *testing.T) { } `) - hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") + hiddenAPI := result.ModuleForTests(t, "platform-bootclasspath", "android_common") hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want) @@ -101,7 +101,7 @@ func TestHiddenAPISingletonWithPrebuilt(t *testing.T) { } `) - hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") + hiddenAPI := result.ModuleForTests(t, "platform-bootclasspath", "android_common") hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want) @@ -128,7 +128,7 @@ func TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) { } `) - hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") + hiddenAPI := result.ModuleForTests(t, "platform-bootclasspath", "android_common") hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar" android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg) @@ -158,7 +158,7 @@ func TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) { } `) - hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") + hiddenAPI := result.ModuleForTests(t, "platform-bootclasspath", "android_common") hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") prebuiltJarArg := "--boot-dex=out/soong/.intermediates/prebuilt_foo/android_common/dex/foo.jar" android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg) @@ -219,7 +219,7 @@ func TestHiddenAPISingletonSdks(t *testing.T) { } `) - hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common") + hiddenAPI := result.ModuleForTests(t, "platform-bootclasspath", "android_common") hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags") wantPublicStubs := "--public-stub-classpath=" + generateSdkDexPath(tc.publicStub, tc.unbundledBuild) android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantPublicStubs) @@ -279,9 +279,9 @@ func TestHiddenAPISingletonWithPrebuiltCsvFile(t *testing.T) { expectedCpOutput := "out/soong/hiddenapi/hiddenapi-flags.csv" expectedFlagsCsv := "out/soong/hiddenapi/hiddenapi-flags.csv" - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") - hiddenAPI := result.SingletonForTests("hiddenapi") + hiddenAPI := result.SingletonForTests(t, "hiddenapi") cpRule := hiddenAPI.Rule("Cp") actualCpInput := cpRule.BuildParams.Input actualCpOutput := cpRule.BuildParams.Output @@ -318,7 +318,7 @@ func TestHiddenAPIEncoding_JavaSdkLibrary(t *testing.T) { `) checkDexEncoded := func(t *testing.T, name, unencodedDexJar, encodedDexJar string) { - moduleForTests := result.ModuleForTests(name+".impl", "android_common") + moduleForTests := result.ModuleForTests(t, name+".impl", "android_common") encodeDexRule := moduleForTests.Rule("hiddenAPIEncodeDex") actualUnencodedDexJar := encodeDexRule.Input diff --git a/java/jarjar_test.go b/java/jarjar_test.go index 82bfa2b86..b68976155 100644 --- a/java/jarjar_test.go +++ b/java/jarjar_test.go @@ -22,7 +22,7 @@ import ( ) func AssertJarJarRename(t *testing.T, result *android.TestResult, libName, original, expectedRename string) { - module := result.ModuleForTests(libName, "android_common") + module := result.ModuleForTests(t, libName, "android_common") provider, found := android.OtherModuleProvider(result.OtherModuleProviderAdaptor(), module.Module(), JarJarProvider) android.AssertBoolEquals(t, fmt.Sprintf("found provider (%s)", libName), true, found) diff --git a/java/java.go b/java/java.go index 900f0e32f..c5dee0c97 100644 --- a/java/java.go +++ b/java/java.go @@ -64,6 +64,7 @@ func registerJavaBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("java_api_library", ApiLibraryFactory) ctx.RegisterModuleType("java_api_contribution", ApiContributionFactory) ctx.RegisterModuleType("java_api_contribution_import", ApiContributionImportFactory) + ctx.RegisterModuleType("java_genrule_combiner", GenruleCombinerFactory) // This mutator registers dependencies on dex2oat for modules that should be // dexpreopted. This is done late when the final variants have been @@ -373,7 +374,7 @@ type JavaInfo struct { ProvidesUsesLibInfo *ProvidesUsesLibInfo - ModuleWithUsesLibraryInfo *ModuleWithUsesLibraryInfo + MissingOptionalUsesLibs []string ModuleWithSdkDepInfo *ModuleWithSdkDepInfo @@ -828,6 +829,8 @@ type Library struct { combinedExportedProguardFlagsFile android.Path InstallMixin func(ctx android.ModuleContext, installPath android.Path) (extraInstallDeps android.InstallPaths) + + apiXmlFile android.WritablePath } var _ android.ApexModule = (*Library)(nil) @@ -1155,6 +1158,8 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.javaLibraryModuleInfoJSON(ctx) buildComplianceMetadata(ctx) + + j.createApiXmlFile(ctx) } func (j *Library) javaLibraryModuleInfoJSON(ctx android.ModuleContext) *android.ModuleInfoJSON { @@ -1189,7 +1194,7 @@ func buildComplianceMetadata(ctx android.ModuleContext) { for _, paths := range ctx.GetOutputFiles().TaggedOutputFiles { builtFiles = append(builtFiles, paths.Strings()...) } - complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.BUILT_FILES, android.FirstUniqueStrings(builtFiles)) + complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.BUILT_FILES, android.SortedUniqueStrings(builtFiles)) // Static deps staticDepNames := make([]string, 0) @@ -1202,8 +1207,8 @@ func buildComplianceMetadata(ctx android.ModuleContext) { staticDepFiles = append(staticDepFiles, dep.ResourceJars...) } }) - complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames)) - complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepFiles.Strings())) + complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.SortedUniqueStrings(staticDepNames)) + complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.SortedUniqueStrings(staticDepFiles.Strings())) } func (j *Library) getJarInstallDir(ctx android.ModuleContext) android.InstallPath { @@ -1259,6 +1264,28 @@ func (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) { } } +var apiXMLGeneratingApiSurfaces = []android.SdkKind{ + android.SdkPublic, + android.SdkSystem, + android.SdkModule, + android.SdkSystemServer, + android.SdkTest, +} + +func (j *Library) createApiXmlFile(ctx android.ModuleContext) { + if kind, ok := android.JavaLibraryNameToSdkKind(ctx.ModuleName()); ok && android.InList(kind, apiXMLGeneratingApiSurfaces) { + scopePrefix := AllApiScopes.matchingScopeFromSdkKind(kind).apiFilePrefix + j.apiXmlFile = android.PathForModuleOut(ctx, fmt.Sprintf("%sapi.xml", scopePrefix)) + ctx.Build(pctx, android.BuildParams{ + Rule: generateApiXMLRule, + // LOCAL_SOONG_CLASSES_JAR + Input: j.implementationAndResourcesJar, + Output: j.apiXmlFile, + }) + ctx.DistForGoal("dist_files", j.apiXmlFile) + } +} + const ( aidlIncludeDir = "aidl" javaDir = "java" @@ -3252,26 +3279,29 @@ func (j *Import) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { var _ android.ApexModule = (*Import)(nil) // Implements android.ApexModule -func (j *Import) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { - return j.depIsInSameApex(tag) +func (m *Import) GetDepInSameApexChecker() android.DepInSameApexChecker { + return JavaImportDepInSameApexChecker{} +} + +type JavaImportDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m JavaImportDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { + return depIsInSameApex(tag) } // Implements android.ApexModule -func (j *Import) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { +func (j *Import) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { sdkVersionSpec := j.SdkVersion(ctx) minSdkVersion := j.MinSdkVersion(ctx) - if !minSdkVersion.Specified() { - return fmt.Errorf("min_sdk_version is not specified") - } + // If the module is compiling against core (via sdk_version), skip comparison check. if sdkVersionSpec.Kind == android.SdkCore { - return nil - } - if minSdkVersion.GreaterThan(sdkVersion) { - return fmt.Errorf("newer SDK(%v)", minSdkVersion) + return android.MinApiLevel } - return nil + + return minSdkVersion } // requiredFilesFromPrebuiltApexForImport returns information about the files that a java_import or @@ -3487,10 +3517,8 @@ func (j *DexImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDex var _ android.ApexModule = (*DexImport)(nil) // Implements android.ApexModule -func (j *DexImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - // we don't check prebuilt modules for sdk_version - return nil +func (m *DexImport) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } // dex_import imports a `.jar` file containing classes.dex files. @@ -3512,7 +3540,6 @@ func DexImportFactory() android.Module { type Defaults struct { android.ModuleBase android.DefaultsModuleBase - android.ApexModuleBase } // java_defaults provides a set of properties that can be inherited by other java or android modules. @@ -3679,11 +3706,11 @@ func addMissingOptionalUsesLibsFromDep(ctx android.ModuleContext, depModule andr usesLibrary *usesLibrary) { dep, ok := android.OtherModuleProvider(ctx, depModule, JavaInfoProvider) - if !ok || dep.ModuleWithUsesLibraryInfo == nil { + if !ok { return } - for _, lib := range dep.ModuleWithUsesLibraryInfo.UsesLibrary.usesLibraryProperties.Missing_optional_uses_libs { + for _, lib := range dep.MissingOptionalUsesLibs { if !android.InList(lib, usesLibrary.usesLibraryProperties.Missing_optional_uses_libs) { usesLibrary.usesLibraryProperties.Missing_optional_uses_libs = append(usesLibrary.usesLibraryProperties.Missing_optional_uses_libs, lib) @@ -3771,9 +3798,7 @@ func setExtraJavaInfo(ctx android.ModuleContext, module android.Module, javaInfo } if mwul, ok := module.(ModuleWithUsesLibrary); ok { - javaInfo.ModuleWithUsesLibraryInfo = &ModuleWithUsesLibraryInfo{ - UsesLibrary: mwul.UsesLibrary(), - } + javaInfo.MissingOptionalUsesLibs = mwul.UsesLibrary().usesLibraryProperties.Missing_optional_uses_libs } if mwsd, ok := module.(moduleWithSdkDep); ok { diff --git a/java/java_test.go b/java/java_test.go index de58237bc..f097762eb 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -349,7 +349,7 @@ func TestSimple(t *testing.T) { PrepareForTestWithJavaDefaultModules, tt.preparer, ).RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") fooJavac := foo.Rule("javac") android.AssertPathsRelativeToTopEquals(t, "foo javac inputs", tt.fooJavacInputs, fooJavac.Inputs) @@ -364,7 +364,7 @@ func TestSimple(t *testing.T) { fooCombinedHeaderJar := foo.Output("turbine-combined/foo.jar") android.AssertPathsRelativeToTopEquals(t, "foo header combined inputs", tt.fooHeaderCombinedInputs, fooCombinedHeaderJar.Inputs) - bar := result.ModuleForTests("bar", "android_common") + bar := result.ModuleForTests(t, "bar", "android_common") barJavac := bar.Rule("javac") android.AssertPathsRelativeToTopEquals(t, "bar javac inputs", tt.barJavacInputs, barJavac.Inputs) @@ -475,11 +475,11 @@ func TestExportedPlugins(t *testing.T) { `+test.extra) for _, want := range test.results { - javac := ctx.ModuleForTests(want.library, "android_common").Rule("javac") + javac := ctx.ModuleForTests(t, want.library, "android_common").Rule("javac") if javac.Args["processor"] != want.processors { t.Errorf("For library %v, expected %v, found %v", want.library, want.processors, javac.Args["processor"]) } - turbine := ctx.ModuleForTests(want.library, "android_common").MaybeRule("turbine") + turbine := ctx.ModuleForTests(t, want.library, "android_common").MaybeRule("turbine") disableTurbine := turbine.BuildParams.Rule == nil if disableTurbine != want.disableTurbine { t.Errorf("For library %v, expected disableTurbine %v, found %v", want.library, want.disableTurbine, disableTurbine) @@ -545,7 +545,7 @@ func TestArchSpecific(t *testing.T) { } `) - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") if len(javac.Inputs) != 2 || javac.Inputs[0].String() != "a.java" || javac.Inputs[1].String() != "b.java" { t.Errorf(`foo inputs %v != ["a.java", "b.java"]`, javac.Inputs) } @@ -576,11 +576,11 @@ func TestBinary(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - bar := ctx.ModuleForTests("bar", buildOS+"_common") + bar := ctx.ModuleForTests(t, "bar", buildOS+"_common") barJar := bar.Output("bar.jar").Output.String() barWrapperDeps := bar.Output("bar").Implicits.Strings() - libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared") + libjni := ctx.ModuleForTests(t, "libjni", buildOS+"_x86_64_shared") libjniSO := libjni.Rule("Cp").Output.String() // Test that the install binary wrapper depends on the installed jar file @@ -613,7 +613,7 @@ func TestTest(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - foo := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) + foo := ctx.ModuleForTests(t, "foo", buildOS+"_common").Module().(*TestHost) expected := "lib64/libjni.so" if runtime.GOOS == "darwin" { @@ -649,7 +649,7 @@ func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) { ).RunTestWithBp(t, bp) // first, check that the -g flag is added to target modules - targetLibrary := result.ModuleForTests("target_library", "android_common") + targetLibrary := result.ModuleForTests(t, "target_library", "android_common") targetJavaFlags := targetLibrary.Module().VariablesForTests()["javacFlags"] if !strings.Contains(targetJavaFlags, "-g:source,lines") { t.Errorf("target library javac flags %v should contain "+ @@ -658,7 +658,7 @@ func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) { // check that -g is not overridden for host modules buildOS := result.Config.BuildOS.String() - hostBinary := result.ModuleForTests("host_binary", buildOS+"_common") + hostBinary := result.ModuleForTests(t, "host_binary", buildOS+"_common") hostJavaFlags := hostBinary.Module().VariablesForTests()["javacFlags"] if strings.Contains(hostJavaFlags, "-g:source,lines") { t.Errorf("java_binary_host javac flags %v should not have "+ @@ -722,14 +722,14 @@ func TestPrebuilts(t *testing.T) { } `) - fooModule := ctx.ModuleForTests("foo", "android_common") + fooModule := ctx.ModuleForTests(t, "foo", "android_common") javac := fooModule.Rule("javac") - combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac") - barModule := ctx.ModuleForTests("bar", "android_common") + combineJar := ctx.ModuleForTests(t, "foo", "android_common").Description("for javac") + barModule := ctx.ModuleForTests(t, "bar", "android_common") barJar := barModule.Output("combined/bar.jar").Output - bazModule := ctx.ModuleForTests("baz", "android_common") + bazModule := ctx.ModuleForTests(t, "baz", "android_common") bazJar := bazModule.Output("combined/baz.jar").Output - sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common"). + sdklibStubsJar := ctx.ModuleForTests(t, "sdklib.stubs", "android_common"). Output("combined/sdklib.stubs.jar").Output fooLibrary := fooModule.Module().(*Library) @@ -762,7 +762,7 @@ func TestPrebuilts(t *testing.T) { expectedDexJar := "out/soong/.intermediates/baz/android_common/dex/baz.jar" android.AssertPathRelativeToTopEquals(t, "baz dex jar build path", expectedDexJar, bazDexJar) - ctx.ModuleForTests("qux", "android_common").Rule("Cp") + ctx.ModuleForTests(t, "qux", "android_common").Rule("Cp") entries := android.AndroidMkEntriesForTest(t, ctx, fooModule.Module())[0] android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "java_library", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0]) @@ -788,7 +788,7 @@ prebuilt_stubs_sources { "stubs/sources/pkg/B.java": nil, }) - zipSrc := ctx.ModuleForTests("stubs-source", "android_common").Rule("zip_src") + zipSrc := ctx.ModuleForTests(t, "stubs-source", "android_common").Rule("zip_src") if expected, actual := expectedInputs, zipSrc.Inputs.Strings(); !reflect.DeepEqual(expected, actual) { t.Errorf("mismatch of inputs to soong_zip: expected %q, actual %q", expected, actual) } @@ -851,8 +851,8 @@ func TestDefaults(t *testing.T) { } `) - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") - combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") + combineJar := ctx.ModuleForTests(t, "foo", "android_common").Description("for javac") if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" { t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs) @@ -863,22 +863,22 @@ func TestDefaults(t *testing.T) { t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barTurbine) } - baz := ctx.ModuleForTests("baz", "android_common").Rule("javac").Output.String() + baz := ctx.ModuleForTests(t, "baz", "android_common").Rule("javac").Output.String() if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz { t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz) } - atestOptimize := ctx.ModuleForTests("atestOptimize", "android_common").MaybeRule("r8") + atestOptimize := ctx.ModuleForTests(t, "atestOptimize", "android_common").MaybeRule("r8") if atestOptimize.Output == nil { t.Errorf("atestOptimize should optimize APK") } - atestNoOptimize := ctx.ModuleForTests("atestNoOptimize", "android_common").MaybeRule("d8") + atestNoOptimize := ctx.ModuleForTests(t, "atestNoOptimize", "android_common").MaybeRule("d8") if atestNoOptimize.Output == nil { t.Errorf("atestNoOptimize should not optimize APK") } - atestDefault := ctx.ModuleForTests("atestDefault", "android_common").MaybeRule("d8") + atestDefault := ctx.ModuleForTests(t, "atestDefault", "android_common").MaybeRule("d8") if atestDefault.Output == nil { t.Errorf("atestDefault should not optimize APK") } @@ -976,8 +976,8 @@ func TestResources(t *testing.T) { }, ) - foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar") - fooRes := ctx.ModuleForTests("foo", "android_common").Output("res/foo.jar") + foo := ctx.ModuleForTests(t, "foo", "android_common").Output("withres/foo.jar") + fooRes := ctx.ModuleForTests(t, "foo", "android_common").Output("res/foo.jar") if !inList(fooRes.Output.String(), foo.Inputs.Strings()) { t.Errorf("foo combined jars %v does not contain %q", @@ -1022,8 +1022,8 @@ func TestIncludeSrcs(t *testing.T) { }) // Test a library with include_srcs: true - foo := ctx.ModuleForTests("foo", "android_common").Output("withres/foo.jar") - fooSrcJar := ctx.ModuleForTests("foo", "android_common").Output("foo.srcjar") + foo := ctx.ModuleForTests(t, "foo", "android_common").Output("withres/foo.jar") + fooSrcJar := ctx.ModuleForTests(t, "foo", "android_common").Output("foo.srcjar") if g, w := fooSrcJar.Output.String(), foo.Inputs.Strings(); !inList(g, w) { t.Errorf("foo combined jars %v does not contain %q", w, g) @@ -1034,10 +1034,10 @@ func TestIncludeSrcs(t *testing.T) { } // Test a library with include_srcs: true and resources - bar := ctx.ModuleForTests("bar", "android_common").Output("withres/bar.jar") - barResCombined := ctx.ModuleForTests("bar", "android_common").Output("res-combined/bar.jar") - barRes := ctx.ModuleForTests("bar", "android_common").Output("res/bar.jar") - barSrcJar := ctx.ModuleForTests("bar", "android_common").Output("bar.srcjar") + bar := ctx.ModuleForTests(t, "bar", "android_common").Output("withres/bar.jar") + barResCombined := ctx.ModuleForTests(t, "bar", "android_common").Output("res-combined/bar.jar") + barRes := ctx.ModuleForTests(t, "bar", "android_common").Output("res/bar.jar") + barSrcJar := ctx.ModuleForTests(t, "bar", "android_common").Output("bar.srcjar") if g, w := barSrcJar.Output.String(), barResCombined.Inputs.Strings(); !inList(g, w) { t.Errorf("bar combined resource jars %v does not contain %q", w, g) @@ -1082,8 +1082,8 @@ func TestGeneratedSources(t *testing.T) { "b.java": nil, }) - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") - genrule := ctx.ModuleForTests("gen", "").Rule("generator") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") + genrule := ctx.ModuleForTests(t, "gen", "").Rule("generator") if filepath.Base(genrule.Output.String()) != "gen.java" { t.Fatalf(`gen output file %v is not ".../gen.java"`, genrule.Output.String()) @@ -1123,11 +1123,11 @@ func TestTurbine(t *testing.T) { } `) - fooTurbine := result.ModuleForTests("foo", "android_common").Rule("turbine") - barTurbine := result.ModuleForTests("bar", "android_common").Rule("turbine") - barJavac := result.ModuleForTests("bar", "android_common").Rule("javac") - barTurbineCombined := result.ModuleForTests("bar", "android_common").Description("for turbine") - bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac") + fooTurbine := result.ModuleForTests(t, "foo", "android_common").Rule("turbine") + barTurbine := result.ModuleForTests(t, "bar", "android_common").Rule("turbine") + barJavac := result.ModuleForTests(t, "bar", "android_common").Rule("javac") + barTurbineCombined := result.ModuleForTests(t, "bar", "android_common").Description("for turbine") + bazJavac := result.ModuleForTests(t, "baz", "android_common").Rule("javac") android.AssertPathsRelativeToTopEquals(t, "foo inputs", []string{"a.java"}, fooTurbine.Inputs) @@ -1151,7 +1151,7 @@ func TestSharding(t *testing.T) { barHeaderJar := filepath.Join("out", "soong", ".intermediates", "bar", "android_common", "turbine", "bar.jar") for i := 0; i < 3; i++ { - barJavac := ctx.ModuleForTests("bar", "android_common").Description("javac" + strconv.Itoa(i)) + barJavac := ctx.ModuleForTests(t, "bar", "android_common").Description("javac" + strconv.Itoa(i)) if !strings.HasPrefix(barJavac.Args["classpath"], "-classpath "+barHeaderJar+":") { t.Errorf("bar javac classpath %v does start with %q", barJavac.Args["classpath"], barHeaderJar) } @@ -1178,7 +1178,7 @@ func TestExcludeFileGroupInSrcs(t *testing.T) { } `) - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "java-fg/c.java" { t.Errorf(`foo inputs %v != ["java-fg/c.java"]`, javac.Inputs) @@ -1249,7 +1249,7 @@ func TestJavaImport(t *testing.T) { PrepareForTestWithJavaDefaultModules, ).RunTestWithBp(t, bp) - source := ctx.ModuleForTests("source_library", "android_common") + source := ctx.ModuleForTests(t, "source_library", "android_common") sourceJar := source.Output("javac/source_library.jar") sourceHeaderJar := source.Output("turbine-combined/source_library.jar") sourceJavaInfo, _ := android.OtherModuleProvider(ctx, source.Module(), JavaInfoProvider) @@ -1260,7 +1260,7 @@ func TestJavaImport(t *testing.T) { android.AssertPathsRelativeToTopEquals(t, "source library header jar", []string{sourceHeaderJar.Output.String()}, sourceJavaInfo.HeaderJars) - importWithNoDeps := ctx.ModuleForTests("import_with_no_deps", "android_common") + importWithNoDeps := ctx.ModuleForTests(t, "import_with_no_deps", "android_common") importWithNoDepsJar := importWithNoDeps.Output("combined/import_with_no_deps.jar") importWithNoDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithNoDeps.Module(), JavaInfoProvider) @@ -1272,7 +1272,7 @@ func TestJavaImport(t *testing.T) { android.AssertPathsRelativeToTopEquals(t, "import with no deps combined inputs", []string{"no_deps.jar"}, importWithNoDepsJar.Inputs) - importWithSourceDeps := ctx.ModuleForTests("import_with_source_deps", "android_common") + importWithSourceDeps := ctx.ModuleForTests(t, "import_with_source_deps", "android_common") importWithSourceDepsJar := importWithSourceDeps.Output("combined/import_with_source_deps.jar") importWithSourceDepsHeaderJar := importWithSourceDeps.Output("turbine-combined/import_with_source_deps.jar") importWithSourceDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithSourceDeps.Module(), JavaInfoProvider) @@ -1287,7 +1287,7 @@ func TestJavaImport(t *testing.T) { android.AssertPathsRelativeToTopEquals(t, "import with source deps combined header jar inputs", []string{"source_deps.jar", sourceHeaderJar.Output.String()}, importWithSourceDepsHeaderJar.Inputs) - importWithImportDeps := ctx.ModuleForTests("import_with_import_deps", "android_common") + importWithImportDeps := ctx.ModuleForTests(t, "import_with_import_deps", "android_common") importWithImportDepsJar := importWithImportDeps.Output("combined/import_with_import_deps.jar") importWithImportDepsJavaInfo, _ := android.OtherModuleProvider(ctx, importWithImportDeps.Module(), JavaInfoProvider) @@ -1364,7 +1364,7 @@ func TestCompilerFlags(t *testing.T) { // TODO(jungjw): Consider making this more robust by ignoring path order. func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) { - variables := ctx.ModuleForTests(moduleName, "android_common").VariablesForTestsRelativeToTop() + variables := ctx.ModuleForTests(t, moduleName, "android_common").VariablesForTestsRelativeToTop() flags := strings.Split(variables["javacFlags"], " ") got := "" for _, flag := range flags { @@ -1505,7 +1505,7 @@ func TestJavaLibraryWithSystemModules(t *testing.T) { } func checkBootClasspathForLibWithSystemModule(t *testing.T, ctx *android.TestContext, moduleName string, expectedSuffix string) { - javacRule := ctx.ModuleForTests(moduleName, "android_common").Rule("javac") + javacRule := ctx.ModuleForTests(t, moduleName, "android_common").Rule("javac") bootClasspath := javacRule.Args["bootClasspath"] if strings.HasPrefix(bootClasspath, "--system ") && strings.HasSuffix(bootClasspath, expectedSuffix) { t.Errorf("bootclasspath of %q must start with --system and end with %q, but was %#v.", moduleName, expectedSuffix, bootClasspath) @@ -1530,7 +1530,7 @@ func TestAidlExportIncludeDirsFromImports(t *testing.T) { } `) - aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command + aidlCommand := ctx.ModuleForTests(t, "foo", "android_common").Rule("aidl").RuleParams.Command expectedAidlFlag := "-Iaidl/bar" if !strings.Contains(aidlCommand, expectedAidlFlag) { t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) @@ -1547,7 +1547,7 @@ func TestAidlFlagsArePassedToTheAidlCompiler(t *testing.T) { } `) - aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command + aidlCommand := ctx.ModuleForTests(t, "foo", "android_common").Rule("aidl").RuleParams.Command expectedAidlFlag := "-Werror" if !strings.Contains(aidlCommand, expectedAidlFlag) { t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) @@ -1577,7 +1577,7 @@ func TestAidlFlagsWithMinSdkVersion(t *testing.T) { `+tc.sdkVersion+` } `) - aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command + aidlCommand := ctx.ModuleForTests(t, "foo", "android_common").Rule("aidl").RuleParams.Command expectedAidlFlag := "--min_sdk_version=" + tc.expected if !strings.Contains(aidlCommand, expectedAidlFlag) { t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) @@ -1614,7 +1614,7 @@ func TestAidlFlagsMinSdkVersionDroidstubs(t *testing.T) { } for _, tc := range testCases { ctx := prepareForJavaTest.RunTestWithBp(t, fmt.Sprintf(bpTemplate, tc.sdkVersionBp)) - aidlCmd := ctx.ModuleForTests("foo-stubs", "android_common").Rule("aidl").RuleParams.Command + aidlCmd := ctx.ModuleForTests(t, "foo-stubs", "android_common").Rule("aidl").RuleParams.Command expected := "--min_sdk_version=" + tc.minSdkVersionExpected android.AssertStringDoesContain(t, "aidl command conatins incorrect min_sdk_version for testCse: "+tc.desc, aidlCmd, expected) } @@ -1630,7 +1630,7 @@ func TestAidlEnforcePermissions(t *testing.T) { } `) - aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command + aidlCommand := ctx.ModuleForTests(t, "foo", "android_common").Rule("aidl").RuleParams.Command expectedAidlFlag := "-Wmissing-permission-annotation -Werror" if !strings.Contains(aidlCommand, expectedAidlFlag) { t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) @@ -1647,7 +1647,7 @@ func TestAidlEnforcePermissionsException(t *testing.T) { } `) - aidlCommand := ctx.ModuleForTests("foo", "android_common").Rule("aidl").RuleParams.Command + aidlCommand := ctx.ModuleForTests(t, "foo", "android_common").Rule("aidl").RuleParams.Command expectedAidlFlag := "$$FLAGS -Wmissing-permission-annotation -Werror aidl/foo/IFoo.aidl" if !strings.Contains(aidlCommand, expectedAidlFlag) { t.Errorf("aidl command %q does not contain %q", aidlCommand, expectedAidlFlag) @@ -1677,7 +1677,7 @@ func TestDataNativeBinaries(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - test := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) + test := ctx.ModuleForTests(t, "foo", buildOS+"_common").Module().(*TestHost) entries := android.AndroidMkEntriesForTest(t, ctx, test)[0] expected := []string{"out/soong/.intermediates/bin/" + buildOS + "_x86_64/bin:bin"} actual := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] @@ -1693,7 +1693,7 @@ func TestDefaultInstallable(t *testing.T) { `) buildOS := ctx.Config().BuildOS.String() - module := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) + module := ctx.ModuleForTests(t, "foo", buildOS+"_common").Module().(*TestHost) assertDeepEquals(t, "Default installable value should be true.", proptools.BoolPtr(true), module.properties.Installable) } @@ -1710,7 +1710,7 @@ func TestErrorproneEnabled(t *testing.T) { } `) - javac := ctx.ModuleForTests("foo", "android_common").Description("javac") + javac := ctx.ModuleForTests(t, "foo", "android_common").Description("javac") // Test that the errorprone plugins are passed to javac expectedSubstring := "-Xplugin:ErrorProne" @@ -1721,7 +1721,7 @@ func TestErrorproneEnabled(t *testing.T) { // Modules with errorprone { enabled: true } will include errorprone checks // in the main javac build rule. Only when RUN_ERROR_PRONE is true will // the explicit errorprone build rule be created. - errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone") + errorprone := ctx.ModuleForTests(t, "foo", "android_common").MaybeDescription("errorprone") if errorprone.RuleParams.Description != "" { t.Errorf("expected errorprone build rule to not exist, but it did") } @@ -1745,7 +1745,7 @@ func TestErrorproneDisabled(t *testing.T) { }), ).RunTestWithBp(t, bp) - javac := ctx.ModuleForTests("foo", "android_common").Description("javac") + javac := ctx.ModuleForTests(t, "foo", "android_common").Description("javac") // Test that the errorprone plugins are not passed to javac, like they would // be if enabled was true. @@ -1756,7 +1756,7 @@ func TestErrorproneDisabled(t *testing.T) { // Check that no errorprone build rule is created, like there would be // if enabled was unset and RUN_ERROR_PRONE was true. - errorprone := ctx.ModuleForTests("foo", "android_common").MaybeDescription("errorprone") + errorprone := ctx.ModuleForTests(t, "foo", "android_common").MaybeDescription("errorprone") if errorprone.RuleParams.Description != "" { t.Errorf("expected errorprone build rule to not exist, but it did") } @@ -1777,8 +1777,8 @@ func TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) { }), ).RunTestWithBp(t, bp) - javac := ctx.ModuleForTests("foo", "android_common").Description("javac") - errorprone := ctx.ModuleForTests("foo", "android_common").Description("errorprone") + javac := ctx.ModuleForTests(t, "foo", "android_common").Description("javac") + errorprone := ctx.ModuleForTests(t, "foo", "android_common").Description("errorprone") // Check that the errorprone plugins are not passed to javac, because they // will instead be passed to the separate errorprone compilation @@ -1940,7 +1940,7 @@ func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) { } buildOS := ctx.Config.BuildOS.String() - fooVariant := ctx.ModuleForTests("foo", buildOS+"_common") + fooVariant := ctx.ModuleForTests(t, "foo", buildOS+"_common") fooMod := fooVariant.Module().(*TestHost) entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0] @@ -1952,7 +1952,7 @@ func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) { expectedData := []string{} for _, variant := range tc.variants { - barVariant := ctx.ModuleForTests("bar", variant) + barVariant := ctx.ModuleForTests(t, "bar", variant) relocated := barVariant.Output("bar") expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant) android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input) @@ -1976,7 +1976,7 @@ func TestDeviceBinaryWrapperGeneration(t *testing.T) { main_class: "foo.bar.jb", } `) - wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_common").AllOutputs()) + wrapperPath := fmt.Sprint(ctx.ModuleForTests(t, "foo", "android_common").AllOutputs()) if !strings.Contains(wrapperPath, "foo.sh") { t.Errorf("wrapper file foo.sh is not generated") } @@ -2072,7 +2072,7 @@ func TestJavaApiLibraryAndProviderLink(t *testing.T) { }, } for _, c := range testcases { - m := ctx.ModuleForTests(c.moduleName, "android_common") + m := ctx.ModuleForTests(t, c.moduleName, "android_common") manifest := m.Output("metalava.sbox.textproto") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest) manifestCommand := sboxProto.Commands[0].GetCommand() @@ -2181,7 +2181,7 @@ func TestJavaApiLibraryAndDefaultsLink(t *testing.T) { }, } for _, c := range testcases { - m := ctx.ModuleForTests(c.moduleName, "android_common") + m := ctx.ModuleForTests(t, c.moduleName, "android_common") manifest := m.Output("metalava.sbox.textproto") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest) manifestCommand := sboxProto.Commands[0].GetCommand() @@ -2249,7 +2249,7 @@ func TestJavaApiLibraryJarGeneration(t *testing.T) { }, } for _, c := range testcases { - m := ctx.ModuleForTests(c.moduleName, "android_common") + m := ctx.ModuleForTests(t, c.moduleName, "android_common") outputs := fmt.Sprint(m.AllOutputs()) if !strings.Contains(outputs, c.outputJarName) { t.Errorf("Module output does not contain expected jar %s", c.outputJarName) @@ -2335,7 +2335,7 @@ func TestJavaApiLibraryLibsLink(t *testing.T) { }, } for _, c := range testcases { - m := ctx.ModuleForTests(c.moduleName, "android_common") + m := ctx.ModuleForTests(t, c.moduleName, "android_common") javacRules := m.Rule("javac") classPathArgs := javacRules.Args["classpath"] for _, jarName := range c.classPathJarNames { @@ -2424,7 +2424,7 @@ func TestJavaApiLibraryStaticLibsLink(t *testing.T) { }, } for _, c := range testcases { - m := ctx.ModuleForTests(c.moduleName, "android_common") + m := ctx.ModuleForTests(t, c.moduleName, "android_common") mergeZipsCommand := m.Rule("merge_zips").RuleParams.Command for _, jarName := range c.staticLibJarNames { if !strings.Contains(mergeZipsCommand, jarName) { @@ -2452,7 +2452,7 @@ func TestTransitiveSrcFiles(t *testing.T) { static_libs: ["b"], } `) - c := ctx.ModuleForTests("c", "android_common").Module() + c := ctx.ModuleForTests(t, "c", "android_common").Module() javaInfo, _ := android.OtherModuleProvider(ctx, c, JavaInfoProvider) transitiveSrcFiles := android.Paths(javaInfo.TransitiveSrcFiles.ToList()) android.AssertArrayString(t, "unexpected jar deps", []string{"b.java", "c.java"}, transitiveSrcFiles.Strings()) @@ -2475,7 +2475,7 @@ java_test_host { `) buildOS := result.Config.BuildOS.String() - args := result.ModuleForTests("foo", buildOS+"_common"). + args := result.ModuleForTests(t, "foo", buildOS+"_common"). Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args expected := proptools.NinjaAndShellEscape("<option name=\"exclude-path\" value=\"org/apache\" />") if args["extraConfigs"] != expected { @@ -2500,7 +2500,7 @@ java_test_host { `) buildOS := result.Config.BuildOS.String() - args := result.ModuleForTests("foo", buildOS+"_common"). + args := result.ModuleForTests(t, "foo", buildOS+"_common"). Output("out/soong/.intermediates/foo/" + buildOS + "_common/foo.config").Args expected := proptools.NinjaAndShellEscape("<option name=\"test-timeout\" value=\"10m\" />\\n ") if args["extraTestRunnerConfigs"] != expected { @@ -2521,7 +2521,7 @@ func TestJavaLibraryWithResourcesStem(t *testing.T) { "test-jar/test/resource.txt": nil, }) - m := ctx.ModuleForTests("foo", "android_common") + m := ctx.ModuleForTests(t, "foo", "android_common") outputs := fmt.Sprint(m.AllOutputs()) if !strings.Contains(outputs, "test.jar") { t.Errorf("Module output does not contain expected jar %s", "test.jar") @@ -2538,12 +2538,12 @@ func TestHeadersOnly(t *testing.T) { } `) - turbine := ctx.ModuleForTests("foo", "android_common").Rule("turbine") + turbine := ctx.ModuleForTests(t, "foo", "android_common").Rule("turbine") if len(turbine.Inputs) != 1 || turbine.Inputs[0].String() != "a.java" { t.Errorf(`foo inputs %v != ["a.java"]`, turbine.Inputs) } - javac := ctx.ModuleForTests("foo", "android_common").MaybeRule("javac") + javac := ctx.ModuleForTests(t, "foo", "android_common").MaybeRule("javac") android.AssertDeepEquals(t, "javac rule", nil, javac.Rule) } @@ -2568,7 +2568,7 @@ func TestJavaApiContributionImport(t *testing.T) { api_surface: "public", } `) - m := ctx.ModuleForTests("foo", "android_common") + m := ctx.ModuleForTests(t, "foo", "android_common") manifest := m.Output("metalava.sbox.textproto") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx.TestContext, manifest) manifestCommand := sboxProto.Commands[0].GetCommand() @@ -2591,7 +2591,7 @@ func TestJavaApiLibraryApiFilesSorting(t *testing.T) { stubs_type: "everything", } `) - m := ctx.ModuleForTests("foo", "android_common") + m := ctx.ModuleForTests(t, "foo", "android_common") manifest := m.Output("metalava.sbox.textproto") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, manifest) manifestCommand := sboxProto.Commands[0].GetCommand() @@ -2666,9 +2666,9 @@ func TestApiLibraryDroidstubsDependency(t *testing.T) { `) currentApiTimestampPath := "api-stubs-docs-non-updatable/android_common/everything/check_current_api.timestamp" - foo := result.ModuleForTests("foo", "android_common").Module().(*ApiLibrary) + foo := result.ModuleForTests(t, "foo", "android_common").Module().(*ApiLibrary) fooValidationPathsString := strings.Join(foo.validationPaths.Strings(), " ") - bar := result.ModuleForTests("bar", "android_common").Module().(*ApiLibrary) + bar := result.ModuleForTests(t, "bar", "android_common").Module().(*ApiLibrary) barValidationPathsString := strings.Join(bar.validationPaths.Strings(), " ") android.AssertStringDoesContain(t, "Module expected to have validation", @@ -2796,8 +2796,8 @@ func TestMultiplePrebuilts(t *testing.T) { ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) // check that rdep gets the correct variation of dep - foo := ctx.ModuleForTests("foo", "android_common") - expectedDependency := ctx.ModuleForTests(tc.expectedDependencyName, "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") + expectedDependency := ctx.ModuleForTests(t, tc.expectedDependencyName, "android_common") android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from %s to %s\n", foo.Module().Name(), tc.expectedDependencyName), true, hasDep(ctx, foo.Module(), expectedDependency.Module())) // check that output file of dep is always bar.jar @@ -2866,7 +2866,7 @@ func TestMultiplePlatformCompatConfigPrebuilts(t *testing.T) { android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"), ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) - mergedGlobalConfig := ctx.SingletonForTests("platform_compat_config_singleton").Output("compat_config/merged_compat_config.xml") + mergedGlobalConfig := ctx.SingletonForTests(t, "platform_compat_config_singleton").Output("compat_config/merged_compat_config.xml") android.AssertIntEquals(t, "The merged compat config file should only have a single dependency", 1, len(mergedGlobalConfig.Implicits)) android.AssertStringEquals(t, "The merged compat config file is missing the appropriate platform compat config", mergedGlobalConfig.Implicits[0].String(), tc.expectedPlatformCompatConfigXml) } @@ -2915,7 +2915,7 @@ func TestApiLibraryAconfigDeclarations(t *testing.T) { android.AssertBoolEquals(t, "foo expected to depend on bar", CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"), true) - m := result.ModuleForTests("foo", "android_common") + m := result.ModuleForTests(t, "foo", "android_common") android.AssertStringDoesContain(t, "foo generates revert annotations file", strings.Join(m.AllOutputs(), ""), "revert-annotations-exportable.txt") @@ -3030,7 +3030,7 @@ func TestJavaLibHostWithStem(t *testing.T) { `) buildOS := ctx.Config().BuildOS.String() - foo := ctx.ModuleForTests("foo", buildOS+"_common") + foo := ctx.ModuleForTests(t, "foo", buildOS+"_common") outputs := fmt.Sprint(foo.AllOutputs()) if !strings.Contains(outputs, "foo-new.jar") { @@ -3048,7 +3048,7 @@ func TestJavaLibWithStem(t *testing.T) { } `) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") outputs := fmt.Sprint(foo.AllOutputs()) if !strings.Contains(outputs, "foo-new.jar") { @@ -3079,9 +3079,9 @@ func TestJavaLibraryOutputFilesRel(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") - bar := result.ModuleForTests("bar", "android_common") - baz := result.ModuleForTests("baz", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") + bar := result.ModuleForTests(t, "bar", "android_common") + baz := result.ModuleForTests(t, "baz", "android_common") fooOutputPaths := foo.OutputFiles(result.TestContext, t, "") barOutputPaths := bar.OutputFiles(result.TestContext, t, "") @@ -3124,8 +3124,8 @@ func TestCoverage(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") - androidCar := result.ModuleForTests("android.car", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") + androidCar := result.ModuleForTests(t, "android.car", "android_common") fooJacoco := foo.Rule("jacoco") fooCombine := foo.Description("for javac") @@ -3196,6 +3196,6 @@ cc_library_shared { } ` res, _ := testJava(t, bp) - deps := findDepsOfModule(res, res.ModuleForTests("myjavabin", "android_common").Module(), "mynativelib") + deps := findDepsOfModule(res, res.ModuleForTests(t, "myjavabin", "android_common").Module(), "mynativelib") android.AssertIntEquals(t, "Create a dep on the first variant", 1, len(deps)) } diff --git a/java/jdeps.go b/java/jdeps.go index c2ce50383..927c1694d 100644 --- a/java/jdeps.go +++ b/java/jdeps.go @@ -37,8 +37,6 @@ type jdepsGeneratorSingleton struct { outputPath android.Path } -var _ android.SingletonMakeVarsProvider = (*jdepsGeneratorSingleton)(nil) - const ( jdepsJsonFileName = "module_bp_java_deps.json" ) @@ -101,13 +99,6 @@ func (j *jdepsGeneratorSingleton) GenerateBuildActions(ctx android.SingletonCont Rule: android.Touch, Output: jfpath, }) -} - -func (j *jdepsGeneratorSingleton) MakeVars(ctx android.MakeVarsContext) { - if j.outputPath == nil { - return - } - ctx.DistForGoal("general-tests", j.outputPath) } diff --git a/java/jdeps_test.go b/java/jdeps_test.go index 2cbf75bc7..00f383997 100644 --- a/java/jdeps_test.go +++ b/java/jdeps_test.go @@ -32,7 +32,7 @@ func TestCollectJavaLibraryPropertiesAddLibsDeps(t *testing.T) { libs: ["Foo", "Bar"], } `) - module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + module := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, module, android.IdeInfoProviderKey) for _, expected := range []string{"Foo", "Bar"} { @@ -53,7 +53,7 @@ func TestCollectJavaLibraryPropertiesAddStaticLibsDeps(t *testing.T) { static_libs: ["Foo", "Bar"], } `) - module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + module := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, module, android.IdeInfoProviderKey) for _, expected := range []string{"Foo", "Bar"} { @@ -72,7 +72,7 @@ func TestCollectJavaLibraryPropertiesAddScrs(t *testing.T) { srcs: ["Foo.java", "Bar.java"], } `) - module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + module := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, module, android.IdeInfoProviderKey) expected := []string{"Foo.java", "Bar.java"} @@ -92,7 +92,7 @@ func TestCollectJavaLibraryPropertiesAddAidlIncludeDirs(t *testing.T) { }, } `) - module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + module := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, module, android.IdeInfoProviderKey) expected := []string{"Foo", "Bar"} @@ -111,7 +111,7 @@ func TestCollectJavaLibraryWithJarJarRules(t *testing.T) { jarjar_rules: "jarjar_rules.txt", } `) - module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + module := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, module, android.IdeInfoProviderKey) android.AssertStringEquals(t, "IdeInfo.Srcs of repackaged library should not be empty", "foo.java", dpInfo.Srcs[0]) @@ -135,7 +135,7 @@ func TestCollectJavaLibraryLinkingAgainstVersionedSdk(t *testing.T) { sdk_version: "29", } `) - module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + module := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, module, android.IdeInfoProviderKey) android.AssertStringListContains(t, "IdeInfo.Deps should contain versioned sdk module", dpInfo.Deps, "sdk_public_29_android") @@ -171,11 +171,11 @@ func TestDoNotAddNoneSystemModulesToDeps(t *testing.T) { api_surface: "public", } `) - javalib := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) + javalib := ctx.ModuleForTests(t, "javalib", "android_common").Module().(*Library) dpInfo, _ := android.OtherModuleProvider(ctx, javalib, android.IdeInfoProviderKey) android.AssertStringListDoesNotContain(t, "IdeInfo.Deps should contain not contain `none`", dpInfo.Deps, "none") - javalib_stubs := ctx.ModuleForTests("javalib.stubs", "android_common").Module().(*ApiLibrary) + javalib_stubs := ctx.ModuleForTests(t, "javalib.stubs", "android_common").Module().(*ApiLibrary) dpInfo, _ = android.OtherModuleProvider(ctx, javalib_stubs, android.IdeInfoProviderKey) android.AssertStringListDoesNotContain(t, "IdeInfo.Deps should contain not contain `none`", dpInfo.Deps, "none") } diff --git a/java/kotlin_test.go b/java/kotlin_test.go index 3a203358a..c7b1ece98 100644 --- a/java/kotlin_test.go +++ b/java/kotlin_test.go @@ -240,7 +240,7 @@ func TestKotlin(t *testing.T) { PrepareForTestWithJavaDefaultModules, tt.preparer, ).RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") fooKotlinc := foo.Rule("kotlinc") android.AssertPathsRelativeToTopEquals(t, "foo kotlinc inputs", tt.fooKotlincInputs, fooKotlinc.Inputs) @@ -260,7 +260,7 @@ func TestKotlin(t *testing.T) { fooCombinedHeaderJar := foo.Output("turbine-combined/foo.jar") android.AssertPathsRelativeToTopEquals(t, "foo header combined inputs", tt.fooHeaderCombinedInputs, fooCombinedHeaderJar.Inputs) - bar := result.ModuleForTests("bar", "android_common") + bar := result.ModuleForTests(t, "bar", "android_common") barKotlinc := bar.Rule("kotlinc") android.AssertPathsRelativeToTopEquals(t, "bar kotlinc inputs", tt.barKotlincInputs, barKotlinc.Inputs) @@ -311,14 +311,14 @@ func TestKapt(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") kaptStubs := foo.Rule("kapt") turbineApt := foo.Description("turbine apt") kotlinc := foo.Rule("kotlinc") javac := foo.Rule("javac") - bar := ctx.ModuleForTests("bar", buildOS+"_common").Rule("javac").Output.String() - baz := ctx.ModuleForTests("baz", buildOS+"_common").Rule("javac").Output.String() + bar := ctx.ModuleForTests(t, "bar", buildOS+"_common").Rule("javac").Output.String() + baz := ctx.ModuleForTests(t, "baz", buildOS+"_common").Rule("javac").Output.String() // Test that the kotlin and java sources are passed to kapt and kotlinc if len(kaptStubs.Inputs) != 2 || kaptStubs.Inputs[0].String() != "a.java" || kaptStubs.Inputs[1].String() != "b.kt" { @@ -400,13 +400,13 @@ func TestKapt(t *testing.T) { buildOS := result.Config.BuildOS.String() - kapt := result.ModuleForTests("foo", "android_common").Rule("kapt") - javac := result.ModuleForTests("foo", "android_common").Description("javac") - errorprone := result.ModuleForTests("foo", "android_common").Description("errorprone") + kapt := result.ModuleForTests(t, "foo", "android_common").Rule("kapt") + javac := result.ModuleForTests(t, "foo", "android_common").Description("javac") + errorprone := result.ModuleForTests(t, "foo", "android_common").Description("errorprone") - bar := result.ModuleForTests("bar", buildOS+"_common").Description("javac").Output.String() - baz := result.ModuleForTests("baz", buildOS+"_common").Description("javac").Output.String() - myCheck := result.ModuleForTests("my_check", buildOS+"_common").Description("javac").Output.String() + bar := result.ModuleForTests(t, "bar", buildOS+"_common").Description("javac").Output.String() + baz := result.ModuleForTests(t, "baz", buildOS+"_common").Description("javac").Output.String() + myCheck := result.ModuleForTests(t, "my_check", buildOS+"_common").Description("javac").Output.String() // Test that the errorprone plugins are not passed to kapt expectedProcessorPath := "-P plugin:org.jetbrains.kotlin.kapt3:apclasspath=" + bar + @@ -531,9 +531,9 @@ func TestKotlinCompose(t *testing.T) { buildOS := result.Config.BuildOS.String() - composeCompiler := result.ModuleForTests("kotlin-compose-compiler-plugin", buildOS+"_common").Rule("combineJar").Output - withCompose := result.ModuleForTests("withcompose", "android_common") - noCompose := result.ModuleForTests("nocompose", "android_common") + composeCompiler := result.ModuleForTests(t, "kotlin-compose-compiler-plugin", buildOS+"_common").Rule("combineJar").Output + withCompose := result.ModuleForTests(t, "withcompose", "android_common") + noCompose := result.ModuleForTests(t, "nocompose", "android_common") android.AssertStringListContains(t, "missing compose compiler dependency", withCompose.Rule("kotlinc").Implicits.Strings(), composeCompiler.String()) @@ -579,9 +579,9 @@ func TestKotlinPlugin(t *testing.T) { buildOS := result.Config.BuildOS.String() - kotlinPlugin := result.ModuleForTests("kotlin_plugin", buildOS+"_common").Rule("combineJar").Output - withKotlinPlugin := result.ModuleForTests("with_kotlin_plugin", "android_common") - noKotlinPlugin := result.ModuleForTests("no_kotlin_plugin", "android_common") + kotlinPlugin := result.ModuleForTests(t, "kotlin_plugin", buildOS+"_common").Rule("combineJar").Output + withKotlinPlugin := result.ModuleForTests(t, "with_kotlin_plugin", "android_common") + noKotlinPlugin := result.ModuleForTests(t, "no_kotlin_plugin", "android_common") android.AssertStringListContains(t, "missing plugin compiler dependency", withKotlinPlugin.Rule("kotlinc").Implicits.Strings(), kotlinPlugin.String()) diff --git a/java/lint.go b/java/lint.go index 3838745e4..66f7f8549 100644 --- a/java/lint.go +++ b/java/lint.go @@ -704,16 +704,12 @@ func (l *lintSingleton) generateLintReportZips(ctx android.SingletonContext) { zip(l.referenceBaselineZip, func(l *LintInfo) android.Path { return l.ReferenceBaseline }) ctx.Phony("lint-check", l.htmlZip, l.textZip, l.xmlZip, l.referenceBaselineZip) -} -func (l *lintSingleton) MakeVars(ctx android.MakeVarsContext) { if !ctx.Config().UnbundledBuild() { ctx.DistForGoal("lint-check", l.htmlZip, l.textZip, l.xmlZip, l.referenceBaselineZip) } } -var _ android.SingletonMakeVarsProvider = (*lintSingleton)(nil) - func init() { android.RegisterParallelSingletonType("lint", func() android.Singleton { return &lintSingleton{} }) diff --git a/java/lint_test.go b/java/lint_test.go index f7d3229b9..236fa63ba 100644 --- a/java/lint_test.go +++ b/java/lint_test.go @@ -38,7 +38,7 @@ func TestJavaLintDoesntUseBaselineImplicitly(t *testing.T) { "lint-baseline.xml": nil, }) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, foo.Output("lint.sbox.textproto")) if strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml") { @@ -87,7 +87,7 @@ func TestJavaLintUsesCorrectBpConfig(t *testing.T) { "mybaseline.xml": nil, }) - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, foo.Output("lint.sbox.textproto")) if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline mybaseline.xml") { @@ -193,7 +193,7 @@ func TestJavaLintStrictUpdatabilityLinting(t *testing.T) { result := android.GroupFixturePreparers(PrepareForTestWithJavaDefaultModules, fs.AddToFixture()). RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") strictUpdatabilityCheck := foo.Output("lint_strict_updatability_check.stamp") if !strings.Contains(strictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi") { @@ -256,7 +256,7 @@ func TestJavaLintDatabaseSelectionFull(t *testing.T) { })). RunTestWithBp(t, thisBp) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") sboxProto := android.RuleBuilderSboxProtoForTests(t, result.TestContext, foo.Output("lint.sbox.textproto")) if !strings.Contains(*sboxProto.Commands[0].Command, "/"+testCase.expected_file) { t.Error("did not use full api database for case", testCase) @@ -313,7 +313,7 @@ func TestNotTestViaDefault(t *testing.T) { result := PrepareForTestWithJavaDefaultModules.RunTestWithBp(t, bp) ctx := result.TestContext - foo := ctx.ModuleForTests("foo", "android_common") + foo := ctx.ModuleForTests(t, "foo", "android_common") sboxProto := android.RuleBuilderSboxProtoForTests(t, ctx, foo.Output("lint.sbox.textproto")) command := *sboxProto.Commands[0].Command @@ -321,7 +321,7 @@ func TestNotTestViaDefault(t *testing.T) { t.Fatalf("Expected command to not contain --test") } - foo2 := ctx.ModuleForTests("foo2", "android_common") + foo2 := ctx.ModuleForTests(t, "foo2", "android_common") sboxProto2 := android.RuleBuilderSboxProtoForTests(t, ctx, foo2.Output("lint.sbox.textproto")) command2 := *sboxProto2.Commands[0].Command diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index 86062d489..155afc6c2 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -15,6 +15,9 @@ package java import ( + "maps" + "slices" + "github.com/google/blueprint" "android/soong/android" @@ -31,12 +34,6 @@ func registerPlatformBootclasspathBuildComponents(ctx android.RegistrationContex // The tags used for the dependencies between the platform bootclasspath and any configured boot // jars. -var ( - platformBootclasspathArtBootJarDepTag = bootclasspathDependencyTag{name: "art-boot-jar"} - platformBootclasspathBootJarDepTag = bootclasspathDependencyTag{name: "platform-boot-jar"} - platformBootclasspathApexBootJarDepTag = bootclasspathDependencyTag{name: "apex-boot-jar"} -) - type platformBootclasspathImplLibDepTagType struct { blueprint.BaseDependencyTag } @@ -59,6 +56,12 @@ type platformBootclasspathModule struct { // The apex:module pairs obtained from the fragments. fragments []android.Module + // The map of apex to the fragments they contain. + apexNameToFragment map[string]android.Module + + // The map of library modules in the bootclasspath to the fragments that contain them. + libraryToApex map[android.Module]string + // Path to the monolithic hiddenapi-flags.csv file. hiddenAPIFlagsCSV android.OutputPath @@ -100,26 +103,12 @@ func (b *platformBootclasspathModule) DepsMutator(ctx android.BottomUpMutatorCon b.hiddenAPIDepsMutator(ctx) - if !dexpreopt.IsDex2oatNeeded(ctx) { - return - } - - // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The - // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). - dexpreopt.RegisterToolDeps(ctx) -} - -func (b *platformBootclasspathModule) hiddenAPIDepsMutator(ctx android.BottomUpMutatorContext) { - if ctx.Config().DisableHiddenApiChecks() { - return + if dexpreopt.IsDex2oatNeeded(ctx) { + // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The + // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). + dexpreopt.RegisterToolDeps(ctx) } - // Add dependencies onto the stub lib modules. - apiLevelToStubLibModules := hiddenAPIComputeMonolithicStubLibModules(ctx.Config()) - hiddenAPIAddStubLibDependencies(ctx, apiLevelToStubLibModules) -} - -func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies on all the ART jars. global := dexpreopt.GetGlobalConfig(ctx) addDependenciesOntoSelectedBootImageApexes(ctx, "com.android.art") @@ -127,13 +116,13 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto var bootImageModuleNames []string // TODO: b/308174306 - Remove the mechanism of depending on the java_sdk_library(_import) directly - addDependenciesOntoBootImageModules(ctx, global.ArtApexJars, platformBootclasspathArtBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, global.ArtApexJars, artBootJar) bootImageModuleNames = append(bootImageModuleNames, global.ArtApexJars.CopyOfJars()...) // Add dependencies on all the non-updatable jars, which are on the platform or in non-updatable // APEXes. platformJars := b.platformJars(ctx) - addDependenciesOntoBootImageModules(ctx, platformJars, platformBootclasspathBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, platformJars, platformBootJar) bootImageModuleNames = append(bootImageModuleNames, platformJars.CopyOfJars()...) // Add dependencies on all the updatable jars, except the ART jars. @@ -144,7 +133,7 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto } addDependenciesOntoSelectedBootImageApexes(ctx, android.FirstUniqueStrings(apexes)...) // TODO: b/308174306 - Remove the mechanism of depending on the java_sdk_library(_import) directly - addDependenciesOntoBootImageModules(ctx, apexJars, platformBootclasspathApexBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, apexJars, apexBootJar) bootImageModuleNames = append(bootImageModuleNames, apexJars.CopyOfJars()...) // Add dependencies on all the fragments. @@ -158,27 +147,37 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto } } -func addDependenciesOntoBootImageModules(ctx android.BottomUpMutatorContext, modules android.ConfiguredJarList, tag bootclasspathDependencyTag) { +func (b *platformBootclasspathModule) hiddenAPIDepsMutator(ctx android.BottomUpMutatorContext) { + if ctx.Config().DisableHiddenApiChecks() { + return + } + + // Add dependencies onto the stub lib modules. + apiLevelToStubLibModules := hiddenAPIComputeMonolithicStubLibModules(ctx.Config()) + hiddenAPIAddStubLibDependencies(ctx, apiLevelToStubLibModules) +} + +func addDependenciesOntoBootImageModules(ctx android.BottomUpMutatorContext, modules android.ConfiguredJarList, tagType bootclasspathDependencyTagType) { for i := 0; i < modules.Len(); i++ { apex := modules.Apex(i) name := modules.Jar(i) - addDependencyOntoApexModulePair(ctx, apex, name, tag) + addDependencyOntoApexModulePair(ctx, apex, name, tagType) } } func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Gather all the dependencies from the art, platform, and apex boot jars. - artModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathArtBootJarDepTag) - platformModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathBootJarDepTag) - apexModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathApexBootJarDepTag) + artModules, artModulesToApex := gatherApexModulePairDepsWithTag(ctx, artBootJar) + platformModules, platformModulesToApex := gatherApexModulePairDepsWithTag(ctx, platformBootJar) + apexModules, apexModulesToApex := gatherApexModulePairDepsWithTag(ctx, apexBootJar) // Concatenate them all, in order as they would appear on the bootclasspath. - var allModules []android.Module - allModules = append(allModules, artModules...) - allModules = append(allModules, platformModules...) - allModules = append(allModules, apexModules...) + allModules := slices.Concat(artModules, platformModules, apexModules) b.configuredModules = allModules + b.libraryToApex = maps.Clone(artModulesToApex) + maps.Copy(b.libraryToApex, platformModulesToApex) + maps.Copy(b.libraryToApex, apexModulesToApex) // Do not add implLibModule to allModules as the impl lib is only used to collect the // transitive source files @@ -199,7 +198,7 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo TransformResourcesToJar(ctx, srcjar, jarArgs, transitiveSrcFiles) // Gather all the fragments dependencies. - b.fragments = gatherApexModulePairDepsWithTag(ctx, bootclasspathFragmentDepTag) + b.fragments, b.apexNameToFragment = gatherFragments(ctx) // Check the configuration of the boot modules. // ART modules are checked by the art-bootclasspath-fragment. @@ -208,7 +207,7 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo b.generateClasspathProtoBuildActions(ctx) - bootDexJarByModule := b.generateHiddenAPIBuildActions(ctx, b.configuredModules, b.fragments) + bootDexJarByModule := b.generateHiddenAPIBuildActions(ctx, b.configuredModules, b.fragments, b.libraryToApex, b.apexNameToFragment) buildRuleForBootJarsPackageCheck(ctx, bootDexJarByModule) ctx.SetOutputFiles(android.Paths{b.hiddenAPIFlagsCSV}, "hiddenapi-flags.csv") @@ -259,7 +258,7 @@ func (b *platformBootclasspathModule) checkPlatformModules(ctx android.ModuleCon fromUpdatableApex := apexInfo.Updatable if fromUpdatableApex { // error: this jar is part of an updatable apex - ctx.ModuleErrorf("module %q from updatable apexes %q is not allowed in the platform bootclasspath", ctx.OtherModuleName(m), apexInfo.InApexVariants) + ctx.ModuleErrorf("module %q from updatable apex %q is not allowed in the platform bootclasspath", ctx.OtherModuleName(m), apexInfo.BaseApexName) } else { // ok: this jar is part of the platform or a non-updatable apex } @@ -283,7 +282,11 @@ func (b *platformBootclasspathModule) checkApexModules(ctx android.ModuleContext // modules is complete. if !ctx.Config().AlwaysUsePrebuiltSdks() { // error: this jar is part of the platform - ctx.ModuleErrorf("module %q from platform is not allowed in the apex boot jars list", name) + if ctx.Config().AllowMissingDependencies() { + ctx.AddMissingDependencies([]string{"module_" + name + "_from_platform_is_not_allowed_in_the_apex_boot_jars_list"}) + } else { + ctx.ModuleErrorf("module %q from platform is not allowed in the apex boot jars list", name) + } } } else { // TODO(b/177892522): Treat this as an error. @@ -295,7 +298,8 @@ func (b *platformBootclasspathModule) checkApexModules(ctx android.ModuleContext } // generateHiddenAPIBuildActions generates all the hidden API related build rules. -func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module, fragments []android.Module) bootDexJarByModule { +func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module, + fragments []android.Module, libraryToApex map[android.Module]string, apexNameToFragment map[string]android.Module) bootDexJarByModule { createEmptyHiddenApiFiles := func() { paths := android.OutputPaths{b.hiddenAPIFlagsCSV, b.hiddenAPIIndexCSV, b.hiddenAPIMetadataCSV} for _, path := range paths { @@ -322,7 +326,7 @@ func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android. } // Construct a list of ClasspathElement objects from the modules and fragments. - classpathElements := CreateClasspathElements(ctx, modules, fragments) + classpathElements := CreateClasspathElements(ctx, modules, fragments, libraryToApex, apexNameToFragment) monolithicInfo := b.createAndProvideMonolithicHiddenAPIInfo(ctx, classpathElements) diff --git a/java/platform_bootclasspath_test.go b/java/platform_bootclasspath_test.go index db8557914..727e30670 100644 --- a/java/platform_bootclasspath_test.go +++ b/java/platform_bootclasspath_test.go @@ -93,7 +93,7 @@ func TestPlatformBootclasspath(t *testing.T) { checkSrcJarInputs := func(t *testing.T, result *android.TestResult, name string, expected []string) { t.Helper() - srcjar := result.ModuleForTests(name, "android_common").Output(name + "-transitive.srcjar") + srcjar := result.ModuleForTests(t, name, "android_common").Output(name + "-transitive.srcjar") android.AssertStringDoesContain(t, "srcjar arg", srcjar.Args["jarArgs"], "-srcjar") android.AssertArrayString(t, "srcjar inputs", expected, srcjar.Implicits.Strings()) } @@ -367,7 +367,7 @@ func TestPlatformBootclasspath_HiddenAPIMonolithicFiles(t *testing.T) { // Make sure that the foo-hiddenapi-annotations.jar is included in the inputs to the rules that // creates the index.csv file. - platformBootclasspath := result.ModuleForTests("myplatform-bootclasspath", "android_common") + platformBootclasspath := result.ModuleForTests(t, "myplatform-bootclasspath", "android_common") var rule android.TestingBuildParams diff --git a/java/platform_compat_config.go b/java/platform_compat_config.go index bb9894400..d4d2fb5bb 100644 --- a/java/platform_compat_config.go +++ b/java/platform_compat_config.go @@ -278,12 +278,7 @@ func (p *platformCompatConfigSingleton) GenerateBuildActions(ctx android.Singlet rule.Build("merged-compat-config", "Merge compat config") p.metadata = outputPath -} - -func (p *platformCompatConfigSingleton) MakeVars(ctx android.MakeVarsContext) { - if p.metadata != nil { - ctx.DistForGoal("droidcore", p.metadata) - } + ctx.DistForGoal("droidcore", p.metadata) } func platformCompatConfigSingletonFactory() android.Singleton { diff --git a/java/plugin_test.go b/java/plugin_test.go index 95f4aca4c..007b74a9e 100644 --- a/java/plugin_test.go +++ b/java/plugin_test.go @@ -27,8 +27,8 @@ func TestNoPlugin(t *testing.T) { } `) - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") - turbine := ctx.ModuleForTests("foo", "android_common").MaybeRule("turbine") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") + turbine := ctx.ModuleForTests(t, "foo", "android_common").MaybeRule("turbine") if turbine.Rule == nil { t.Errorf("expected turbine to be enabled") @@ -61,14 +61,14 @@ func TestPlugin(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") - turbine := ctx.ModuleForTests("foo", "android_common").MaybeRule("turbine") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") + turbine := ctx.ModuleForTests(t, "foo", "android_common").MaybeRule("turbine") if turbine.Rule == nil { t.Errorf("expected turbine to be enabled") } - bar := ctx.ModuleForTests("bar", buildOS+"_common").Rule("javac").Output.String() + bar := ctx.ModuleForTests(t, "bar", buildOS+"_common").Rule("javac").Output.String() if !inList(bar, javac.Implicits.Strings()) { t.Errorf("foo implicits %v does not contain %q", javac.Implicits.Strings(), bar) @@ -102,14 +102,14 @@ func TestPluginGeneratesApi(t *testing.T) { buildOS := ctx.Config().BuildOS.String() - javac := ctx.ModuleForTests("foo", "android_common").Rule("javac") - turbine := ctx.ModuleForTests("foo", "android_common").MaybeRule("turbine") + javac := ctx.ModuleForTests(t, "foo", "android_common").Rule("javac") + turbine := ctx.ModuleForTests(t, "foo", "android_common").MaybeRule("turbine") if turbine.Rule != nil { t.Errorf("expected turbine to be disabled") } - bar := ctx.ModuleForTests("bar", buildOS+"_common").Rule("javac").Output.String() + bar := ctx.ModuleForTests(t, "bar", buildOS+"_common").Rule("javac").Output.String() if !inList(bar, javac.Implicits.Strings()) { t.Errorf("foo implicits %v does not contain %q", javac.Implicits.Strings(), bar) diff --git a/java/prebuilt_apis_test.go b/java/prebuilt_apis_test.go index c6a5913b0..1f095e49b 100644 --- a/java/prebuilt_apis_test.go +++ b/java/prebuilt_apis_test.go @@ -78,9 +78,9 @@ func TestPrebuiltApis_WithExtensions(t *testing.T) { "2": {"foo", "bar"}, }), ).RunTest(t) - foo_input = result.ModuleForTests("foo.api.public.latest", "").Rule("generator").Implicits[0].String() - bar_input = result.ModuleForTests("bar.api.public.latest", "").Rule("generator").Implicits[0].String() - baz_input = result.ModuleForTests("baz.api.public.latest", "").Rule("generator").Implicits[0].String() + foo_input = result.ModuleForTests(t, "foo.api.public.latest", "").Rule("generator").Implicits[0].String() + bar_input = result.ModuleForTests(t, "bar.api.public.latest", "").Rule("generator").Implicits[0].String() + baz_input = result.ModuleForTests(t, "baz.api.public.latest", "").Rule("generator").Implicits[0].String() return } // Extension 2 is the latest for both foo and bar, finalized after the base extension version. @@ -114,9 +114,9 @@ func TestPrebuiltApis_WithIncrementalApi(t *testing.T) { "current": {"foo", "bar"}, }), ).RunTest(t) - foo_input = result.ModuleForTests("foo.api.public.latest", "").Rule("generator").Implicits[0].String() - bar_input = result.ModuleForTests("bar.api.public.latest", "").Rule("generator").Implicits[0].String() - baz_input = result.ModuleForTests("baz.api.public.latest", "").Rule("generator").Implicits[0].String() + foo_input = result.ModuleForTests(t, "foo.api.public.latest", "").Rule("generator").Implicits[0].String() + bar_input = result.ModuleForTests(t, "bar.api.public.latest", "").Rule("generator").Implicits[0].String() + baz_input = result.ModuleForTests(t, "baz.api.public.latest", "").Rule("generator").Implicits[0].String() return } // 33.1 is the latest for baz, 33.2 is the latest for both foo & bar diff --git a/java/proto_test.go b/java/proto_test.go index 5b184b673..3fbe3e602 100644 --- a/java/proto_test.go +++ b/java/proto_test.go @@ -46,7 +46,7 @@ func TestProtoStream(t *testing.T) { PrepareForIntegrationTestWithJava, ).RunTestWithBp(t, protoModules+bp) - proto0 := ctx.ModuleForTests("java-stream-protos", "android_common").Output("proto/proto0.srcjar") + proto0 := ctx.ModuleForTests(t, "java-stream-protos", "android_common").Output("proto/proto0.srcjar") if cmd := proto0.RuleParams.Command; !strings.Contains(cmd, "--javastream_out=") { t.Errorf("expected '--javastream_out' in %q", cmd) diff --git a/java/ravenwood_test.go b/java/ravenwood_test.go index ac4f14782..24a02bbdc 100644 --- a/java/ravenwood_test.go +++ b/java/ravenwood_test.go @@ -121,7 +121,7 @@ func TestRavenwoodRuntime(t *testing.T) { CheckModuleHasDependency(t, ctx.TestContext, "ravenwood-utils", "android_common", "framework-rules.ravenwood") // Verify that we've emitted artifacts in expected location - runtime := ctx.ModuleForTests("ravenwood-runtime", "android_common") + runtime := ctx.ModuleForTests(t, "ravenwood-runtime", "android_common") runtime.Output(installPathPrefix + "/ravenwood-runtime/framework-minus-apex.ravenwood.jar") runtime.Output(installPathPrefix + "/ravenwood-runtime/framework-services.ravenwood.jar") runtime.Output(installPathPrefix + "/ravenwood-runtime/lib64/ravenwood-runtime-jni1.so") @@ -129,7 +129,7 @@ func TestRavenwoodRuntime(t *testing.T) { runtime.Output(installPathPrefix + "/ravenwood-runtime/lib64/ravenwood-runtime-jni3.so") runtime.Output(installPathPrefix + "/ravenwood-runtime/ravenwood-data/app1.apk") runtime.Output(installPathPrefix + "/ravenwood-runtime/fonts/Font.ttf") - utils := ctx.ModuleForTests("ravenwood-utils", "android_common") + utils := ctx.ModuleForTests(t, "ravenwood-utils", "android_common") utils.Output(installPathPrefix + "/ravenwood-utils/framework-rules.ravenwood.jar") } @@ -193,7 +193,7 @@ func TestRavenwoodTest(t *testing.T) { CheckModuleHasDependency(t, ctx.TestContext, "ravenwood-test", "android_common", "ravenwood-utils") CheckModuleHasDependency(t, ctx.TestContext, "ravenwood-test", "android_common", "jni-lib") - module := ctx.ModuleForTests("ravenwood-test", "android_common") + module := ctx.ModuleForTests(t, "ravenwood-test", "android_common") classpath := module.Rule("javac").Args["classpath"] // Verify that we're linking against test_current @@ -214,7 +214,7 @@ func TestRavenwoodTest(t *testing.T) { module.Output(installPathPrefix + "/ravenwood-test/ravenwood-res-apks/ravenwood-res.apk") module.Output(installPathPrefix + "/ravenwood-test/ravenwood-res-apks/ravenwood-inst-res.apk") - module = ctx.ModuleForTests("ravenwood-test-empty", "android_common") + module = ctx.ModuleForTests(t, "ravenwood-test-empty", "android_common") module.Output(installPathPrefix + "/ravenwood-test-empty/ravenwood.properties") // ravenwood-runtime*.so are included in the runtime, so it shouldn't be emitted. diff --git a/java/robolectric_test.go b/java/robolectric_test.go index ad0613ebd..4bf224b4f 100644 --- a/java/robolectric_test.go +++ b/java/robolectric_test.go @@ -105,6 +105,6 @@ func TestRobolectricJniTest(t *testing.T) { CheckModuleHasDependency(t, ctx.TestContext, "robo-test", "android_common", "jni-lib1") // Check that the .so files make it into the output. - module := ctx.ModuleForTests("robo-test", "android_common") + module := ctx.ModuleForTests(t, "robo-test", "android_common") module.Output(installPathPrefix + "/robo-test/lib64/jni-lib1.so") } diff --git a/java/rro_test.go b/java/rro_test.go index 1978ad67d..0ccc8e707 100644 --- a/java/rro_test.go +++ b/java/rro_test.go @@ -67,7 +67,7 @@ func TestRuntimeResourceOverlay(t *testing.T) { fs.AddToFixture(), ).RunTestWithBp(t, bp) - m := result.ModuleForTests("foo", "android_common") + m := result.ModuleForTests(t, "foo", "android_common") // Check AAPT2 link flags. aapt2Flags := m.Output("package-res.apk").Args["flags"] @@ -116,7 +116,7 @@ func TestRuntimeResourceOverlay(t *testing.T) { android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_MODULE_PATH", result.Config, expectedPath, path) // A themed module has a different device location - m = result.ModuleForTests("foo_themed", "android_common") + m = result.ModuleForTests(t, "foo_themed", "android_common") androidMkEntries = android.AndroidMkEntriesForTest(t, result.TestContext, m.Module())[0] path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"] expectedPath = []string{shared.JoinPath("out/target/product/test_device/product/overlay/faza")} @@ -155,7 +155,7 @@ func TestRuntimeResourceOverlay_JavaDefaults(t *testing.T) { // // RRO module with defaults // - m := result.ModuleForTests("foo_with_defaults", "android_common") + m := result.ModuleForTests(t, "foo_with_defaults", "android_common") // Check AAPT2 link flags. aapt2Flags := strings.Split(m.Output("package-res.apk").Args["flags"], " ") @@ -173,7 +173,7 @@ func TestRuntimeResourceOverlay_JavaDefaults(t *testing.T) { // // RRO module without defaults // - m = result.ModuleForTests("foo_barebones", "android_common") + m = result.ModuleForTests(t, "foo_barebones", "android_common") // Check AAPT2 link flags. aapt2Flags = strings.Split(m.Output("package-res.apk").Args["flags"], " ") @@ -235,7 +235,7 @@ func TestOverrideRuntimeResourceOverlay(t *testing.T) { }, } for _, expected := range expectedVariants { - variant := ctx.ModuleForTests("foo_overlay", expected.variantName) + variant := ctx.ModuleForTests(t, "foo_overlay", expected.variantName) // Check the final apk name variant.Output(expected.apkPath) @@ -306,7 +306,7 @@ func TestRuntimeResourceOverlayPartition(t *testing.T) { } for _, testCase := range testCases { ctx, _ := testJava(t, bp) - mod := ctx.ModuleForTests(testCase.name, "android_common").Module().(*RuntimeResourceOverlay) + mod := ctx.ModuleForTests(t, testCase.name, "android_common").Module().(*RuntimeResourceOverlay) android.AssertPathRelativeToTopEquals(t, "Install dir is not correct for "+testCase.name, testCase.expectedPath, mod.installDir) } } @@ -341,7 +341,7 @@ func TestRuntimeResourceOverlayFlagsPackages(t *testing.T) { } `) - foo := result.ModuleForTests("foo", "android_common") + foo := result.ModuleForTests(t, "foo", "android_common") // runtime_resource_overlay module depends on aconfig_declarations listed in flags_packages android.AssertBoolEquals(t, "foo expected to depend on bar", true, diff --git a/java/sdk.go b/java/sdk.go index bb2aa8d7e..27b2434c5 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -381,6 +381,10 @@ func createAPIFingerprint(ctx android.SingletonContext) { } rule.Build("api_fingerprint", "generate api_fingerprint.txt") + + if ctx.Config().BuildOS == android.Linux { + ctx.DistForGoals([]string{"sdk", "droidcore"}, out) + } } func sdkMakeVars(ctx android.MakeVarsContext) { diff --git a/java/sdk_library.go b/java/sdk_library.go index 07f059928..cf31b5095 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -316,6 +316,15 @@ func (scopes apiScopes) ConvertStubsLibraryExportableToEverything(name string) s return name } +func (scopes apiScopes) matchingScopeFromSdkKind(kind android.SdkKind) *apiScope { + for _, scope := range scopes { + if scope.kind == kind { + return scope + } + } + return nil +} + var ( scopeByName = make(map[string]*apiScope) allScopeNames []string @@ -922,6 +931,8 @@ type commonSdkLibraryAndImportModule interface { RootLibraryName() string } +var _ android.ApexModule = (*SdkLibrary)(nil) + func (m *SdkLibrary) RootLibraryName() string { return m.BaseModuleName() } @@ -1699,14 +1710,22 @@ func (module *SdkLibrary) compareAgainstLatestApi(apiScope *apiScope) bool { } // Implements android.ApexModule -func (module *SdkLibrary) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { - if depTag == xmlPermissionsFileTag { +func (m *SdkLibrary) GetDepInSameApexChecker() android.DepInSameApexChecker { + return SdkLibraryDepInSameApexChecker{} +} + +type SdkLibraryDepInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m SdkLibraryDepInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { + if tag == xmlPermissionsFileTag { return true } - if depTag == implLibraryTag { + if tag == implLibraryTag { return true } - return module.Library.OutgoingDepIsInSameApex(depTag) + return depIsInSameApex(tag) } // Implements android.ApexModule @@ -2117,8 +2136,16 @@ func (module *SdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext) var _ android.ApexModule = (*SdkLibraryImport)(nil) // Implements android.ApexModule -func (module *SdkLibraryImport) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { - if depTag == xmlPermissionsFileTag { +func (m *SdkLibraryImport) GetDepInSameApexChecker() android.DepInSameApexChecker { + return SdkLibraryImportDepIsInSameApexChecker{} +} + +type SdkLibraryImportDepIsInSameApexChecker struct { + android.BaseDepInSameApexChecker +} + +func (m SdkLibraryImportDepIsInSameApexChecker) OutgoingDepIsInSameApex(tag blueprint.DependencyTag) bool { + if tag == xmlPermissionsFileTag { return true } @@ -2128,13 +2155,10 @@ func (module *SdkLibraryImport) OutgoingDepIsInSameApex(depTag blueprint.Depende } // Implements android.ApexModule -func (module *SdkLibraryImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - // we don't check prebuilt modules for sdk_version - return nil +func (m *SdkLibraryImport) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } -// Implements android.ApexModule func (module *SdkLibraryImport) UniqueApexVariations() bool { return module.uniqueApexVariations() } diff --git a/java/sdk_library_internal.go b/java/sdk_library_internal.go index db9cd24ce..578969223 100644 --- a/java/sdk_library_internal.go +++ b/java/sdk_library_internal.go @@ -807,10 +807,8 @@ func (module *sdkLibraryXml) DepsMutator(ctx android.BottomUpMutatorContext) { var _ android.ApexModule = (*sdkLibraryXml)(nil) // Implements android.ApexModule -func (module *sdkLibraryXml) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - // sdkLibraryXml doesn't need to be checked separately because java_sdk_library is checked - return nil +func (m *sdkLibraryXml) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } // File path to the runtime implementation library diff --git a/java/sdk_library_test.go b/java/sdk_library_test.go index 0aed4b81a..2cb827dc2 100644 --- a/java/sdk_library_test.go +++ b/java/sdk_library_test.go @@ -115,19 +115,19 @@ func TestJavaSdkLibrary(t *testing.T) { `) // check the existence of the internal modules - foo := result.ModuleForTests("foo", "android_common") - result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common") - result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common") - result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common") - result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common") - result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common") - result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common") - result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "") - result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common") - result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common") - result.ModuleForTests("foo.api.public.28", "") - result.ModuleForTests("foo.api.system.28", "") - result.ModuleForTests("foo.api.test.28", "") + foo := result.ModuleForTests(t, "foo", "android_common") + result.ModuleForTests(t, apiScopePublic.stubsLibraryModuleName("foo"), "android_common") + result.ModuleForTests(t, apiScopeSystem.stubsLibraryModuleName("foo"), "android_common") + result.ModuleForTests(t, apiScopeTest.stubsLibraryModuleName("foo"), "android_common") + result.ModuleForTests(t, apiScopePublic.stubsSourceModuleName("foo"), "android_common") + result.ModuleForTests(t, apiScopeSystem.stubsSourceModuleName("foo"), "android_common") + result.ModuleForTests(t, apiScopeTest.stubsSourceModuleName("foo"), "android_common") + result.ModuleForTests(t, apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "") + result.ModuleForTests(t, apiScopePublic.apiLibraryModuleName("foo"), "android_common") + result.ModuleForTests(t, "foo"+sdkXmlFileSuffix, "android_common") + result.ModuleForTests(t, "foo.api.public.28", "") + result.ModuleForTests(t, "foo.api.system.28", "") + result.ModuleForTests(t, "foo.api.test.28", "") exportedComponentsInfo, _ := android.OtherModuleProvider(result, foo.Module(), android.ExportedComponentsInfoProvider) expectedFooExportedComponents := []string{ @@ -147,7 +147,7 @@ func TestJavaSdkLibrary(t *testing.T) { } android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components) - bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac") + bazJavac := result.ModuleForTests(t, "baz", "android_common").Rule("javac") // tests if baz is actually linked to the stubs lib android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar") // ... and not to the impl lib @@ -155,20 +155,20 @@ func TestJavaSdkLibrary(t *testing.T) { // test if baz is not linked to the system variant of foo android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar") - bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac") + bazTestJavac := result.ModuleForTests(t, "baz-test", "android_common").Rule("javac") // tests if baz-test is actually linked to the test stubs lib android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar") - baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac") + baz29Javac := result.ModuleForTests(t, "baz-29", "android_common").Rule("javac") // tests if baz-29 is actually linked to the system 29 stubs lib android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/sdk_system_29_foo/android_common/combined/sdk_system_29_foo.jar") - bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac") + bazModule30Javac := result.ModuleForTests(t, "baz-module-30", "android_common").Rule("javac") // tests if "baz-module-30" is actually linked to the module 30 stubs lib android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/sdk_module-lib_30_foo/android_common/combined/sdk_module-lib_30_foo.jar") // test if baz has exported SDK lib names foo and bar to qux - qux := result.ModuleForTests("qux", "android_common") + qux := result.ModuleForTests(t, "qux", "android_common") if quxLib, ok := qux.Module().(*Library); ok { requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs() android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs) @@ -176,13 +176,13 @@ func TestJavaSdkLibrary(t *testing.T) { } // test if quuz have created the api_contribution module - result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "") + result.ModuleForTests(t, apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "") - fooImplDexJar := result.ModuleForTests("foo.impl", "android_common").Rule("d8") + fooImplDexJar := result.ModuleForTests(t, "foo.impl", "android_common").Rule("d8") // tests if kotlinc generated files are NOT excluded from output of foo.impl. android.AssertStringDoesNotContain(t, "foo.impl dex", fooImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module") - barImplDexJar := result.ModuleForTests("bar.impl", "android_common").Rule("d8") + barImplDexJar := result.ModuleForTests(t, "bar.impl", "android_common").Rule("d8") // tests if kotlinc generated files are excluded from output of bar.impl. android.AssertStringDoesContain(t, "bar.impl dex", barImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module") } @@ -220,7 +220,7 @@ func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) { `) // test that updatability attributes are passed on correctly - fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Output("fooUpdatable.xml") + fooUpdatable := result.ModuleForTests(t, "fooUpdatable.xml", "android_common").Output("fooUpdatable.xml") fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable) android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-since="U"`) android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-before="V"`) @@ -229,7 +229,7 @@ func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) { // double check that updatability attributes are not written if they don't exist in the bp file // the permissions file for the foo library defined above - fooPermissions := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml") + fooPermissions := result.ModuleForTests(t, "foo.xml", "android_common").Output("foo.xml") fooPermissionsContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooPermissions) android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-since`) android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-before`) @@ -370,7 +370,7 @@ func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) { } `) // test that updatability attributes are passed on correctly - fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml") + fooUpdatable := result.ModuleForTests(t, "foo.xml", "android_common").Output("foo.xml") fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable) android.AssertStringDoesContain(t, "foo.xml contents", fooUpdatableContents, `<apex-library`) android.AssertStringDoesNotContain(t, "foo.xml contents", fooUpdatableContents, `<library`) @@ -417,11 +417,11 @@ func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) { {lib: "stub-only-static-lib", in_stub_combined: true}, } verify := func(sdklib, dep string, cp, combined bool) { - sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"] + sdklibCp := result.ModuleForTests(t, sdklib, "android_common").Rule("javac").Args["classpath"] expected := cp || combined // Every combined jar is also on the classpath. android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected) - combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings() + combineJarInputs := result.ModuleForTests(t, sdklib, "android_common").Rule("combineJar").Inputs.Strings() depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar") android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined) } @@ -457,7 +457,7 @@ func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) { `) // The bar library should depend on the stubs jar. - barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac") + barLibrary := result.ModuleForTests(t, "bar", "android_common").Rule("javac") if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) { t.Errorf("expected %q, found %#q", expected, actual) } @@ -797,7 +797,7 @@ func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) { // The bar library should depend on the highest (where system server is highest and public is // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the // foo-<x> module is <x>. - barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac") + barLibrary := result.ModuleForTests(t, "bar", "android_common").Rule("javac") stubLibraries := []string{ stubsPath("foo-public", apiScopePublic), stubsPath("foo-system", apiScopeSystem), @@ -850,10 +850,10 @@ func TestJavaSdkLibraryImport(t *testing.T) { `) for _, scope := range []string{"", ".system", ".test"} { - fooModule := result.ModuleForTests("foo"+scope, "android_common") + fooModule := result.ModuleForTests(t, "foo"+scope, "android_common") javac := fooModule.Rule("javac") - sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Output("combined/sdklib.stubs" + scope + ".jar").Output + sdklibStubsJar := result.ModuleForTests(t, "sdklib.stubs"+scope, "android_common").Output("combined/sdklib.stubs" + scope + ".jar").Output android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String()) } @@ -993,15 +993,13 @@ func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer an CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{ // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib. `prebuilt_sdklib`, - `prebuilt_sdklib`, - `prebuilt_sdklib`, `prebuilt_sdklib.stubs`, `prebuilt_sdklib.stubs.source`, }) // Make sure that dependencies on sdklib that resolve to one of the child libraries use the // prebuilt library. - public := result.ModuleForTests("public", "android_common") + public := result.ModuleForTests(t, "public", "android_common") rule := public.Output("javac/public.jar") inputs := rule.Implicits.Strings() expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar" @@ -1121,7 +1119,7 @@ func TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) { ).RunTestWithBp(t, bp) // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions - public := result.ModuleForTests("public", "android_common") + public := result.ModuleForTests(t, "public", "android_common") rule := public.Output("javac/public.jar") inputs := rule.Implicits.Strings() expectedInputs := []string{ @@ -1209,7 +1207,7 @@ func TestJavaSdkLibraryDist(t *testing.T) { for _, tt := range testCases { t.Run(tt.module, func(t *testing.T) { t.Parallel() - m := result.ModuleForTests(apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library) + m := result.ModuleForTests(t, apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library) dists := m.Dists() if len(dists) != 1 { t.Fatalf("expected exactly 1 dist entry, got %d", len(dists)) @@ -1332,7 +1330,7 @@ func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) { `) // The foo.stubs.source should depend on bar-lib - fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs) + fooStubsSources := result.ModuleForTests(t, "foo.stubs.source", "android_common").Module().(*Droidstubs) eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext)) android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs.GetOrDefault(eval, nil), "bar-lib") } @@ -1360,7 +1358,7 @@ func TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) { `) // The foo.stubs.source should depend on bar-lib - fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs) + fooStubsSources := result.ModuleForTests(t, "foo.stubs.source", "android_common").Module().(*Droidstubs) eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext)) android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs.GetOrDefault(eval, nil), "bar-lib") } @@ -1411,7 +1409,7 @@ func TestJavaSdkLibrary_ApiLibrary(t *testing.T) { } for _, c := range testCases { - m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary) + m := result.ModuleForTests(t, c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary) android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions) } } @@ -1474,7 +1472,7 @@ func TestSdkLibraryDependency(t *testing.T) { } `) - barPermissions := result.ModuleForTests("bar.xml", "android_common").Output("bar.xml") + barPermissions := result.ModuleForTests(t, "bar.xml", "android_common").Output("bar.xml") barContents := android.ContentFromFileRuleForTests(t, result.TestContext, barPermissions) android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barContents, `dependency="foo"`) } @@ -1517,8 +1515,8 @@ func TestSdkLibraryExportableStubsLibrary(t *testing.T) { exportableSourceStubsLibraryModuleName := apiScopePublic.exportableSourceStubsLibraryModuleName("foo") // Check modules generation - result.ModuleForTests(exportableStubsLibraryModuleName, "android_common") - result.ModuleForTests(exportableSourceStubsLibraryModuleName, "android_common") + result.ModuleForTests(t, exportableStubsLibraryModuleName, "android_common") + result.ModuleForTests(t, exportableSourceStubsLibraryModuleName, "android_common") // Check static lib dependency android.AssertBoolEquals(t, "exportable top level stubs library module depends on the"+ @@ -1577,7 +1575,7 @@ func TestStubResolutionOfJavaSdkLibraryInLibs(t *testing.T) { result := fixture.RunTestWithBp(t, bp) // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions - public := result.ModuleForTests("mymodule", "android_common") + public := result.ModuleForTests(t, "mymodule", "android_common") rule := public.Output("javac/mymodule.jar") inputs := rule.Implicits.Strings() android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar") @@ -1663,7 +1661,7 @@ func TestMultipleSdkLibraryPrebuilts(t *testing.T) { result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions - public := result.ModuleForTests("mymodule", "android_common") + public := result.ModuleForTests(t, "mymodule", "android_common") rule := public.Output("javac/mymodule.jar") inputs := rule.Implicits.Strings() android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, tc.expectedStubPath) diff --git a/java/sdk_test.go b/java/sdk_test.go index e926307fb..49983ada2 100644 --- a/java/sdk_test.go +++ b/java/sdk_test.go @@ -501,7 +501,7 @@ func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase } checkClasspath := func(t *testing.T, result *android.TestResult, isJava8 bool) { - foo := result.ModuleForTests("foo", variant(result)) + foo := result.ModuleForTests(t, "foo", variant(result)) javac := foo.Rule("javac") var deps []string @@ -579,7 +579,7 @@ func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase checkClasspath(t, result, true /* isJava8 */) if testcase.host != android.Host { - aidl := result.ModuleForTests("foo", variant(result)).Rule("aidl") + aidl := result.ModuleForTests(t, "foo", variant(result)).Rule("aidl") android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.") } @@ -593,7 +593,7 @@ func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase checkClasspath(t, result, false /* isJava8 */) if testcase.host != android.Host { - aidl := result.ModuleForTests("foo", variant(result)).Rule("aidl") + aidl := result.ModuleForTests(t, "foo", variant(result)).Rule("aidl") android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.") } diff --git a/java/sdk_version_test.go b/java/sdk_version_test.go index 6f0370a52..03d55f70a 100644 --- a/java/sdk_version_test.go +++ b/java/sdk_version_test.go @@ -58,7 +58,7 @@ func TestSystemSdkFromVendor(t *testing.T) { vendor: true, sdk_version: "system_current", }`) - fooModule := result.ModuleForTests("foo", "android_common") + fooModule := result.ModuleForTests(t, "foo", "android_common") fooClasspath := fooModule.Rule("javac").Args["classpath"] android.AssertStringDoesContain(t, "foo classpath", fooClasspath, "prebuilts/sdk/34/system/android.jar") diff --git a/java/system_modules_test.go b/java/system_modules_test.go index b7a99b51a..99301bc52 100644 --- a/java/system_modules_test.go +++ b/java/system_modules_test.go @@ -55,7 +55,7 @@ func TestJavaSystemModules(t *testing.T) { result := android.GroupFixturePreparers(prepareForJavaTest, addSourceSystemModules).RunTest(t) // check the existence of the source module - sourceSystemModules := result.ModuleForTests("system-modules", "android_common") + sourceSystemModules := result.ModuleForTests(t, "system-modules", "android_common") sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the source input modules. @@ -83,7 +83,7 @@ func TestJavaSystemModulesImport(t *testing.T) { result := android.GroupFixturePreparers(prepareForJavaTest, addPrebuiltSystemModules).RunTest(t) // check the existence of the renamed prebuilt module - prebuiltSystemModules := result.ModuleForTests("system-modules", "android_common") + prebuiltSystemModules := result.ModuleForTests(t, "system-modules", "android_common") prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the renamed prebuilt input modules. @@ -100,7 +100,7 @@ func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { ).RunTest(t) // check the existence of the source module - sourceSystemModules := result.ModuleForTests("system-modules", "android_common") + sourceSystemModules := result.ModuleForTests(t, "system-modules", "android_common") sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the source input modules. @@ -108,7 +108,7 @@ func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) // check the existence of the renamed prebuilt module - prebuiltSystemModules := result.ModuleForTests("prebuilt_system-modules", "android_common") + prebuiltSystemModules := result.ModuleForTests(t, "prebuilt_system-modules", "android_common") prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the renamed prebuilt input modules. diff --git a/java/systemserver_classpath_fragment.go b/java/systemserver_classpath_fragment.go index f3074ed0a..a60f6b82c 100644 --- a/java/systemserver_classpath_fragment.go +++ b/java/systemserver_classpath_fragment.go @@ -95,8 +95,10 @@ type SystemServerClasspathModule struct { properties systemServerClasspathFragmentProperties } -func (s *SystemServerClasspathModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { - return nil +var _ android.ApexModule = (*SystemServerClasspathModule)(nil) + +func (m *SystemServerClasspathModule) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } type systemServerClasspathFragmentProperties struct { @@ -119,6 +121,7 @@ func systemServerClasspathFactory() android.Module { android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon) return m } + func (m *SystemServerClasspathModule) UniqueApexVariations() bool { return true } diff --git a/java/testing.go b/java/testing.go index 0ea4e6408..35319ae58 100644 --- a/java/testing.go +++ b/java/testing.go @@ -18,7 +18,6 @@ import ( "fmt" "reflect" "regexp" - "sort" "strings" "testing" @@ -378,7 +377,6 @@ func registerRequiredBuildComponentsForTest(ctx android.RegistrationContext) { RegisterAppBuildComponents(ctx) RegisterAppImportBuildComponents(ctx) RegisterAppSetBuildComponents(ctx) - registerBootclasspathBuildComponents(ctx) registerBootclasspathFragmentBuildComponents(ctx) RegisterDexpreoptBootJarsComponents(ctx) RegisterDocsBuildComponents(ctx) @@ -607,19 +605,18 @@ func gatherRequiredDepsForTest() string { func getModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string) []string { t.Helper() - module := ctx.ModuleForTests(name, variant).Module() + module := ctx.ModuleForTests(t, name, variant).Module() deps := []string{} ctx.VisitDirectDeps(module, func(m blueprint.Module) { deps = append(deps, m.Name()) }) - sort.Strings(deps) - - return deps + return android.SortedUniqueStrings(deps) } // CheckModuleDependencies checks if the expected dependencies of the module are // identical to the actual dependencies. func CheckModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) { + t.Helper() deps := getModuleDependencies(t, ctx, name, variant) if actual := deps; !reflect.DeepEqual(expected, actual) { @@ -639,7 +636,7 @@ func CheckModuleHasDependency(t *testing.T, ctx *android.TestContext, name, vari // CheckModuleHasDependency returns true if the module depends on the expected dependency. func CheckModuleHasDependencyWithTag(t *testing.T, ctx *android.TestContext, name, variant string, desiredTag blueprint.DependencyTag, expected string) bool { - module := ctx.ModuleForTests(name, variant).Module() + module := ctx.ModuleForTests(t, name, variant).Module() found := false ctx.VisitDirectDepsWithTags(module, func(m blueprint.Module, tag blueprint.DependencyTag) { if tag == desiredTag && m.Name() == expected { @@ -654,7 +651,7 @@ func CheckModuleHasDependencyWithTag(t *testing.T, ctx *android.TestContext, nam func CheckPlatformBootclasspathModules(t *testing.T, result *android.TestResult, name string, expected []string) { t.Helper() platformBootclasspath := result.Module(name, "android_common").(*platformBootclasspathModule) - pairs := ApexNamePairsFromModules(result.TestContext, platformBootclasspath.configuredModules) + pairs := apexNamePairsFromModules(result.TestContext, platformBootclasspath.configuredModules, platformBootclasspath.libraryToApex) android.AssertDeepEquals(t, fmt.Sprintf("%s modules", "platform-bootclasspath"), expected, pairs) } @@ -669,23 +666,54 @@ func CheckClasspathFragmentProtoContentInfoProvider(t *testing.T, result *androi android.AssertPathRelativeToTopEquals(t, "install filepath", installDir, info.ClasspathFragmentProtoInstallDir) } -// ApexNamePairsFromModules returns the apex:module pair for the supplied modules. -func ApexNamePairsFromModules(ctx *android.TestContext, modules []android.Module) []string { +// CheckPlatformBootclasspathDependencies checks the dependencies of the selected module against the expected list. +// +// The expected list must be a list of strings of the form "<apex>:<module>", where <apex> is the +// name of the apex, or platform is it is not part of an apex and <module> is the module name. +func CheckPlatformBootclasspathDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) { + t.Helper() + platformBootclasspath := ctx.ModuleForTests(t, name, variant).Module().(*platformBootclasspathModule) + modules := []android.Module{} + ctx.VisitDirectDeps(platformBootclasspath, func(m blueprint.Module) { + modules = append(modules, m.(android.Module)) + }) + + pairs := apexNamePairsFromModules(ctx, modules, platformBootclasspath.libraryToApex) + android.AssertDeepEquals(t, "module dependencies", expected, pairs) +} + +// apexNamePairsFromModules returns the apex:module pair for the supplied modules. +func apexNamePairsFromModules(ctx *android.TestContext, modules []android.Module, modulesToApex map[android.Module]string) []string { pairs := []string{} for _, module := range modules { - pairs = append(pairs, apexNamePairFromModule(ctx, module)) + pairs = append(pairs, apexNamePairFromModule(ctx, module, modulesToApex)) + } + return pairs +} + +// ApexFragmentPairsFromModules returns the apex:fragment pair for the supplied fragments. +func ApexFragmentPairsFromModules(ctx *android.TestContext, fragments []android.Module, apexNameToFragment map[string]android.Module) []string { + pairs := []string{} + for _, fragment := range fragments { + found := false + for apex, apexFragment := range apexNameToFragment { + if apexFragment == fragment { + pairs = append(pairs, apex+":"+ctx.ModuleName(fragment)) + found = true + } + } + if !found { + pairs = append(pairs, "platform:"+ctx.ModuleName(fragment)) + } } return pairs } -func apexNamePairFromModule(ctx *android.TestContext, module android.Module) string { +func apexNamePairFromModule(ctx *android.TestContext, module android.Module, modulesToApex map[android.Module]string) string { name := module.Name() - var apex string - apexInfo, _ := android.OtherModuleProvider(ctx, module, android.ApexInfoProvider) - if apexInfo.IsForPlatform() { + apex := modulesToApex[module] + if apex == "" { apex = "platform" - } else { - apex = apexInfo.InApexVariants[0] } return fmt.Sprintf("%s:%s", apex, name) @@ -696,7 +724,7 @@ func apexNamePairFromModule(ctx *android.TestContext, module android.Module) str func CheckPlatformBootclasspathFragments(t *testing.T, result *android.TestResult, name string, expected []string) { t.Helper() platformBootclasspath := result.Module(name, "android_common").(*platformBootclasspathModule) - pairs := ApexNamePairsFromModules(result.TestContext, platformBootclasspath.fragments) + pairs := ApexFragmentPairsFromModules(result.TestContext, platformBootclasspath.fragments, platformBootclasspath.apexNameToFragment) android.AssertDeepEquals(t, fmt.Sprintf("%s fragments", "platform-bootclasspath"), expected, pairs) } @@ -719,7 +747,7 @@ func CheckHiddenAPIRuleInputs(t *testing.T, message string, expected string, hid // Check that the merged file create by platform_compat_config_singleton has the correct inputs. func CheckMergedCompatConfigInputs(t *testing.T, result *android.TestResult, message string, expectedPaths ...string) { - sourceGlobalCompatConfig := result.SingletonForTests("platform_compat_config_singleton") + sourceGlobalCompatConfig := result.SingletonForTests(t, "platform_compat_config_singleton") allOutputs := sourceGlobalCompatConfig.AllOutputs() android.AssertIntEquals(t, message+": output len", 1, len(allOutputs)) output := sourceGlobalCompatConfig.Output(allOutputs[0]) diff --git a/kernel/prebuilt_kernel_modules_test.go b/kernel/prebuilt_kernel_modules_test.go index 7b818695b..0fc2720be 100644 --- a/kernel/prebuilt_kernel_modules_test.go +++ b/kernel/prebuilt_kernel_modules_test.go @@ -50,7 +50,7 @@ func TestKernelModulesFilelist(t *testing.T) { var actual []string for _, ps := range android.OtherModuleProviderOrDefault( - ctx, ctx.ModuleForTests("foo", "android_arm64_armv8-a").Module(), android.InstallFilesProvider).PackagingSpecs { + ctx, ctx.ModuleForTests(t, "foo", "android_arm64_armv8-a").Module(), android.InstallFilesProvider).PackagingSpecs { actual = append(actual, ps.RelPathInPackage()) } actual = android.SortedUniqueStrings(actual) diff --git a/linkerconfig/linkerconfig_test.go b/linkerconfig/linkerconfig_test.go index 939e4bbb1..9e08b1950 100644 --- a/linkerconfig/linkerconfig_test.go +++ b/linkerconfig/linkerconfig_test.go @@ -46,7 +46,7 @@ func TestBaseLinkerConfig(t *testing.T) { "LOCAL_INSTALLED_MODULE_STEM": {"linker.config.pb"}, } - p := result.ModuleForTests("linker-config-base", "android_arm64_armv8-a").Module().(*linkerConfig) + p := result.ModuleForTests(t, "linker-config-base", "android_arm64_armv8-a").Module().(*linkerConfig) if p.outputFilePath.Base() != "linker.config.pb" { t.Errorf("expected linker.config.pb, got %q", p.outputFilePath.Base()) @@ -79,7 +79,7 @@ func TestUninstallableLinkerConfig(t *testing.T) { expected := []string{"true"} - p := result.ModuleForTests("linker-config-base", "android_arm64_armv8-a").Module().(*linkerConfig) + p := result.ModuleForTests(t, "linker-config-base", "android_arm64_armv8-a").Module().(*linkerConfig) entries := android.AndroidMkEntriesForTest(t, result.TestContext, p)[0] if value, ok := entries.EntryMap["LOCAL_UNINSTALLABLE_MODULE"]; ok { if !reflect.DeepEqual(value, expected) { diff --git a/phony/phony.go b/phony/phony.go index 807b95b32..4f61c4583 100644 --- a/phony/phony.go +++ b/phony/phony.go @@ -38,9 +38,11 @@ var PrepareForTestWithPhony = android.FixtureRegisterWithContext(registerPhonyMo type phony struct { android.ModuleBase + requiredModuleNames []string hostRequiredModuleNames []string targetRequiredModuleNames []string + outputDeps android.Paths } func PhonyFactory() android.Module { @@ -54,6 +56,14 @@ func (p *phony) GenerateAndroidBuildActions(ctx android.ModuleContext) { p.requiredModuleNames = ctx.RequiredModuleNames(ctx) p.hostRequiredModuleNames = ctx.HostRequiredModuleNames() p.targetRequiredModuleNames = ctx.TargetRequiredModuleNames() + + ctx.VisitDirectDepsWithTag(android.RequiredDepTag, func(dep android.Module) { + if o, ok := android.OtherModuleProvider(ctx, dep, android.OutputFilesProvider); ok { + p.outputDeps = append(p.outputDeps, o.DefaultOutputFiles...) + } + }) + + ctx.Phony(p.Name(), p.outputDeps...) } func (p *phony) AndroidMk() android.AndroidMkData { @@ -77,6 +87,10 @@ func (p *phony) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, "LOCAL_TARGET_REQUIRED_MODULES :=", strings.Join(p.targetRequiredModuleNames, " ")) } + if len(p.outputDeps) > 0 { + fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES :=", + strings.Join(p.outputDeps.Strings(), " ")) + } // AconfigUpdateAndroidMkData may have added elements to Extra. Process them here. for _, extra := range data.Extra { extra(w, nil) diff --git a/provenance/provenance_singleton.go b/provenance/provenance_singleton.go index c372db2b3..c1bc1c75c 100644 --- a/provenance/provenance_singleton.go +++ b/provenance/provenance_singleton.go @@ -99,6 +99,7 @@ func (p *provenanceInfoSingleton) GenerateBuildActions(context android.Singleton }) context.Phony("droidcore", android.PathForPhony(context, "provenance_metadata")) + context.DistForGoal("droidcore", p.mergedMetaDataFile) } func GenerateArtifactProvenanceMetaData(ctx android.ModuleContext, artifactPath android.Path, installedFile android.InstallPath) android.Path { @@ -116,9 +117,3 @@ func GenerateArtifactProvenanceMetaData(ctx android.ModuleContext, artifactPath return artifactMetaDataFile } - -func (p *provenanceInfoSingleton) MakeVars(ctx android.MakeVarsContext) { - ctx.DistForGoal("droidcore", p.mergedMetaDataFile) -} - -var _ android.SingletonMakeVarsProvider = (*provenanceInfoSingleton)(nil) diff --git a/provenance/provenance_singleton_test.go b/provenance/provenance_singleton_test.go index 0f1eae220..05f3474b6 100644 --- a/provenance/provenance_singleton_test.go +++ b/provenance/provenance_singleton_test.go @@ -28,9 +28,9 @@ func TestProvenanceSingleton(t *testing.T) { PrepareForTestWithProvenanceSingleton, android.PrepareForTestWithAndroidMk).RunTestWithBp(t, "") - outputs := result.SingletonForTests("provenance_metadata_singleton").AllOutputs() + outputs := result.SingletonForTests(t, "provenance_metadata_singleton").AllOutputs() for _, output := range outputs { - testingBuildParam := result.SingletonForTests("provenance_metadata_singleton").Output(output) + testingBuildParam := result.SingletonForTests(t, "provenance_metadata_singleton").Output(output) switch { case strings.Contains(output, "soong/provenance_metadata.textproto"): android.AssertStringEquals(t, "Invalid build rule", "android/soong/provenance.mergeProvenanceMetaData", testingBuildParam.Rule.String()) diff --git a/python/binary.go b/python/binary.go index a3acb347d..4d6e11816 100644 --- a/python/binary.go +++ b/python/binary.go @@ -23,6 +23,7 @@ import ( "android/soong/android" "android/soong/cc" + "github.com/google/blueprint" ) @@ -143,8 +144,7 @@ func (p *PythonBinaryModule) buildBinary(ctx android.ModuleContext) { } srcsZips = append(srcsZips, depsSrcsZips...) p.installSource = registerBuildActionForParFile(ctx, embeddedLauncher, launcherPath, - p.getHostInterpreterName(ctx, p.properties.Actual_version), - main, p.getStem(ctx), srcsZips) + "python3", main, p.getStem(ctx), srcsZips) var sharedLibs []string // if embedded launcher is enabled, we need to collect the shared library dependencies of the @@ -205,23 +205,6 @@ func (b *PythonBinaryModule) autorun() bool { return BoolDefault(b.binaryProperties.Autorun, true) } -// get host interpreter name. -func (p *PythonBinaryModule) getHostInterpreterName(ctx android.ModuleContext, - actualVersion string) string { - var interp string - switch actualVersion { - case pyVersion2: - interp = "python2.7" - case pyVersion3: - interp = "python3" - default: - panic(fmt.Errorf("unknown Python actualVersion: %q for module: %q.", - actualVersion, ctx.ModuleName())) - } - - return interp -} - // find main program path within runfiles tree. func (p *PythonBinaryModule) getPyMainFile(ctx android.ModuleContext, srcsPathMappings []pathMapping) string { diff --git a/python/defaults.go b/python/defaults.go index 3dc5bc4d2..b5ee2bcb1 100644 --- a/python/defaults.go +++ b/python/defaults.go @@ -18,10 +18,6 @@ import ( "android/soong/android" ) -func init() { - android.RegisterModuleType("python_defaults", DefaultsFactory) -} - type Defaults struct { android.ModuleBase android.DefaultsModuleBase diff --git a/python/library.go b/python/library.go index 7cdb80b87..c197028df 100644 --- a/python/library.go +++ b/python/library.go @@ -27,6 +27,7 @@ func init() { func registerPythonLibraryComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("python_library_host", PythonLibraryHostFactory) ctx.RegisterModuleType("python_library", PythonLibraryFactory) + ctx.RegisterModuleType("python_defaults", DefaultsFactory) } func PythonLibraryHostFactory() android.Module { diff --git a/python/python.go b/python/python.go index 09af62ea5..f8f41658f 100644 --- a/python/python.go +++ b/python/python.go @@ -23,6 +23,7 @@ import ( "strings" "android/soong/cc" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -39,19 +40,6 @@ type PythonLibraryInfo struct { var PythonLibraryInfoProvider = blueprint.NewProvider[PythonLibraryInfo]() -func init() { - registerPythonMutators(android.InitRegistrationContext) -} - -func registerPythonMutators(ctx android.RegistrationContext) { - ctx.PreDepsMutators(RegisterPythonPreDepsMutators) -} - -// Exported to support other packages using Python modules in tests. -func RegisterPythonPreDepsMutators(ctx android.RegisterMutatorsContext) { - ctx.Transition("python_version", &versionSplitTransitionMutator{}) -} - // the version-specific properties that apply to python modules. type VersionProperties struct { // whether the module is required to be built with this version. @@ -127,18 +115,14 @@ type BaseProperties struct { Py3 VersionProperties `android:"arch_variant"` } `android:"arch_variant"` - // the actual version each module uses after variations created. - // this property name is hidden from users' perspectives, and soong will populate it during - // runtime. - Actual_version string `blueprint:"mutated"` - - // whether the module is required to be built with actual_version. - // this is set by the python version mutator based on version-specific properties + // This enabled property is to accept the collapsed enabled property from the VersionProperties. + // It is unused now, as all builds should be python3. Enabled *bool `blueprint:"mutated"` - // whether the binary is required to be built with embedded launcher for this actual_version. - // this is set by the python version mutator based on version-specific properties - Embedded_launcher *bool `blueprint:"mutated"` + // whether the binary is required to be built with an embedded python interpreter, defaults to + // true. This allows taking the resulting binary outside of the build and running it on machines + // that don't have python installed or may have an older version of python. + Embedded_launcher *bool } // Used to store files of current module after expanding dependencies @@ -252,8 +236,6 @@ var ( pathComponentRegexp = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_-]*$`) pyExt = ".py" protoExt = ".proto" - pyVersion2 = "PY2" - pyVersion3 = "PY3" internalPath = "internal" ) @@ -261,71 +243,6 @@ type basePropertiesProvider interface { getBaseProperties() *BaseProperties } -type versionSplitTransitionMutator struct{} - -func (versionSplitTransitionMutator) Split(ctx android.BaseModuleContext) []string { - if base, ok := ctx.Module().(basePropertiesProvider); ok { - props := base.getBaseProperties() - var variants []string - // PY3 is first so that we alias the PY3 variant rather than PY2 if both - // are available - if proptools.BoolDefault(props.Version.Py3.Enabled, true) { - variants = append(variants, pyVersion3) - } - if proptools.BoolDefault(props.Version.Py2.Enabled, false) { - if ctx.ModuleName() != "py2-cmd" && - ctx.ModuleName() != "py2-stdlib" { - ctx.PropertyErrorf("version.py2.enabled", "Python 2 is no longer supported, please convert to python 3.") - } - variants = append(variants, pyVersion2) - } - return variants - } - return []string{""} -} - -func (versionSplitTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { - return "" -} - -func (versionSplitTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { - if incomingVariation != "" { - return incomingVariation - } - if base, ok := ctx.Module().(basePropertiesProvider); ok { - props := base.getBaseProperties() - if proptools.BoolDefault(props.Version.Py3.Enabled, true) { - return pyVersion3 - } else { - return pyVersion2 - } - } - - return "" -} - -func (versionSplitTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) { - if variation == "" { - return - } - if base, ok := ctx.Module().(basePropertiesProvider); ok { - props := base.getBaseProperties() - props.Actual_version = variation - - var versionProps *VersionProperties - if variation == pyVersion3 { - versionProps = &props.Version.Py3 - } else if variation == pyVersion2 { - versionProps = &props.Version.Py2 - } - - err := proptools.AppendMatchingProperties([]interface{}{props}, versionProps, nil) - if err != nil { - panic(err) - } - } -} - func anyHasExt(paths []string, ext string) bool { for _, p := range paths { if filepath.Ext(p) == ext { @@ -345,19 +262,26 @@ func (p *PythonLibraryModule) anySrcHasExt(ctx android.BottomUpMutatorContext, e // - if required, specifies launcher and adds launcher dependencies, // - applies python version mutations to Python dependencies func (p *PythonLibraryModule) DepsMutator(ctx android.BottomUpMutatorContext) { - android.ProtoDeps(ctx, &p.protoProperties) + // Flatten the version.py3 props down into the main property struct. Leftover from when + // there was both python2 and 3 in the build, and properties could be different between them. + if base, ok := ctx.Module().(basePropertiesProvider); ok { + props := base.getBaseProperties() - versionVariation := []blueprint.Variation{ - {"python_version", p.properties.Actual_version}, + err := proptools.AppendMatchingProperties([]interface{}{props}, &props.Version.Py3, nil) + if err != nil { + panic(err) + } } + android.ProtoDeps(ctx, &p.protoProperties) + // If sources contain a proto file, add dependency on libprotobuf-python if p.anySrcHasExt(ctx, protoExt) && p.Name() != "libprotobuf-python" { - ctx.AddVariationDependencies(versionVariation, pythonLibTag, "libprotobuf-python") + ctx.AddDependency(ctx.Module(), pythonLibTag, "libprotobuf-python") } // Add python library dependencies for this python version variation - ctx.AddVariationDependencies(versionVariation, pythonLibTag, android.LastUniqueStrings(p.properties.Libs)...) + ctx.AddDependency(ctx.Module(), pythonLibTag, android.LastUniqueStrings(p.properties.Libs)...) // Emulate the data property for java_data but with the arch variation overridden to "common" // so that it can point to java modules. @@ -394,55 +318,38 @@ func (p *PythonLibraryModule) AddDepsOnPythonLauncherAndStdlib(ctx android.Botto launcherSharedLibDeps = append(launcherSharedLibDeps, "libc_musl") } - switch p.properties.Actual_version { - case pyVersion2: - stdLib = "py2-stdlib" - - launcherModule = "py2-launcher" - if autorun { - launcherModule = "py2-launcher-autorun" - } - - launcherSharedLibDeps = append(launcherSharedLibDeps, "libc++") - case pyVersion3: - var prebuiltStdLib bool - if targetForDeps.Os.Bionic() { - prebuiltStdLib = false - } else if ctx.Config().VendorConfig("cpython3").Bool("force_build_host") { - prebuiltStdLib = false - } else { - prebuiltStdLib = true - } + var prebuiltStdLib bool + if targetForDeps.Os.Bionic() { + prebuiltStdLib = false + } else if ctx.Config().VendorConfig("cpython3").Bool("force_build_host") { + prebuiltStdLib = false + } else { + prebuiltStdLib = true + } - if prebuiltStdLib { - stdLib = "py3-stdlib-prebuilt" - } else { - stdLib = "py3-stdlib" - } + if prebuiltStdLib { + stdLib = "py3-stdlib-prebuilt" + } else { + stdLib = "py3-stdlib" + } - launcherModule = "py3-launcher" - if autorun { - launcherModule = "py3-launcher-autorun" - } - if ctx.Config().HostStaticBinaries() && targetForDeps.Os == android.LinuxMusl { - launcherModule += "-static" - } - if ctx.Device() { - launcherSharedLibDeps = append(launcherSharedLibDeps, "liblog") - } - default: - panic(fmt.Errorf("unknown Python Actual_version: %q for module: %q.", - p.properties.Actual_version, ctx.ModuleName())) + launcherModule = "py3-launcher" + if autorun { + launcherModule = "py3-launcher-autorun" } + if ctx.Config().HostStaticBinaries() && targetForDeps.Os == android.LinuxMusl { + launcherModule += "-static" + } + if ctx.Device() { + launcherSharedLibDeps = append(launcherSharedLibDeps, "liblog") + } + targetVariations := targetForDeps.Variations() if ctx.ModuleName() != stdLib { - stdLibVariations := make([]blueprint.Variation, 0, len(targetVariations)+1) - stdLibVariations = append(stdLibVariations, blueprint.Variation{Mutator: "python_version", Variation: p.properties.Actual_version}) - stdLibVariations = append(stdLibVariations, targetVariations...) // Using AddFarVariationDependencies for all of these because they can be for a different // platform, like if the python module itself was being compiled for device, we may want // the python interpreter built for host so that we can precompile python sources. - ctx.AddFarVariationDependencies(stdLibVariations, stdLibTag, stdLib) + ctx.AddFarVariationDependencies(targetVariations, stdLibTag, stdLib) } ctx.AddFarVariationDependencies(targetVariations, launcherTag, launcherModule) ctx.AddFarVariationDependencies(targetVariations, launcherSharedLibTag, launcherSharedLibDeps...) @@ -450,6 +357,9 @@ func (p *PythonLibraryModule) AddDepsOnPythonLauncherAndStdlib(ctx android.Botto // GenerateAndroidBuildActions performs build actions common to all Python modules func (p *PythonLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { + if proptools.BoolDefault(p.properties.Version.Py2.Enabled, false) { + ctx.PropertyErrorf("version.py2.enabled", "Python 2 is no longer supported, please convert to python 3.") + } expandedSrcs := android.PathsForModuleSrcExcludes(ctx, p.properties.Srcs, p.properties.Exclude_srcs) // Keep before any early returns. android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ @@ -490,7 +400,8 @@ func (p *PythonLibraryModule) GenerateAndroidBuildActions(ctx android.ModuleCont // generate the zipfile of all source and data files p.srcsZip = p.createSrcsZip(ctx, pkgPath) - p.precompiledSrcsZip = p.precompileSrcs(ctx) + // TODO(b/388344853): precompilation temporarily disabled for python3.13 upgrade + p.precompiledSrcsZip = p.srcsZip //p.precompileSrcs(ctx) android.SetProvider(ctx, PythonLibraryInfoProvider, PythonLibraryInfo{ SrcsPathMappings: p.getSrcsPathMappings(), diff --git a/python/python_test.go b/python/python_test.go index 6a6bd1d91..5f971cdd1 100644 --- a/python/python_test.go +++ b/python/python_test.go @@ -36,10 +36,8 @@ type pyModule struct { } var ( - buildNamePrefix = "soong_python_test" - // We allow maching almost anything before the actual variant so that the os/arch variant - // is matched. - moduleVariantErrTemplate = `%s: module %q variant "[a-zA-Z0-9_]*%s": ` + buildNamePrefix = "soong_python_test" + moduleVariantErrTemplate = `%s: module %q variant "[a-zA-Z0-9_]*": ` pkgPathErrTemplate = moduleVariantErrTemplate + "pkg_path: %q must be a relative path contained in par file." badIdentifierErrTemplate = moduleVariantErrTemplate + @@ -48,9 +46,8 @@ var ( "found two files to be placed at the same location within zip %q." + " First file: in module %s at path %q." + " Second file: in module %s at path %q." - noSrcFileErr = moduleVariantErrTemplate + "doesn't have any source files!" - badSrcFileExtErr = moduleVariantErrTemplate + "srcs: found non (.py|.proto) file: %q!" - badDataFileExtErr = moduleVariantErrTemplate + "data: found (.py) file: %q!" + badSrcFileExtErr = moduleVariantErrTemplate + `srcs: found non \(.py\|.proto\) file: %q!` + badDataFileExtErr = moduleVariantErrTemplate + `data: found \(.py\) file: %q!` bpFile = "Android.bp" data = []struct { @@ -61,20 +58,6 @@ var ( expectedBinaries []pyModule }{ { - desc: "module without any src files", - mockFiles: map[string][]byte{ - filepath.Join("dir", bpFile): []byte( - `python_library_host { - name: "lib1", - }`, - ), - }, - errors: []string{ - fmt.Sprintf(noSrcFileErr, - "dir/Android.bp:1:1", "lib1", "PY3"), - }, - }, - { desc: "module with bad src file ext", mockFiles: map[string][]byte{ filepath.Join("dir", bpFile): []byte( @@ -89,7 +72,7 @@ var ( }, errors: []string{ fmt.Sprintf(badSrcFileExtErr, - "dir/Android.bp:3:11", "lib1", "PY3", "dir/file1.exe"), + "dir/Android.bp:3:11", "lib1", "dir/file1.exe"), }, }, { @@ -111,7 +94,7 @@ var ( }, errors: []string{ fmt.Sprintf(badDataFileExtErr, - "dir/Android.bp:6:11", "lib1", "PY3", "dir/file2.py"), + "dir/Android.bp:6:11", "lib1", "dir/file2.py"), }, }, { @@ -146,9 +129,9 @@ var ( }, errors: []string{ fmt.Sprintf(pkgPathErrTemplate, - "dir/Android.bp:11:15", "lib2", "PY3", "a/c/../../../"), + "dir/Android.bp:11:15", "lib2", "a/c/../../../"), fmt.Sprintf(pkgPathErrTemplate, - "dir/Android.bp:19:15", "lib3", "PY3", "/a/c/../../"), + "dir/Android.bp:19:15", "lib3", "/a/c/../../"), }, }, { @@ -171,11 +154,11 @@ var ( }, errors: []string{ fmt.Sprintf(badIdentifierErrTemplate, "dir/Android.bp:4:11", - "lib1", "PY3", "a/b/c/-e/f/file1.py", "-e"), + "lib1", "a/b/c/-e/f/file1.py", "-e"), fmt.Sprintf(badIdentifierErrTemplate, "dir/Android.bp:4:11", - "lib1", "PY3", "a/b/c/.file1.py", ".file1"), + "lib1", "a/b/c/.file1.py", ".file1"), fmt.Sprintf(badIdentifierErrTemplate, "dir/Android.bp:4:11", - "lib1", "PY3", "a/b/c/123/file1.py", "123"), + "lib1", "a/b/c/123/file1.py", "123"), }, }, { @@ -219,115 +202,15 @@ var ( }, errors: []string{ fmt.Sprintf(dupRunfileErrTemplate, "dir/Android.bp:20:6", - "bin", "PY3", "a/b/c/file1.py", "bin", "dir/file1.py", + "bin", "a/b/c/file1.py", "bin", "dir/file1.py", "lib1", "dir/c/file1.py"), }, }, - { - desc: "module for testing dependencies", - mockFiles: map[string][]byte{ - filepath.Join("dir", bpFile): []byte( - `python_defaults { - name: "default_lib", - srcs: [ - "default.py", - ], - version: { - py2: { - enabled: true, - srcs: [ - "default_py2.py", - ], - }, - py3: { - enabled: false, - srcs: [ - "default_py3.py", - ], - }, - }, - } - - python_library_host { - name: "lib5", - pkg_path: "a/b/", - srcs: [ - "file1.py", - ], - version: { - py2: { - enabled: true, - }, - py3: { - enabled: true, - }, - }, - } - - python_library_host { - name: "lib6", - pkg_path: "c/d/", - srcs: [ - "file2.py", - ], - libs: [ - "lib5", - ], - } - - python_binary_host { - name: "bin", - defaults: ["default_lib"], - pkg_path: "e/", - srcs: [ - "bin.py", - ], - libs: [ - "lib5", - ], - version: { - py3: { - enabled: true, - srcs: [ - "file4.py", - ], - libs: [ - "lib6", - ], - }, - }, - }`, - ), - filepath.Join("dir", "default.py"): nil, - filepath.Join("dir", "default_py2.py"): nil, - filepath.Join("dir", "default_py3.py"): nil, - filepath.Join("dir", "file1.py"): nil, - filepath.Join("dir", "file2.py"): nil, - filepath.Join("dir", "bin.py"): nil, - filepath.Join("dir", "file4.py"): nil, - }, - expectedBinaries: []pyModule{ - { - name: "bin", - actualVersion: "PY3", - pyRunfiles: []string{ - "e/default.py", - "e/bin.py", - "e/default_py3.py", - "e/file4.py", - }, - srcsZip: "out/soong/.intermediates/dir/bin/PY3/bin.py.srcszip", - }, - }, - }, } ) func TestPythonModule(t *testing.T) { for _, d := range data { - if d.desc != "module with duplicate runfile path" { - continue - } d.mockFiles[filepath.Join("common", bpFile)] = []byte(` python_library { name: "py3-stdlib", @@ -416,10 +299,6 @@ func TestInvalidTestOnlyTargets(t *testing.T) { for i, bp := range testCases { ctx := android.GroupFixturePreparers( PrepareForTestWithPythonBuildComponents, - android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { - - ctx.RegisterModuleType("python_defaults", DefaultsFactory) - }), android.PrepareForTestWithAllowMissingDependencies). ExtendWithErrorHandler(android.FixtureIgnoreErrors). RunTestWithBp(t, bp) @@ -434,7 +313,7 @@ func TestInvalidTestOnlyTargets(t *testing.T) { } func expectModule(t *testing.T, ctx *android.TestContext, name, variant, expectedSrcsZip string, expectedPyRunfiles []string) { - module := ctx.ModuleForTests(name, variant) + module := ctx.ModuleForTests(t, name, variant) base, baseOk := module.Module().(*PythonLibraryModule) if !baseOk { diff --git a/python/testing.go b/python/testing.go index ce1a5ab27..fe53ee528 100644 --- a/python/testing.go +++ b/python/testing.go @@ -20,5 +20,4 @@ var PrepareForTestWithPythonBuildComponents = android.GroupFixturePreparers( android.FixtureRegisterWithContext(registerPythonBinaryComponents), android.FixtureRegisterWithContext(registerPythonLibraryComponents), android.FixtureRegisterWithContext(registerPythonTestComponents), - android.FixtureRegisterWithContext(registerPythonMutators), ) diff --git a/rust/afdo_test.go b/rust/afdo_test.go index 0cdf70491..69aa97e22 100644 --- a/rust/afdo_test.go +++ b/rust/afdo_test.go @@ -50,7 +50,7 @@ func TestAfdoEnabled(t *testing.T) { rustMockedFiles.AddToFixture(), ).RunTestWithBp(t, bp) - foo := result.ModuleForTests("foo", "android_arm64_armv8-a").Rule("rustc") + foo := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Rule("rustc") expectedCFlag := fmt.Sprintf(afdoFlagFormat, "afdo_profiles_package/foo.afdo") @@ -96,8 +96,8 @@ func TestAfdoEnabledWithMultiArchs(t *testing.T) { rustMockedFiles.AddToFixture(), ).RunTestWithBp(t, bp) - fooArm := result.ModuleForTests("foo", "android_arm_armv7-a-neon").Rule("rustc") - fooArm64 := result.ModuleForTests("foo", "android_arm64_armv8-a").Rule("rustc") + fooArm := result.ModuleForTests(t, "foo", "android_arm_armv7-a-neon").Rule("rustc") + fooArm64 := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Rule("rustc") expectedCFlagArm := fmt.Sprintf(afdoFlagFormat, "afdo_profiles_package/foo_arm.afdo") expectedCFlagArm64 := fmt.Sprintf(afdoFlagFormat, "afdo_profiles_package/foo_arm64.afdo") diff --git a/rust/androidmk.go b/rust/androidmk.go index 8de6b6004..98946844d 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -92,9 +92,6 @@ func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries { func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, binary.baseCompiler) - if binary.distFile.Valid() { - ret.DistFiles = android.MakeDefaultDistFiles(binary.distFile.Path()) - } ret.Class = "EXECUTABLES" } @@ -143,9 +140,6 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An } else if library.shared() { ret.Class = "SHARED_LIBRARIES" } - if library.distFile.Valid() { - ret.DistFiles = android.MakeDefaultDistFiles(library.distFile.Path()) - } ret.ExtraEntries = append(ret.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { if library.tocFile.Valid() { @@ -158,10 +152,6 @@ func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *androi ctx.SubAndroidMk(ret, procMacro.baseCompiler) ret.Class = "PROC_MACRO_LIBRARIES" - if procMacro.distFile.Valid() { - ret.DistFiles = android.MakeDefaultDistFiles(procMacro.distFile.Path()) - } - } func (sourceProvider *BaseSourceProvider) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { diff --git a/rust/benchmark_test.go b/rust/benchmark_test.go index 734dda71d..c239a0985 100644 --- a/rust/benchmark_test.go +++ b/rust/benchmark_test.go @@ -28,7 +28,7 @@ func TestRustBenchmark(t *testing.T) { srcs: ["foo.rs"], }`) - testingModule := ctx.ModuleForTests("my_bench", "linux_glibc_x86_64") + testingModule := ctx.ModuleForTests(t, "my_bench", "linux_glibc_x86_64") expectedOut := "my_bench/linux_glibc_x86_64/my_bench" outPath := testingModule.Output("my_bench").Output.String() if !strings.Contains(outPath, expectedOut) { @@ -43,7 +43,7 @@ func TestRustBenchmarkLinkage(t *testing.T) { srcs: ["foo.rs"], }`) - testingModule := ctx.ModuleForTests("my_bench", "android_arm64_armv8-a").Module().(*Module) + testingModule := ctx.ModuleForTests(t, "my_bench", "android_arm64_armv8-a").Module().(*Module) if !android.InList("libcriterion.rlib-std", testingModule.Properties.AndroidMkRlibs) { t.Errorf("rlib-std variant for libcriterion not detected as a rustlib-defined rlib dependency for device rust_benchmark module") diff --git a/rust/binary_test.go b/rust/binary_test.go index ef9303768..33710f9a8 100644 --- a/rust/binary_test.go +++ b/rust/binary_test.go @@ -36,7 +36,7 @@ func TestBinaryHostLinkage(t *testing.T) { host_supported: true, } `) - fizzBuzz := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Module().(*Module) + fizzBuzz := ctx.ModuleForTests(t, "fizz-buzz", "linux_glibc_x86_64").Module().(*Module) if !android.InList("libfoo.rlib-std", fizzBuzz.Properties.AndroidMkRlibs) { t.Errorf("rustlibs dependency libfoo should be an rlib dep for host binaries") } @@ -65,8 +65,8 @@ func TestBinaryLinkage(t *testing.T) { host_supported: true, }`) - fizzBuzzHost := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Module().(*Module) - fizzBuzzDevice := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a").Module().(*Module) + fizzBuzzHost := ctx.ModuleForTests(t, "fizz-buzz", "linux_glibc_x86_64").Module().(*Module) + fizzBuzzDevice := ctx.ModuleForTests(t, "fizz-buzz", "android_arm64_armv8-a").Module().(*Module) if !android.InList("libfoo.rlib-std", fizzBuzzHost.Properties.AndroidMkRlibs) { t.Errorf("rustlibs dependency libfoo should be an rlib dep for host modules") @@ -76,7 +76,7 @@ func TestBinaryLinkage(t *testing.T) { t.Errorf("rustlibs dependency libfoo should be an dylib dep for device modules") } - rlibLinkDevice := ctx.ModuleForTests("rlib_linked", "android_arm64_armv8-a").Module().(*Module) + rlibLinkDevice := ctx.ModuleForTests(t, "rlib_linked", "android_arm64_armv8-a").Module().(*Module) if !android.InList("libfoo.rlib-std", rlibLinkDevice.Properties.AndroidMkRlibs) { t.Errorf("rustlibs dependency libfoo should be an rlib dep for device modules when prefer_rlib is set") @@ -100,7 +100,7 @@ func TestBinaryPreferRlib(t *testing.T) { host_supported: true, }`) - mod := ctx.ModuleForTests("rlib_linked", "android_arm64_armv8-a").Module().(*Module) + mod := ctx.ModuleForTests(t, "rlib_linked", "android_arm64_armv8-a").Module().(*Module) if !android.InList("libfoo.rlib-std", mod.Properties.AndroidMkRlibs) { t.Errorf("rustlibs dependency libfoo should be an rlib dep when prefer_rlib is defined") @@ -119,7 +119,7 @@ func TestHostToolPath(t *testing.T) { srcs: ["foo.rs"], }`) - path := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Module().(*Module).HostToolPath() + path := ctx.ModuleForTests(t, "fizz-buzz", "linux_glibc_x86_64").Module().(*Module).HostToolPath() if g, w := path.String(), "/host/linux-x86/bin/fizz-buzz"; !strings.Contains(g, w) { t.Errorf("wrong host tool path, expected %q got %q", w, g) } @@ -133,7 +133,7 @@ func TestBinaryFlags(t *testing.T) { srcs: ["foo.rs"], }`) - fizzBuzz := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Rule("rustc") + fizzBuzz := ctx.ModuleForTests(t, "fizz-buzz", "linux_glibc_x86_64").Rule("rustc") flags := fizzBuzz.Args["rustcFlags"] if strings.Contains(flags, "--test") { @@ -150,7 +150,7 @@ func TestBootstrap(t *testing.T) { bootstrap: true, }`) - foo := ctx.ModuleForTests("foo", "android_arm64_armv8-a").Rule("rustc") + foo := ctx.ModuleForTests(t, "foo", "android_arm64_armv8-a").Rule("rustc") flag := "-Wl,-dynamic-linker,/system/bin/bootstrap/linker64" if !strings.Contains(foo.Args["linkFlags"], flag) { @@ -166,8 +166,8 @@ func TestStaticBinaryFlags(t *testing.T) { static_executable: true, }`) - fizzOut := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Rule("rustc") - fizzMod := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Module().(*Module) + fizzOut := ctx.ModuleForTests(t, "fizz", "android_arm64_armv8-a").Rule("rustc") + fizzMod := ctx.ModuleForTests(t, "fizz", "android_arm64_armv8-a").Module().(*Module) flags := fizzOut.Args["rustcFlags"] linkFlags := fizzOut.Args["linkFlags"] @@ -200,7 +200,7 @@ func TestLinkObjects(t *testing.T) { name: "libfoo", }`) - fizzBuzz := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a").Rule("rustc") + fizzBuzz := ctx.ModuleForTests(t, "fizz-buzz", "android_arm64_armv8-a").Rule("rustc") linkFlags := fizzBuzz.Args["linkFlags"] if !strings.Contains(linkFlags, "/libfoo.so") { t.Errorf("missing shared dependency 'libfoo.so' in linkFlags: %#v", linkFlags) @@ -223,7 +223,7 @@ func TestStrippedBinary(t *testing.T) { } `) - foo := ctx.ModuleForTests("foo", "android_arm64_armv8-a") + foo := ctx.ModuleForTests(t, "foo", "android_arm64_armv8-a") foo.Output("unstripped/foo") foo.Output("foo") @@ -233,7 +233,7 @@ func TestStrippedBinary(t *testing.T) { t.Errorf("installed binary not based on stripped version: %v", cp.Input) } - fizzBar := ctx.ModuleForTests("bar", "android_arm64_armv8-a").MaybeOutput("unstripped/bar") + fizzBar := ctx.ModuleForTests(t, "bar", "android_arm64_armv8-a").MaybeOutput("unstripped/bar") if fizzBar.Rule != nil { t.Errorf("unstripped binary exists, so stripped binary has incorrectly been generated") } diff --git a/rust/bindgen.go b/rust/bindgen.go index 8accd03f9..2f84168bd 100644 --- a/rust/bindgen.go +++ b/rust/bindgen.go @@ -398,7 +398,7 @@ func (b *bindgenDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { // // This is necessary to avoid a circular dependency between the source variant and the // dependent cc module. - deps.StaticLibs = append(deps.StaticLibs, String(b.Properties.Static_inline_library)) + deps.WholeStaticLibs = append(deps.WholeStaticLibs, String(b.Properties.Static_inline_library)) } deps.SharedLibs = append(deps.SharedLibs, b.ClangProperties.Shared_libs.GetOrDefault(ctx, nil)...) diff --git a/rust/bindgen_test.go b/rust/bindgen_test.go index 2b7362f08..267fb1cba 100644 --- a/rust/bindgen_test.go +++ b/rust/bindgen_test.go @@ -67,10 +67,10 @@ func TestRustBindgen(t *testing.T) { cflags: ["--default-flag"], } `) - libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") - libbindgenStatic := ctx.ModuleForTests("libbindgen_staticlib", "android_arm64_armv8-a_source").Output("bindings.rs") - libbindgenHeader := ctx.ModuleForTests("libbindgen_headerlib", "android_arm64_armv8-a_source").Output("bindings.rs") - libbindgenHeaderModule := ctx.ModuleForTests("libbindgen_headerlib", "android_arm64_armv8-a_source").Module().(*Module) + libbindgen := ctx.ModuleForTests(t, "libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgenStatic := ctx.ModuleForTests(t, "libbindgen_staticlib", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgenHeader := ctx.ModuleForTests(t, "libbindgen_headerlib", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgenHeaderModule := ctx.ModuleForTests(t, "libbindgen_headerlib", "android_arm64_armv8-a_source").Module().(*Module) // Ensure that the flags are present and escaped if !strings.Contains(libbindgen.Args["flags"], "'--bindgen-flag.*'") { t.Errorf("missing bindgen flags in rust_bindgen rule: flags %#v", libbindgen.Args["flags"]) @@ -113,7 +113,7 @@ func TestRustBindgenCustomBindgen(t *testing.T) { } `) - libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgen := ctx.ModuleForTests(t, "libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") // The rule description should contain the custom binary name rather than bindgen, so checking the description // should be sufficient. @@ -155,8 +155,8 @@ func TestRustBindgenStdVersions(t *testing.T) { } `) - libbindgen_cstd := ctx.ModuleForTests("libbindgen_cstd", "android_arm64_armv8-a_source").Output("bindings.rs") - libbindgen_cppstd := ctx.ModuleForTests("libbindgen_cppstd", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgen_cstd := ctx.ModuleForTests(t, "libbindgen_cstd", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgen_cppstd := ctx.ModuleForTests(t, "libbindgen_cppstd", "android_arm64_armv8-a_source").Output("bindings.rs") if !strings.Contains(libbindgen_cstd.Args["cflags"], "-std=foo") { t.Errorf("c_std value not passed in to rust_bindgen as a clang flag") @@ -216,7 +216,7 @@ func TestBindgenFlagFile(t *testing.T) { ], } `) - libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgen := ctx.ModuleForTests(t, "libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") if !strings.Contains(libbindgen.Args["flagfiles"], "/dev/null") { t.Errorf("missing /dev/null in rust_bindgen rule: flags %#v", libbindgen.Args["flagfiles"]) @@ -246,7 +246,7 @@ func TestBindgenHandleStaticInlining(t *testing.T) { include_dirs: ["src/"], } `) - libbindgen := ctx.ModuleForTests("libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") + libbindgen := ctx.ModuleForTests(t, "libbindgen", "android_arm64_armv8-a_source").Output("bindings.rs") // Make sure the flag to support `static inline` functions is present if !strings.Contains(libbindgen.Args["flags"], "--wrap-static-fns") { t.Errorf("missing flag to handle static inlining in rust_bindgen rule: flags %#v", libbindgen.Args["flags"]) diff --git a/rust/builder.go b/rust/builder.go index 8a869aad8..1b6a6c117 100644 --- a/rust/builder.go +++ b/rust/builder.go @@ -171,7 +171,7 @@ func TransformSrctoRlib(ctx ModuleContext, mainSrc android.Path, deps PathDeps, return transformSrctoCrate(ctx, mainSrc, deps, flags, outputFile, getTransformProperties(ctx, "rlib")) } -// TransformRlibstoStaticlib is assumed to be called from the cc module, and +// TransformRlibstoStaticlib is assumed to be callable from the cc module, and // thus needs to reconstruct the common set of flags which need to be passed // to the rustc compiler. func TransformRlibstoStaticlib(ctx android.ModuleContext, mainSrc android.Path, deps []cc.RustRlibDep, @@ -185,7 +185,7 @@ func TransformRlibstoStaticlib(ctx android.ModuleContext, mainSrc android.Path, rustPathDeps.linkDirs = append(rustPathDeps.linkDirs, rlibDep.LinkDirs...) } - ccModule := ctx.(cc.ModuleContext).Module().(*cc.Module) + mod := ctx.Module().(cc.LinkableInterface) toolchain := config.FindToolchain(ctx.Os(), ctx.Arch()) t := transformProperties{ // Crate name can be a predefined value as this is a staticlib and @@ -195,10 +195,10 @@ func TransformRlibstoStaticlib(ctx android.ModuleContext, mainSrc android.Path, crateName: "generated_rust_staticlib", is64Bit: toolchain.Is64Bit(), targetTriple: toolchain.RustTriple(), - bootstrap: ccModule.Bootstrap(), - inRecovery: ccModule.InRecovery(), - inRamdisk: ccModule.InRamdisk(), - inVendorRamdisk: ccModule.InVendorRamdisk(), + bootstrap: mod.Bootstrap(), + inRecovery: mod.InRecovery(), + inRamdisk: mod.InRamdisk(), + inVendorRamdisk: mod.InVendorRamdisk(), // crateType indicates what type of crate to build crateType: "staticlib", @@ -402,6 +402,11 @@ func transformSrctoCrate(ctx android.ModuleContext, main android.Path, deps Path linkFlags = append(linkFlags, dynamicLinker) } + if generatedLib := cc.GenerateRustStaticlib(ctx, deps.ccRlibDeps); generatedLib != nil { + deps.StaticLibs = append(deps.StaticLibs, generatedLib) + linkFlags = append(linkFlags, generatedLib.String()) + } + libFlags := makeLibFlags(deps) // Collect dependencies diff --git a/rust/builder_test.go b/rust/builder_test.go index b4b022ed9..7d6b56ac9 100644 --- a/rust/builder_test.go +++ b/rust/builder_test.go @@ -160,7 +160,7 @@ func TestCompilationOutputFiles(t *testing.T) { } for _, tc := range testcases { t.Run(tc.testName, func(t *testing.T) { - modOutputs := ctx.ModuleForTests(tc.moduleName, tc.variant).AllOutputs() + modOutputs := ctx.ModuleForTests(t, tc.moduleName, tc.variant).AllOutputs() sort.Strings(tc.expectedFiles) sort.Strings(modOutputs) android.AssertStringPathsRelativeToTopEquals( diff --git a/rust/clippy_test.go b/rust/clippy_test.go index bd3bfb151..3563348ea 100644 --- a/rust/clippy_test.go +++ b/rust/clippy_test.go @@ -62,13 +62,13 @@ func TestClippy(t *testing.T) { android.FixtureAddTextFile(tc.modulePath+"Android.bp", bp), ).RunTest(t) - r := result.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").MaybeRule("clippy") + r := result.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib").MaybeRule("clippy") android.AssertStringEquals(t, "libfoo flags", tc.fooFlags, r.Args["clippyFlags"]) - r = result.ModuleForTests("libbar", "android_arm64_armv8-a_dylib").MaybeRule("clippy") + r = result.ModuleForTests(t, "libbar", "android_arm64_armv8-a_dylib").MaybeRule("clippy") android.AssertStringEquals(t, "libbar flags", "${config.ClippyDefaultLints}", r.Args["clippyFlags"]) - r = result.ModuleForTests("libfoobar", "android_arm64_armv8-a_dylib").MaybeRule("clippy") + r = result.ModuleForTests(t, "libfoobar", "android_arm64_armv8-a_dylib").MaybeRule("clippy") if r.Rule != nil { t.Errorf("libfoobar is setup to use clippy when explicitly disabled: clippyFlags=%q", r.Args["clippyFlags"]) } diff --git a/rust/compiler.go b/rust/compiler.go index f186ef38f..c3bc937da 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -257,8 +257,6 @@ type baseCompiler struct { location installLocation sanitize *sanitize - distFile android.OptionalPath - installDeps android.InstallPaths // unstripped output file. diff --git a/rust/compiler_test.go b/rust/compiler_test.go index 4caa12b3e..8805d15eb 100644 --- a/rust/compiler_test.go +++ b/rust/compiler_test.go @@ -34,7 +34,7 @@ func TestFeaturesToFlags(t *testing.T) { ], }`) - libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") + libfooDylib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") if !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'feature=\"fizz\"'") || !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'feature=\"buzz\"'") { @@ -55,7 +55,7 @@ func TestCfgsToFlags(t *testing.T) { ], }`) - libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") + libfooDylib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") if !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'std'") || !strings.Contains(libfooDylib.Args["rustcFlags"], "cfg 'cfg1=\"one\"'") { @@ -81,8 +81,8 @@ func TestLtoFlag(t *testing.T) { } `) - libfoo := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") - libfooLto := ctx.ModuleForTests("libfoo_lto", "linux_glibc_x86_64_dylib").Rule("rustc") + libfoo := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") + libfooLto := ctx.ModuleForTests(t, "libfoo_lto", "linux_glibc_x86_64_dylib").Rule("rustc") if strings.Contains(libfoo.Args["rustcFlags"], "-C lto=thin") { t.Fatalf("libfoo expected to disable lto -- rustcFlags: %#v", libfoo.Args["rustcFlags"]) @@ -174,7 +174,7 @@ func TestCargoCompat(t *testing.T) { cargo_pkg_version: "1.0.0" }`) - fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Rule("rustc") + fizz := ctx.ModuleForTests(t, "fizz", "android_arm64_armv8-a").Rule("rustc") if !strings.Contains(fizz.Args["envVars"], "CARGO_BIN_NAME=fizz") { t.Fatalf("expected 'CARGO_BIN_NAME=fizz' in envVars, actual envVars: %#v", fizz.Args["envVars"]) @@ -199,11 +199,11 @@ func TestInstallDir(t *testing.T) { srcs: ["foo.rs"], }`) - install_path_lib64 := ctx.ModuleForTests("libfoo", + install_path_lib64 := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String() - install_path_lib32 := ctx.ModuleForTests("libfoo", + install_path_lib32 := ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String() - install_path_bin := ctx.ModuleForTests("fizzbuzz", + install_path_bin := ctx.ModuleForTests(t, "fizzbuzz", "android_arm64_armv8-a").Module().(*Module).compiler.(*binaryDecorator).path.String() if !strings.HasSuffix(install_path_lib64, "system/lib64/libfoo.dylib.so") { @@ -259,13 +259,13 @@ func TestLints(t *testing.T) { android.FixtureAddTextFile(tc.modulePath+"Android.bp", bp), ).RunTest(t) - r := result.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").MaybeRule("rustc") + r := result.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib").MaybeRule("rustc") android.AssertStringDoesContain(t, "libfoo flags", r.Args["rustcFlags"], tc.fooFlags) - r = result.ModuleForTests("libbar", "android_arm64_armv8-a_dylib").MaybeRule("rustc") + r = result.ModuleForTests(t, "libbar", "android_arm64_armv8-a_dylib").MaybeRule("rustc") android.AssertStringDoesContain(t, "libbar flags", r.Args["rustcFlags"], "${config.RustDefaultLints}") - r = result.ModuleForTests("libfoobar", "android_arm64_armv8-a_dylib").MaybeRule("rustc") + r = result.ModuleForTests(t, "libfoobar", "android_arm64_armv8-a_dylib").MaybeRule("rustc") android.AssertStringDoesContain(t, "libfoobar flags", r.Args["rustcFlags"], "${config.RustAllowAllLints}") }) } @@ -283,9 +283,9 @@ func TestStdDeviceLinkage(t *testing.T) { srcs: ["foo.rs"], crate_name: "foo", }`) - fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a").Module().(*Module) - fooRlib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module) - fooDylib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) + fizz := ctx.ModuleForTests(t, "fizz", "android_arm64_armv8-a").Module().(*Module) + fooRlib := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module) + fooDylib := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) if !android.InList("libstd", fizz.Properties.AndroidMkDylibs) { t.Errorf("libstd is not linked dynamically for device binaries") diff --git a/rust/coverage.go b/rust/coverage.go index ae95e46b1..798b21d78 100644 --- a/rust/coverage.go +++ b/rust/coverage.go @@ -16,12 +16,12 @@ package rust import ( "android/soong/android" + "github.com/google/blueprint" "android/soong/cc" ) -var CovLibraryName = "libprofile-clang-extras" var ProfilerBuiltins = "libprofiler_builtins.rust_sysroot" // Add '%c' to default specifier after we resolve http://b/210012154 @@ -38,12 +38,20 @@ func (cov *coverage) props() []interface{} { return []interface{}{&cov.Properties} } +func getClangProfileLibraryName(ctx ModuleContextIntf) string { + if ctx.RustModule().UseSdk() { + return "libprofile-clang-extras_ndk" + } else { + return "libprofile-clang-extras" + } +} + func (cov *coverage) deps(ctx DepsContext, deps Deps) Deps { if cov.Properties.NeedCoverageVariant { if ctx.Device() { ctx.AddVariationDependencies([]blueprint.Variation{ {Mutator: "link", Variation: "static"}, - }, cc.CoverageDepTag, CovLibraryName) + }, cc.CoverageDepTag, getClangProfileLibraryName(ctx)) } // no_std modules are missing libprofiler_builtins which provides coverage, so we need to add it as a dependency. @@ -66,7 +74,7 @@ func (cov *coverage) flags(ctx ModuleContext, flags Flags, deps PathDeps) (Flags flags.RustFlags = append(flags.RustFlags, "-C instrument-coverage", "-g") if ctx.Device() { - m := ctx.GetDirectDepProxyWithTag(CovLibraryName, cc.CoverageDepTag) + m := ctx.GetDirectDepProxyWithTag(getClangProfileLibraryName(ctx), cc.CoverageDepTag) coverage := android.OtherModuleProviderOrDefault(ctx, m, cc.LinkableInfoProvider) flags.LinkFlags = append(flags.LinkFlags, profileInstrFlag, "-g", coverage.OutputFile.Path().String(), "-Wl,--wrap,open") diff --git a/rust/coverage_test.go b/rust/coverage_test.go index 0f599d745..f9198f1f0 100644 --- a/rust/coverage_test.go +++ b/rust/coverage_test.go @@ -51,10 +51,10 @@ func TestCoverageFlags(t *testing.T) { } // Just test the dylib variants unless the library coverage logic changes to distinguish between the types. - libfooCov := ctx.ModuleForTests("libfoo_cov", "android_arm64_armv8-a_dylib_cov").Rule("rustc") - libbarNoCov := ctx.ModuleForTests("libbar_nocov", "android_arm64_armv8-a_dylib").Rule("rustc") - fizzCov := ctx.ModuleForTests("fizz_cov", "android_arm64_armv8-a_cov").Rule("rustc") - buzzNoCov := ctx.ModuleForTests("buzzNoCov", "android_arm64_armv8-a").Rule("rustc") + libfooCov := ctx.ModuleForTests(t, "libfoo_cov", "android_arm64_armv8-a_dylib_cov").Rule("rustc") + libbarNoCov := ctx.ModuleForTests(t, "libbar_nocov", "android_arm64_armv8-a_dylib").Rule("rustc") + fizzCov := ctx.ModuleForTests(t, "fizz_cov", "android_arm64_armv8-a_cov").Rule("rustc") + buzzNoCov := ctx.ModuleForTests(t, "buzzNoCov", "android_arm64_armv8-a").Rule("rustc") rustcCoverageFlags := []string{"-C instrument-coverage", " -g "} for _, flag := range rustcCoverageFlags { @@ -103,7 +103,7 @@ func TestCoverageDeps(t *testing.T) { srcs: ["foo.rs"], }`) - fizz := ctx.ModuleForTests("fizz", "android_arm64_armv8-a_cov").Rule("rustc") + fizz := ctx.ModuleForTests(t, "fizz", "android_arm64_armv8-a_cov").Rule("rustc") if !strings.Contains(fizz.Args["linkFlags"], "libprofile-clang-extras.a") { t.Fatalf("missing expected coverage 'libprofile-clang-extras' dependency in linkFlags: %#v", fizz.Args["linkFlags"]) } diff --git a/rust/fuzz_test.go b/rust/fuzz_test.go index 3598c9970..bdcfbbba1 100644 --- a/rust/fuzz_test.go +++ b/rust/fuzz_test.go @@ -41,7 +41,7 @@ func TestRustFuzz(t *testing.T) { `) // Check that appropriate dependencies are added and that the rustlib linkage is correct. - fuzz_libtest_mod := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module) + fuzz_libtest_mod := ctx.ModuleForTests(t, "fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module) if !android.InList("liblibfuzzer_sys.rlib-std", fuzz_libtest_mod.Properties.AndroidMkRlibs) { t.Errorf("liblibfuzzer_sys rlib library dependency missing for rust_fuzz module. %#v", fuzz_libtest_mod.Properties.AndroidMkRlibs) } @@ -50,21 +50,21 @@ func TestRustFuzz(t *testing.T) { } // Check that compiler flags are set appropriately . - fuzz_libtest := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Rule("rustc") + fuzz_libtest := ctx.ModuleForTests(t, "fuzz_libtest", "android_arm64_armv8-a_fuzzer").Rule("rustc") if !strings.Contains(fuzz_libtest.Args["rustcFlags"], "-C passes='sancov-module'") || !strings.Contains(fuzz_libtest.Args["rustcFlags"], "--cfg fuzzing") { t.Errorf("rust_fuzz module does not contain the expected flags (sancov-module, cfg fuzzing).") } // Check that host modules support fuzzing. - host_fuzzer := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Rule("rustc") + host_fuzzer := ctx.ModuleForTests(t, "fuzz_libtest", "android_arm64_armv8-a_fuzzer").Rule("rustc") if !strings.Contains(host_fuzzer.Args["rustcFlags"], "-C passes='sancov-module'") || !strings.Contains(host_fuzzer.Args["rustcFlags"], "--cfg fuzzing") { t.Errorf("rust_fuzz_host module does not contain the expected flags (sancov-module, cfg fuzzing).") } // Check that dependencies have 'fuzzer' variants produced for them as well. - libtest_fuzzer := ctx.ModuleForTests("libtest_fuzzing", "android_arm64_armv8-a_rlib_rlib-std_fuzzer").Output("libtest_fuzzing.rlib") + libtest_fuzzer := ctx.ModuleForTests(t, "libtest_fuzzing", "android_arm64_armv8-a_rlib_rlib-std_fuzzer").Output("libtest_fuzzing.rlib") if !strings.Contains(libtest_fuzzer.Args["rustcFlags"], "-C passes='sancov-module'") || !strings.Contains(libtest_fuzzer.Args["rustcFlags"], "--cfg fuzzing") { t.Errorf("rust_fuzz dependent library does not contain the expected flags (sancov-module, cfg fuzzing).") @@ -93,7 +93,7 @@ func TestRustFuzzDepBundling(t *testing.T) { } `) - fuzz_libtest := ctx.ModuleForTests("fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module) + fuzz_libtest := ctx.ModuleForTests(t, "fuzz_libtest", "android_arm64_armv8-a_fuzzer").Module().(*Module) if !strings.Contains(fuzz_libtest.FuzzSharedLibraries().String(), ":libcc_direct_dep.so") { t.Errorf("rust_fuzz does not contain the expected bundled direct shared libs ('libcc_direct_dep'): %#v", fuzz_libtest.FuzzSharedLibraries().String()) @@ -134,9 +134,9 @@ func TestCCFuzzDepBundling(t *testing.T) { } `) - fuzz_shared_libtest := ctx.ModuleForTests("fuzz_shared_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) - fuzz_static_libtest := ctx.ModuleForTests("fuzz_static_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) - fuzz_staticffi_libtest := ctx.ModuleForTests("fuzz_staticffi_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) + fuzz_shared_libtest := ctx.ModuleForTests(t, "fuzz_shared_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) + fuzz_static_libtest := ctx.ModuleForTests(t, "fuzz_static_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) + fuzz_staticffi_libtest := ctx.ModuleForTests(t, "fuzz_staticffi_libtest", "android_arm64_armv8-a_fuzzer").Module().(cc.LinkableInterface) if !strings.Contains(fuzz_shared_libtest.FuzzSharedLibraries().String(), ":libcc_transitive_dep.so") { t.Errorf("cc_fuzz does not contain the expected bundled transitive shared libs from rust_ffi_shared ('libcc_transitive_dep'): %#v", fuzz_shared_libtest.FuzzSharedLibraries().String()) diff --git a/rust/image_test.go b/rust/image_test.go index 0581fa7f8..e5ecd7972 100644 --- a/rust/image_test.go +++ b/rust/image_test.go @@ -45,7 +45,7 @@ func TestVendorLinkage(t *testing.T) { } `) - vendorBinary := ctx.ModuleForTests("fizz_vendor_available", "android_vendor_arm64_armv8-a").Module().(*cc.Module) + vendorBinary := ctx.ModuleForTests(t, "fizz_vendor_available", "android_vendor_arm64_armv8-a").Module().(*cc.Module) if android.InList("libfoo_vendor.vendor", vendorBinary.Properties.AndroidMkStaticLibs) { t.Errorf("vendorBinary should not have a staticlib dependency on libfoo_vendor.vendor: %#v", vendorBinary.Properties.AndroidMkStaticLibs) @@ -64,7 +64,7 @@ func TestImageCfgFlag(t *testing.T) { } `) - vendor := ctx.ModuleForTests("libfoo", "android_vendor_arm64_armv8-a_shared").Rule("rustc") + vendor := ctx.ModuleForTests(t, "libfoo", "android_vendor_arm64_armv8-a_shared").Rule("rustc") if !strings.Contains(vendor.Args["rustcFlags"], "--cfg 'android_vndk'") { t.Errorf("missing \"--cfg 'android_vndk'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) @@ -76,7 +76,7 @@ func TestImageCfgFlag(t *testing.T) { t.Errorf("unexpected \"--cfg 'android_product'\" for libfoo vendor variant, rustcFlags: %#v", vendor.Args["rustcFlags"]) } - product := ctx.ModuleForTests("libfoo", "android_product_arm64_armv8-a_shared").Rule("rustc") + product := ctx.ModuleForTests(t, "libfoo", "android_product_arm64_armv8-a_shared").Rule("rustc") if !strings.Contains(product.Args["rustcFlags"], "--cfg 'android_vndk'") { t.Errorf("missing \"--cfg 'android_vndk'\" for libfoo product variant, rustcFlags: %#v", product.Args["rustcFlags"]) } @@ -87,7 +87,7 @@ func TestImageCfgFlag(t *testing.T) { t.Errorf("missing \"--cfg 'android_product'\" for libfoo product variant, rustcFlags: %#v", product.Args["rustcFlags"]) } - system := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Rule("rustc") + system := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared").Rule("rustc") if strings.Contains(system.Args["rustcFlags"], "--cfg 'android_vndk'") { t.Errorf("unexpected \"--cfg 'android_vndk'\" for libfoo system variant, rustcFlags: %#v", system.Args["rustcFlags"]) } @@ -119,7 +119,7 @@ func TestVendorRamdiskLinkage(t *testing.T) { } `) - vendorRamdiskLibrary := ctx.ModuleForTests("libcc_vendor_ramdisk", "android_vendor_ramdisk_arm64_armv8-a_shared").Module().(*cc.Module) + vendorRamdiskLibrary := ctx.ModuleForTests(t, "libcc_vendor_ramdisk", "android_vendor_ramdisk_arm64_armv8-a_shared").Module().(*cc.Module) if android.InList("libfoo_vendor_ramdisk.vendor_ramdisk", vendorRamdiskLibrary.Properties.AndroidMkStaticLibs) { t.Errorf("libcc_vendor_ramdisk should not have a dependency on the libfoo_vendor_ramdisk static library") @@ -144,7 +144,7 @@ func TestForbiddenVendorLinkage(t *testing.T) { } func checkInstallPartition(t *testing.T, ctx *android.TestContext, name, variant, expected string) { - mod := ctx.ModuleForTests(name, variant).Module().(*Module) + mod := ctx.ModuleForTests(t, name, variant).Module().(*Module) partitionDefined := false checkPartition := func(specific bool, partition string) { if specific { diff --git a/rust/library.go b/rust/library.go index 94f5730ea..7f5861fe8 100644 --- a/rust/library.go +++ b/rust/library.go @@ -737,12 +737,15 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa if library.rlib() { library.flagExporter.exportStaticLibs(deps.staticLibObjects...) } - // Since we have FFI rlibs, we need to collect their includes as well if library.static() || library.shared() || library.rlib() || library.stubs() { - android.SetProvider(ctx, cc.FlagExporterInfoProvider, cc.FlagExporterInfo{ + ccExporter := cc.FlagExporterInfo{ IncludeDirs: android.FirstUniquePaths(library.includeDirs), - }) + } + if library.rlib() { + ccExporter.RustRlibDeps = append(ccExporter.RustRlibDeps, deps.reexportedCcRlibDeps...) + } + android.SetProvider(ctx, cc.FlagExporterInfoProvider, ccExporter) } if library.shared() || library.stubs() { @@ -771,7 +774,7 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa cc.AddStubDependencyProviders(ctx) // Set our flagexporter provider to export relevant Rust flags - library.flagExporter.setProvider(ctx) + library.flagExporter.setRustProvider(ctx) return ret } @@ -945,6 +948,9 @@ func (libraryTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (libraryTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } @@ -1012,6 +1018,12 @@ func (libraryTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, varia }, sourceDepTag, ctx.ModuleName()) } + + if prebuilt, ok := m.compiler.(*prebuiltLibraryDecorator); ok { + if Bool(prebuilt.Properties.Force_use_prebuilt) && len(prebuilt.prebuiltSrcs()) > 0 { + m.Prebuilt().SetUsePrebuilt(true) + } + } } type libstdTransitionMutator struct{} @@ -1029,6 +1041,9 @@ func (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (libstdTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } diff --git a/rust/library_test.go b/rust/library_test.go index 1198fcc9f..6db95253f 100644 --- a/rust/library_test.go +++ b/rust/library_test.go @@ -42,10 +42,10 @@ func TestLibraryVariants(t *testing.T) { }`) // Test all variants are being built. - libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") - libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") - libfooFFIRlib := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") - libfooShared := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_shared").Rule("rustc") + libfooRlib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") + libfooDylib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") + libfooFFIRlib := ctx.ModuleForTests(t, "libfoo.ffi", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") + libfooShared := ctx.ModuleForTests(t, "libfoo.ffi", "linux_glibc_x86_64_shared").Rule("rustc") rlibCrateType := "rlib" dylibCrateType := "dylib" @@ -82,7 +82,7 @@ func TestDylibPreferDynamic(t *testing.T) { crate_name: "foo", }`) - libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") + libfooDylib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_dylib").Rule("rustc") if !strings.Contains(libfooDylib.Args["rustcFlags"], "prefer-dynamic") { t.Errorf("missing prefer-dynamic flag for libfoo dylib, rustcFlags: %#v", libfooDylib.Args["rustcFlags"]) @@ -134,7 +134,7 @@ func TestSharedLibrary(t *testing.T) { crate_name: "foo", }`) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_shared") libfooOutput := libfoo.Rule("rustc") if !strings.Contains(libfooOutput.Args["linkFlags"], "-Wl,-soname=libfoo.so") { @@ -160,7 +160,7 @@ func TestSharedLibraryToc(t *testing.T) { shared_libs: ["libfoo"], }`) - fizzbuzz := ctx.ModuleForTests("fizzbuzz", "android_arm64_armv8-a").Rule("ld") + fizzbuzz := ctx.ModuleForTests(t, "fizzbuzz", "android_arm64_armv8-a").Rule("ld") if !android.SuffixInList(fizzbuzz.Implicits.Strings(), "libfoo.so.toc") { t.Errorf("missing expected libfoo.so.toc implicit dependency, instead found: %#v", @@ -176,7 +176,7 @@ func TestStaticLibraryLinkage(t *testing.T) { crate_name: "foo", }`) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_rlib-std") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_rlib_rlib-std") if !android.InList("libstd", libfoo.Module().(*Module).Properties.AndroidMkRlibs) { t.Errorf("Static libstd rlib expected to be a dependency of Rust rlib libraries. Rlib deps are: %#v", @@ -209,9 +209,9 @@ func TestNativeDependencyOfRlib(t *testing.T) { } `) - rustRlibRlibStd := ctx.ModuleForTests("librust_rlib", "android_arm64_armv8-a_rlib_rlib-std") - rustRlibDylibStd := ctx.ModuleForTests("librust_rlib", "android_arm64_armv8-a_rlib_dylib-std") - ffiRlib := ctx.ModuleForTests("libffi_static", "android_arm64_armv8-a_rlib_rlib-std") + rustRlibRlibStd := ctx.ModuleForTests(t, "librust_rlib", "android_arm64_armv8-a_rlib_rlib-std") + rustRlibDylibStd := ctx.ModuleForTests(t, "librust_rlib", "android_arm64_armv8-a_rlib_dylib-std") + ffiRlib := ctx.ModuleForTests(t, "libffi_static", "android_arm64_armv8-a_rlib_rlib-std") modules := []android.TestingModule{ rustRlibRlibStd, @@ -285,10 +285,10 @@ func TestAutoDeps(t *testing.T) { ], }`) - libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std") - libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib") - libfooFFIRlib := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_rlib_rlib-std") - libfooShared := ctx.ModuleForTests("libfoo.ffi", "linux_glibc_x86_64_shared") + libfooRlib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_rlib_rlib-std") + libfooDylib := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_dylib") + libfooFFIRlib := ctx.ModuleForTests(t, "libfoo.ffi", "linux_glibc_x86_64_rlib_rlib-std") + libfooShared := ctx.ModuleForTests(t, "libfoo.ffi", "linux_glibc_x86_64_shared") for _, static := range []android.TestingModule{libfooRlib, libfooFFIRlib} { if !android.InList("libbar.rlib-std", static.Module().(*Module).Properties.AndroidMkRlibs) { @@ -330,7 +330,7 @@ func TestStrippedLibrary(t *testing.T) { } `) - foo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib") + foo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib") foo.Output("libfoo.dylib.so") foo.Output("unstripped/libfoo.dylib.so") // Check that the `cp` rule is using the stripped version as input. @@ -339,7 +339,7 @@ func TestStrippedLibrary(t *testing.T) { t.Errorf("installed library not based on stripped version: %v", cp.Input) } - fizzBar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_dylib").MaybeOutput("unstripped/libbar.dylib.so") + fizzBar := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_dylib").MaybeOutput("unstripped/libbar.dylib.so") if fizzBar.Rule != nil { t.Errorf("unstripped library exists, so stripped library has incorrectly been generated") } @@ -372,15 +372,15 @@ func TestLibstdLinkage(t *testing.T) { prefer_rlib: true, }`) - libfooDylib := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) - libfooRlibStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_rlib-std").Module().(*Module) - libfooRlibDynamic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module) + libfooDylib := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) + libfooRlibStatic := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_rlib_rlib-std").Module().(*Module) + libfooRlibDynamic := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_rlib_dylib-std").Module().(*Module) - libbarShared := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module().(*Module) - libbarFFIRlib := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_rlib_rlib-std").Module().(*Module) + libbarShared := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_shared").Module().(*Module) + libbarFFIRlib := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_rlib_rlib-std").Module().(*Module) // prefer_rlib works the same for both rust_library and rust_ffi, so a single check is sufficient here. - libbarRlibStd := ctx.ModuleForTests("libbar.prefer_rlib", "android_arm64_armv8-a_shared").Module().(*Module) + libbarRlibStd := ctx.ModuleForTests(t, "libbar.prefer_rlib", "android_arm64_armv8-a_shared").Module().(*Module) if !android.InList("libstd", libfooRlibStatic.Properties.AndroidMkRlibs) { t.Errorf("rlib-std variant for device rust_library_rlib does not link libstd as an rlib") @@ -422,7 +422,7 @@ func TestRustFFIExportedIncludes(t *testing.T) { shared_libs: ["libbar"], host_supported: true, }`) - libfooStatic := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_static").Rule("cc") + libfooStatic := ctx.ModuleForTests(t, "libfoo", "linux_glibc_x86_64_static").Rule("cc") android.AssertStringDoesContain(t, "cFlags for lib module", libfooStatic.Args["cFlags"], " -Irust_includes ") } @@ -443,8 +443,8 @@ func TestRustVersionScript(t *testing.T) { `) //linkFlags - librs := ctx.ModuleForTests("librs", "android_arm64_armv8-a_dylib").Rule("rustc") - libffi := ctx.ModuleForTests("libffi", "android_arm64_armv8-a_shared").Rule("rustc") + librs := ctx.ModuleForTests(t, "librs", "android_arm64_armv8-a_dylib").Rule("rustc") + libffi := ctx.ModuleForTests(t, "libffi", "android_arm64_armv8-a_shared").Rule("rustc") if !strings.Contains(librs.Args["linkFlags"], "-Wl,--version-script=librs.map.txt") { t.Errorf("missing expected -Wl,--version-script= linker flag for libextended shared lib, linkFlags: %#v", @@ -632,13 +632,13 @@ func TestVersionedStubs(t *testing.T) { } } - libBarLinkRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("ld") + libBarLinkRule := ctx.ModuleForTests(t, "libBar", "android_arm64_armv8-a_shared").Rule("ld") libBarFlags := libBarLinkRule.Args["libFlags"] - libBarRsRustcRule := ctx.ModuleForTests("libbar_rs", "android_arm64_armv8-a_dylib").Rule("rustc") + libBarRsRustcRule := ctx.ModuleForTests(t, "libbar_rs", "android_arm64_armv8-a_dylib").Rule("rustc") libBarRsFlags := libBarRsRustcRule.Args["linkFlags"] - libBarFfiRsRustcRule := ctx.ModuleForTests("libbar_ffi_rs", "android_arm64_armv8-a_shared").Rule("rustc") + libBarFfiRsRustcRule := ctx.ModuleForTests(t, "libbar_ffi_rs", "android_arm64_armv8-a_shared").Rule("rustc") libBarFfiRsFlags := libBarFfiRsRustcRule.Args["linkFlags"] libFoo1StubPath := "libFoo/android_arm64_armv8-a_shared_1/unstripped/libFoo.so" @@ -709,7 +709,7 @@ func TestAddnoOverride64GlobalCflags(t *testing.T) { android.PrepareForTestWithVisibility, rustMockedFiles.AddToFixture()).RunTestWithBp(t, bp) - cFlags := ctx.ModuleForTests("libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + cFlags := ctx.ModuleForTests(t, "libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] if !strings.Contains(cFlags, "${config.NoOverride64GlobalCflags}") { t.Errorf("expected %q in cflags, got %q", "${config.NoOverride64GlobalCflags}", cFlags) diff --git a/rust/prebuilt.go b/rust/prebuilt.go index e35e510da..7c92dda1e 100644 --- a/rust/prebuilt.go +++ b/rust/prebuilt.go @@ -30,6 +30,8 @@ type PrebuiltProperties struct { Srcs []string `android:"path,arch_variant"` // directories containing associated rlib dependencies Link_dirs []string `android:"path,arch_variant"` + + Force_use_prebuilt *bool `android:"arch_variant"` } type prebuiltLibraryDecorator struct { @@ -158,7 +160,7 @@ func (prebuilt *prebuiltLibraryDecorator) compilerProps() []interface{} { func (prebuilt *prebuiltLibraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) - prebuilt.flagExporter.setProvider(ctx) + prebuilt.flagExporter.setRustProvider(ctx) srcPath := prebuiltPath(ctx, prebuilt) prebuilt.baseCompiler.unstrippedOutputFile = srcPath return buildOutput{outputFile: srcPath} @@ -211,7 +213,7 @@ func (prebuilt *prebuiltProcMacroDecorator) compilerProps() []interface{} { func (prebuilt *prebuiltProcMacroDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { prebuilt.flagExporter.exportLinkDirs(android.PathsForModuleSrc(ctx, prebuilt.Properties.Link_dirs).Strings()...) - prebuilt.flagExporter.setProvider(ctx) + prebuilt.flagExporter.setRustProvider(ctx) srcPath := prebuiltPath(ctx, prebuilt) prebuilt.baseCompiler.unstrippedOutputFile = srcPath return buildOutput{outputFile: srcPath} diff --git a/rust/proc_macro_test.go b/rust/proc_macro_test.go index cc8193858..8a95eb483 100644 --- a/rust/proc_macro_test.go +++ b/rust/proc_macro_test.go @@ -28,7 +28,7 @@ func TestRustProcMacro(t *testing.T) { } `) - libprocmacro := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Rule("rustc") + libprocmacro := ctx.ModuleForTests(t, "libprocmacro", "linux_glibc_x86_64").Rule("rustc") if !strings.Contains(libprocmacro.Args["rustcFlags"], "--extern proc_macro") { t.Errorf("--extern proc_macro flag not being passed to rustc for proc macro %#v", libprocmacro.Args["rustcFlags"]) diff --git a/rust/protobuf_test.go b/rust/protobuf_test.go index cae071b8f..531e034e8 100644 --- a/rust/protobuf_test.go +++ b/rust/protobuf_test.go @@ -41,13 +41,13 @@ func TestRustProtobuf3(t *testing.T) { } `) // Check that libprotobuf is added as a dependency. - librust_proto := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_dylib").Module().(*Module) + librust_proto := ctx.ModuleForTests(t, "librust_proto", "android_arm64_armv8-a_dylib").Module().(*Module) if !android.InList("libprotobuf", librust_proto.Properties.AndroidMkDylibs) { t.Errorf("libprotobuf dependency missing for rust_protobuf (dependency missing from AndroidMkDylibs)") } // Make sure the correct plugin is being used. - librust_proto_out := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_source").Output("buf.rs") + librust_proto_out := ctx.ModuleForTests(t, "librust_proto", "android_arm64_armv8-a_source").Output("buf.rs") cmd := librust_proto_out.RuleParams.Command if w := "protoc-gen-rust"; !strings.Contains(cmd, w) { t.Errorf("expected %q in %q", w, cmd) @@ -62,7 +62,7 @@ func TestRustProtobuf3(t *testing.T) { } // Check proto.rs, the second protobuf, is listed as an output - librust_proto_outputs := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_source").AllOutputs() + librust_proto_outputs := ctx.ModuleForTests(t, "librust_proto", "android_arm64_armv8-a_source").AllOutputs() if android.InList("proto.rs", librust_proto_outputs) { t.Errorf("rust_protobuf is not producing multiple outputs; expected 'proto.rs' in list, got: %#v ", librust_proto_outputs) @@ -92,7 +92,7 @@ func TestRustProtobufInclude(t *testing.T) { } `) // Check that librust_exported_proto is added as additional crate to generate source. - librust_proto := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_source").Module().(*Module).sourceProvider.(*protobufDecorator) + librust_proto := ctx.ModuleForTests(t, "librust_proto", "android_arm64_armv8-a_source").Module().(*Module).sourceProvider.(*protobufDecorator) if !android.InList("rust_exported_proto", librust_proto.additionalCrates) { t.Errorf("librust_proto should have librust_exported_proto included as an additional crate for generated source, instead got: %#v", librust_proto.additionalCrates) } @@ -111,7 +111,7 @@ func TestRustProtobufInclude(t *testing.T) { } // Check librust_proto args includes -Iproto - librust_proto_rule := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_source").Output("proto.rs") + librust_proto_rule := ctx.ModuleForTests(t, "librust_proto", "android_arm64_armv8-a_source").Output("proto.rs") cmd := librust_proto_rule.RuleParams.Command if w := "-Iproto"; !strings.Contains(cmd, w) { t.Errorf("expected %q in %q", w, cmd) @@ -131,7 +131,7 @@ func TestRustGrpc(t *testing.T) { `) // Check that libprotobuf is added as a dependency. - librust_grpcio_module := ctx.ModuleForTests("librust_grpcio", "android_arm64_armv8-a_dylib").Module().(*Module) + librust_grpcio_module := ctx.ModuleForTests(t, "librust_grpcio", "android_arm64_armv8-a_dylib").Module().(*Module) // Check that libgrpcio is added as a dependency. if !android.InList("libgrpcio", librust_grpcio_module.Properties.AndroidMkDylibs) { @@ -144,7 +144,7 @@ func TestRustGrpc(t *testing.T) { } // Make sure the correct plugin is being used. - librust_grpcio_out := ctx.ModuleForTests("librust_grpcio", "android_arm64_armv8-a_source").Output("foo_grpc.rs") + librust_grpcio_out := ctx.ModuleForTests(t, "librust_grpcio", "android_arm64_armv8-a_source").Output("foo_grpc.rs") cmd := librust_grpcio_out.RuleParams.Command if w := "protoc-gen-grpc"; !strings.Contains(cmd, w) { t.Errorf("expected %q in %q", w, cmd) @@ -156,7 +156,7 @@ func TestRustGrpc(t *testing.T) { } // Check proto.rs, the second protobuf, is listed as an output - librust_grpcio_outputs := ctx.ModuleForTests("librust_grpcio", "android_arm64_armv8-a_source").AllOutputs() + librust_grpcio_outputs := ctx.ModuleForTests(t, "librust_grpcio", "android_arm64_armv8-a_source").AllOutputs() if android.InList("proto_grpc.rs", librust_grpcio_outputs) { t.Errorf("rust_protobuf is not producing multiple outputs; expected 'proto_grpc.rs' in list, got: %#v ", librust_grpcio_outputs) diff --git a/rust/rust.go b/rust/rust.go index 81c33e688..7a7b1064c 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -495,6 +495,10 @@ type PathDeps struct { depFlags []string depLinkFlags []string + // track cc static-libs that have Rlib dependencies + reexportedCcRlibDeps []cc.RustRlibDep + ccRlibDeps []cc.RustRlibDep + // linkDirs are link paths passed via -L to rustc. linkObjects are objects passed directly to the linker // Both of these are exported and propagate to dependencies. linkDirs []string @@ -573,8 +577,8 @@ func (flagExporter *flagExporter) exportWholeStaticLibs(flags ...string) { flagExporter.wholeStaticLibObjects = android.FirstUniqueStrings(append(flagExporter.wholeStaticLibObjects, flags...)) } -func (flagExporter *flagExporter) setProvider(ctx ModuleContext) { - android.SetProvider(ctx, FlagExporterInfoProvider, FlagExporterInfo{ +func (flagExporter *flagExporter) setRustProvider(ctx ModuleContext) { + android.SetProvider(ctx, RustFlagExporterInfoProvider, RustFlagExporterInfo{ LinkDirs: flagExporter.linkDirs, RustLibObjects: flagExporter.rustLibPaths, StaticLibObjects: flagExporter.staticLibObjects, @@ -589,7 +593,7 @@ func NewFlagExporter() *flagExporter { return &flagExporter{} } -type FlagExporterInfo struct { +type RustFlagExporterInfo struct { Flags []string LinkDirs []string RustLibObjects []string @@ -598,7 +602,7 @@ type FlagExporterInfo struct { SharedLibPaths []string } -var FlagExporterInfoProvider = blueprint.NewProvider[FlagExporterInfo]() +var RustFlagExporterInfoProvider = blueprint.NewProvider[RustFlagExporterInfo]() func (mod *Module) isCoverageVariant() bool { return mod.coverage.Properties.IsCoverageVariant @@ -1199,10 +1203,11 @@ func (mod *Module) GenerateAndroidBuildActions(actx android.ModuleContext) { // Define the linker info if compiler != nil because Rust currently // does compilation and linking in one step. If this changes in the future, // move this as appropriate. + baseCompilerProps := mod.compiler.baseCompilerProps() ccInfo.LinkerInfo = &cc.LinkerInfo{ - WholeStaticLibs: mod.compiler.baseCompilerProps().Whole_static_libs, - StaticLibs: mod.compiler.baseCompilerProps().Static_libs, - SharedLibs: mod.compiler.baseCompilerProps().Shared_libs, + WholeStaticLibs: baseCompilerProps.Whole_static_libs.GetOrDefault(ctx, nil), + StaticLibs: baseCompilerProps.Static_libs.GetOrDefault(ctx, nil), + SharedLibs: baseCompilerProps.Shared_libs.GetOrDefault(ctx, nil), } android.SetProvider(ctx, cc.CcInfoProvider, ccInfo) @@ -1530,6 +1535,13 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } } + if !mod.Rlib() { + depPaths.ccRlibDeps = append(depPaths.ccRlibDeps, exportedInfo.RustRlibDeps...) + } else { + // rlibs need to reexport these + depPaths.reexportedCcRlibDeps = append(depPaths.reexportedCcRlibDeps, exportedInfo.RustRlibDeps...) + } + case depTag == procMacroDepTag: directProcMacroDeps = append(directProcMacroDeps, linkableInfo) mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName) @@ -1573,7 +1585,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { directSrcProvidersDeps = append(directSrcProvidersDeps, &dep) } - exportedInfo, _ := android.OtherModuleProvider(ctx, dep, FlagExporterInfoProvider) + exportedInfo, _ := android.OtherModuleProvider(ctx, dep, RustFlagExporterInfoProvider) //Append the dependencies exported objects, except for proc-macros which target a different arch/OS if depTag != procMacroDepTag { @@ -1650,8 +1662,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } else { // Otherwise add to staticLibObjects, which only propagate through rlibs to their dependents. depPaths.staticLibObjects = append(depPaths.staticLibObjects, ccLibPath.String()) - } + depPaths.linkDirs = append(depPaths.linkDirs, linkPath) exportedInfo, _ := android.OtherModuleProvider(ctx, dep, cc.FlagExporterInfoProvider) @@ -1659,6 +1671,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...) depPaths.depClangFlags = append(depPaths.depClangFlags, exportedInfo.Flags...) depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...) + + if !mod.Rlib() { + // rlibs don't need to build the generated static library, so they don't need to track these. + depPaths.ccRlibDeps = append(depPaths.ccRlibDeps, exportedInfo.RustRlibDeps...) + } else { + depPaths.reexportedCcRlibDeps = append(depPaths.reexportedCcRlibDeps, exportedInfo.RustRlibDeps...) + } + directStaticLibDeps = append(directStaticLibDeps, linkableInfo) // Record baseLibName for snapshots. @@ -1814,6 +1834,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths) depPaths.depSystemIncludePaths = android.FirstUniquePaths(depPaths.depSystemIncludePaths) depPaths.depLinkFlags = android.FirstUniqueStrings(depPaths.depLinkFlags) + depPaths.reexportedCcRlibDeps = android.FirstUniqueFunc(depPaths.reexportedCcRlibDeps, cc.EqRustRlibDeps) + depPaths.ccRlibDeps = android.FirstUniqueFunc(depPaths.ccRlibDeps, cc.EqRustRlibDeps) return depPaths } @@ -2063,26 +2085,23 @@ func (mod *Module) MinSdkVersion() string { } // Implements android.ApexModule -func (mod *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { +func (mod *Module) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { minSdkVersion := mod.MinSdkVersion() if minSdkVersion == "apex_inherit" { - return nil + return android.MinApiLevel } + if minSdkVersion == "" { - return fmt.Errorf("min_sdk_version is not specificed") + return android.NoneApiLevel } - // Not using nativeApiLevelFromUser because the context here is not // necessarily a native context. - ver, err := android.ApiLevelFromUser(ctx, minSdkVersion) + ver, err := android.ApiLevelFromUserWithConfig(ctx.Config(), minSdkVersion) if err != nil { - return err + return android.NoneApiLevel } - if ver.GreaterThan(sdkVersion) { - return fmt.Errorf("newer SDK(%v)", ver) - } - return nil + return ver } // Implements android.ApexModule @@ -2093,12 +2112,28 @@ func (mod *Module) AlwaysRequiresPlatformApexVariant() bool { } // Implements android.ApexModule -func (mod *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { +type RustDepInSameApexChecker struct { + Static bool + HasStubsVariants bool + ApexExclude bool + Host bool +} + +func (mod *Module) GetDepInSameApexChecker() android.DepInSameApexChecker { + return RustDepInSameApexChecker{ + Static: mod.Static(), + HasStubsVariants: mod.HasStubsVariants(), + ApexExclude: mod.ApexExclude(), + Host: mod.Host(), + } +} + +func (r RustDepInSameApexChecker) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool { if depTag == procMacroDepTag || depTag == customBindgenDepTag { return false } - if mod.Static() && cc.IsSharedDepTag(depTag) { + if r.Static && cc.IsSharedDepTag(depTag) { // shared_lib dependency from a static lib is considered as crossing // the APEX boundary because the dependency doesn't actually is // linked; the dependency is used only during the compilation phase. @@ -2115,20 +2150,23 @@ func (mod *Module) OutgoingDepIsInSameApex(depTag blueprint.DependencyTag) bool } // TODO(b/362509506): remove once all apex_exclude uses are switched to stubs. - if mod.ApexExclude() { + if r.ApexExclude { return false } return true } -func (mod *Module) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool { +func (r RustDepInSameApexChecker) IncomingDepIsInSameApex(depTag blueprint.DependencyTag) bool { + if r.Host { + return false + } // TODO(b/362509506): remove once all apex_exclude uses are switched to stubs. - if mod.ApexExclude() { + if r.ApexExclude { return false } - if mod.HasStubsVariants() { + if r.HasStubsVariants { if cc.IsSharedDepTag(depTag) && !cc.IsExplicitImplSharedDepTag(depTag) { // dynamic dep to a stubs lib crosses APEX boundary return false diff --git a/rust/rust_test.go b/rust/rust_test.go index 858c4db95..fbb994752 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -184,8 +184,8 @@ func TestDepsTracking(t *testing.T) { srcs: ["foo.rs"], } `) - module := ctx.ModuleForTests("fizz-buzz", "linux_glibc_x86_64").Module().(*Module) - rustc := ctx.ModuleForTests("librlib", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") + module := ctx.ModuleForTests(t, "fizz-buzz", "linux_glibc_x86_64").Module().(*Module) + rustc := ctx.ModuleForTests(t, "librlib", "linux_glibc_x86_64_rlib_rlib-std").Rule("rustc") // Since dependencies are added to AndroidMk* properties, we can check these to see if they've been picked up. if !android.InList("librlib.rlib-std", module.Properties.AndroidMkRlibs) { @@ -274,7 +274,7 @@ func TestSourceProviderDeps(t *testing.T) { } `) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc") + libfoo := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc") if !android.SuffixInList(libfoo.Implicits.Strings(), "/out/bindings.rs") { t.Errorf("rust_bindgen generated source not included as implicit input for libfoo; Implicits %#v", libfoo.Implicits.Strings()) } @@ -282,7 +282,7 @@ func TestSourceProviderDeps(t *testing.T) { t.Errorf("genrule generated source not included as implicit input for libfoo; Implicits %#v", libfoo.Implicits.Strings()) } - fizzBuzz := ctx.ModuleForTests("fizz-buzz-dep", "android_arm64_armv8-a").Rule("rustc") + fizzBuzz := ctx.ModuleForTests(t, "fizz-buzz-dep", "android_arm64_armv8-a").Rule("rustc") if !android.SuffixInList(fizzBuzz.Implicits.Strings(), "/out/bindings.rs") { t.Errorf("rust_bindgen generated source not included as implicit input for fizz-buzz-dep; Implicits %#v", libfoo.Implicits.Strings()) } @@ -290,7 +290,7 @@ func TestSourceProviderDeps(t *testing.T) { t.Errorf("genrule generated source not included as implicit input for fizz-buzz-dep; Implicits %#v", libfoo.Implicits.Strings()) } - libprocmacro := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Rule("rustc") + libprocmacro := ctx.ModuleForTests(t, "libprocmacro", "linux_glibc_x86_64").Rule("rustc") if !android.SuffixInList(libprocmacro.Implicits.Strings(), "/out/bindings.rs") { t.Errorf("rust_bindgen generated source not included as implicit input for libprocmacro; Implicits %#v", libfoo.Implicits.Strings()) } @@ -299,15 +299,15 @@ func TestSourceProviderDeps(t *testing.T) { } // Check that our bindings are picked up as crate dependencies as well - libfooMod := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) + libfooMod := ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_dylib").Module().(*Module) if !android.InList("libbindings", libfooMod.Properties.AndroidMkRlibs) { t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)") } - fizzBuzzMod := ctx.ModuleForTests("fizz-buzz-dep", "android_arm64_armv8-a").Module().(*Module) + fizzBuzzMod := ctx.ModuleForTests(t, "fizz-buzz-dep", "android_arm64_armv8-a").Module().(*Module) if !android.InList("libbindings", fizzBuzzMod.Properties.AndroidMkRlibs) { t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)") } - libprocmacroMod := ctx.ModuleForTests("libprocmacro", "linux_glibc_x86_64").Module().(*Module) + libprocmacroMod := ctx.ModuleForTests(t, "libprocmacro", "linux_glibc_x86_64").Module().(*Module) if !android.InList("libbindings.rlib-std", libprocmacroMod.Properties.AndroidMkRlibs) { t.Errorf("bindgen dependency not detected as a rlib dependency (dependency missing from AndroidMkRlibs)") } @@ -354,7 +354,7 @@ func TestProcMacroDeviceDeps(t *testing.T) { srcs: ["foo.rs"], } `) - rustc := ctx.ModuleForTests("libpm", "linux_glibc_x86_64").Rule("rustc") + rustc := ctx.ModuleForTests(t, "libpm", "linux_glibc_x86_64").Rule("rustc") if !strings.Contains(rustc.Args["libFlags"], "libbar/linux_glibc_x86_64") { t.Errorf("Proc_macro is not using host variant of dependent modules.") @@ -369,7 +369,7 @@ func TestNoStdlibs(t *testing.T) { srcs: ["foo.rs"], no_stdlibs: true, }`) - module := ctx.ModuleForTests("fizz-buzz", "android_arm64_armv8-a").Module().(*Module) + module := ctx.ModuleForTests(t, "fizz-buzz", "android_arm64_armv8-a").Module().(*Module) if android.InList("libstd", module.Properties.AndroidMkDylibs) { t.Errorf("no_stdlibs did not suppress dependency on libstd") @@ -385,8 +385,8 @@ func TestMultilib(t *testing.T) { crate_name: "foo", }`) - _ = ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_rlib_dylib-std") - _ = ctx.ModuleForTests("libfoo", "android_arm_armv7-a-neon_rlib_dylib-std") + _ = ctx.ModuleForTests(t, "libfoo", "android_arm64_armv8-a_rlib_dylib-std") + _ = ctx.ModuleForTests(t, "libfoo", "android_arm_armv7-a-neon_rlib_dylib-std") } // Test that library size measurements are generated. @@ -398,7 +398,7 @@ func TestLibrarySizes(t *testing.T) { crate_name: "waldo", }`) - m := ctx.SingletonForTests("file_metrics") + m := ctx.SingletonForTests(t, "file_metrics") m.Output("unstripped/libwaldo.dylib.so.bloaty.csv") m.Output("libwaldo.dylib.so.bloaty.csv") } @@ -423,7 +423,7 @@ func TestRustAliases(t *testing.T) { aliases: ["bar:bar_renamed"], }`) - fooRustc := ctx.ModuleForTests("foo", "android_arm64_armv8-a").Rule("rustc") + fooRustc := ctx.ModuleForTests(t, "foo", "android_arm64_armv8-a").Rule("rustc") if !strings.Contains(fooRustc.Args["libFlags"], "--extern force:bar_renamed=out/soong/.intermediates/libbar/android_arm64_armv8-a_dylib/unstripped/libbar.dylib.so") { t.Errorf("--extern force:bar_renamed=out/soong/.intermediates/libbar/android_arm64_armv8-a_dylib/unstripped/libbar.dylib.so flag not being passed to rustc for rust_binary with aliases. libFlags: %#v", fooRustc.Args["libFlags"]) } @@ -432,7 +432,7 @@ func TestRustAliases(t *testing.T) { } } -func TestRustRlibs(t *testing.T) { +func TestRustFFIRlibs(t *testing.T) { ctx := testRust(t, ` rust_ffi_static { name: "libbar", @@ -449,12 +449,26 @@ func TestRustRlibs(t *testing.T) { } rust_ffi_static { + name: "libfoo_from_rlib", + crate_name: "foo_from_rlib", + srcs: ["src/lib.rs"], + export_include_dirs: ["foo_includes"] + } + + rust_ffi_static { name: "libbuzz", crate_name: "buzz", srcs: ["src/lib.rs"], export_include_dirs: ["buzz_includes"] } + rust_ffi_static { + name: "libbuzz_from_rlib", + crate_name: "buzz_from_rlib", + srcs: ["src/lib.rs"], + export_include_dirs: ["buzz_includes"] + } + cc_library_shared { name: "libcc_shared", srcs:["foo.c"], @@ -468,20 +482,45 @@ func TestRustRlibs(t *testing.T) { whole_static_libs: ["libfoo"], } + cc_library_static { + name: "libcc_static_from_rlib", + srcs:["foo.c"], + static_libs: ["libbuzz_from_rlib"], + whole_static_libs: ["libfoo_from_rlib"], + } + cc_binary { name: "ccBin", srcs:["foo.c"], static_libs: ["libcc_static", "libbar"], } + + rust_library { + name: "librs", + srcs:["src/foo.rs"], + crate_name: "rs", + static_libs: ["libcc_static_from_rlib"], + } + + rust_binary { + name: "rsBin", + srcs:["src/foo.rs"], + crate_name: "rsBin", + rlibs: ["librs", "libbar"], + static_libs: ["libcc_static"], + } `) - libbar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_rlib_rlib-std").Rule("rustc") - libcc_shared_rustc := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("rustc") - libcc_shared_ld := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("ld") - libcc_shared_cc := ctx.ModuleForTests("libcc_shared", "android_arm64_armv8-a_shared").Rule("cc") - ccbin_rustc := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("rustc") - ccbin_ld := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("ld") - ccbin_cc := ctx.ModuleForTests("ccBin", "android_arm64_armv8-a").Rule("cc") + libbar := ctx.ModuleForTests(t, "libbar", "android_arm64_armv8-a_rlib_rlib-std").Rule("rustc") + libcc_shared_rustc := ctx.ModuleForTests(t, "libcc_shared", "android_arm64_armv8-a_shared").Rule("rustc") + libcc_shared_ld := ctx.ModuleForTests(t, "libcc_shared", "android_arm64_armv8-a_shared").Rule("ld") + libcc_shared_cc := ctx.ModuleForTests(t, "libcc_shared", "android_arm64_armv8-a_shared").Rule("cc") + ccbin_rustc := ctx.ModuleForTests(t, "ccBin", "android_arm64_armv8-a").Rule("rustc") + ccbin_ld := ctx.ModuleForTests(t, "ccBin", "android_arm64_armv8-a").Rule("ld") + ccbin_cc := ctx.ModuleForTests(t, "ccBin", "android_arm64_armv8-a").Rule("cc") + rustbin_genlib := ctx.ModuleForTests(t, "rsBin", "android_arm64_armv8-a").Output("generated_rust_staticlib/librustlibs.a") + rustbin := ctx.ModuleForTests(t, "rsBin", "android_arm64_armv8-a").Output("unstripped/rsBin") + librs_rlib := ctx.ModuleForTests(t, "librs", "android_arm64_armv8-a_rlib_dylib-std").MaybeOutput("generated_rust_staticlib/librustlibs.a") if !strings.Contains(libbar.Args["rustcFlags"], "crate-type=rlib") { t.Errorf("missing crate-type for static variant, expecting %#v, rustcFlags: %#v", "rlib", libbar.Args["rustcFlags"]) @@ -513,7 +552,7 @@ func TestRustRlibs(t *testing.T) { // Make sure the static lib is included in the cc command if !strings.Contains(ccbin_ld.Args["libFlags"], "generated_rust_staticlib/librustlibs.a") { t.Errorf("missing generated static library in linker step libFlags, expecting %#v, libFlags: %#v", - "ccBin.generated_rust_staticlib.a", ccbin_ld.Args["libFlags"]) + "generated_rust_staticlib/librustlibs.a", ccbin_ld.Args["libFlags"]) } // Make sure the static lib includes are in the ld command @@ -534,11 +573,43 @@ func TestRustRlibs(t *testing.T) { t.Errorf("Missing direct dependency libbar when writing generated Rust staticlib: %#v", ccbin_rustc.Args["libFlags"]) } + // Make sure the static lib is included in the rustc command + if !strings.Contains(rustbin.Args["linkFlags"], "generated_rust_staticlib/librustlibs.a") { + t.Errorf("missing generated static library in linker step libFlags in Rust module, expecting %#v, libFlags: %#v", + "generated_rust_staticlib/librustlibs.a", rustbin.Args["libFlags"]) + } + + // Make sure that direct dependencies and indirect whole static dependencies are + // propagating correctly for the rlib -> cc_library_static -> rust_* generated library example. + if !strings.Contains(rustbin_genlib.Args["libFlags"], "--extern foo=") { + t.Errorf("Missing indirect whole_static_lib dependency libfoo from cc static_lib when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if strings.Contains(rustbin_genlib.Args["libFlags"], "--extern buzz=") { + t.Errorf("Indirect rlib dependency libbuzz from cc static_lib found when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if strings.Contains(rustbin_genlib.Args["libFlags"], "--extern bar=") { + t.Errorf("Direct rlib dependency libbar getting included in the generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if !strings.Contains(rustbin_genlib.Args["libFlags"], "--extern foo_from_rlib=") { + t.Errorf("Missing indirect whole_static_lib dependency libfoo_from_rlib from cc static_lib when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + if strings.Contains(rustbin_genlib.Args["libFlags"], "--extern buzz_from_rlib=") { + // While static-libs propagate for rust modules, this is not the + // expected behavior for cc modules. Thus, libbuzz_from_rlib would + // be expected to have to be re-declared as a direct rlib dependency. + t.Errorf("Indirect rlib dependency libbuzz_from_rlib from cc static_lib found when writing generated Rust staticlib: %#v", rustbin_genlib.Args["libFlags"]) + } + // Test indirect includes propagation if !strings.Contains(ccbin_cc.Args["cFlags"], "-Ifoo_includes") { t.Errorf("missing rlibs includes, expecting %#v, cFlags: %#v", "-Ifoo_includes", ccbin_cc.Args) } + + // Make sure we're not generating superfluous mto staticlibs. + if librs_rlib.Rule != nil { + t.Error("rlibs should not be generating mto staticlibs", "rlib", libbar.Args["rustcFlags"]) + } } func assertString(t *testing.T, got, expected string) { @@ -681,8 +752,8 @@ func TestRustLinkPropagation(t *testing.T) { } `) - librlib3 := ctx.ModuleForTests("librlib3", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc") - libdylib3 := ctx.ModuleForTests("libdylib3", "android_arm64_armv8-a_dylib").Rule("rustc") + librlib3 := ctx.ModuleForTests(t, "librlib3", "android_arm64_armv8-a_rlib_dylib-std").Rule("rustc") + libdylib3 := ctx.ModuleForTests(t, "libdylib3", "android_arm64_armv8-a_dylib").Rule("rustc") // Test static lib propagation from: // rlib -> rlib diff --git a/rust/sanitize_test.go b/rust/sanitize_test.go index d6a14b295..a3fe2828a 100644 --- a/rust/sanitize_test.go +++ b/rust/sanitize_test.go @@ -153,65 +153,65 @@ func TestSanitizeMemtagHeap(t *testing.T) { ).RunTest(t) ctx := result.TestContext - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_sync", variant), Sync) } func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) { @@ -226,67 +226,67 @@ func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) { ).RunTest(t) ctx := result.TestContext - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_sync", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_async", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_sync", variant), Sync) } func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) { @@ -302,64 +302,64 @@ func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) { ).RunTest(t) ctx := result.TestContext - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_binary_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_no_override", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_async", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("no_memtag_test_override_default_sync", variant), None) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_binary_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_no_override", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_async", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_disable", variant), Async) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_async_test_override_default_sync", variant), Async) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("set_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_binary_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_no_override", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_async", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "no_memtag_test_override_default_sync", variant), None) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_binary_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_no_override", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_async", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_disable", variant), Async) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_async_test_override_default_sync", variant), Async) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "set_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_async", variant), Sync) // should sanitize: { diag: { memtag: true } } result in Sync instead of None here? - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_memtag_set_sync_test_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_disable", variant), None) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_binary_override_default_sync", variant), Sync) - - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_no_override", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_async", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_disable", variant), Sync) - checkHasMemtagNote(t, ctx.ModuleForTests("unset_test_override_default_sync", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_memtag_set_sync_test_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_disable", variant), None) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_binary_override_default_sync", variant), Sync) + + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_no_override", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_async", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_disable", variant), Sync) + checkHasMemtagNote(t, ctx.ModuleForTests(t, "unset_test_override_default_sync", variant), Sync) } diff --git a/rust/test_test.go b/rust/test_test.go index 1097da226..076a2598b 100644 --- a/rust/test_test.go +++ b/rust/test_test.go @@ -29,7 +29,7 @@ func TestRustTest(t *testing.T) { data: ["data.txt"], }`) - testingModule := ctx.ModuleForTests("my_test", "linux_glibc_x86_64") + testingModule := ctx.ModuleForTests(t, "my_test", "linux_glibc_x86_64") expectedOut := "my_test/linux_glibc_x86_64/my_test" outPath := testingModule.Output("my_test").Output.String() if !strings.Contains(outPath, expectedOut) { @@ -62,7 +62,7 @@ func TestRustTestLinkage(t *testing.T) { crate_name: "bar", }`) - testingModule := ctx.ModuleForTests("my_test", "android_arm64_armv8-a").Module().(*Module) + testingModule := ctx.ModuleForTests(t, "my_test", "android_arm64_armv8-a").Module().(*Module) if !android.InList("libfoo.rlib-std", testingModule.Properties.AndroidMkRlibs) { t.Errorf("rlib-std variant for libfoo not detected as a rustlib-defined rlib dependency for device rust_test module") @@ -106,7 +106,7 @@ func TestDataLibs(t *testing.T) { ctx := testRust(t, bp) - testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a") + testingModule := ctx.ModuleForTests(t, "main_test", "android_arm64_armv8-a") testBinary := testingModule.Module().(*Module).compiler.(*testDecorator) outputFiles := testingModule.OutputFiles(ctx, t, "") if len(outputFiles) != 1 { @@ -165,7 +165,7 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { ` ctx := testRust(t, bp) - testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a") + testingModule := ctx.ModuleForTests(t, "main_test", "android_arm64_armv8-a") module := testingModule.Module() testBinary := module.(*Module).compiler.(*testDecorator) outputFiles := testingModule.OutputFiles(ctx, t, "") diff --git a/scripts/build-ndk-prebuilts.sh b/scripts/build-ndk-prebuilts.sh index ef0f44a7c..b60044389 100755 --- a/scripts/build-ndk-prebuilts.sh +++ b/scripts/build-ndk-prebuilts.sh @@ -23,9 +23,18 @@ fi # TODO: remove ALLOW_MISSING_DEPENDENCIES=true when all the riscv64 # dependencies exist (currently blocked by http://b/273792258). # TODO: remove BUILD_BROKEN_DISABLE_BAZEL=1 when bazel supports riscv64 (http://b/262192655). +# +# LTO is disabled because the NDK compiler is not necessarily in-sync with the +# compiler used to build the platform sysroot, and the sysroot includes static +# libraries which would be incompatible with mismatched compilers when built +# with LTO. Disabling LTO globally for the NDK sysroot is okay because the only +# compiled code in the sysroot that will end up in apps is those static +# libraries. +# https://github.com/android/ndk/issues/1591 TARGET_RELEASE=trunk_staging \ ALLOW_MISSING_DEPENDENCIES=true \ BUILD_BROKEN_DISABLE_BAZEL=1 \ +DISABLE_LTO=true \ TARGET_PRODUCT=ndk build/soong/soong_ui.bash --make-mode --soong-only ${OUT_DIR}/soong/ndk.timestamp if [ -n "${DIST_DIR}" ]; then diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index 34e11f0da..80ced00bf 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -66,6 +66,7 @@ func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) andro exported_bootclasspath_fragments: [ "%s", ], + prefer: false, } `, apex, apexFile, fragment)), android.FixtureAddFile(filepath.Join(dir, apexFile), nil), @@ -73,6 +74,7 @@ func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) andro } func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithDexpreopt, @@ -225,8 +227,8 @@ java_import { checkBootJarsPackageCheckRule(t, result, append( []string{ - "out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_com.android.art/deapexer/javalib/core1.jar", - "out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_com.android.art/deapexer/javalib/core2.jar", + "out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_prebuilt_com.android.art/deapexer/javalib/core1.jar", + "out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_prebuilt_com.android.art/deapexer/javalib/core2.jar", "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar", }, java.ApexBootJarDexJarPaths..., @@ -270,7 +272,7 @@ java_import { // package check rule. func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, expectedModules ...string) { t.Helper() - platformBcp := result.ModuleForTests("platform-bootclasspath", "android_common") + platformBcp := result.ModuleForTests(t, "platform-bootclasspath", "android_common") bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check") command := bootJarsCheckRule.RuleParams.Command expectedCommandArgs := " build/soong/scripts/check_boot_jars/package_allowed_list.txt " + strings.Join(expectedModules, " ") + " &&" @@ -479,7 +481,7 @@ java_sdk_library_import { checkAllCopyRules(copyRules), snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot), snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) { - module := result.ModuleForTests("platform-bootclasspath", "android_common") + module := result.ModuleForTests(t, "platform-bootclasspath", "android_common") var rule android.TestingBuildParams rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv") java.CheckHiddenAPIRuleInputs(t, "monolithic flags", ` @@ -505,7 +507,7 @@ java_sdk_library_import { }), snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot), snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) { - module := result.ModuleForTests("platform-bootclasspath", "android_common") + module := result.ModuleForTests(t, "platform-bootclasspath", "android_common") rule := module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid") android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv ") }), @@ -514,7 +516,9 @@ java_sdk_library_import { } func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { + t.Parallel() t.Run("added-directly", func(t *testing.T) { + t.Parallel() testSnapshotWithBootClasspathFragment_Contents(t, ` sdk { name: "mysdk", @@ -566,6 +570,7 @@ func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { .intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt ` t.Run("added-via-apex", func(t *testing.T) { + t.Parallel() testSnapshotWithBootClasspathFragment_Contents(t, ` sdk { name: "mysdk", @@ -575,6 +580,7 @@ func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { }) t.Run("added-directly-and-indirectly", func(t *testing.T) { + t.Parallel() testSnapshotWithBootClasspathFragment_Contents(t, ` sdk { name: "mysdk", @@ -599,6 +605,7 @@ func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { // TestSnapshotWithBootClasspathFragment_Fragments makes sure that the fragments property of a // bootclasspath_fragment is correctly output to the sdk snapshot. func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, @@ -734,9 +741,11 @@ java_sdk_library_import { // Test that bootclasspath_fragment works with sdk. func TestBasicSdkWithBootclasspathFragment(t *testing.T) { + t.Parallel() android.GroupFixturePreparers( prepareForSdkTestWithApex, prepareForSdkTestWithJava, + java.PrepareForTestWithJavaDefaultModules, android.FixtureMergeMockFs(android.MockFS{ "java/mybootlib.jar": nil, "hiddenapi/annotation-flags.csv": nil, @@ -752,6 +761,13 @@ func TestBasicSdkWithBootclasspathFragment(t *testing.T) { bootclasspath_fragments: ["mybootclasspathfragment"], } + apex { + name: "myapex", + key: "myapex.key", + min_sdk_version: "1", + bootclasspath_fragments: ["mybootclasspathfragment"], + } + bootclasspath_fragment { name: "mybootclasspathfragment", image_name: "art", @@ -794,7 +810,7 @@ func TestBasicSdkWithBootclasspathFragment(t *testing.T) { java_import { name: "mybootlib", visibility: ["//visibility:public"], - apex_available: ["com.android.art"], + apex_available: ["myapex"], jars: ["java/mybootlib.jar"], } `), @@ -802,6 +818,7 @@ func TestBasicSdkWithBootclasspathFragment(t *testing.T) { } func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, @@ -1116,7 +1133,7 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui `), ).RunTest(t) - bcpf := result.ModuleForTests("mybootclasspathfragment", "android_common") + bcpf := result.ModuleForTests(t, "mybootclasspathfragment", "android_common") rule := bcpf.Output("out/soong/.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi" + suffix + "/stub-flags.csv") android.AssertPathsRelativeToTopEquals(t, "stub flags inputs", android.SortedUniqueStrings(expectedStubFlagsInputs), android.SortedUniquePaths(rule.Implicits)) @@ -1127,7 +1144,9 @@ func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBui } func TestSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T) { + t.Parallel() t.Run("target S build", func(t *testing.T) { + t.Parallel() expectedSnapshot := ` // This is auto-generated. DO NOT EDIT. @@ -1184,6 +1203,7 @@ java_sdk_library_import { }) t.Run("target-Tiramisu-build", func(t *testing.T) { + t.Parallel() expectedSnapshot := ` // This is auto-generated. DO NOT EDIT. @@ -1268,6 +1288,7 @@ java_sdk_library_import { } func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, diff --git a/sdk/bp_test.go b/sdk/bp_test.go index c620ac2b8..d3eaafeba 100644 --- a/sdk/bp_test.go +++ b/sdk/bp_test.go @@ -73,6 +73,7 @@ func checkPropertySetFixture(t *testing.T, val interface{}, hasTags bool) { } func TestAddPropertySimple(t *testing.T) { + t.Parallel() set := newPropertySet() for name, val := range map[string]interface{}{ "x": "taxi", @@ -91,14 +92,17 @@ func TestAddPropertySimple(t *testing.T) { } func TestAddPropertySubset(t *testing.T) { + t.Parallel() getFixtureMap := map[string]func() interface{}{ "property set": propertySetFixture, "property struct": propertyStructFixture, } t.Run("add new subset", func(t *testing.T) { + t.Parallel() for name, getFixture := range getFixtureMap { t.Run(name, func(t *testing.T) { + t.Parallel() set := propertySetFixture().(*bpPropertySet) set.AddProperty("new", getFixture()) checkPropertySetFixture(t, set, true) @@ -108,8 +112,10 @@ func TestAddPropertySubset(t *testing.T) { }) t.Run("merge existing subset", func(t *testing.T) { + t.Parallel() for name, getFixture := range getFixtureMap { t.Run(name, func(t *testing.T) { + t.Parallel() set := newPropertySet() subset := set.AddPropertySet("sub") subset.AddProperty("flag", false) @@ -123,12 +129,14 @@ func TestAddPropertySubset(t *testing.T) { }) t.Run("add conflicting subset", func(t *testing.T) { + t.Parallel() set := propertySetFixture().(*bpPropertySet) android.AssertPanicMessageContains(t, "adding x again should panic", `Property "x" already exists in property set`, func() { set.AddProperty("x", propertySetFixture()) }) }) t.Run("add non-pointer struct", func(t *testing.T) { + t.Parallel() set := propertySetFixture().(*bpPropertySet) str := propertyStructFixture().(*propertyStruct) android.AssertPanicMessageContains(t, "adding a non-pointer struct should panic", "Value is a struct, not a pointer to one:", @@ -137,6 +145,7 @@ func TestAddPropertySubset(t *testing.T) { } func TestAddPropertySetNew(t *testing.T) { + t.Parallel() set := newPropertySet() subset := set.AddPropertySet("sub") subset.AddProperty("new", "d^^b") @@ -144,6 +153,7 @@ func TestAddPropertySetNew(t *testing.T) { } func TestAddPropertySetExisting(t *testing.T) { + t.Parallel() set := propertySetFixture().(*bpPropertySet) subset := set.AddPropertySet("sub") subset.AddProperty("new", "d^^b") @@ -176,6 +186,7 @@ func (t removeFredTransformation) transformPropertySetAfterContents(name string, } func TestTransformRemoveProperty(t *testing.T) { + t.Parallel() set := newPropertySet() set.AddProperty("name", "name") set.AddProperty("fred", "12") @@ -188,6 +199,7 @@ func TestTransformRemoveProperty(t *testing.T) { } func TestTransformRemovePropertySet(t *testing.T) { + t.Parallel() set := newPropertySet() set.AddProperty("name", "name") set.AddPropertySet("fred") diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 25839b8a1..bf4ac139c 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -58,6 +58,7 @@ func testSdkWithCc(t *testing.T, bp string) *android.TestResult { // Contains tests for SDK members provided by the cc package. func TestSingleDeviceOsAssumption(t *testing.T) { + t.Parallel() // Mock a module with DeviceSupported() == true. s := &sdk{} android.InitAndroidArchModule(s, android.DeviceSupported, android.MultilibCommon) @@ -72,6 +73,7 @@ func TestSingleDeviceOsAssumption(t *testing.T) { } func TestSdkIsCompileMultilibBoth(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -102,6 +104,7 @@ func TestSdkIsCompileMultilibBoth(t *testing.T) { } func TestSdkCompileMultilibOverride(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -161,6 +164,7 @@ cc_prebuilt_library_shared { // Make sure the sdk can use host specific cc libraries static/shared and both. func TestHostSdkWithCc(t *testing.T) { + t.Parallel() testSdkWithCc(t, ` sdk { name: "mysdk", @@ -184,6 +188,7 @@ func TestHostSdkWithCc(t *testing.T) { // Make sure the sdk can use cc libraries static/shared and both. func TestSdkWithCc(t *testing.T) { + t.Parallel() testSdkWithCc(t, ` sdk { name: "mysdk", @@ -214,6 +219,7 @@ func TestSdkWithCc(t *testing.T) { } func TestSnapshotWithObject(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -268,6 +274,7 @@ cc_prebuilt_object { } func TestSnapshotWithCcDuplicateHeaders(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -305,6 +312,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestSnapshotWithCcExportGeneratedHeaders(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -393,6 +401,7 @@ myinclude/Test.h -> include/myinclude/Test.h // handling is tested with the sanitize clauses (but note there's a lot of // built-in logic in sanitize.go that can affect those flags). func TestSnapshotWithCcSharedLibraryCommonProperties(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -475,6 +484,7 @@ arm64/include/Arm64Test.h -> arm64/include/arm64/include/Arm64Test.h } func TestSnapshotWithCcBinary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "mymodule_exports", @@ -523,6 +533,7 @@ cc_prebuilt_binary { } func TestMultipleHostOsTypesSnapshotWithCcBinary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "myexports", @@ -604,6 +615,7 @@ cc_prebuilt_binary { } func TestSnapshotWithSingleHostOsType(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTest, ccTestFs.AddToFixture(), @@ -721,6 +733,7 @@ cc_prebuilt_library_shared { // Test that we support the necessary flags for the linker binary, which is // special in several ways. func TestSnapshotWithCcStaticNocrtBinary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "mymodule_exports", @@ -785,19 +798,26 @@ cc_prebuilt_binary { } func TestSnapshotWithCcSharedLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", native_shared_libs: ["mynativelib"], } + apex { + name: "myapex", + key: "myapex.key", + min_sdk_version: "1", + } + cc_library_shared { name: "mynativelib", srcs: [ "Test.cpp", "aidl/foo/bar/Test.aidl", ], - apex_available: ["apex1", "apex2"], + apex_available: ["myapex"], export_include_dirs: ["myinclude"], aidl: { export_aidl_headers: true, @@ -807,6 +827,18 @@ func TestSnapshotWithCcSharedLibrary(t *testing.T) { `) CheckSnapshot(t, result, "mysdk", "", + snapshotTestPreparer(checkSnapshotWithoutSource, + android.FixtureMergeMockFs(android.MockFS{ + "myapex/Android.bp": []byte(` + apex { + name: "myapex", + key: "myapex.key", + min_sdk_version: "1", + } + `), + "myapex/apex_manifest.json": nil, + }), + ), checkAndroidBpContents(` // This is auto-generated. DO NOT EDIT. @@ -819,10 +851,7 @@ cc_prebuilt_library_shared { name: "mynativelib", prefer: false, visibility: ["//visibility:public"], - apex_available: [ - "apex1", - "apex2", - ], + apex_available: ["myapex"], stl: "none", compile_multilib: "both", export_include_dirs: ["include/myinclude"], @@ -856,6 +885,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestSnapshotWithCcSharedLibrarySharedLibs(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -1005,6 +1035,7 @@ cc_prebuilt_library_shared { } func TestHostSnapshotWithCcSharedLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -1085,6 +1116,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestMultipleHostOsTypesSnapshotWithCcSharedLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -1168,6 +1200,7 @@ cc_prebuilt_library_shared { } func TestSnapshotWithCcStaticLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "myexports", @@ -1232,6 +1265,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestHostSnapshotWithCcStaticLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "myexports", @@ -1307,6 +1341,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestSnapshotWithCcLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "myexports", @@ -1370,12 +1405,11 @@ myinclude/Test.h -> include/myinclude/Test.h .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so `), - // TODO(b/183315522): Remove this and fix the issue. - snapshotTestErrorHandler(checkSnapshotPreferredWithSource, android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\Qunrecognized property "arch.arm.shared.export_include_dirs"\E`)), ) } func TestSnapshotSameLibraryWithNativeLibsAndNativeSharedLib(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { host_supported: true, @@ -1477,6 +1511,7 @@ cc_prebuilt_library { } func TestSnapshotSameLibraryWithAndroidNativeLibsAndHostNativeSharedLib(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { host_supported: true, @@ -1578,6 +1613,7 @@ cc_prebuilt_library { } func TestSnapshotSameLibraryWithNativeStaticLibsAndNativeSharedLib(t *testing.T) { + t.Parallel() testSdkError(t, "Incompatible member types", ` module_exports { host_supported: true, @@ -1609,6 +1645,7 @@ func TestSnapshotSameLibraryWithNativeStaticLibsAndNativeSharedLib(t *testing.T) } func TestHostSnapshotWithMultiLib64(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` module_exports { name: "myexports", @@ -1682,6 +1719,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestSnapshotWithCcHeadersLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -1721,6 +1759,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestSnapshotWithCcHeadersLibraryAndNativeBridgeSupport(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( cc.PrepareForTestWithCcDefaultModules, PrepareForTestWithSdkBuildComponents, @@ -1778,6 +1817,7 @@ myinclude/Test.h -> include/myinclude/Test.h // module that has different output files for a native bridge target requests the native bridge // variants are copied into the sdk snapshot that it reports an error. func TestSnapshotWithCcHeadersLibrary_DetectsNativeBridgeSpecificProperties(t *testing.T) { + t.Parallel() android.GroupFixturePreparers( cc.PrepareForTestWithCcDefaultModules, PrepareForTestWithSdkBuildComponents, @@ -1814,6 +1854,7 @@ func TestSnapshotWithCcHeadersLibrary_DetectsNativeBridgeSpecificProperties(t *t } func TestSnapshotWithCcHeadersLibraryAndImageVariants(t *testing.T) { + t.Parallel() testImageVariant := func(t *testing.T, property, trait string) { result := android.GroupFixturePreparers( cc.PrepareForTestWithCcDefaultModules, @@ -1877,6 +1918,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestHostSnapshotWithCcHeadersLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -1933,6 +1975,7 @@ myinclude/Test.h -> include/myinclude/Test.h } func TestDeviceAndHostSnapshotWithCcHeadersLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -2002,6 +2045,7 @@ myinclude-host/HostTest.h -> linux_glibc/include/myinclude-host/HostTest.h } func TestSystemSharedLibPropagation(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -2162,6 +2206,7 @@ cc_prebuilt_library_shared { } func TestStubsLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -2223,6 +2268,7 @@ cc_prebuilt_library_shared { } func TestDeviceAndHostSnapshotWithStubsLibrary(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -2299,6 +2345,7 @@ cc_prebuilt_library_shared { } func TestUniqueHostSoname(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", @@ -2364,6 +2411,7 @@ cc_prebuilt_library_shared { } func TestNoSanitizerMembers(t *testing.T) { + t.Parallel() result := testSdkWithCc(t, ` sdk { name: "mysdk", diff --git a/sdk/compat_config_sdk_test.go b/sdk/compat_config_sdk_test.go index 75b5229bf..1737b3af1 100644 --- a/sdk/compat_config_sdk_test.go +++ b/sdk/compat_config_sdk_test.go @@ -76,6 +76,7 @@ prebuilt_platform_compat_config { } func TestSnapshotWithCompatConfig(t *testing.T) { + t.Parallel() testSnapshotWithCompatConfig(t, ` sdk { name: "mysdk", @@ -85,6 +86,7 @@ func TestSnapshotWithCompatConfig(t *testing.T) { } func TestSnapshotWithCompatConfig_Apex(t *testing.T) { + t.Parallel() testSnapshotWithCompatConfig(t, ` apex { name: "myapex", diff --git a/sdk/exports_test.go b/sdk/exports_test.go index 9d0a24210..5a7ce845a 100644 --- a/sdk/exports_test.go +++ b/sdk/exports_test.go @@ -20,6 +20,7 @@ import ( // Ensure that module_exports generates a module_exports_snapshot module. func TestModuleExportsSnapshot(t *testing.T) { + t.Parallel() packageBp := ` module_exports { name: "myexports", diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index 4db163cdf..1e545cea3 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -51,6 +51,7 @@ var prepareForSdkTestWithJavaSdkLibrary = android.GroupFixturePreparers( // Contains tests for SDK members provided by the java package. func TestSdkDependsOnSourceEvenWhenPrebuiltPreferred(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJava).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -77,6 +78,7 @@ func TestSdkDependsOnSourceEvenWhenPrebuiltPreferred(t *testing.T) { } func TestSnapshotWithJavaHeaderLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureAddFile("aidl/foo/bar/Test.aidl", nil), @@ -126,6 +128,7 @@ aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl } func TestHostSnapshotWithJavaHeaderLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureAddFile("aidl/foo/bar/Test.aidl", nil), @@ -178,6 +181,7 @@ aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl } func TestDeviceAndHostSnapshotWithJavaHeaderLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJava).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -228,6 +232,7 @@ java_import { } func TestSnapshotWithJavaImplLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureAddFile("aidl/foo/bar/Test.aidl", nil), @@ -277,6 +282,7 @@ aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl } func TestSnapshotWithJavaBootLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureAddFile("aidl", nil), @@ -328,6 +334,7 @@ java_import { } func TestSnapshotWithJavaBootLibrary_UpdatableMedia(t *testing.T) { + t.Parallel() runTest := func(t *testing.T, targetBuildRelease, expectedJarPath, expectedCopyRule string) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, @@ -385,6 +392,7 @@ java_import { } func TestSnapshotWithJavaLibrary_MinSdkVersion(t *testing.T) { + t.Parallel() runTest := func(t *testing.T, targetBuildRelease, minSdkVersion, expectedMinSdkVersion string) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, @@ -457,6 +465,7 @@ java_import { } func TestSnapshotWithJavaSystemserverLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureAddFile("aidl", nil), @@ -509,6 +518,7 @@ java_import { } func TestHostSnapshotWithJavaImplLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureAddFile("aidl/foo/bar/Test.aidl", nil), @@ -561,6 +571,7 @@ aidl/foo/bar/Test.aidl -> aidl/aidl/foo/bar/Test.aidl } func TestSnapshotWithJavaTest(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJava).RunTestWithBp(t, ` module_exports { name: "myexports", @@ -603,6 +614,7 @@ java_test_import { } func TestHostSnapshotWithJavaTest(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJava).RunTestWithBp(t, ` module_exports { name: "myexports", @@ -650,6 +662,7 @@ java_test_import { } func TestSnapshotWithJavaSystemModules(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, @@ -853,6 +866,7 @@ java_system_modules_import { } func TestHostSnapshotWithJavaSystemModules(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJava).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -911,6 +925,7 @@ java_system_modules_import { } func TestDeviceAndHostSnapshotWithOsSpecificMembers(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJava).RunTestWithBp(t, ` module_exports { name: "myexports", @@ -1004,6 +1019,7 @@ java_import { } func TestSnapshotWithJavaSdkLibrary(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1081,6 +1097,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_DistStem(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1136,6 +1153,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_UseSrcJar(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJavaSdkLibrary, android.FixtureMergeEnv(map[string]string{ @@ -1192,6 +1210,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_AnnotationsZip(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1246,6 +1265,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_AnnotationsZip_PreT(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJavaSdkLibrary, android.FixtureMergeEnv(map[string]string{ @@ -1303,6 +1323,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_CompileDex(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJavaSdkLibrary, android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), @@ -1385,6 +1406,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_SdkVersion_None(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1435,6 +1457,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1488,6 +1511,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_ApiScopes(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1555,6 +1579,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_ModuleLib(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1636,6 +1661,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_SystemServer(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { name: "mysdk", @@ -1703,6 +1729,7 @@ java_sdk_library_import { } func TestSnapshotWithJavaSdkLibrary_DoctagFiles(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJavaSdkLibrary, android.FixtureAddFile("docs/known_doctags", nil), diff --git a/sdk/license_sdk_test.go b/sdk/license_sdk_test.go index 754f01961..eb8112ba7 100644 --- a/sdk/license_sdk_test.go +++ b/sdk/license_sdk_test.go @@ -21,6 +21,7 @@ import ( ) func TestSnapshotWithPackageDefaultLicense(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.PrepareForTestWithLicenses, diff --git a/sdk/member_trait_test.go b/sdk/member_trait_test.go index 673d6fb6e..9b41e9b7a 100644 --- a/sdk/member_trait_test.go +++ b/sdk/member_trait_test.go @@ -116,6 +116,7 @@ func init() { } func TestBasicTrait_WithoutTrait(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` @@ -154,6 +155,7 @@ java_import { } func TestBasicTrait_MultipleTraits(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` @@ -262,6 +264,7 @@ java_import { } func TestTraitUnsupportedByMemberType(t *testing.T) { + t.Parallel() android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` diff --git a/sdk/sdk_test.go b/sdk/sdk_test.go index 2532a2581..985641e95 100644 --- a/sdk/sdk_test.go +++ b/sdk/sdk_test.go @@ -40,6 +40,7 @@ func TestMain(m *testing.M) { // Ensure that prebuilt modules have the same effective visibility as the source // modules. func TestSnapshotVisibility(t *testing.T) { + t.Parallel() packageBp := ` package { default_visibility: ["//other/foo"], @@ -160,6 +161,7 @@ java_import { } func TestSdkInstall(t *testing.T) { + t.Parallel() sdk := ` sdk { name: "mysdk", @@ -326,6 +328,7 @@ func TestCommonValueOptimization_InvalidArchSpecificVariants(t *testing.T) { // Ensure that sdk snapshot related environment variables work correctly. func TestSnapshot_EnvConfiguration(t *testing.T) { + t.Parallel() bp := ` sdk { name: "mysdk", @@ -347,11 +350,12 @@ func TestSnapshot_EnvConfiguration(t *testing.T) { ) checkZipFile := func(t *testing.T, result *android.TestResult, expected string) { - zipRule := result.ModuleForTests("mysdk", "common_os").Rule("SnapshotZipFiles") + zipRule := result.ModuleForTests(t, "mysdk", "common_os").Rule("SnapshotZipFiles") android.AssertStringEquals(t, "snapshot zip file", expected, zipRule.Output.String()) } t.Run("no env variables", func(t *testing.T) { + t.Parallel() result := preparer.RunTest(t) checkZipFile(t, result, "out/soong/.intermediates/mysdk/common_os/mysdk-current.zip") @@ -377,6 +381,7 @@ java_import { }) t.Run("SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE=S", func(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, @@ -468,6 +473,7 @@ java_sdk_library_import { }) t.Run("test replacing exportable module", func(t *testing.T) { + t.Parallel() result := android.GroupFixturePreparers( prepareForSdkTestWithJava, java.PrepareForTestWithJavaDefaultModules, diff --git a/sdk/systemserverclasspath_fragment_sdk_test.go b/sdk/systemserverclasspath_fragment_sdk_test.go index fd6c4e7b8..7ebdcd4c3 100644 --- a/sdk/systemserverclasspath_fragment_sdk_test.go +++ b/sdk/systemserverclasspath_fragment_sdk_test.go @@ -87,10 +87,23 @@ func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, tar CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(expectedSdkSnapshot), + snapshotTestPreparer(checkSnapshotWithoutSource, + android.FixtureMergeMockFs(android.MockFS{ + "myapex/Android.bp": []byte(` + apex { + name: "myapex", + key: "myapex.key", + min_sdk_version: "1", + } + `), + "myapex/apex_manifest.json": nil, + }), + ), ) } func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) { + t.Parallel() commonSdk := ` apex { name: "myapex", @@ -185,6 +198,7 @@ prebuilt_systemserverclasspath_fragment { } func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) { + t.Parallel() commonSdk := ` apex { name: "myapex", @@ -231,6 +245,7 @@ func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) { } func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) { + t.Parallel() commonSdk := ` sdk { @@ -298,6 +313,7 @@ prebuilt_systemserverclasspath_fragment { ` t.Run("target-s", func(t *testing.T) { + t.Parallel() testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", ` // This is auto-generated. DO NOT EDIT. @@ -319,6 +335,7 @@ java_sdk_library_import { }) t.Run("target-t", func(t *testing.T) { + t.Parallel() testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", ` // This is auto-generated. DO NOT EDIT. @@ -361,6 +378,7 @@ prebuilt_systemserverclasspath_fragment { }) t.Run("target-u", func(t *testing.T) { + t.Parallel() testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", ` // This is auto-generated. DO NOT EDIT. @@ -409,10 +427,12 @@ prebuilt_systemserverclasspath_fragment { }) t.Run("added-directly", func(t *testing.T) { + t.Parallel() testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot) }) t.Run("added-via-apex", func(t *testing.T) { + t.Parallel() testSnapshotWithSystemServerClasspathFragment(t, ` sdk { name: "mysdk", diff --git a/sdk/testing.go b/sdk/testing.go index 21d457c5f..cd7bbf58e 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -128,12 +128,11 @@ func ensureListContains(t *testing.T, result []string, expected string) { // generated, etc. func getSdkSnapshotBuildInfo(t *testing.T, result *android.TestResult, sdk *sdk) *snapshotBuildInfo { info := &snapshotBuildInfo{ - t: t, - r: result, - androidBpContents: sdk.GetAndroidBpContentsForTests(), - infoContents: sdk.GetInfoContentsForTests(), - snapshotTestCustomizations: map[snapshotTest]*snapshotTestCustomization{}, - targetBuildRelease: sdk.builderForTests.targetBuildRelease, + t: t, + r: result, + androidBpContents: sdk.GetAndroidBpContentsForTests(), + infoContents: sdk.GetInfoContentsForTests(), + targetBuildRelease: sdk.builderForTests.targetBuildRelease, } buildParams := sdk.BuildParamsForTests() @@ -282,7 +281,7 @@ func CheckSnapshot(t *testing.T, result *android.TestResult, name string, dir st // Run the snapshot with the snapshot preparer and the extra preparer, which must come after as // it may need to modify parts of the MockFS populated by the snapshot preparer. - result := android.GroupFixturePreparers(snapshotPreparer, extraPreparer, customizedPreparers). + result := android.GroupFixturePreparers(snapshotPreparer, customizedPreparers, extraPreparer). ExtendWithErrorHandler(customization.errorHandler). RunTest(t) @@ -293,6 +292,7 @@ func CheckSnapshot(t *testing.T, result *android.TestResult, name string, dir st } t.Run("snapshot without source", func(t *testing.T) { + t.Parallel() // Remove the source Android.bp file to make sure it works without. removeSourceAndroidBp := android.FixtureModifyMockFS(func(fs android.MockFS) { delete(fs, "Android.bp") @@ -302,16 +302,23 @@ func CheckSnapshot(t *testing.T, result *android.TestResult, name string, dir st }) t.Run("snapshot with source preferred", func(t *testing.T) { + t.Parallel() runSnapshotTestWithCheckers(t, checkSnapshotWithSourcePreferred, android.NullFixturePreparer) }) t.Run("snapshot preferred with source", func(t *testing.T) { + t.Parallel() // Replace the snapshot/Android.bp file with one where "prefer: false," has been replaced with // "prefer: true," preferPrebuilts := android.FixtureModifyMockFS(func(fs android.MockFS) { snapshotBpFile := filepath.Join(snapshotSubDir, "Android.bp") unpreferred := string(fs[snapshotBpFile]) fs[snapshotBpFile] = []byte(strings.ReplaceAll(unpreferred, "prefer: false,", "prefer: true,")) + + prebuiltApexBpFile := "prebuilts/apex/Android.bp" + if prebuiltApexBp, ok := fs[prebuiltApexBpFile]; ok { + fs[prebuiltApexBpFile] = []byte(strings.ReplaceAll(string(prebuiltApexBp), "prefer: false,", "prefer: true,")) + } }) runSnapshotTestWithCheckers(t, checkSnapshotPreferredWithSource, preferPrebuilts) @@ -469,19 +476,40 @@ type snapshotBuildInfo struct { targetBuildRelease *buildRelease // The test specific customizations for each snapshot test. - snapshotTestCustomizations map[snapshotTest]*snapshotTestCustomization + snapshotTestCustomizations snapshotTestCustomizationSet +} + +type snapshotTestCustomizationSet struct { + snapshotWithoutSource *snapshotTestCustomization + snapshotWithSourcePreferred *snapshotTestCustomization + snapshotPreferredWithSource *snapshotTestCustomization +} + +func (s *snapshotTestCustomizationSet) customization(snapshotTest snapshotTest) **snapshotTestCustomization { + var customization **snapshotTestCustomization + switch snapshotTest { + case checkSnapshotWithoutSource: + + customization = &s.snapshotWithoutSource + case checkSnapshotWithSourcePreferred: + customization = &s.snapshotWithSourcePreferred + case checkSnapshotPreferredWithSource: + customization = &s.snapshotPreferredWithSource + default: + panic(fmt.Errorf("unsupported snapshotTest %v", snapshotTest)) + } + return customization } // snapshotTestCustomization gets the test specific customization for the specified snapshotTest. // // If no customization was created previously then it creates a default customization. func (i *snapshotBuildInfo) snapshotTestCustomization(snapshotTest snapshotTest) *snapshotTestCustomization { - customization := i.snapshotTestCustomizations[snapshotTest] - if customization == nil { - customization = &snapshotTestCustomization{ + customization := i.snapshotTestCustomizations.customization(snapshotTest) + if *customization == nil { + *customization = &snapshotTestCustomization{ errorHandler: android.FixtureExpectsNoErrors, } - i.snapshotTestCustomizations[snapshotTest] = customization } - return customization + return *customization } diff --git a/sh/sh_binary_test.go b/sh/sh_binary_test.go index 28f997d8e..c2e2d2bd1 100644 --- a/sh/sh_binary_test.go +++ b/sh/sh_binary_test.go @@ -58,7 +58,7 @@ func TestShTestSubDir(t *testing.T) { } `) - mod := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*ShTest) + mod := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Module().(*ShTest) entries := android.AndroidMkEntriesForTest(t, result.TestContext, mod)[0] @@ -83,7 +83,7 @@ func TestShTest(t *testing.T) { } `) - mod := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*ShTest) + mod := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Module().(*ShTest) entries := android.AndroidMkEntriesForTest(t, result.TestContext, mod)[0] @@ -129,7 +129,7 @@ func TestShTest_dataModules(t *testing.T) { buildOS := config.BuildOS.String() arches := []string{"android_arm64_armv8-a", buildOS + "_x86_64"} for _, arch := range arches { - variant := ctx.ModuleForTests("foo", arch) + variant := ctx.ModuleForTests(t, "foo", arch) libExt := ".so" if arch == "darwin_x86_64" { @@ -167,7 +167,7 @@ func TestShTestHost(t *testing.T) { `) buildOS := ctx.Config().BuildOS.String() - mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest) + mod := ctx.ModuleForTests(t, "foo", buildOS+"_x86_64").Module().(*ShTest) if !mod.Host() { t.Errorf("host bit is not set for a sh_test_host module.") } @@ -186,7 +186,7 @@ func TestShTestExtraTestConfig(t *testing.T) { } `) - mod := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*ShTest) + mod := result.ModuleForTests(t, "foo", "android_arm64_armv8-a").Module().(*ShTest) entries := android.AndroidMkEntriesForTest(t, result, mod)[0] actualData := entries.EntryMap["LOCAL_EXTRA_FULL_TEST_CONFIGS"] android.AssertStringPathsRelativeToTopEquals(t, "extra_configs", result.Config(), []string{"config1.xml", "config2.xml"}, actualData) @@ -221,7 +221,7 @@ func TestShTestHost_dataDeviceModules(t *testing.T) { buildOS := config.BuildOS.String() variant := buildOS + "_x86_64" - foo := ctx.ModuleForTests("foo", variant) + foo := ctx.ModuleForTests(t, "foo", variant) relocated := foo.Output(filepath.Join("out/soong/.intermediates/foo", variant, "relocated/lib64/libbar.so")) expectedInput := "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so" @@ -266,7 +266,7 @@ func TestShTestHost_dataDeviceModulesAutogenTradefedConfig(t *testing.T) { `) buildOS := config.BuildOS.String() - fooModule := ctx.ModuleForTests("foo", buildOS+"_x86_64") + fooModule := ctx.ModuleForTests(t, "foo", buildOS+"_x86_64") expectedBinAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />` autogen := fooModule.Rule("autogen") @@ -296,7 +296,7 @@ func TestShTestHost_javaData(t *testing.T) { } `) buildOS := ctx.Config().BuildOS.String() - mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest) + mod := ctx.ModuleForTests(t, "foo", buildOS+"_x86_64").Module().(*ShTest) if !mod.Host() { t.Errorf("host bit is not set for a sh_test_host module.") } @@ -345,7 +345,7 @@ func TestDefaultsForTests(t *testing.T) { `) buildOS := ctx.Config().BuildOS.String() - mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest) + mod := ctx.ModuleForTests(t, "foo", buildOS+"_x86_64").Module().(*ShTest) if !mod.Host() { t.Errorf("host bit is not set for a sh_test_host module.") } @@ -365,7 +365,7 @@ func TestDefaultsForTests(t *testing.T) { ":testdata/data1", ":testdata/sub/data2", } - mod = ctx.ModuleForTests("sh-test", "android_arm64_armv8-a").Module().(*ShTest) + mod = ctx.ModuleForTests(t, "sh-test", "android_arm64_armv8-a").Module().(*ShTest) entries = android.AndroidMkEntriesForTest(t, ctx, mod)[0] actualData = entries.EntryMap["LOCAL_TEST_DATA"] android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData) @@ -388,7 +388,7 @@ func TestDefaultsForBinaries(t *testing.T) { } `) buildOS := ctx.Config().BuildOS.String() - mod := ctx.ModuleForTests("the-host-binary", buildOS+"_x86_64").Module().(*ShBinary) + mod := ctx.ModuleForTests(t, "the-host-binary", buildOS+"_x86_64").Module().(*ShBinary) if !mod.Host() { t.Errorf("host bit is not set for a sh_binary_host module.") } @@ -396,6 +396,6 @@ func TestDefaultsForBinaries(t *testing.T) { expectedFilename := "test.sh" android.AssertStringEquals(t, "Filename", expectedFilename, *mod.properties.Filename) - mod = ctx.ModuleForTests("the-binary", "android_arm64_armv8-a").Module().(*ShBinary) + mod = ctx.ModuleForTests(t, "the-binary", "android_arm64_armv8-a").Module().(*ShBinary) android.AssertStringEquals(t, "Filename", expectedFilename, *mod.properties.Filename) } diff --git a/sysprop/sysprop_library.go b/sysprop/sysprop_library.go index df89f5c95..a398cbce2 100644 --- a/sysprop/sysprop_library.go +++ b/sysprop/sysprop_library.go @@ -462,9 +462,8 @@ func (m *syspropLibrary) AndroidMk() android.AndroidMkData { var _ android.ApexModule = (*syspropLibrary)(nil) // Implements android.ApexModule -func (m *syspropLibrary) ShouldSupportSdkVersion(ctx android.BaseModuleContext, - sdkVersion android.ApiLevel) error { - return fmt.Errorf("sysprop_library is not supposed to be part of apex modules") +func (m *syspropLibrary) MinSdkVersionSupported(ctx android.BaseModuleContext) android.ApiLevel { + return android.MinApiLevel } // sysprop_library creates schematized APIs from sysprop description files (.sysprop). diff --git a/sysprop/sysprop_test.go b/sysprop/sysprop_test.go index 7d4e69d87..06c5e9c9c 100644 --- a/sysprop/sysprop_test.go +++ b/sysprop/sysprop_test.go @@ -261,9 +261,9 @@ func TestSyspropLibrary(t *testing.T) { "android_vendor_arm64_armv8-a_shared", "android_vendor_arm64_armv8-a_static", } { - result.ModuleForTests("libsysprop-platform", variant) - result.ModuleForTests("libsysprop-vendor", variant) - result.ModuleForTests("libsysprop-odm", variant) + result.ModuleForTests(t, "libsysprop-platform", variant) + result.ModuleForTests(t, "libsysprop-vendor", variant) + result.ModuleForTests(t, "libsysprop-odm", variant) } // product variant of vendor-owned sysprop_library @@ -273,7 +273,7 @@ func TestSyspropLibrary(t *testing.T) { "android_product_arm64_armv8-a_shared", "android_product_arm64_armv8-a_static", } { - result.ModuleForTests("libsysprop-vendor-on-product", variant) + result.ModuleForTests(t, "libsysprop-vendor-on-product", variant) } for _, variant := range []string{ @@ -282,15 +282,15 @@ func TestSyspropLibrary(t *testing.T) { "android_arm64_armv8-a_shared", "android_arm64_armv8-a_static", } { - library := result.ModuleForTests("libsysprop-platform", variant).Module().(*cc.Module) + library := result.ModuleForTests(t, "libsysprop-platform", variant).Module().(*cc.Module) expectedApexAvailableOnLibrary := []string{"//apex_available:platform"} android.AssertDeepEquals(t, "apex available property on libsysprop-platform", expectedApexAvailableOnLibrary, library.ApexProperties.Apex_available) } - result.ModuleForTests("sysprop-platform", "android_common") - result.ModuleForTests("sysprop-platform_public", "android_common") - result.ModuleForTests("sysprop-vendor", "android_common") - result.ModuleForTests("sysprop-vendor-on-product", "android_common") + result.ModuleForTests(t, "sysprop-platform", "android_common") + result.ModuleForTests(t, "sysprop-platform_public", "android_common") + result.ModuleForTests(t, "sysprop-vendor", "android_common") + result.ModuleForTests(t, "sysprop-vendor-on-product", "android_common") // Check for exported includes coreVariant := "android_arm64_armv8-a_static" @@ -305,19 +305,19 @@ func TestSyspropLibrary(t *testing.T) { vendorInternalPath := "libsysprop-vendor/android_vendor_arm64_armv8-a_static/gen/sysprop/include" vendorOnProductPath := "libsysprop-vendor-on-product/android_product_arm64_armv8-a_static/gen/sysprop/public/include" - platformClient := result.ModuleForTests("cc-client-platform", coreVariant) + platformClient := result.ModuleForTests(t, "cc-client-platform", coreVariant) platformFlags := platformClient.Rule("cc").Args["cFlags"] // platform should use platform's internal header android.AssertStringDoesContain(t, "flags for platform", platformFlags, platformInternalPath) - platformStaticClient := result.ModuleForTests("cc-client-platform-static", coreVariant) + platformStaticClient := result.ModuleForTests(t, "cc-client-platform-static", coreVariant) platformStaticFlags := platformStaticClient.Rule("cc").Args["cFlags"] // platform-static should use platform's internal header android.AssertStringDoesContain(t, "flags for platform-static", platformStaticFlags, platformInternalPath) - productClient := result.ModuleForTests("cc-client-product", productVariant) + productClient := result.ModuleForTests(t, "cc-client-product", productVariant) productFlags := productClient.Rule("cc").Args["cFlags"] // Product should use platform's and vendor's public headers @@ -327,7 +327,7 @@ func TestSyspropLibrary(t *testing.T) { platformOnProductPath, vendorOnProductPath, productFlags) } - vendorClient := result.ModuleForTests("cc-client-vendor", vendorVariant) + vendorClient := result.ModuleForTests(t, "cc-client-vendor", vendorVariant) vendorFlags := vendorClient.Rule("cc").Args["cFlags"] // Vendor should use platform's public header and vendor's internal header @@ -338,8 +338,8 @@ func TestSyspropLibrary(t *testing.T) { } // Java modules linking against system API should use public stub - javaSystemApiClient := result.ModuleForTests("java-platform", "android_common").Rule("javac") - syspropPlatformPublic := result.ModuleForTests("sysprop-platform_public", "android_common").Description("for turbine") + javaSystemApiClient := result.ModuleForTests(t, "java-platform", "android_common").Rule("javac") + syspropPlatformPublic := result.ModuleForTests(t, "sysprop-platform_public", "android_common").Description("for turbine") if g, w := javaSystemApiClient.Implicits.Strings(), syspropPlatformPublic.Output.String(); !android.InList(w, g) { t.Errorf("system api client should use public stub %q, got %q", w, g) } @@ -358,15 +358,15 @@ func TestApexAvailabilityIsForwarded(t *testing.T) { expected := []string{"//apex_available:platform"} - ccModule := result.ModuleForTests("libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module) + ccModule := result.ModuleForTests(t, "libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module) propFromCc := ccModule.ApexProperties.Apex_available android.AssertDeepEquals(t, "apex_available forwarding to cc module", expected, propFromCc) - javaModule := result.ModuleForTests("sysprop-platform", "android_common").Module().(*java.Library) + javaModule := result.ModuleForTests(t, "sysprop-platform", "android_common").Module().(*java.Library) propFromJava := javaModule.ApexProperties.Apex_available android.AssertDeepEquals(t, "apex_available forwarding to java module", expected, propFromJava) - rustModule := result.ModuleForTests("libsysprop_platform_rust", "android_arm64_armv8-a_rlib_rlib-std").Module().(*rust.Module) + rustModule := result.ModuleForTests(t, "libsysprop_platform_rust", "android_arm64_armv8-a_rlib_rlib-std").Module().(*rust.Module) propFromRust := rustModule.ApexProperties.Apex_available android.AssertDeepEquals(t, "apex_available forwarding to rust module", expected, propFromRust) } @@ -390,15 +390,15 @@ func TestMinSdkVersionIsForwarded(t *testing.T) { } `) - ccModule := result.ModuleForTests("libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module) + ccModule := result.ModuleForTests(t, "libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module) propFromCc := proptools.String(ccModule.Properties.Min_sdk_version) android.AssertStringEquals(t, "min_sdk_version forwarding to cc module", "29", propFromCc) - javaModule := result.ModuleForTests("sysprop-platform", "android_common").Module().(*java.Library) + javaModule := result.ModuleForTests(t, "sysprop-platform", "android_common").Module().(*java.Library) propFromJava := javaModule.MinSdkVersionString() android.AssertStringEquals(t, "min_sdk_version forwarding to java module", "30", propFromJava) - rustModule := result.ModuleForTests("libsysprop_platform_rust", "android_arm64_armv8-a_rlib_rlib-std").Module().(*rust.Module) + rustModule := result.ModuleForTests(t, "libsysprop_platform_rust", "android_arm64_armv8-a_rlib_rlib-std").Module().(*rust.Module) propFromRust := proptools.String(rustModule.Properties.Min_sdk_version) android.AssertStringEquals(t, "min_sdk_version forwarding to rust module", "29", propFromRust) } diff --git a/systemfeatures/system_features_test.go b/systemfeatures/system_features_test.go index 558bb958e..58e6a0660 100644 --- a/systemfeatures/system_features_test.go +++ b/systemfeatures/system_features_test.go @@ -36,7 +36,7 @@ java_system_features_srcs { android.PrepareForTestWithBuildFlag("RELEASE_NOT_SYSTEM_FEATURE_FOO", "BAR"), ).RunTestWithBp(t, bp) - module := res.ModuleForTests("system-features-srcs", "") + module := res.ModuleForTests(t, "system-features-srcs", "") cmd := module.Rule("system-features-srcs").RuleParams.Command android.AssertStringDoesContain(t, "Expected fully class name", cmd, " com.android.test.RoSystemFeatures ") android.AssertStringDoesContain(t, "Expected readonly flag", cmd, "--readonly=true") diff --git a/tradefed/autogen.go b/tradefed/autogen.go index 8dd738174..89c69bd23 100644 --- a/tradefed/autogen.go +++ b/tradefed/autogen.go @@ -160,6 +160,7 @@ type AutoGenTestConfigOptions struct { DeviceTemplate string HostTemplate string HostUnitTestTemplate string + StandaloneTest *bool } func AutoGenTestConfig(ctx android.ModuleContext, options AutoGenTestConfigOptions) android.Path { @@ -178,6 +179,12 @@ func AutoGenTestConfig(ctx android.ModuleContext, options AutoGenTestConfigOptio autogenTemplate(ctx, name, autogenPath, templatePath.String(), configs, options.TestRunnerOptions, options.OutputFileName, options.TestInstallBase) } else { if ctx.Device() { + if Bool(options.StandaloneTest) { + options.TestRunnerOptions = append(options.TestRunnerOptions, Option{ + Name: "ld-library-path", + Value: "{TEST_INSTALL_BASE}/" + name + "/" + ctx.Arch().ArchType.String() + "/standalone-libs", + }) + } autogenTemplate(ctx, name, autogenPath, options.DeviceTemplate, configs, options.TestRunnerOptions, options.OutputFileName, options.TestInstallBase) } else { if Bool(options.UnitTest) { @@ -190,10 +197,10 @@ func AutoGenTestConfig(ctx android.ModuleContext, options AutoGenTestConfigOptio return autogenPath } if len(options.OptionsForAutogenerated) > 0 { - ctx.ModuleErrorf("Extra tradefed configurations (%v) were provided for an autogenerated xml file, but the autogenerated xml file was not used.", options.OptionsForAutogenerated) + ctx.ModuleErrorf("You likely need to delete your soong modules local AndroidTest.xml file. Extra tradefed configurations (%v) were provided for an autogenerated xml file, but the autogenerated xml file was not used.", options.OptionsForAutogenerated) } if len(options.TestRunnerOptions) > 0 { - ctx.ModuleErrorf("Extra test runner options (%v) were provided for an autogenerated xml file, but the autogenerated xml file was not used.", options.TestRunnerOptions) + ctx.ModuleErrorf("You likely need to delete your soong modules local AndroidTest.xml file. Extra test runner options (%v) were provided for an autogenerated xml file, but the autogenerated xml file was not used.", options.TestRunnerOptions) } return path } diff --git a/tradefed_modules/test_module_config_test.go b/tradefed_modules/test_module_config_test.go index 037dcea04..302f9a9d5 100644 --- a/tradefed_modules/test_module_config_test.go +++ b/tradefed_modules/test_module_config_test.go @@ -65,13 +65,13 @@ func TestModuleConfigAndroidTest(t *testing.T) { android.FixtureRegisterWithContext(RegisterTestModuleConfigBuildComponents), ).RunTestWithBp(t, bp) - derived := ctx.ModuleForTests("derived_test", variant) + derived := ctx.ModuleForTests(t, "derived_test", variant) // Assert there are rules to create these files. derived.Output("test_module_config.manifest") derived.Output("test_config_fixer/derived_test.config") // Ensure some basic rules exist. - ctx.ModuleForTests("base", "android_common").Output("package-res.apk") + ctx.ModuleForTests(t, "base", "android_common").Output("package-res.apk") entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, derived.Module())[0] // Ensure some entries from base are there, specifically support files for data and helper apps. @@ -136,7 +136,7 @@ func TestModuleConfigShTest(t *testing.T) { options: [{name: "SomeName", value: "OptionValue"}], } `) - derived := ctx.ModuleForTests("conch", variant) // + derived := ctx.ModuleForTests(t, "conch", variant) // conch := derived.Module().(*testModuleConfigModule) android.AssertArrayString(t, "TestcaseRelDataFiles", []string{"arm64/testdata/data1", "arm64/testdata/sub/data2"}, conch.provider.TestcaseRelDataFiles) android.AssertStringEquals(t, "Rel OutputFile", "test.sh", conch.provider.OutputFile.Rel()) @@ -191,7 +191,7 @@ func TestModuleConfigOptions(t *testing.T) { ).RunTestWithBp(t, bp) // Check that we generate a rule to make a new AndroidTest.xml/Module.config file. - derived := ctx.ModuleForTests("derived_test", variant) + derived := ctx.ModuleForTests(t, "derived_test", variant) rule_cmd := derived.Rule("fix_test_config").RuleParams.Command android.AssertStringDoesContain(t, "Bad FixConfig rule inputs", rule_cmd, `--test-runner-options='[{"Name":"exclude-filter","Key":"","Value":"android.test.example.devcodelab.DevCodelabTest#testHelloFail"},{"Name":"include-annotation","Key":"","Value":"android.platform.test.annotations.LargeTest"}]'`) @@ -288,7 +288,7 @@ func TestModuleConfigNoFiltersOrAnnotationsShouldFail(t *testing.T) { ).ExtendWithErrorHandler( android.FixtureExpectsAtLeastOneErrorMatchingPattern("Test options must be given")). RunTestWithBp(t, badBp) - ctx.ModuleForTests("derived_test", variant) + ctx.ModuleForTests(t, "derived_test", variant) } func TestModuleConfigMultipleDerivedTestsWriteDistinctMakeEntries(t *testing.T) { @@ -326,7 +326,7 @@ func TestModuleConfigMultipleDerivedTestsWriteDistinctMakeEntries(t *testing.T) ).RunTestWithBp(t, multiBp) { - derived := ctx.ModuleForTests("derived_test", variant) + derived := ctx.ModuleForTests(t, "derived_test", variant) entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, derived.Module())[0] // All these should be the same in both derived tests android.AssertStringPathsRelativeToTopEquals(t, "support-files", ctx.Config, @@ -342,7 +342,7 @@ func TestModuleConfigMultipleDerivedTestsWriteDistinctMakeEntries(t *testing.T) } { - derived := ctx.ModuleForTests("another_derived_test", variant) + derived := ctx.ModuleForTests(t, "another_derived_test", variant) entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, derived.Module())[0] // All these should be the same in both derived tests android.AssertStringPathsRelativeToTopEquals(t, "support-files", ctx.Config, @@ -381,7 +381,7 @@ func TestModuleConfigHostBasics(t *testing.T) { ).RunTestWithBp(t, bp) variant := ctx.Config.BuildOS.String() + "_common" - derived := ctx.ModuleForTests("derived_test", variant) + derived := ctx.ModuleForTests(t, "derived_test", variant) mod := derived.Module().(*testModuleConfigHostModule) allEntries := android.AndroidMkEntriesForTest(t, ctx.TestContext, mod) entries := allEntries[0] diff --git a/tradefed_modules/test_suite_test.go b/tradefed_modules/test_suite_test.go index 3c0a9eb2c..3e1472cee 100644 --- a/tradefed_modules/test_suite_test.go +++ b/tradefed_modules/test_suite_test.go @@ -46,7 +46,7 @@ func TestTestSuites(t *testing.T) { ] } `) - manifestPath := ctx.ModuleForTests("my-suite", "android_common").Output("out/soong/test_suites/my-suite/my-suite.json") + manifestPath := ctx.ModuleForTests(t, "my-suite", "android_common").Output("out/soong/test_suites/my-suite/my-suite.json") var actual testSuiteManifest if err := json.Unmarshal([]byte(android.ContentFromFileRuleForTests(t, ctx.TestContext, manifestPath)), &actual); err != nil { t.Errorf("failed to unmarshal manifest: %v", err) @@ -106,7 +106,7 @@ func TestTestSuitesWithNested(t *testing.T) { ] } `) - manifestPath := ctx.ModuleForTests("my-all-tests-suite", "android_common").Output("out/soong/test_suites/my-all-tests-suite/my-all-tests-suite.json") + manifestPath := ctx.ModuleForTests(t, "my-all-tests-suite", "android_common").Output("out/soong/test_suites/my-all-tests-suite/my-all-tests-suite.json") var actual testSuiteManifest if err := json.Unmarshal([]byte(android.ContentFromFileRuleForTests(t, ctx.TestContext, manifestPath)), &actual); err != nil { t.Errorf("failed to unmarshal manifest: %v", err) diff --git a/ui/build/build.go b/ui/build/build.go index ea867826c..781ca182f 100644 --- a/ui/build/build.go +++ b/ui/build/build.go @@ -401,6 +401,7 @@ func Build(ctx Context, config Config) { if what&RunKati != 0 { installCleanIfNecessary(ctx, config) } + partialCompileCleanIfNecessary(ctx, config) runNinjaForBuild(ctx, config) updateBuildIdDir(ctx, config) } @@ -427,6 +428,9 @@ func evaluateWhatToRun(config Config, verboseln func(v ...interface{})) int { if config.Checkbuild() { what |= RunBuildTests } + if value, ok := config.environ.Get("RUN_BUILD_TESTS"); ok && value == "true" { + what |= RunBuildTests + } if !config.SkipConfig() { what |= RunProductConfig } else { diff --git a/ui/build/cleanbuild.go b/ui/build/cleanbuild.go index 41cb5ab6d..723d90fa3 100644 --- a/ui/build/cleanbuild.go +++ b/ui/build/cleanbuild.go @@ -218,6 +218,52 @@ func installCleanIfNecessary(ctx Context, config Config) { writeConfig() } +// When SOONG_USE_PARTIAL_COMPILE transitions from on to off, we need to remove +// all files which were potentially built with partial compile, so that they +// get rebuilt with that turned off. +func partialCompileCleanIfNecessary(ctx Context, config Config) { + configFile := config.DevicePreviousUsePartialCompile() + currentValue, _ := config.Environment().Get("SOONG_USE_PARTIAL_COMPILE") + + ensureDirectoriesExist(ctx, filepath.Dir(configFile)) + + writeValue := func() { + err := ioutil.WriteFile(configFile, []byte(currentValue), 0666) // a+rw + if err != nil { + ctx.Fatalln("Failed to write use partial compile config:", err) + } + } + + previousValueBytes, err := ioutil.ReadFile(configFile) + if err != nil { + if os.IsNotExist(err) { + // Just write the new config file, no old config file to worry about. + writeValue() + return + } else { + ctx.Fatalln("Failed to read previous use partial compile config:", err) + } + } + + previousValue := string(previousValueBytes) + switch previousValue { + case currentValue: + // Same value as before - nothing left to do here. + return + case "true": + // Transitioning from on to off. Build (phony) target: partialcompileclean. + ctx.BeginTrace(metrics.PrimaryNinja, "partialcompileclean") + defer ctx.EndTrace() + + ctx.Printf("SOONG_USE_PARTIAL_COMPILE turned off, forcing partialcompileclean\n") + + runNinja(ctx, config, []string{"partialcompileclean"}) + default: + // Transitioning from off to on. Nothing to do in this case. + } + writeValue() +} + // cleanOldFiles takes an input file (with all paths relative to basePath), and removes files from // the filesystem if they were removed from the input file since the last execution. func cleanOldFiles(ctx Context, basePath, newFile string) { diff --git a/ui/build/config.go b/ui/build/config.go index 2a00c4124..a4f778d74 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -1685,6 +1685,10 @@ func (c *configImpl) DevicePreviousProductConfig() string { return filepath.Join(c.ProductOut(), "previous_build_config.mk") } +func (c *configImpl) DevicePreviousUsePartialCompile() string { + return filepath.Join(c.ProductOut(), "previous_use_partial_compile.txt") +} + func (c *configImpl) KatiPackageMkDir() string { return filepath.Join(c.SoongOutDir(), "kati_packaging"+c.KatiSuffix()) } diff --git a/ui/build/ninja.go b/ui/build/ninja.go index 1d4285f2c..e2a568fad 100644 --- a/ui/build/ninja.go +++ b/ui/build/ninja.go @@ -36,10 +36,16 @@ const ( ninjaWeightListFileName = ".ninja_weight_list" ) +// Runs ninja with the arguments from the command line, as found in +// config.NinjaArgs(). +func runNinjaForBuild(ctx Context, config Config) { + runNinja(ctx, config, config.NinjaArgs()) +} + // Constructs and runs the Ninja command line with a restricted set of // environment variables. It's important to restrict the environment Ninja runs // for hermeticity reasons, and to avoid spurious rebuilds. -func runNinjaForBuild(ctx Context, config Config) { +func runNinja(ctx Context, config Config, ninjaArgs []string) { ctx.BeginTrace(metrics.PrimaryNinja, "ninja") defer ctx.EndTrace() @@ -88,7 +94,7 @@ func runNinjaForBuild(ctx Context, config Config) { "-w", "missingdepfile=err", } } - args = append(args, config.NinjaArgs()...) + args = append(args, ninjaArgs...) var parallel int if config.UseRemoteBuild() { @@ -244,6 +250,8 @@ func runNinjaForBuild(ctx Context, config Config) { "RUST_LOG", // SOONG_USE_PARTIAL_COMPILE only determines which half of the rule we execute. + // When it transitions true => false, we build phony target "partialcompileclean", + // which removes all files that could have been created while it was true. "SOONG_USE_PARTIAL_COMPILE", // Directory for ExecutionMetrics diff --git a/ui/build/test_build.go b/ui/build/test_build.go index 7a2fd1668..87bec93a2 100644 --- a/ui/build/test_build.go +++ b/ui/build/test_build.go @@ -76,8 +76,10 @@ func testForDanglingRules(ctx Context, config Config) { // treated as an source file. dexpreoptConfigFilePath := filepath.Join(outDir, "soong", "dexpreopt.config") - // out/build_date.txt is considered a "source file" + // out/build_(date|hostname|number).txt is considered a "source file" buildDatetimeFilePath := filepath.Join(outDir, "build_date.txt") + buildHostnameFilePath := filepath.Join(outDir, "soong", "build_hostname.txt") + buildNumberFilePath := filepath.Join(outDir, "soong", "build_number.txt") // release-config files are generated from the initial lunch or Kati phase // before running soong and ninja. @@ -102,6 +104,8 @@ func testForDanglingRules(ctx Context, config Config) { line == extraVariablesFilePath || line == dexpreoptConfigFilePath || line == buildDatetimeFilePath || + line == buildHostnameFilePath || + line == buildNumberFilePath || strings.HasPrefix(line, releaseConfigDir) || buildFingerPrintFilePattern.MatchString(line) { // Leaf node is in one of Soong's bootstrap directories, which do not have diff --git a/xml/xml_test.go b/xml/xml_test.go index 9f28315b7..212b0c5af 100644 --- a/xml/xml_test.go +++ b/xml/xml_test.go @@ -71,7 +71,7 @@ func TestPrebuiltEtcXml(t *testing.T) { {rule: "xmllint-minimal", input: "baz.xml"}, } { t.Run(tc.schemaType, func(t *testing.T) { - rule := result.ModuleForTests(tc.input, "android_arm64_armv8-a").Rule(tc.rule) + rule := result.ModuleForTests(t, tc.input, "android_arm64_armv8-a").Rule(tc.rule) android.AssertStringEquals(t, "input", tc.input, rule.Input.String()) if tc.schemaType != "" { android.AssertStringEquals(t, "schema", tc.schema, rule.Args[tc.schemaType]) @@ -79,6 +79,6 @@ func TestPrebuiltEtcXml(t *testing.T) { }) } - m := result.ModuleForTests("foo.xml", "android_arm64_armv8-a").Module().(*prebuiltEtcXml) + m := result.ModuleForTests(t, "foo.xml", "android_arm64_armv8-a").Module().(*prebuiltEtcXml) android.AssertPathRelativeToTopEquals(t, "installDir", "out/target/product/test_device/system/etc", m.InstallDirPath()) } diff --git a/zip/cmd/main.go b/zip/cmd/main.go index 37537ab8b..831f6d421 100644 --- a/zip/cmd/main.go +++ b/zip/cmd/main.go @@ -164,6 +164,7 @@ func main() { directories := flags.Bool("d", false, "include directories in zip") compLevel := flags.Int("L", 5, "deflate compression level (0-9)") emulateJar := flags.Bool("jar", false, "modify the resultant .zip to emulate the output of 'jar'") + sortEntries := flags.Bool("sort_entries", false, "sort the zip entries") writeIfChanged := flags.Bool("write_if_changed", false, "only update resultant .zip if it has changed") ignoreMissingFiles := flags.Bool("ignore_missing_files", false, "continue if a requested file does not exist") symlinks := flags.Bool("symlinks", true, "store symbolic links in zip instead of following them") @@ -228,6 +229,7 @@ func main() { FileArgs: fileArgsBuilder.FileArgs(), OutputFilePath: *out, EmulateJar: *emulateJar, + SortEntries: *sortEntries, SrcJar: *srcJar, AddDirectoryEntriesToZip: *directories, CompressionLevel: *compLevel, diff --git a/zip/zip.go b/zip/zip.go index f91a5f2cb..e4e9585d5 100644 --- a/zip/zip.go +++ b/zip/zip.go @@ -272,6 +272,7 @@ type ZipArgs struct { FileArgs []FileArg OutputFilePath string EmulateJar bool + SortEntries bool SrcJar bool AddDirectoryEntriesToZip bool CompressionLevel int @@ -394,7 +395,7 @@ func zipTo(args ZipArgs, w io.Writer) error { } } - return z.write(w, pathMappings, args.ManifestSourcePath, args.EmulateJar, args.SrcJar, args.NumParallelJobs) + return z.write(w, pathMappings, args.ManifestSourcePath, args.EmulateJar, args.SortEntries, args.SrcJar, args.NumParallelJobs) } // Zip creates an output zip archive from given sources. @@ -481,7 +482,8 @@ func jarSort(mappings []pathMapping) { }) } -func (z *ZipWriter) write(f io.Writer, pathMappings []pathMapping, manifest string, emulateJar, srcJar bool, +func (z *ZipWriter) write(f io.Writer, pathMappings []pathMapping, manifest string, + emulateJar, sortEntries, srcJar bool, parallelJobs int) error { z.errors = make(chan error) @@ -511,12 +513,20 @@ func (z *ZipWriter) write(f io.Writer, pathMappings []pathMapping, manifest stri return errors.New("must specify --jar when specifying a manifest via -m") } + if emulateJar && sortEntries { + return errors.New("Cannot specify both --jar and --sort_entries (--jar implies sorting with a different algorithm)") + } if emulateJar { // manifest may be empty, in which case addManifest will fill in a default pathMappings = append(pathMappings, pathMapping{jar.ManifestFile, manifest, zip.Deflate}) jarSort(pathMappings) } + if sortEntries { + sort.SliceStable(pathMappings, func(i int, j int) bool { + return pathMappings[i].dest < pathMappings[j].dest + }) + } go func() { var err error |