diff options
| -rw-r--r-- | aconfig/codegen/cc_aconfig_library_test.go | 17 | ||||
| -rw-r--r-- | android/config.go | 4 | ||||
| -rw-r--r-- | android/selects_test.go | 52 | ||||
| -rw-r--r-- | android/soongconfig/modules.go | 15 | ||||
| -rw-r--r-- | apex/aconfig_test.go | 13 | ||||
| -rw-r--r-- | apex/apex_test.go | 4 | ||||
| -rw-r--r-- | apex/platform_bootclasspath_test.go | 30 | ||||
| -rw-r--r-- | apex/prebuilt.go | 8 | ||||
| -rw-r--r-- | cc/builder.go | 2 | ||||
| -rw-r--r-- | cc/config/toolchain.go | 54 | ||||
| -rw-r--r-- | cc/fuzz.go | 4 | ||||
| -rw-r--r-- | cc/linker.go | 4 | ||||
| -rw-r--r-- | cc/makevars.go | 44 | ||||
| -rw-r--r-- | cc/sanitize.go | 152 | ||||
| -rw-r--r-- | java/java.go | 6 | ||||
| -rw-r--r-- | java/sdk.go | 6 |
16 files changed, 296 insertions, 119 deletions
diff --git a/aconfig/codegen/cc_aconfig_library_test.go b/aconfig/codegen/cc_aconfig_library_test.go index d01d13b61..2f6c1a643 100644 --- a/aconfig/codegen/cc_aconfig_library_test.go +++ b/aconfig/codegen/cc_aconfig_library_test.go @@ -74,11 +74,6 @@ func testCCCodegenModeHelper(t *testing.T, bpMode string, ruleMode string) { srcs: ["libaconfig_storage_read_api_cc.cc"], } - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - } - cc_aconfig_library { name: "my_cc_aconfig_library", aconfig_declarations: "my_aconfig_declarations", @@ -137,12 +132,6 @@ func testIncorrectCCCodegenModeHelper(t *testing.T, bpMode string, err string) { srcs: ["libaconfig_storage_read_api_cc.cc"], } - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - } - - cc_aconfig_library { name: "my_cc_aconfig_library", aconfig_declarations: "my_aconfig_declarations", @@ -214,12 +203,6 @@ func TestAndroidMkCcLibrary(t *testing.T) { srcs: ["libaconfig_storage_read_api_cc.cc"], vendor_available: true, } - - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - vendor_available: true, - } ` result := android.GroupFixturePreparers( PrepareForTestWithAconfigBuildComponents, diff --git a/android/config.go b/android/config.go index 76c590ad9..600745162 100644 --- a/android/config.go +++ b/android/config.go @@ -827,6 +827,10 @@ func (c *config) IsEnvFalse(key string) bool { return value == "0" || value == "n" || value == "no" || value == "off" || value == "false" } +func (c *config) TargetsJava21() bool { + return c.IsEnvTrue("EXPERIMENTAL_TARGET_JAVA_VERSION_21") +} + // EnvDeps returns the environment variables this build depends on. The first // call to this function blocks future reads from the environment. func (c *config) EnvDeps() map[string]string { diff --git a/android/selects_test.go b/android/selects_test.go index 87ba42a94..6f980ce4c 100644 --- a/android/selects_test.go +++ b/android/selects_test.go @@ -729,6 +729,55 @@ func TestSelects(t *testing.T) { }, }, }, + { + name: "Soong config value variable on configurable property", + bp: ` + soong_config_module_type { + name: "soong_config_my_module_type", + module_type: "my_module_type", + config_namespace: "my_namespace", + value_variables: ["my_variable"], + properties: ["my_string", "my_string_list"], + } + + soong_config_my_module_type { + name: "foo", + my_string_list: ["before.cpp"], + soong_config_variables: { + my_variable: { + my_string_list: ["after_%s.cpp"], + my_string: "%s.cpp", + }, + }, + } + `, + provider: selectsTestProvider{ + my_string: proptools.StringPtr("foo.cpp"), + my_string_list: &[]string{"before.cpp", "after_foo.cpp"}, + }, + vendorVars: map[string]map[string]string{ + "my_namespace": { + "my_variable": "foo", + }, + }, + }, + { + name: "Property appending with variable", + bp: ` + my_variable = ["b.cpp"] + my_module_type { + name: "foo", + my_string_list: ["a.cpp"] + my_variable + select(soong_config_variable("my_namespace", "my_variable"), { + "a": ["a.cpp"], + "b": ["b.cpp"], + default: ["c.cpp"], + }), + } + `, + provider: selectsTestProvider{ + my_string_list: &[]string{"a.cpp", "b.cpp", "c.cpp"}, + }, + }, } for _, tc := range testCases { @@ -736,6 +785,7 @@ func TestSelects(t *testing.T) { fixtures := GroupFixturePreparers( PrepareForTestWithDefaults, PrepareForTestWithArchMutator, + PrepareForTestWithSoongConfigModuleBuildComponents, FixtureRegisterWithContext(func(ctx RegistrationContext) { ctx.RegisterModuleType("my_module_type", newSelectsMockModule) ctx.RegisterModuleType("my_defaults", newSelectsMockModuleDefaults) @@ -790,7 +840,7 @@ func (p *selectsTestProvider) String() string { myStringStr = *p.my_string } myNonconfigurableStringStr := "nil" - if p.my_string != nil { + if p.my_nonconfigurable_string != nil { myNonconfigurableStringStr = *p.my_nonconfigurable_string } return fmt.Sprintf(`selectsTestProvider { diff --git a/android/soongconfig/modules.go b/android/soongconfig/modules.go index c910974f6..87af774fd 100644 --- a/android/soongconfig/modules.go +++ b/android/soongconfig/modules.go @@ -733,11 +733,18 @@ func (s *valueVariable) printfIntoPropertyRecursive(fieldName []string, propStru case reflect.Bool: // Nothing to do case reflect.Struct: - fieldName = append(fieldName, propStruct.Type().Field(i).Name) - if err := s.printfIntoPropertyRecursive(fieldName, field, configValue); err != nil { - return err + if proptools.IsConfigurable(field.Type()) { + if err := proptools.PrintfIntoConfigurable(field.Interface(), configValue); err != nil { + fieldName = append(fieldName, propStruct.Type().Field(i).Name) + return fmt.Errorf("soong_config_variables.%s.%s: %s", s.variable, strings.Join(fieldName, "."), err) + } + } else { + fieldName = append(fieldName, propStruct.Type().Field(i).Name) + if err := s.printfIntoPropertyRecursive(fieldName, field, configValue); err != nil { + return err + } + fieldName = fieldName[:len(fieldName)-1] } - fieldName = fieldName[:len(fieldName)-1] default: fieldName = append(fieldName, propStruct.Type().Field(i).Name) return fmt.Errorf("soong_config_variables.%s.%s: unsupported property type %q", s.variable, strings.Join(fieldName, "."), kind) diff --git a/apex/aconfig_test.go b/apex/aconfig_test.go index 726041c60..14c0b6394 100644 --- a/apex/aconfig_test.go +++ b/apex/aconfig_test.go @@ -23,6 +23,7 @@ import ( "android/soong/genrule" "android/soong/java" "android/soong/rust" + "github.com/google/blueprint/proptools" ) @@ -173,10 +174,6 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) { name: "libaconfig_storage_read_api_cc", srcs: ["libaconfig_storage_read_api_cc.cc"], } - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - } aconfig_declarations { name: "my_aconfig_declarations_bar", package: "com.example.package", @@ -436,10 +433,6 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { name: "libaconfig_storage_read_api_cc", srcs: ["libaconfig_storage_read_api_cc.cc"], } - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - } aconfig_declarations { name: "my_aconfig_declarations_foo", package: "com.example.package", @@ -501,10 +494,6 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { name: "libaconfig_storage_read_api_cc", srcs: ["libaconfig_storage_read_api_cc.cc"], } - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - } aconfig_declarations { name: "my_aconfig_declarations_foo", package: "com.example.package", diff --git a/apex/apex_test.go b/apex/apex_test.go index 965b4be24..4cac0ccd4 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -10709,10 +10709,6 @@ func TestAconfigFilesJavaAndCcDeps(t *testing.T) { name: "libaconfig_storage_read_api_cc", srcs: ["libaconfig_storage_read_api_cc.cc"], } - cc_library { - name: "libaconfig_storage_protos_cc", - srcs: ["libaconfig_storage_protos_cc.cc"], - } `) mod := ctx.ModuleForTests("myapex", "android_common_myapex") diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go index 9f1e1e16f..4a20cf0e3 100644 --- a/apex/platform_bootclasspath_test.go +++ b/apex/platform_bootclasspath_test.go @@ -865,6 +865,36 @@ func TestNonBootJarMissingInPrebuiltFragment(t *testing.T) { }, } + // Another prebuilt apex, but this is not selected during the build. + prebuilt_apex { + name: "com.google.android.myapex.v2", // mainline prebuilt selection logic in soong relies on the naming convention com.google.android + apex_name: "myapex", + source_apex_name: "myapex", + src: "myapex.apex", + exported_bootclasspath_fragments: ["apex-fragment.v2"], + } + + java_import { + name: "bar", + jars: ["bar.jar"], + apex_available: ["myapex"], + permitted_packages: ["bar"], + } + + prebuilt_bootclasspath_fragment { + name: "apex-fragment.v2", + contents: ["bar"], // Unlike the source fragment, this is missing foo + apex_available:[ "myapex" ], + hidden_api: { + annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", + metadata: "my-bootclasspath-fragment/metadata.csv", + index: "my-bootclasspath-fragment/index.csv", + stub_flags: "my-bootclasspath-fragment/stub-flags.csv", + all_flags: "my-bootclasspath-fragment/all-flags.csv", + }, + } + + apex_contributions { name: "my_apex_contributions", api_domain: "myapex", diff --git a/apex/prebuilt.go b/apex/prebuilt.go index b2afa3933..9ad5159b5 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -848,7 +848,9 @@ func validateApexClasspathFragments(ctx android.ModuleContext) { func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Validate contents of classpath fragments - validateApexClasspathFragments(ctx) + if !p.IsHideFromMake() { + validateApexClasspathFragments(ctx) + } p.apexKeysPath = writeApexKeys(ctx, p) // TODO(jungjw): Check the key validity. @@ -1074,7 +1076,9 @@ func (a *ApexSet) ApexInfoMutator(mctx android.TopDownMutatorContext) { func (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Validate contents of classpath fragments - validateApexClasspathFragments(ctx) + if !a.IsHideFromMake() { + validateApexClasspathFragments(ctx) + } a.apexKeysPath = writeApexKeys(ctx, a) a.installFilename = a.InstallFilename() diff --git a/cc/builder.go b/cc/builder.go index d817d8257..7a3394a4d 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -638,7 +638,7 @@ func transformSourceToObj(ctx ModuleContext, subdir string, srcFiles, noTidySrcs ccCmd = "${config.ClangBin}/" + ccCmd if flags.clangVerify { - postCmd = " && touch $$out" + postCmd = " && touch " + objFile.String() } var implicitOutputs android.WritablePaths diff --git a/cc/config/toolchain.go b/cc/config/toolchain.go index 7dc990b71..5d8c351ab 100644 --- a/cc/config/toolchain.go +++ b/cc/config/toolchain.go @@ -209,58 +209,58 @@ func addPrefix(list []string, prefix string) []string { return list } -func LibclangRuntimeLibrary(t Toolchain, library string) string { +func LibclangRuntimeLibrary(library string) string { return "libclang_rt." + library } -func BuiltinsRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "builtins") +func BuiltinsRuntimeLibrary() string { + return LibclangRuntimeLibrary("builtins") } -func AddressSanitizerRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "asan") +func AddressSanitizerRuntimeLibrary() string { + return LibclangRuntimeLibrary("asan") } -func AddressSanitizerStaticRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "asan.static") +func AddressSanitizerStaticRuntimeLibrary() string { + return LibclangRuntimeLibrary("asan.static") } -func AddressSanitizerCXXStaticRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "asan_cxx.static") +func AddressSanitizerCXXStaticRuntimeLibrary() string { + return LibclangRuntimeLibrary("asan_cxx.static") } -func HWAddressSanitizerRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "hwasan") +func HWAddressSanitizerRuntimeLibrary() string { + return LibclangRuntimeLibrary("hwasan") } -func HWAddressSanitizerStaticLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "hwasan_static") +func HWAddressSanitizerStaticLibrary() string { + return LibclangRuntimeLibrary("hwasan_static") } -func UndefinedBehaviorSanitizerRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "ubsan_standalone") +func UndefinedBehaviorSanitizerRuntimeLibrary() string { + return LibclangRuntimeLibrary("ubsan_standalone") } -func UndefinedBehaviorSanitizerMinimalRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "ubsan_minimal") +func UndefinedBehaviorSanitizerMinimalRuntimeLibrary() string { + return LibclangRuntimeLibrary("ubsan_minimal") } -func ThreadSanitizerRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "tsan") +func ThreadSanitizerRuntimeLibrary() string { + return LibclangRuntimeLibrary("tsan") } -func ScudoRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "scudo") +func ScudoRuntimeLibrary() string { + return LibclangRuntimeLibrary("scudo") } -func ScudoMinimalRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "scudo_minimal") +func ScudoMinimalRuntimeLibrary() string { + return LibclangRuntimeLibrary("scudo_minimal") } -func LibFuzzerRuntimeLibrary(t Toolchain) string { - return LibclangRuntimeLibrary(t, "fuzzer") +func LibFuzzerRuntimeLibrary() string { + return LibclangRuntimeLibrary("fuzzer") } -func LibFuzzerRuntimeInterceptors(t Toolchain) string { - return LibclangRuntimeLibrary(t, "fuzzer_interceptors") +func LibFuzzerRuntimeInterceptors() string { + return LibclangRuntimeLibrary("fuzzer_interceptors") } diff --git a/cc/fuzz.go b/cc/fuzz.go index 164ec997b..92f2c5e44 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -128,13 +128,13 @@ func (fuzzBin *fuzzBinary) linkerDeps(ctx DepsContext, deps Deps) Deps { if ctx.Config().Getenv("FUZZ_FRAMEWORK") == "AFL" { deps.HeaderLibs = append(deps.HeaderLibs, "libafl_headers") } else { - deps.StaticLibs = append(deps.StaticLibs, config.LibFuzzerRuntimeLibrary(ctx.toolchain())) + deps.StaticLibs = append(deps.StaticLibs, config.LibFuzzerRuntimeLibrary()) // Fuzzers built with HWASAN should use the interceptors for better // mutation based on signals in strcmp, memcpy, etc. This is only needed for // fuzz targets, not generic HWASAN-ified binaries or libraries. if module, ok := ctx.Module().(*Module); ok { if module.IsSanitizerEnabled(Hwasan) { - deps.StaticLibs = append(deps.StaticLibs, config.LibFuzzerRuntimeInterceptors(ctx.toolchain())) + deps.StaticLibs = append(deps.StaticLibs, config.LibFuzzerRuntimeInterceptors()) } } } diff --git a/cc/linker.go b/cc/linker.go index f325c125d..1b5a33a9f 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -431,7 +431,7 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { if ctx.toolchain().Bionic() { // libclang_rt.builtins has to be last on the command line if linker.Properties.libCrt() && !ctx.header() { - deps.UnexportedStaticLibs = append(deps.UnexportedStaticLibs, config.BuiltinsRuntimeLibrary(ctx.toolchain())) + deps.UnexportedStaticLibs = append(deps.UnexportedStaticLibs, config.BuiltinsRuntimeLibrary()) } if inList("libdl", deps.SharedLibs) { @@ -454,7 +454,7 @@ func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps { } } else if ctx.toolchain().Musl() { if linker.Properties.libCrt() && !ctx.header() { - deps.UnexportedStaticLibs = append(deps.UnexportedStaticLibs, config.BuiltinsRuntimeLibrary(ctx.toolchain())) + deps.UnexportedStaticLibs = append(deps.UnexportedStaticLibs, config.BuiltinsRuntimeLibrary()) } } diff --git a/cc/makevars.go b/cc/makevars.go index 51bcbf090..9d29affcd 100644 --- a/cc/makevars.go +++ b/cc/makevars.go @@ -28,6 +28,16 @@ var ( modulesWarningsAllowedKey = android.NewOnceKey("ModulesWarningsAllowed") modulesUsingWnoErrorKey = android.NewOnceKey("ModulesUsingWnoError") modulesMissingProfileFileKey = android.NewOnceKey("ModulesMissingProfileFile") + sanitizerVariables = map[string]string{ + "ADDRESS_SANITIZER_RUNTIME_LIBRARY": config.AddressSanitizerRuntimeLibrary(), + "HWADDRESS_SANITIZER_RUNTIME_LIBRARY": config.HWAddressSanitizerRuntimeLibrary(), + "HWADDRESS_SANITIZER_STATIC_LIBRARY": config.HWAddressSanitizerStaticLibrary(), + "UBSAN_RUNTIME_LIBRARY": config.UndefinedBehaviorSanitizerRuntimeLibrary(), + "UBSAN_MINIMAL_RUNTIME_LIBRARY": config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(), + "TSAN_RUNTIME_LIBRARY": config.ThreadSanitizerRuntimeLibrary(), + "SCUDO_RUNTIME_LIBRARY": config.ScudoRuntimeLibrary(), + "SCUDO_MINIMAL_RUNTIME_LIBRARY": config.ScudoMinimalRuntimeLibrary(), + } ) func init() { @@ -261,43 +271,9 @@ func makeVarsToolchain(ctx android.MakeVarsContext, secondPrefix string, }, " ")) if target.Os.Class == android.Device { - sanitizerVariables := map[string]string{ - "ADDRESS_SANITIZER_RUNTIME_LIBRARY": config.AddressSanitizerRuntimeLibrary(toolchain), - "HWADDRESS_SANITIZER_RUNTIME_LIBRARY": config.HWAddressSanitizerRuntimeLibrary(toolchain), - "HWADDRESS_SANITIZER_STATIC_LIBRARY": config.HWAddressSanitizerStaticLibrary(toolchain), - "UBSAN_RUNTIME_LIBRARY": config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain), - "UBSAN_MINIMAL_RUNTIME_LIBRARY": config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(toolchain), - "TSAN_RUNTIME_LIBRARY": config.ThreadSanitizerRuntimeLibrary(toolchain), - "SCUDO_RUNTIME_LIBRARY": config.ScudoRuntimeLibrary(toolchain), - "SCUDO_MINIMAL_RUNTIME_LIBRARY": config.ScudoMinimalRuntimeLibrary(toolchain), - } - for variable, value := range sanitizerVariables { ctx.Strict(secondPrefix+variable, value) } - - sanitizerLibs := android.SortedStringValues(sanitizerVariables) - var sanitizerLibStems []string - ctx.VisitAllModules(func(m android.Module) { - if !m.Enabled(ctx) { - return - } - - ccModule, _ := m.(*Module) - if ccModule == nil || ccModule.library == nil || !ccModule.library.shared() { - return - } - - if android.InList(strings.TrimPrefix(ctx.ModuleName(m), "prebuilt_"), sanitizerLibs) && - m.Target().Os == target.Os && m.Target().Arch.ArchType == target.Arch.ArchType { - outputFile := ccModule.outputFile - if outputFile.Valid() { - sanitizerLibStems = append(sanitizerLibStems, outputFile.Path().Base()) - } - } - }) - sanitizerLibStems = android.SortedUniqueStrings(sanitizerLibStems) - ctx.Strict(secondPrefix+"SANITIZER_STEMS", strings.Join(sanitizerLibStems, " ")) } // This is used by external/gentoo/... diff --git a/cc/sanitize.go b/cc/sanitize.go index 1a94729c6..e6075ada4 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -25,6 +25,7 @@ import ( "android/soong/android" "android/soong/cc/config" + "android/soong/etc" ) var ( @@ -408,6 +409,8 @@ func init() { android.RegisterMakeVarsProvider(pctx, cfiMakeVarsProvider) android.RegisterMakeVarsProvider(pctx, hwasanMakeVarsProvider) android.RegisterMakeVarsProvider(pctx, memtagStackMakeVarsProvider) + + RegisterSanitizerLibrariesTxtType(android.InitRegistrationContext) } func (sanitize *sanitize) props() []interface{} { @@ -1316,7 +1319,7 @@ func (s *sanitizerSplitMutator) Mutate(mctx android.BottomUpMutatorContext, vari } else if s.sanitizer == cfi { cfiStaticLibs(mctx.Config()).add(c, c.Module().Name()) } else if s.sanitizer == Memtag_stack { - memtagStackStaticLibs(mctx.Config()).add(c, c.Module().Name()); + memtagStackStaticLibs(mctx.Config()).add(c, c.Module().Name()) } } } else if c.IsSanitizerEnabled(s.sanitizer) { @@ -1522,25 +1525,25 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { if Bool(sanProps.Address) { if toolchain.Musl() || (c.staticBinary() && toolchain.Bionic()) { // Use a static runtime for musl to match what clang does for glibc. - addStaticDeps(config.AddressSanitizerStaticRuntimeLibrary(toolchain), false) - addStaticDeps(config.AddressSanitizerCXXStaticRuntimeLibrary(toolchain), false) + addStaticDeps(config.AddressSanitizerStaticRuntimeLibrary(), false) + addStaticDeps(config.AddressSanitizerCXXStaticRuntimeLibrary(), false) } else { - runtimeSharedLibrary = config.AddressSanitizerRuntimeLibrary(toolchain) + runtimeSharedLibrary = config.AddressSanitizerRuntimeLibrary() } } else if Bool(sanProps.Hwaddress) { if c.staticBinary() { - addStaticDeps(config.HWAddressSanitizerStaticLibrary(toolchain), true) + addStaticDeps(config.HWAddressSanitizerStaticLibrary(), true) addStaticDeps("libdl", false) } else { - runtimeSharedLibrary = config.HWAddressSanitizerRuntimeLibrary(toolchain) + runtimeSharedLibrary = config.HWAddressSanitizerRuntimeLibrary() } } else if Bool(sanProps.Thread) { - runtimeSharedLibrary = config.ThreadSanitizerRuntimeLibrary(toolchain) + runtimeSharedLibrary = config.ThreadSanitizerRuntimeLibrary() } else if Bool(sanProps.Scudo) { if len(diagSanitizers) == 0 && !c.sanitize.Properties.UbsanRuntimeDep { - runtimeSharedLibrary = config.ScudoMinimalRuntimeLibrary(toolchain) + runtimeSharedLibrary = config.ScudoMinimalRuntimeLibrary() } else { - runtimeSharedLibrary = config.ScudoRuntimeLibrary(toolchain) + runtimeSharedLibrary = config.ScudoRuntimeLibrary() } } else if len(diagSanitizers) > 0 || c.sanitize.Properties.UbsanRuntimeDep || Bool(sanProps.Fuzzer) || @@ -1553,17 +1556,17 @@ func sanitizerRuntimeMutator(mctx android.BottomUpMutatorContext) { // Also manually add a static runtime for musl to match what clang does for glibc. // Otherwise dlopening libraries that depend on libclang_rt.ubsan_standalone.so fails with: // Error relocating ...: initial-exec TLS resolves to dynamic definition - addStaticDeps(config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain)+".static", true) + addStaticDeps(config.UndefinedBehaviorSanitizerRuntimeLibrary()+".static", true) } else { - runtimeSharedLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary(toolchain) + runtimeSharedLibrary = config.UndefinedBehaviorSanitizerRuntimeLibrary() } } if enableMinimalRuntime(c.sanitize) || c.sanitize.Properties.MinimalRuntimeDep { - addStaticDeps(config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(toolchain), true) + addStaticDeps(config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(), true) } if c.sanitize.Properties.BuiltinsDep { - addStaticDeps(config.BuiltinsRuntimeLibrary(toolchain), true) + addStaticDeps(config.BuiltinsRuntimeLibrary(), true) } if runtimeSharedLibrary != "" && (toolchain.Bionic() || toolchain.Musl()) { @@ -1787,3 +1790,126 @@ func hwasanMakeVarsProvider(ctx android.MakeVarsContext) { func memtagStackMakeVarsProvider(ctx android.MakeVarsContext) { memtagStackStaticLibs(ctx.Config()).exportToMake(ctx) } + +type sanitizerLibrariesTxtModule struct { + android.ModuleBase + + outputFile android.OutputPath +} + +var _ etc.PrebuiltEtcModule = (*sanitizerLibrariesTxtModule)(nil) +var _ android.OutputFileProducer = (*sanitizerLibrariesTxtModule)(nil) + +func RegisterSanitizerLibrariesTxtType(ctx android.RegistrationContext) { + ctx.RegisterModuleType("sanitizer_libraries_txt", sanitizerLibrariesTxtFactory) +} + +func sanitizerLibrariesTxtFactory() android.Module { + m := &sanitizerLibrariesTxtModule{} + android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibCommon) + return m +} + +type sanitizerLibraryDependencyTag struct { + blueprint.BaseDependencyTag +} + +func (t sanitizerLibraryDependencyTag) AllowDisabledModuleDependency(target android.Module) bool { + return true +} + +var _ android.AllowDisabledModuleDependency = (*sanitizerLibraryDependencyTag)(nil) + +func (txt *sanitizerLibrariesTxtModule) DepsMutator(actx android.BottomUpMutatorContext) { + targets := actx.Config().Targets[android.Android] + depTag := sanitizerLibraryDependencyTag{} + + for _, target := range targets { + variation := append(target.Variations(), + blueprint.Variation{Mutator: "image", Variation: ""}, + blueprint.Variation{Mutator: "sdk", Variation: ""}, + blueprint.Variation{Mutator: "link", Variation: "shared"}, + ) + for _, lib := range android.SortedStringValues(sanitizerVariables) { + if actx.OtherModuleFarDependencyVariantExists(variation, lib) { + actx.AddFarVariationDependencies(variation, depTag, lib) + } + + prebuiltLibName := "prebuilt_" + lib + if actx.OtherModuleFarDependencyVariantExists(variation, prebuiltLibName) { + actx.AddFarVariationDependencies(variation, depTag, prebuiltLibName) + } + } + } + +} + +func (txt *sanitizerLibrariesTxtModule) getSanitizerLibs(ctx android.ModuleContext) string { + var sanitizerLibStems []string + + ctx.VisitDirectDepsIf(func(m android.Module) bool { + if !m.Enabled(ctx) { + return false + } + + ccModule, _ := m.(*Module) + if ccModule == nil || ccModule.library == nil || !ccModule.library.shared() { + return false + } + + targets := ctx.Config().Targets[android.Android] + + for _, target := range targets { + if m.Target().Os == target.Os && m.Target().Arch.ArchType == target.Arch.ArchType { + return true + } + } + + return false + }, func(m android.Module) { + ccModule, _ := m.(*Module) + outputFile := ccModule.outputFile + if outputFile.Valid() { + sanitizerLibStems = append(sanitizerLibStems, outputFile.Path().Base()) + } + }) + + sanitizerLibStems = android.SortedUniqueStrings(sanitizerLibStems) + return strings.Join(sanitizerLibStems, "\n") +} + +func (txt *sanitizerLibrariesTxtModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { + filename := txt.Name() + + txt.outputFile = android.PathForModuleOut(ctx, filename).OutputPath + android.WriteFileRule(ctx, txt.outputFile, txt.getSanitizerLibs(ctx)) + + installPath := android.PathForModuleInstall(ctx, "etc") + ctx.InstallFile(installPath, filename, txt.outputFile) +} + +func (txt *sanitizerLibrariesTxtModule) AndroidMkEntries() []android.AndroidMkEntries { + return []android.AndroidMkEntries{{ + Class: "ETC", + OutputFile: android.OptionalPathForPath(txt.outputFile), + }} +} + +// PrebuiltEtcModule interface +func (txt *sanitizerLibrariesTxtModule) OutputFile() android.OutputPath { + return txt.outputFile +} + +// PrebuiltEtcModule interface +func (txt *sanitizerLibrariesTxtModule) BaseDir() string { + return "etc" +} + +// PrebuiltEtcModule interface +func (txt *sanitizerLibrariesTxtModule) SubDir() string { + return "" +} + +func (txt *sanitizerLibrariesTxtModule) OutputFiles(tag string) (android.Paths, error) { + return android.Paths{txt.outputFile}, nil +} diff --git a/java/java.go b/java/java.go index e3f482450..9fe7a2ff8 100644 --- a/java/java.go +++ b/java/java.go @@ -567,6 +567,12 @@ func getJavaVersion(ctx android.ModuleContext, javaVersion string, sdkContext an return normalizeJavaVersion(ctx, javaVersion) } else if ctx.Device() { return defaultJavaLanguageVersion(ctx, sdkContext.SdkVersion(ctx)) + } else if ctx.Config().TargetsJava21() { + // Temporary experimental flag to be able to try and build with + // java version 21 options. The flag, if used, just sets Java + // 21 as the default version, leaving any components that + // target an older version intact. + return JAVA_VERSION_21 } else { return JAVA_VERSION_17 } diff --git a/java/sdk.go b/java/sdk.go index d972c19bd..4ef4ee251 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -65,6 +65,12 @@ func defaultJavaLanguageVersion(ctx android.EarlyModuleContext, s android.SdkSpe return JAVA_VERSION_9 } else if sdk.FinalOrFutureInt() <= 33 { return JAVA_VERSION_11 + } else if ctx.Config().TargetsJava21() { + // Temporary experimental flag to be able to try and build with + // java version 21 options. The flag, if used, just sets Java + // 21 as the default version, leaving any components that + // target an older version intact. + return JAVA_VERSION_21 } else { return JAVA_VERSION_17 } |