diff options
34 files changed, 531 insertions, 420 deletions
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index b7faf34f5..bcb98f7d1 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -324,30 +324,31 @@ var ( "libnativehelper": Bp2BuildDefaultTrueRecursively, - "packages/apps/DevCamera": Bp2BuildDefaultTrue, - "packages/apps/HTMLViewer": Bp2BuildDefaultTrue, - "packages/apps/Protips": Bp2BuildDefaultTrue, - "packages/apps/SafetyRegulatoryInfo": Bp2BuildDefaultTrue, - "packages/apps/WallpaperPicker": Bp2BuildDefaultTrue, - "packages/modules/NeuralNetworks/driver/cache": Bp2BuildDefaultTrueRecursively, - "packages/modules/StatsD/lib/libstatssocket": Bp2BuildDefaultTrueRecursively, - "packages/modules/adb": Bp2BuildDefaultTrue, - "packages/modules/adb/apex": Bp2BuildDefaultTrue, - "packages/modules/adb/fastdeploy": Bp2BuildDefaultTrue, - "packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively, - "packages/modules/adb/libs": Bp2BuildDefaultTrueRecursively, - "packages/modules/adb/pairing_auth": Bp2BuildDefaultTrueRecursively, - "packages/modules/adb/pairing_connection": Bp2BuildDefaultTrueRecursively, - "packages/modules/adb/proto": Bp2BuildDefaultTrueRecursively, - "packages/modules/adb/tls": Bp2BuildDefaultTrueRecursively, - "packages/modules/Connectivity/staticlibs/native": Bp2BuildDefaultTrueRecursively, - "packages/modules/Gki/libkver": Bp2BuildDefaultTrue, - "packages/modules/NetworkStack/common/captiveportal": Bp2BuildDefaultTrue, - "packages/modules/NeuralNetworks/apex": Bp2BuildDefaultTrue, - "packages/modules/NeuralNetworks/apex/testing": Bp2BuildDefaultTrue, - "packages/providers/MediaProvider/tools/dialogs": Bp2BuildDefaultFalse, // TODO(b/242834374) - "packages/screensavers/Basic": Bp2BuildDefaultTrue, - "packages/services/Car/tests/SampleRearViewCamera": Bp2BuildDefaultFalse, // TODO(b/242834321) + "packages/apps/DevCamera": Bp2BuildDefaultTrue, + "packages/apps/HTMLViewer": Bp2BuildDefaultTrue, + "packages/apps/Protips": Bp2BuildDefaultTrue, + "packages/apps/SafetyRegulatoryInfo": Bp2BuildDefaultTrue, + "packages/apps/WallpaperPicker": Bp2BuildDefaultTrue, + "packages/modules/NeuralNetworks/driver/cache": Bp2BuildDefaultTrueRecursively, + "packages/modules/StatsD/lib/libstatssocket": Bp2BuildDefaultTrueRecursively, + "packages/modules/adb": Bp2BuildDefaultTrue, + "packages/modules/adb/apex": Bp2BuildDefaultTrue, + "packages/modules/adb/fastdeploy": Bp2BuildDefaultTrue, + "packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively, + "packages/modules/adb/libs": Bp2BuildDefaultTrueRecursively, + "packages/modules/adb/pairing_auth": Bp2BuildDefaultTrueRecursively, + "packages/modules/adb/pairing_connection": Bp2BuildDefaultTrueRecursively, + "packages/modules/adb/proto": Bp2BuildDefaultTrueRecursively, + "packages/modules/adb/tls": Bp2BuildDefaultTrueRecursively, + "packages/modules/Connectivity/staticlibs/native": Bp2BuildDefaultTrueRecursively, + "packages/modules/Connectivity/staticlibs/netd/libnetdutils": Bp2BuildDefaultTrueRecursively, + "packages/modules/Gki/libkver": Bp2BuildDefaultTrue, + "packages/modules/NetworkStack/common/captiveportal": Bp2BuildDefaultTrue, + "packages/modules/NeuralNetworks/apex": Bp2BuildDefaultTrue, + "packages/modules/NeuralNetworks/apex/testing": Bp2BuildDefaultTrue, + "packages/providers/MediaProvider/tools/dialogs": Bp2BuildDefaultFalse, // TODO(b/242834374) + "packages/screensavers/Basic": Bp2BuildDefaultTrue, + "packages/services/Car/tests/SampleRearViewCamera": Bp2BuildDefaultFalse, // TODO(b/242834321) "platform_testing/libraries/annotations": Bp2BuildDefaultTrueRecursively, "platform_testing/libraries/flag-helpers/libflagtest": Bp2BuildDefaultTrueRecursively, @@ -1019,6 +1020,7 @@ var ( "ndk_headers", "ndk_library", "sysprop_library", + "versioned_ndk_headers", "xsd_config", // go/keep-sorted end } diff --git a/android/api_domain.go b/android/api_domain.go index 0603c7016..38f48e3d4 100644 --- a/android/api_domain.go +++ b/android/api_domain.go @@ -14,12 +14,6 @@ package android -import ( - "github.com/google/blueprint" - - "android/soong/bazel" -) - func init() { RegisterApiDomainBuildComponents(InitRegistrationContext) } @@ -97,13 +91,3 @@ const ( func ApiContributionTargetName(moduleName string) string { return moduleName + apiContributionSuffix } - -// For each contributing cc_library, format the name to its corresponding contribution bazel target in the bp2build workspace -func contributionBazelAttributes(ctx TopDownMutatorContext, contributions []string) bazel.LabelListAttribute { - addSuffix := func(ctx BazelConversionPathContext, module blueprint.Module) string { - baseLabel := BazelModuleLabel(ctx, module) - return ApiContributionTargetName(baseLabel) - } - bazelLabels := BazelLabelForModuleDepsWithFn(ctx, contributions, addSuffix) - return bazel.MakeLabelListAttribute(bazelLabels) -} diff --git a/android/bazel.go b/android/bazel.go index 5df12f02e..e307b18d2 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -625,7 +625,18 @@ func registerBp2buildConversionMutator(ctx RegisterMutatorsContext) { ctx.BottomUp("bp2build_conversion", bp2buildConversionMutator).Parallel() } +func registerBp2buildDepsMutator(ctx RegisterMutatorsContext) { + ctx.BottomUp("bp2build_deps", bp2buildDepsMutator).Parallel() +} + func bp2buildConversionMutator(ctx BottomUpMutatorContext) { + // If an existing BUILD file in the module directory has a target defined + // with this same name as this module, assume that this is an existing + // definition for this target. + if ctx.Config().HasBazelBuildTargetInSource(ctx.ModuleDir(), ctx.ModuleName()) { + ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_DEFINED_IN_BUILD_FILE, ctx.ModuleName()) + return + } bModule, ok := ctx.Module().(Bazelable) if !ok { ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "") @@ -659,6 +670,10 @@ func bp2buildConversionMutator(ctx BottomUpMutatorContext) { panic(fmt.Errorf("illegal bp2build invariant: module '%s' was neither converted nor marked unconvertible", ctx.ModuleName())) } + // If an existing BUILD file in the module directory has a target defined + // with the same name as any target generated by this module, assume that this + // is an existing definition for this target. (These generated target names + // may be different than the module name, as checked at the beginning of this function!) for _, targetInfo := range ctx.Module().base().Bp2buildTargets() { if ctx.Config().HasBazelBuildTargetInSource(targetInfo.TargetPackage(), targetInfo.TargetName()) { // Defer to the BUILD target. Generating an additional target would @@ -669,6 +684,27 @@ func bp2buildConversionMutator(ctx BottomUpMutatorContext) { } } +// TODO: b/285631638 - Add this as a new mutator to the bp2build conversion mutators. +// Currently, this only exists to prepare test coverage for the launch of this feature. +func bp2buildDepsMutator(ctx BottomUpMutatorContext) { + if ctx.Module().base().GetUnconvertedReason() != nil { + return + } + + if len(ctx.Module().GetMissingBp2buildDeps()) > 0 { + exampleDep := ctx.Module().GetMissingBp2buildDeps()[0] + ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_UNCONVERTED_DEP, exampleDep) + } + + ctx.VisitDirectDeps(func(dep Module) { + if dep.base().GetUnconvertedReason() != nil && + dep.base().GetUnconvertedReason().ReasonType != int(bp2build_metrics_proto.UnconvertedReasonType_DEFINED_IN_BUILD_FILE) && + ctx.OtherModuleDependencyTag(dep) == Bp2buildDepTag { + ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_UNCONVERTED_DEP, dep.Name()) + } + }) +} + // GetMainClassInManifest scans the manifest file specified in filepath and returns // the value of attribute Main-Class in the manifest file if it exists, or returns error. // WARNING: this is for bp2build converters of java_* modules only. diff --git a/android/bazel_paths.go b/android/bazel_paths.go index 09580a762..a554775fb 100644 --- a/android/bazel_paths.go +++ b/android/bazel_paths.go @@ -102,8 +102,8 @@ type BazelConversionPathContext interface { // BazelLabelForModuleDeps expects a list of reference to other modules, ("<module>" // or ":<module>") and returns a Bazel-compatible label which corresponds to dependencies on the // module within the given ctx. -func BazelLabelForModuleDeps(ctx BazelConversionPathContext, modules []string) bazel.LabelList { - return BazelLabelForModuleDepsWithFn(ctx, modules, BazelModuleLabel) +func BazelLabelForModuleDeps(ctx Bp2buildMutatorContext, modules []string) bazel.LabelList { + return BazelLabelForModuleDepsWithFn(ctx, modules, BazelModuleLabel, true) } // BazelLabelForModuleWholeDepsExcludes expects two lists: modules (containing modules to include in @@ -112,15 +112,16 @@ func BazelLabelForModuleDeps(ctx BazelConversionPathContext, modules []string) b // list which corresponds to dependencies on the module within the given ctx, and the excluded // dependencies. Prebuilt dependencies will be appended with _alwayslink so they can be handled as // whole static libraries. -func BazelLabelForModuleDepsExcludes(ctx BazelConversionPathContext, modules, excludes []string) bazel.LabelList { +func BazelLabelForModuleDepsExcludes(ctx Bp2buildMutatorContext, modules, excludes []string) bazel.LabelList { return BazelLabelForModuleDepsExcludesWithFn(ctx, modules, excludes, BazelModuleLabel) } // BazelLabelForModuleDepsWithFn expects a list of reference to other modules, ("<module>" // or ":<module>") and applies moduleToLabelFn to determine and return a Bazel-compatible label // which corresponds to dependencies on the module within the given ctx. -func BazelLabelForModuleDepsWithFn(ctx BazelConversionPathContext, modules []string, - moduleToLabelFn func(BazelConversionPathContext, blueprint.Module) string) bazel.LabelList { +func BazelLabelForModuleDepsWithFn(ctx Bp2buildMutatorContext, modules []string, + moduleToLabelFn func(BazelConversionPathContext, blueprint.Module) string, + markAsDeps bool) bazel.LabelList { var labels bazel.LabelList // In some cases, a nil string list is different than an explicitly empty list. if len(modules) == 0 && modules != nil { @@ -134,7 +135,7 @@ func BazelLabelForModuleDepsWithFn(ctx BazelConversionPathContext, modules []str module = ":" + module } if m, t := SrcIsModuleWithTag(module); m != "" { - l := getOtherModuleLabel(ctx, m, t, moduleToLabelFn) + l := getOtherModuleLabel(ctx, m, t, moduleToLabelFn, markAsDeps) if l != nil { l.OriginalModuleName = bpText labels.Includes = append(labels.Includes, *l) @@ -151,27 +152,27 @@ func BazelLabelForModuleDepsWithFn(ctx BazelConversionPathContext, modules []str // to other modules, ("<module>" or ":<module>"). It applies moduleToLabelFn to determine and return a // Bazel-compatible label list which corresponds to dependencies on the module within the given ctx, and // the excluded dependencies. -func BazelLabelForModuleDepsExcludesWithFn(ctx BazelConversionPathContext, modules, excludes []string, +func BazelLabelForModuleDepsExcludesWithFn(ctx Bp2buildMutatorContext, modules, excludes []string, moduleToLabelFn func(BazelConversionPathContext, blueprint.Module) string) bazel.LabelList { - moduleLabels := BazelLabelForModuleDepsWithFn(ctx, RemoveListFromList(modules, excludes), moduleToLabelFn) + moduleLabels := BazelLabelForModuleDepsWithFn(ctx, RemoveListFromList(modules, excludes), moduleToLabelFn, true) if len(excludes) == 0 { return moduleLabels } - excludeLabels := BazelLabelForModuleDepsWithFn(ctx, excludes, moduleToLabelFn) + excludeLabels := BazelLabelForModuleDepsWithFn(ctx, excludes, moduleToLabelFn, false) return bazel.LabelList{ Includes: moduleLabels.Includes, Excludes: excludeLabels.Includes, } } -func BazelLabelForModuleSrcSingle(ctx BazelConversionPathContext, path string) bazel.Label { +func BazelLabelForModuleSrcSingle(ctx Bp2buildMutatorContext, path string) bazel.Label { if srcs := BazelLabelForModuleSrcExcludes(ctx, []string{path}, []string(nil)).Includes; len(srcs) > 0 { return srcs[0] } return bazel.Label{} } -func BazelLabelForModuleDepSingle(ctx BazelConversionPathContext, path string) bazel.Label { +func BazelLabelForModuleDepSingle(ctx Bp2buildMutatorContext, path string) bazel.Label { if srcs := BazelLabelForModuleDepsExcludes(ctx, []string{path}, []string(nil)).Includes; len(srcs) > 0 { return srcs[0] } @@ -184,7 +185,7 @@ func BazelLabelForModuleDepSingle(ctx BazelConversionPathContext, path string) b // relative if within the same package). // Properties must have been annotated with struct tag `android:"path"` so that dependencies modules // will have already been handled by the pathdeps mutator. -func BazelLabelForModuleSrc(ctx BazelConversionPathContext, paths []string) bazel.LabelList { +func BazelLabelForModuleSrc(ctx Bp2buildMutatorContext, paths []string) bazel.LabelList { return BazelLabelForModuleSrcExcludes(ctx, paths, []string(nil)) } @@ -194,13 +195,13 @@ func BazelLabelForModuleSrc(ctx BazelConversionPathContext, paths []string) baze // (absolute if in a different package or relative if within the same package). // Properties must have been annotated with struct tag `android:"path"` so that dependencies modules // will have already been handled by the pathdeps mutator. -func BazelLabelForModuleSrcExcludes(ctx BazelConversionPathContext, paths, excludes []string) bazel.LabelList { - excludeLabels := expandSrcsForBazel(ctx, excludes, []string(nil)) +func BazelLabelForModuleSrcExcludes(ctx Bp2buildMutatorContext, paths, excludes []string) bazel.LabelList { + excludeLabels := expandSrcsForBazel(ctx, excludes, []string(nil), false) excluded := make([]string, 0, len(excludeLabels.Includes)) for _, e := range excludeLabels.Includes { excluded = append(excluded, e.Label) } - labels := expandSrcsForBazel(ctx, paths, excluded) + labels := expandSrcsForBazel(ctx, paths, excluded, true) labels.Excludes = excludeLabels.Includes labels = TransformSubpackagePaths(ctx.Config(), ctx.ModuleDir(), labels) return labels @@ -361,6 +362,12 @@ func RootToModuleRelativePaths(ctx BazelConversionPathContext, paths Paths) []ba return newPaths } +var Bp2buildDepTag bp2buildDepTag + +type bp2buildDepTag struct { + blueprint.BaseDependencyTag +} + // expandSrcsForBazel returns bazel.LabelList with paths rooted from the module's local source // directory and Bazel target labels, excluding those included in the excludes argument (which // should already be expanded to resolve references to Soong-modules). Valid elements of paths @@ -383,7 +390,7 @@ func RootToModuleRelativePaths(ctx BazelConversionPathContext, paths Paths) []ba // Properties passed as the paths or excludes argument must have been annotated with struct tag // `android:"path"` so that dependencies on other modules will have already been handled by the // pathdeps mutator. -func expandSrcsForBazel(ctx BazelConversionPathContext, paths, expandedExcludes []string) bazel.LabelList { +func expandSrcsForBazel(ctx Bp2buildMutatorContext, paths, expandedExcludes []string, markAsDeps bool) bazel.LabelList { if paths == nil { return bazel.LabelList{} } @@ -400,7 +407,7 @@ func expandSrcsForBazel(ctx BazelConversionPathContext, paths, expandedExcludes for _, p := range paths { if m, tag := SrcIsModuleWithTag(p); m != "" { - l := getOtherModuleLabel(ctx, m, tag, BazelModuleLabel) + l := getOtherModuleLabel(ctx, m, tag, BazelModuleLabel, markAsDeps) if l != nil && !InList(l.Label, expandedExcludes) { if strings.HasPrefix(m, "//") { // this is a module in a soong namespace @@ -432,8 +439,9 @@ func expandSrcsForBazel(ctx BazelConversionPathContext, paths, expandedExcludes // getOtherModuleLabel returns a bazel.Label for the given dependency/tag combination for the // module. The label will be relative to the current directory if appropriate. The dependency must // already be resolved by either deps mutator or path deps mutator. -func getOtherModuleLabel(ctx BazelConversionPathContext, dep, tag string, - labelFromModule func(BazelConversionPathContext, blueprint.Module) string) *bazel.Label { +func getOtherModuleLabel(ctx Bp2buildMutatorContext, dep, tag string, + labelFromModule func(BazelConversionPathContext, blueprint.Module) string, + markAsDep bool) *bazel.Label { m, _ := ctx.ModuleFromName(dep) // The module was not found in an Android.bp file, this is often due to: // * a limited manifest @@ -444,6 +452,13 @@ func getOtherModuleLabel(ctx BazelConversionPathContext, dep, tag string, Label: ":" + dep + "__BP2BUILD__MISSING__DEP", } } + if markAsDep { + // Don't count dependencies of "libc". This is a hack to circumvent the + // fact that, in a variantless build graph, "libc" has a dependency on itself. + if ctx.ModuleName() != "libc" { + ctx.AddDependency(ctx.Module(), Bp2buildDepTag, dep) + } + } if !convertedToBazel(ctx, m) { ctx.AddUnconvertedBp2buildDep(dep) } diff --git a/android/config.go b/android/config.go index ed9b7b0e3..622a672ca 100644 --- a/android/config.go +++ b/android/config.go @@ -297,6 +297,10 @@ type config struct { // in tests when a path doesn't exist. TestAllowNonExistentPaths bool + // If testAllowNonExistentPaths is true then PathForSource and PathForModuleSrc won't error + // in tests when a path doesn't exist. + Bp2buildDepsMutator bool + // The list of files that when changed, must invalidate soong_build to // regenerate build.ninja. ninjaFileDepsSet sync.Map @@ -1435,10 +1439,6 @@ func (c *deviceConfig) PlatformVndkVersion() string { return String(c.config.productVariables.Platform_vndk_version) } -func (c *deviceConfig) ProductVndkVersion() string { - return String(c.config.productVariables.ProductVndkVersion) -} - func (c *deviceConfig) ExtraVndkVersions() []string { return c.config.productVariables.ExtraVndkVersions } diff --git a/android/filegroup.go b/android/filegroup.go index b6e37a50d..856c50e5a 100644 --- a/android/filegroup.go +++ b/android/filegroup.go @@ -50,7 +50,7 @@ var ( // ignoring case, checks for proto or protos as an independent word in the name, whether at the // beginning, end, or middle. e.g. "proto.foo", "bar-protos", "baz_proto_srcs" would all match filegroupLikelyProtoPattern = regexp.MustCompile("(?i)(^|[^a-z])proto(s)?([^a-z]|$)") - filegroupLikelyAidlPattern = regexp.MustCompile("(?i)(^|[^a-z])aidl([^a-z]|$)") + filegroupLikelyAidlPattern = regexp.MustCompile("(?i)(^|[^a-z])aidl(s)?([^a-z]|$)") ProtoSrcLabelPartition = bazel.LabelPartition{ Extensions: []string{".proto"}, diff --git a/android/mutator.go b/android/mutator.go index 57ff1e092..3d596554d 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -35,6 +35,9 @@ import ( // RegisterMutatorsForBazelConversion is a alternate registration pipeline for bp2build. Exported for testing. func RegisterMutatorsForBazelConversion(ctx *Context, preArchMutators []RegisterMutatorFunc) { bp2buildMutators := append(preArchMutators, registerBp2buildConversionMutator) + if ctx.config.Bp2buildDepsMutator { + bp2buildMutators = append(bp2buildMutators, registerBp2buildDepsMutator) + } registerMutatorsForBazelConversion(ctx, bp2buildMutators) } @@ -226,6 +229,15 @@ type Bp2buildMutatorContext interface { BazelConversionPathContext BaseMutatorContext + // AddDependency adds a dependency to the given module. It returns a slice of modules for each + // dependency (some entries may be nil). + // + // If the mutator is parallel (see MutatorHandle.Parallel), this method will pause until the + // new dependencies have had the current mutator called on them. If the mutator is not + // parallel this method does not affect the ordering of the current mutator pass, but will + // be ordered correctly for all future mutator passes. + AddDependency(module blueprint.Module, tag blueprint.DependencyTag, name ...string) []blueprint.Module + // CreateBazelTargetModule creates a BazelTargetModule by calling the // factory method, just like in CreateModule, but also requires // BazelTargetModuleProperties containing additional metadata for the @@ -294,15 +306,6 @@ type BottomUpMutatorContext interface { BaseMutatorContext Bp2buildMutatorContext - // AddDependency adds a dependency to the given module. It returns a slice of modules for each - // dependency (some entries may be nil). - // - // If the mutator is parallel (see MutatorHandle.Parallel), this method will pause until the - // new dependencies have had the current mutator called on them. If the mutator is not - // parallel this method does not affect the ordering of the current mutator pass, but will - // be ordered correctly for all future mutator passes. - AddDependency(module blueprint.Module, tag blueprint.DependencyTag, name ...string) []blueprint.Module - // AddReverseDependency adds a dependency from the destination to the given module. // Does not affect the ordering of the current mutator pass, but will be ordered // correctly for all future mutator passes. All reverse dependencies for a destination module are diff --git a/android/variable.go b/android/variable.go index 3a5ad63bc..8882e80cb 100644 --- a/android/variable.go +++ b/android/variable.go @@ -418,8 +418,6 @@ type ProductVariables struct { ProductPublicSepolicyDirs []string `json:",omitempty"` ProductPrivateSepolicyDirs []string `json:",omitempty"` - ProductVndkVersion *string `json:",omitempty"` - TargetFSConfigGen []string `json:",omitempty"` EnforceProductPartitionInterface *bool `json:",omitempty"` diff --git a/apex/apex.go b/apex/apex.go index 090d9c4fe..f90337301 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -736,7 +736,7 @@ func (a *apexBundle) getImageVariationPair(deviceConfig android.DeviceConfig) (s vndkVersion = deviceConfig.VndkVersion() } else if a.ProductSpecific() { prefix = cc.ProductVariationPrefix - vndkVersion = deviceConfig.ProductVndkVersion() + vndkVersion = deviceConfig.PlatformVndkVersion() } } if vndkVersion == "current" { diff --git a/apex/apex_test.go b/apex/apex_test.go index 90aec91c4..e70d3af7e 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -3088,10 +3088,7 @@ func TestProductVariant(t *testing.T) { apex_available: ["myapex"], srcs: ["foo.cpp"], } - `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { - variables.ProductVndkVersion = proptools.StringPtr("current") - }), - ) + `) cflags := strings.Fields( ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"]) @@ -10521,6 +10518,7 @@ func TestTrimmedApex(t *testing.T) { min_sdk_version: "29", recovery_available: true, vendor_available: true, + product_available: true, } api_imports { name: "api_imports", diff --git a/apex/vndk_test.go b/apex/vndk_test.go index 2b86e5347..e2aee96e7 100644 --- a/apex/vndk_test.go +++ b/apex/vndk_test.go @@ -115,12 +115,7 @@ func TestVndkApexUsesVendorVariant(t *testing.T) { }) t.Run("VNDK APEX gathers only vendor variants even if product variants are available", func(t *testing.T) { - ctx := testApex(t, bp, - android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { - // Now product variant is available - variables.ProductVndkVersion = proptools.StringPtr("current") - }), - ) + ctx := testApex(t, bp) files := getFiles(t, ctx, "com.android.vndk.current", "android_common") ensureFileSrc(t, files, "lib/libfoo.so", "libfoo/android_vendor.29_arm_armv7-a-neon_shared/libfoo.so") diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go index f53588d76..53c37b90e 100644 --- a/bp2build/build_conversion.go +++ b/bp2build/build_conversion.go @@ -576,7 +576,7 @@ func createBuildConversionMetadata(ctx *android.Context) buildConversionMetadata Dir: ctx.ModuleDir(m), Deps: m.(*bootstrap.GoPackage).Deps(), } - } else if moduleType == "ndk_headers" { + } else if moduleType == "ndk_headers" || moduleType == "versioned_ndk_headers" { ndkHeaders = append(ndkHeaders, m) } }) diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go index afbfffacc..dc56a17b0 100644 --- a/bp2build/build_conversion_test.go +++ b/bp2build/build_conversion_test.go @@ -2101,3 +2101,219 @@ func TestCreateBazelTargetInDifferentDir(t *testing.T) { }) } + +func TestBp2buildDepsMutator_missingTransitiveDep(t *testing.T) { + bp := ` + custom { + name: "foo", + } + + custom { + name: "has_deps", + arch_paths: [":has_missing_dep", ":foo"], + } + + custom { + name: "has_missing_dep", + arch_paths: [":missing"], + } + ` + expectedBazelTargets := []string{ + MakeBazelTarget( + "custom", + "foo", + AttrNameToString{}, + ), + } + registerCustomModule := func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) + } + RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ + Blueprint: bp, + ExpectedBazelTargets: expectedBazelTargets, + Description: "Skipping conversion of a target with missing transitive dep", + DepsMutator: true, + }) +} + +func TestBp2buildDepsMutator_missingDirectDep(t *testing.T) { + bp := ` + custom { + name: "foo", + arch_paths: [":exists"], + } + custom { + name: "exists", + } + + custom { + name: "has_missing_dep", + arch_paths: [":missing"], + } + ` + expectedBazelTargets := []string{ + MakeBazelTarget( + "custom", + "foo", + AttrNameToString{"arch_paths": `[":exists"]`}, + ), + MakeBazelTarget( + "custom", + "exists", + AttrNameToString{}, + ), + } + registerCustomModule := func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) + } + RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ + Blueprint: bp, + ExpectedBazelTargets: expectedBazelTargets, + Description: "Skipping conversion of a target with missing direct dep", + DepsMutator: true, + }) +} + +func TestBp2buildDepsMutator_unconvertedDirectDep(t *testing.T) { + bp := ` + custom { + name: "has_unconverted_dep", + arch_paths: [":unconvertible"], + } + + custom { + name: "unconvertible", + does_not_convert_to_bazel: true + } + ` + registerCustomModule := func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) + } + RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ + Blueprint: bp, + ExpectedBazelTargets: []string{}, + Description: "Skipping conversion of a target with unconverted direct dep", + DepsMutator: true, + }) +} + +func TestBp2buildDepsMutator_unconvertedTransitiveDep(t *testing.T) { + bp := ` + custom { + name: "foo", + arch_paths: [":has_unconverted_dep", ":bar"], + } + + custom { + name: "bar", + } + + custom { + name: "has_unconverted_dep", + arch_paths: [":unconvertible"], + } + + custom { + name: "unconvertible", + does_not_convert_to_bazel: true + } + ` + expectedBazelTargets := []string{ + MakeBazelTarget( + "custom", + "bar", + AttrNameToString{}, + ), + } + registerCustomModule := func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) + } + RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ + Blueprint: bp, + ExpectedBazelTargets: expectedBazelTargets, + Description: "Skipping conversion of a target with unconverted transitive dep", + DepsMutator: true, + }) +} + +func TestBp2buildDepsMutator_alreadyExistsBuildDeps(t *testing.T) { + bp := ` + custom { + name: "foo", + arch_paths: [":bar"], + } + custom { + name: "bar", + arch_paths: [":checked_in"], + } + custom { + name: "checked_in", + arch_paths: [":checked_in"], + does_not_convert_to_bazel: true + } + ` + expectedBazelTargets := []string{ + MakeBazelTarget( + "custom", + "foo", + AttrNameToString{"arch_paths": `[":bar"]`}, + ), + MakeBazelTarget( + "custom", + "bar", + AttrNameToString{"arch_paths": `[":checked_in"]`}, + ), + } + registerCustomModule := func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) + } + RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ + StubbedBuildDefinitions: []string{"checked_in"}, + Blueprint: bp, + ExpectedBazelTargets: expectedBazelTargets, + Description: "Convert target with already-existing build dep", + DepsMutator: true, + }) +} + +// Tests that deps of libc are always considered valid for libc. This circumvents +// an issue that, in a variantless graph (such as bp2build's), libc has the +// unique predicament that it depends on itself. +func TestBp2buildDepsMutator_depOnLibc(t *testing.T) { + bp := ` + custom { + name: "foo", + arch_paths: [":libc"], + } + custom { + name: "libc", + arch_paths: [":libc_dep"], + } + custom { + name: "libc_dep", + does_not_convert_to_bazel: true + } + ` + expectedBazelTargets := []string{ + MakeBazelTarget( + "custom", + "foo", + AttrNameToString{"arch_paths": `[":libc"]`}, + ), + MakeBazelTarget( + "custom", + "libc", + AttrNameToString{"arch_paths": `[":libc_dep"]`}, + ), + } + registerCustomModule := func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) + } + RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ + StubbedBuildDefinitions: []string{"checked_in"}, + Blueprint: bp, + ExpectedBazelTargets: expectedBazelTargets, + Description: "Convert target with dep on libc", + DepsMutator: true, + }) +} diff --git a/bp2build/bzl_conversion_test.go b/bp2build/bzl_conversion_test.go index 402d4b013..645298f15 100644 --- a/bp2build/bzl_conversion_test.go +++ b/bp2build/bzl_conversion_test.go @@ -95,6 +95,7 @@ custom = rule( "bool_prop": attr.bool(), "bool_ptr_prop": attr.bool(), "dir": attr.string(), + "does_not_convert_to_bazel": attr.bool(), "embedded_prop": attr.string(), "int64_ptr_prop": attr.int(), # nested_props start @@ -128,6 +129,7 @@ custom_defaults = rule( "bool_prop": attr.bool(), "bool_ptr_prop": attr.bool(), "dir": attr.string(), + "does_not_convert_to_bazel": attr.bool(), "embedded_prop": attr.string(), "int64_ptr_prop": attr.int(), # nested_props start @@ -161,6 +163,7 @@ custom_test_ = rule( "bool_prop": attr.bool(), "bool_ptr_prop": attr.bool(), "dir": attr.string(), + "does_not_convert_to_bazel": attr.bool(), "embedded_prop": attr.string(), "int64_ptr_prop": attr.int(), # nested_props start diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 3cce430aa..bc88f86b7 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -5198,7 +5198,7 @@ ndk_headers { name: "libfoo_headers", from: "from", to: "to", - srcs: ["foo.h", "foo_other.h"] + srcs: ["from/foo.h", "from/foo_other.h"] } `, ExpectedBazelTargets: []string{ @@ -5206,11 +5206,42 @@ ndk_headers { "strip_import_prefix": `"from"`, "import_prefix": `"to"`, "hdrs": `[ - "foo.h", - "foo_other.h", + "from/foo.h", + "from/foo_other.h", ]`, }), }, } runCcLibraryTestCase(t, tc) } + +func TestVersionedNdkHeadersConversion(t *testing.T) { + tc := Bp2buildTestCase{ + Description: "versioned_ndk_headers conversion", + ModuleTypeUnderTest: "versioned_ndk_headers", + ModuleTypeUnderTestFactory: cc.VersionedNdkHeadersFactory, + Blueprint: ` +versioned_ndk_headers { + name: "libfoo_headers", + from: "from", + to: "to", +} +`, + Filesystem: map[string]string{ + "from/foo.h": "", + "from/foo_other.h": "", + }, + ExpectedBazelTargets: []string{ + MakeBazelTargetNoRestrictions("ndk_headers", "libfoo_headers", AttrNameToString{ + "strip_import_prefix": `"from"`, + "import_prefix": `"to"`, + "hdrs": `[ + "from/foo.h", + "from/foo_other.h", + ]`, + "run_versioner": "True", + }), + }, + } + runCcLibraryTestCase(t, tc) +} diff --git a/bp2build/java_library_conversion_test.go b/bp2build/java_library_conversion_test.go index 7e4e44ec8..38571d4cc 100644 --- a/bp2build/java_library_conversion_test.go +++ b/bp2build/java_library_conversion_test.go @@ -567,12 +567,20 @@ filegroup { "b.aidl", ], } +filegroup { + name: "aidls_files", + srcs: [ + "a.aidl", + "b.aidl", + ], +} java_library { name: "example_lib", srcs: [ "a.java", "b.java", ":aidl_files", + ":aidls_files", ":random_other_files", ], sdk_version: "current", @@ -586,8 +594,18 @@ java_library { ]`, "tags": `["apex_available=//apex_available:anyapex"]`, }), + MakeBazelTargetNoRestrictions("aidl_library", "aidls_files", AttrNameToString{ + "srcs": `[ + "a.aidl", + "b.aidl", + ]`, + "tags": `["apex_available=//apex_available:anyapex"]`, + }), MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{ - "deps": `[":aidl_files"]`, + "deps": `[ + ":aidl_files", + ":aidls_files", + ]`, }), MakeBazelTarget("java_library", "example_lib", AttrNameToString{ "deps": `[":example_lib_java_aidl_library"]`, diff --git a/bp2build/testing.go b/bp2build/testing.go index d26b346dd..690748756 100644 --- a/bp2build/testing.go +++ b/bp2build/testing.go @@ -124,25 +124,37 @@ type Bp2buildTestCase struct { // be merged with the generated BUILD file. This allows custom BUILD targets // to be used in tests, or use BUILD files to draw package boundaries. KeepBuildFileForDirs []string + + // If true, the bp2build_deps mutator is used for this test. This is an + // experimental mutator that will disable modules which have transitive + // dependencies with no bazel definition. + // TODO: b/285631638 - Enable this feature by default. + DepsMutator bool } func RunBp2BuildTestCaseExtraContext(t *testing.T, registerModuleTypes func(ctx android.RegistrationContext), modifyContext func(ctx *android.TestContext), tc Bp2buildTestCase) { t.Helper() - bp2buildSetup := android.GroupFixturePreparers( + preparers := []android.FixturePreparer{ android.FixtureRegisterWithContext(registerModuleTypes), - android.FixtureModifyContext(modifyContext), - SetBp2BuildTestRunner, + } + if modifyContext != nil { + preparers = append(preparers, android.FixtureModifyContext(modifyContext)) + } + if tc.DepsMutator { + preparers = append(preparers, android.FixtureModifyConfig(func(cfg android.Config) { + cfg.Bp2buildDepsMutator = true + })) + } + preparers = append(preparers, SetBp2BuildTestRunner) + bp2buildSetup := android.GroupFixturePreparers( + preparers..., ) runBp2BuildTestCaseWithSetup(t, bp2buildSetup, tc) } func RunBp2BuildTestCase(t *testing.T, registerModuleTypes func(ctx android.RegistrationContext), tc Bp2buildTestCase) { t.Helper() - bp2buildSetup := android.GroupFixturePreparers( - android.FixtureRegisterWithContext(registerModuleTypes), - SetBp2BuildTestRunner, - ) - runBp2BuildTestCaseWithSetup(t, bp2buildSetup, tc) + RunBp2BuildTestCaseExtraContext(t, registerModuleTypes, nil, tc) } func runBp2BuildTestCaseWithSetup(t *testing.T, extraPreparer android.FixturePreparer, tc Bp2buildTestCase) { @@ -400,6 +412,10 @@ type customProps struct { // Prop used to indicate this conversion should be 1 module -> multiple targets One_to_many_prop *bool + // Prop used to simulate an unsupported property in bp2build conversion. If this + // is true, this module should be treated as "unconvertible" via bp2build. + Does_not_convert_to_bazel *bool + Api *string // File describing the APIs of this module Test_config_setting *bool // Used to test generation of config_setting targets @@ -535,6 +551,10 @@ func (m *customModule) dir() *string { } func (m *customModule) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + if p := m.props.Does_not_convert_to_bazel; p != nil && *p { + ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_PROPERTY_UNSUPPORTED, "") + return + } if p := m.props.One_to_many_prop; p != nil && *p { customBp2buildOneToMany(ctx, m) return diff --git a/cc/bp2build.go b/cc/bp2build.go index 7738487db..45fbf278a 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -99,7 +99,7 @@ type tidyAttributes struct { Tidy_timeout_srcs bazel.LabelListAttribute } -func (m *Module) convertTidyAttributes(ctx android.BaseMutatorContext, moduleAttrs *tidyAttributes) { +func (m *Module) convertTidyAttributes(ctx android.Bp2buildMutatorContext, moduleAttrs *tidyAttributes) { for _, f := range m.features { if tidy, ok := f.(*tidyFeature); ok { var tidyAttr *string @@ -246,9 +246,9 @@ type depsPartition struct { implementation bazel.LabelList } -type bazelLabelForDepsFn func(android.BazelConversionPathContext, []string) bazel.LabelList +type bazelLabelForDepsFn func(android.Bp2buildMutatorContext, []string) bazel.LabelList -func maybePartitionExportedAndImplementationsDeps(ctx android.BazelConversionPathContext, exportsDeps bool, allDeps, exportedDeps []string, fn bazelLabelForDepsFn) depsPartition { +func maybePartitionExportedAndImplementationsDeps(ctx android.Bp2buildMutatorContext, exportsDeps bool, allDeps, exportedDeps []string, fn bazelLabelForDepsFn) depsPartition { if !exportsDeps { return depsPartition{ implementation: fn(ctx, allDeps), @@ -263,9 +263,9 @@ func maybePartitionExportedAndImplementationsDeps(ctx android.BazelConversionPat } } -type bazelLabelForDepsExcludesFn func(android.BazelConversionPathContext, []string, []string) bazel.LabelList +type bazelLabelForDepsExcludesFn func(android.Bp2buildMutatorContext, []string, []string) bazel.LabelList -func maybePartitionExportedAndImplementationsDepsExcludes(ctx android.BazelConversionPathContext, exportsDeps bool, allDeps, excludes, exportedDeps []string, fn bazelLabelForDepsExcludesFn) depsPartition { +func maybePartitionExportedAndImplementationsDepsExcludes(ctx android.Bp2buildMutatorContext, exportsDeps bool, allDeps, excludes, exportedDeps []string, fn bazelLabelForDepsExcludesFn) depsPartition { if !exportsDeps { return depsPartition{ implementation: fn(ctx, allDeps, excludes), @@ -352,7 +352,7 @@ type prebuiltAttributes struct { Enabled bazel.BoolAttribute } -func parseSrc(ctx android.BazelConversionPathContext, srcLabelAttribute *bazel.LabelAttribute, axis bazel.ConfigurationAxis, config string, srcs []string) { +func parseSrc(ctx android.Bp2buildMutatorContext, srcLabelAttribute *bazel.LabelAttribute, axis bazel.ConfigurationAxis, config string, srcs []string) { srcFileError := func() { ctx.ModuleErrorf("parseSrc: Expected at most one source file for %s %s\n", axis, config) } @@ -370,7 +370,7 @@ func parseSrc(ctx android.BazelConversionPathContext, srcLabelAttribute *bazel.L } // NOTE: Used outside of Soong repo project, in the clangprebuilts.go bootstrap_go_package -func Bp2BuildParsePrebuiltLibraryProps(ctx android.BazelConversionPathContext, module *Module, isStatic bool) prebuiltAttributes { +func Bp2BuildParsePrebuiltLibraryProps(ctx android.Bp2buildMutatorContext, module *Module, isStatic bool) prebuiltAttributes { var srcLabelAttribute bazel.LabelAttribute bp2BuildPropParseHelper(ctx, module, &prebuiltLinkerProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) { @@ -407,7 +407,7 @@ func Bp2BuildParsePrebuiltLibraryProps(ctx android.BazelConversionPathContext, m } } -func bp2BuildParsePrebuiltBinaryProps(ctx android.BazelConversionPathContext, module *Module) prebuiltAttributes { +func bp2BuildParsePrebuiltBinaryProps(ctx android.Bp2buildMutatorContext, module *Module) prebuiltAttributes { var srcLabelAttribute bazel.LabelAttribute bp2BuildPropParseHelper(ctx, module, &prebuiltLinkerProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) { if props, ok := props.(*prebuiltLinkerProperties); ok { @@ -420,7 +420,7 @@ func bp2BuildParsePrebuiltBinaryProps(ctx android.BazelConversionPathContext, mo } } -func bp2BuildParsePrebuiltObjectProps(ctx android.BazelConversionPathContext, module *Module) prebuiltAttributes { +func bp2BuildParsePrebuiltObjectProps(ctx android.Bp2buildMutatorContext, module *Module) prebuiltAttributes { var srcLabelAttribute bazel.LabelAttribute bp2BuildPropParseHelper(ctx, module, &prebuiltObjectProperties{}, func(axis bazel.ConfigurationAxis, config string, props interface{}) { if props, ok := props.(*prebuiltObjectProperties); ok { @@ -555,7 +555,7 @@ func parseCommandLineFlags(soongFlags []string, filterOut ...filterOutFn) []stri return result } -func (ca *compilerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversionPathContext, axis bazel.ConfigurationAxis, config string, props *BaseCompilerProperties) { +func (ca *compilerAttributes) bp2buildForAxisAndConfig(ctx android.Bp2buildMutatorContext, axis bazel.ConfigurationAxis, config string, props *BaseCompilerProperties) { // If there's arch specific srcs or exclude_srcs, generate a select entry for it. // TODO(b/186153868): do this for OS specific srcs and exclude_srcs too. srcsList, ok := parseSrcs(ctx, props) @@ -680,7 +680,7 @@ func (ca *compilerAttributes) finalize(ctx android.BazelConversionPathContext, i } // Parse srcs from an arch or OS's props value. -func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProperties) (bazel.LabelList, bool) { +func parseSrcs(ctx android.Bp2buildMutatorContext, props *BaseCompilerProperties) (bazel.LabelList, bool) { anySrcs := false // Add srcs-like dependencies such as generated files. // First create a LabelList containing these dependencies, then merge the values with srcs. @@ -1265,7 +1265,7 @@ var ( // resolveTargetApex re-adds the shared and static libs in target.apex.exclude_shared|static_libs props to non-apex variant // since all libs are already excluded by default -func (la *linkerAttributes) resolveTargetApexProp(ctx android.BazelConversionPathContext, props *BaseLinkerProperties) { +func (la *linkerAttributes) resolveTargetApexProp(ctx android.Bp2buildMutatorContext, props *BaseLinkerProperties) { excludeSharedLibs := bazelLabelForSharedDeps(ctx, props.Target.Apex.Exclude_shared_libs) sharedExcludes := bazel.LabelList{Excludes: excludeSharedLibs.Includes} sharedExcludesLabelList := bazel.LabelListAttribute{} @@ -1696,7 +1696,7 @@ func (la *linkerAttributes) convertStripProps(ctx android.BazelConversionPathCon }) } -func (la *linkerAttributes) convertProductVariables(ctx android.BazelConversionPathContext, productVariableProps android.ProductConfigProperties) { +func (la *linkerAttributes) convertProductVariables(ctx android.Bp2buildMutatorContext, productVariableProps android.ProductConfigProperties) { type productVarDep struct { // the name of the corresponding excludes field, if one exists @@ -1704,7 +1704,7 @@ func (la *linkerAttributes) convertProductVariables(ctx android.BazelConversionP // reference to the bazel attribute that should be set for the given product variable config attribute *bazel.LabelListAttribute - depResolutionFunc func(ctx android.BazelConversionPathContext, modules, excludes []string) bazel.LabelList + depResolutionFunc func(ctx android.Bp2buildMutatorContext, modules, excludes []string) bazel.LabelList } // an intermediate attribute that holds Header_libs info, and will be appended to @@ -1762,7 +1762,7 @@ func (la *linkerAttributes) convertProductVariables(ctx android.BazelConversionP la.implementationDeps.Append(headerDeps) } -func (la *linkerAttributes) finalize(ctx android.BazelConversionPathContext) { +func (la *linkerAttributes) finalize(ctx android.Bp2buildMutatorContext) { // if system dynamic deps have the default value, any use of a system dynamic library used will // result in duplicate library errors for bionic OSes. Here, we explicitly exclude those libraries // from bionic OSes and the no config case as these libraries only build for bionic OSes. @@ -1903,39 +1903,39 @@ func xsdConfigCppTarget(xsd android.XsdConfigBp2buildTargets) string { return xsd.CppBp2buildTargetName() } -func bazelLabelForWholeDeps(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList { - return android.BazelLabelForModuleDepsWithFn(ctx, modules, bazelLabelForStaticWholeModuleDeps) +func bazelLabelForWholeDeps(ctx android.Bp2buildMutatorContext, modules []string) bazel.LabelList { + return android.BazelLabelForModuleDepsWithFn(ctx, modules, bazelLabelForStaticWholeModuleDeps, true) } -func bazelLabelForWholeDepsExcludes(ctx android.BazelConversionPathContext, modules, excludes []string) bazel.LabelList { +func bazelLabelForWholeDepsExcludes(ctx android.Bp2buildMutatorContext, modules, excludes []string) bazel.LabelList { return android.BazelLabelForModuleDepsExcludesWithFn(ctx, modules, excludes, bazelLabelForStaticWholeModuleDeps) } -func bazelLabelForStaticDepsExcludes(ctx android.BazelConversionPathContext, modules, excludes []string) bazel.LabelList { +func bazelLabelForStaticDepsExcludes(ctx android.Bp2buildMutatorContext, modules, excludes []string) bazel.LabelList { return android.BazelLabelForModuleDepsExcludesWithFn(ctx, modules, excludes, bazelLabelForStaticModule) } -func bazelLabelForStaticDeps(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList { - return android.BazelLabelForModuleDepsWithFn(ctx, modules, bazelLabelForStaticModule) +func bazelLabelForStaticDeps(ctx android.Bp2buildMutatorContext, modules []string) bazel.LabelList { + return android.BazelLabelForModuleDepsWithFn(ctx, modules, bazelLabelForStaticModule, true) } -func bazelLabelForSharedDeps(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList { - return android.BazelLabelForModuleDepsWithFn(ctx, modules, bazelLabelForSharedModule) +func bazelLabelForSharedDeps(ctx android.Bp2buildMutatorContext, modules []string) bazel.LabelList { + return android.BazelLabelForModuleDepsWithFn(ctx, modules, bazelLabelForSharedModule, true) } -func bazelLabelForHeaderDeps(ctx android.BazelConversionPathContext, modules []string) bazel.LabelList { +func bazelLabelForHeaderDeps(ctx android.Bp2buildMutatorContext, modules []string) bazel.LabelList { // This is not elegant, but bp2build's shared library targets only propagate // their header information as part of the normal C++ provider. return bazelLabelForSharedDeps(ctx, modules) } -func bazelLabelForHeaderDepsExcludes(ctx android.BazelConversionPathContext, modules, excludes []string) bazel.LabelList { +func bazelLabelForHeaderDepsExcludes(ctx android.Bp2buildMutatorContext, modules, excludes []string) bazel.LabelList { // This is only used when product_variable header_libs is processed, to follow // the pattern of depResolutionFunc return android.BazelLabelForModuleDepsExcludesWithFn(ctx, modules, excludes, bazelLabelForSharedModule) } -func bazelLabelForSharedDepsExcludes(ctx android.BazelConversionPathContext, modules, excludes []string) bazel.LabelList { +func bazelLabelForSharedDepsExcludes(ctx android.Bp2buildMutatorContext, modules, excludes []string) bazel.LabelList { return android.BazelLabelForModuleDepsExcludesWithFn(ctx, modules, excludes, bazelLabelForSharedModule) } @@ -1895,8 +1895,7 @@ func getNameSuffixWithVndkVersion(ctx android.ModuleContext, c LinkableInterface // do not add a name suffix because it is a base module. return "" } - vndkVersion = ctx.DeviceConfig().ProductVndkVersion() - nameSuffix = ProductSuffix + return ProductSuffix } else { vndkVersion = ctx.DeviceConfig().VndkVersion() nameSuffix = VendorSuffix diff --git a/cc/cc_test.go b/cc/cc_test.go index 7ce0f3715..f7eb8d270 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -41,7 +41,6 @@ var prepareForCcTest = android.GroupFixturePreparers( PrepareForTestWithCcIncludeVndk, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.DeviceVndkVersion = StringPtr("current") - variables.ProductVndkVersion = StringPtr("current") variables.Platform_vndk_version = StringPtr("29") }), ) @@ -104,33 +103,6 @@ func testCc(t *testing.T, bp string) *android.TestContext { return result.TestContext } -// testCcNoVndk runs tests using the prepareForCcTest -// -// See testCc for an explanation as to how to stop using this deprecated method. -// -// deprecated -func testCcNoVndk(t *testing.T, bp string) *android.TestContext { - t.Helper() - config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) - config.TestProductVariables.Platform_vndk_version = StringPtr("29") - - return testCcWithConfig(t, config) -} - -// testCcNoProductVndk runs tests using the prepareForCcTest -// -// See testCc for an explanation as to how to stop using this deprecated method. -// -// deprecated -func testCcNoProductVndk(t *testing.T, bp string) *android.TestContext { - t.Helper() - config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) - config.TestProductVariables.DeviceVndkVersion = StringPtr("current") - config.TestProductVariables.Platform_vndk_version = StringPtr("29") - - return testCcWithConfig(t, config) -} - // testCcErrorWithConfig runs tests using the prepareForCcTest // // See testCc for an explanation as to how to stop using this deprecated method. @@ -167,7 +139,6 @@ func testCcErrorProductVndk(t *testing.T, pattern string, bp string) { t.Helper() config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") - config.TestProductVariables.ProductVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("29") testCcErrorWithConfig(t, pattern, config) return @@ -523,7 +494,6 @@ func TestVndk(t *testing.T) { config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") - config.TestProductVariables.ProductVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("29") ctx := testCcWithConfig(t, config) @@ -889,63 +859,6 @@ func TestTestLibraryTestSuites(t *testing.T) { } } -func TestVndkWhenVndkVersionIsNotSet(t *testing.T) { - t.Parallel() - ctx := testCcNoVndk(t, ` - cc_library { - name: "libvndk", - vendor_available: true, - product_available: true, - vndk: { - enabled: true, - }, - nocrt: true, - } - cc_library { - name: "libvndk-private", - vendor_available: true, - product_available: true, - vndk: { - enabled: true, - private: true, - }, - nocrt: true, - } - - cc_library { - name: "libllndk", - llndk: { - symbol_file: "libllndk.map.txt", - export_llndk_headers: ["libllndk_headers"], - } - } - - cc_library_headers { - name: "libllndk_headers", - llndk: { - symbol_file: "libllndk.map.txt", - }, - export_include_dirs: ["include"], - } - `) - - checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{ - "LLNDK: libc.so", - "LLNDK: libdl.so", - "LLNDK: libft2.so", - "LLNDK: libllndk.so", - "LLNDK: libm.so", - "VNDK-SP: libc++.so", - "VNDK-core: libvndk-private.so", - "VNDK-core: libvndk.so", - "VNDK-private: libft2.so", - "VNDK-private: libvndk-private.so", - "VNDK-product: libc++.so", - "VNDK-product: libvndk-private.so", - "VNDK-product: libvndk.so", - }) -} - func TestVndkModuleError(t *testing.T) { t.Parallel() // Check the error message for vendor_available and product_available properties. @@ -1111,6 +1024,7 @@ func TestVndkDepError(t *testing.T) { cc_library { name: "libnonvndk", vendor_available: true, + product_available: true, nocrt: true, } `) @@ -1132,6 +1046,7 @@ func TestVndkDepError(t *testing.T) { cc_library { name: "libnonvndk", vendor_available: true, + product_available: true, nocrt: true, } `) @@ -1153,6 +1068,7 @@ func TestVndkDepError(t *testing.T) { cc_library { name: "libnonvndk", vendor_available: true, + product_available: true, nocrt: true, } `) @@ -1175,6 +1091,7 @@ func TestVndkDepError(t *testing.T) { cc_library { name: "libnonvndk", vendor_available: true, + product_available: true, nocrt: true, } `) @@ -1390,6 +1307,7 @@ func TestCheckVndkMembershipBeforeDoubleLoadable(t *testing.T) { cc_library { name: "libanothervndksp", vendor_available: true, + product_available: true, } `) } @@ -1467,7 +1385,6 @@ func TestVndkExt(t *testing.T) { ` config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") - config.TestProductVariables.ProductVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("29") ctx := testCcWithConfig(t, config) @@ -1482,70 +1399,6 @@ func TestVndkExt(t *testing.T) { assertString(t, mod_product.outputFile.Path().Base(), "libvndk2-suffix.so") } -func TestVndkExtWithoutBoardVndkVersion(t *testing.T) { - t.Parallel() - // This test checks the VNDK-Ext properties when BOARD_VNDK_VERSION is not set. - ctx := testCcNoVndk(t, ` - cc_library { - name: "libvndk", - vendor_available: true, - product_available: true, - vndk: { - enabled: true, - }, - nocrt: true, - } - - cc_library { - name: "libvndk_ext", - vendor: true, - vndk: { - enabled: true, - extends: "libvndk", - }, - nocrt: true, - } - `) - - // Ensures that the core variant of "libvndk_ext" can be found. - mod := ctx.ModuleForTests("libvndk_ext", coreVariant).Module().(*Module) - if extends := mod.getVndkExtendsModuleName(); extends != "libvndk" { - t.Errorf("\"libvndk_ext\" must extend from \"libvndk\" but get %q", extends) - } -} - -func TestVndkExtWithoutProductVndkVersion(t *testing.T) { - t.Parallel() - // This test checks the VNDK-Ext properties when PRODUCT_PRODUCT_VNDK_VERSION is not set. - ctx := testCcNoProductVndk(t, ` - cc_library { - name: "libvndk", - vendor_available: true, - product_available: true, - vndk: { - enabled: true, - }, - nocrt: true, - } - - cc_library { - name: "libvndk_ext_product", - product_specific: true, - vndk: { - enabled: true, - extends: "libvndk", - }, - nocrt: true, - } - `) - - // Ensures that the core variant of "libvndk_ext_product" can be found. - mod := ctx.ModuleForTests("libvndk_ext_product", coreVariant).Module().(*Module) - if extends := mod.getVndkExtendsModuleName(); extends != "libvndk" { - t.Errorf("\"libvndk_ext_product\" must extend from \"libvndk\" but get %q", extends) - } -} - func TestVndkExtError(t *testing.T) { t.Parallel() // This test ensures an error is emitted in ill-formed vndk-ext definition. @@ -1920,7 +1773,6 @@ func TestProductVndkExtDependency(t *testing.T) { ` config := TestConfig(t.TempDir(), android.Android, nil, bp, nil) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") - config.TestProductVariables.ProductVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("29") testCcWithConfig(t, config) @@ -3034,24 +2886,6 @@ func TestExcludeRuntimeLibs(t *testing.T) { checkRuntimeLibs(t, nil, module) } -func TestRuntimeLibsNoVndk(t *testing.T) { - t.Parallel() - ctx := testCcNoVndk(t, runtimeLibAndroidBp) - - // If DeviceVndkVersion is not defined, then runtime_libs are copied as-is. - - variant := "android_arm64_armv8-a_shared" - - module := ctx.ModuleForTests("libvendor_available1", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available"}, module) - - module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available", "libvendor1", "libproduct_vendor"}, module) - - module = ctx.ModuleForTests("libproduct2", variant).Module().(*Module) - checkRuntimeLibs(t, []string{"liball_available", "libproduct1", "libproduct_vendor"}, module) -} - func checkStaticLibs(t *testing.T, expected []string, module *Module) { t.Helper() actual := module.Properties.AndroidMkStaticLibs diff --git a/cc/genrule.go b/cc/genrule.go index d1c4c2a2f..63c728cb6 100644 --- a/cc/genrule.go +++ b/cc/genrule.go @@ -84,7 +84,7 @@ func (g *GenruleExtraProperties) CoreVariantNeeded(ctx android.BaseModuleContext return true } - if ctx.DeviceConfig().ProductVndkVersion() != "" && ctx.ProductSpecific() { + if ctx.ProductSpecific() { return false } @@ -134,15 +134,8 @@ func (g *GenruleExtraProperties) ExtraImageVariations(ctx android.BaseModuleCont } } - if ctx.DeviceConfig().ProductVndkVersion() == "" { - return variants - } - if Bool(g.Product_available) || ctx.ProductSpecific() { variants = append(variants, ProductVariationPrefix+ctx.DeviceConfig().PlatformVndkVersion()) - if vndkVersion := ctx.DeviceConfig().ProductVndkVersion(); vndkVersion != "current" { - variants = append(variants, ProductVariationPrefix+vndkVersion) - } } return variants diff --git a/cc/image.go b/cc/image.go index f91762adc..239f1db37 100644 --- a/cc/image.go +++ b/cc/image.go @@ -427,7 +427,6 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { platformVndkVersion := mctx.DeviceConfig().PlatformVndkVersion() boardVndkVersion := mctx.DeviceConfig().VndkVersion() - productVndkVersion := mctx.DeviceConfig().ProductVndkVersion() recoverySnapshotVersion := mctx.DeviceConfig().RecoverySnapshotVersion() usingRecoverySnapshot := recoverySnapshotVersion != "current" && recoverySnapshotVersion != "" @@ -444,9 +443,6 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { if boardVndkVersion == "current" { boardVndkVersion = platformVndkVersion } - if productVndkVersion == "current" { - productVndkVersion = platformVndkVersion - } if m.NeedsLlndkVariants() { // This is an LLNDK library. The implementation of the library will be on /system, @@ -462,9 +458,6 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { if needVndkVersionVendorVariantForLlndk { vendorVariants = append(vendorVariants, boardVndkVersion) } - if productVndkVersion != "" { - productVariants = append(productVariants, productVndkVersion) - } } else if m.NeedsVendorPublicLibraryVariants() { // A vendor public library has the implementation on /vendor, with stub variants // for system and product. @@ -473,9 +466,6 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { if platformVndkVersion != "" { productVariants = append(productVariants, platformVndkVersion) } - if productVndkVersion != "" { - productVariants = append(productVariants, productVndkVersion) - } } else if boardVndkVersion == "" { // If the device isn't compiling against the VNDK, we always // use the core mode. @@ -507,10 +497,6 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { // product_available modules are available to /product. if m.HasProductVariant() { productVariants = append(productVariants, platformVndkVersion) - // VNDK is always PLATFORM_VNDK_VERSION - if !m.IsVndk() { - productVariants = append(productVariants, productVndkVersion) - } } } else if vendorSpecific && m.SdkVersion() == "" { // This will be available in /vendor (or /odm) only @@ -538,17 +524,10 @@ func MutateImage(mctx android.BaseModuleContext, m ImageMutatableModule) { coreVariantNeeded = true } - if boardVndkVersion != "" && productVndkVersion != "" { - if coreVariantNeeded && productSpecific && m.SdkVersion() == "" { - // The module has "product_specific: true" that does not create core variant. - coreVariantNeeded = false - productVariants = append(productVariants, productVndkVersion) - } - } else { - // Unless PRODUCT_PRODUCT_VNDK_VERSION is set, product partition has no - // restriction to use system libs. - // No product variants defined in this case. - productVariants = []string{} + if coreVariantNeeded && productSpecific && m.SdkVersion() == "" { + // The module has "product_specific: true" that does not create core variant. + coreVariantNeeded = false + productVariants = append(productVariants, platformVndkVersion) } if m.RamdiskAvailable() { diff --git a/cc/library.go b/cc/library.go index e66ce08e6..90d91ca0e 100644 --- a/cc/library.go +++ b/cc/library.go @@ -547,54 +547,6 @@ func (includes *apiIncludes) addDep(name string) { includes.attrs.Deps.Append(lla) } -// includes provided to the module-lib API surface. This API surface is used by apexes. -func getModuleLibApiIncludes(ctx android.TopDownMutatorContext, c *Module) apiIncludes { - flagProps := c.library.(*libraryDecorator).flagExporter.Properties - linkProps := c.library.(*libraryDecorator).baseLinker.Properties - includes := android.FirstUniqueStrings(flagProps.Export_include_dirs) - systemIncludes := android.FirstUniqueStrings(flagProps.Export_system_include_dirs) - headerLibs := android.FirstUniqueStrings(linkProps.Export_header_lib_headers) - attrs := bazelCcLibraryHeadersAttributes{ - Export_includes: bazel.MakeStringListAttribute(includes), - Export_system_includes: bazel.MakeStringListAttribute(systemIncludes), - Deps: bazel.MakeLabelListAttribute(apiHeaderLabels(ctx, headerLibs)), - } - - return apiIncludes{ - name: c.Name() + ".module-libapi.headers", - attrs: bazelCcApiLibraryHeadersAttributes{ - bazelCcLibraryHeadersAttributes: attrs, - }, - } -} - -func getVendorApiIncludes(ctx android.TopDownMutatorContext, c *Module) apiIncludes { - baseProps := c.library.(*libraryDecorator).flagExporter.Properties - llndkProps := c.library.(*libraryDecorator).Properties.Llndk - includes := baseProps.Export_include_dirs - systemIncludes := baseProps.Export_system_include_dirs - // LLNDK can override the base includes - if llndkIncludes := llndkProps.Override_export_include_dirs; llndkIncludes != nil { - includes = llndkIncludes - } - if proptools.Bool(llndkProps.Export_headers_as_system) { - systemIncludes = append(systemIncludes, includes...) - includes = nil - } - - attrs := bazelCcLibraryHeadersAttributes{ - Export_includes: bazel.MakeStringListAttribute(includes), - Export_system_includes: bazel.MakeStringListAttribute(systemIncludes), - Deps: bazel.MakeLabelListAttribute(apiHeaderLabels(ctx, llndkProps.Export_llndk_headers)), - } - return apiIncludes{ - name: c.Name() + ".vendorapi.headers", - attrs: bazelCcApiLibraryHeadersAttributes{ - bazelCcLibraryHeadersAttributes: attrs, - }, - } -} - // cc_library creates both static and/or shared libraries for a device and/or // host. By default, a cc_library has a single variant that targets the device. // Specifying `host_supported: true` also creates a library that targets the diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go index da5db1c19..461aa961c 100644 --- a/cc/ndk_headers.go +++ b/cc/ndk_headers.go @@ -19,6 +19,7 @@ import ( "path/filepath" "github.com/google/blueprint" + "github.com/google/blueprint/proptools" "android/soong/android" "android/soong/bazel" @@ -151,6 +152,7 @@ type bazelNdkHeadersAttributes struct { Strip_import_prefix *string Import_prefix *string Hdrs bazel.LabelListAttribute + Run_versioner *bool } func (h *headerModule) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { @@ -217,6 +219,7 @@ type versionedHeaderProperties struct { // Note that this is really only built to handle bionic/libc/include. type versionedHeaderModule struct { android.ModuleBase + android.BazelModuleBase properties versionedHeaderProperties @@ -255,6 +258,25 @@ func (m *versionedHeaderModule) GenerateAndroidBuildActions(ctx android.ModuleCo processHeadersWithVersioner(ctx, fromSrcPath, toOutputPath, m.srcPaths, installPaths) } +func (h *versionedHeaderModule) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + props := bazel.BazelTargetModuleProperties{ + Rule_class: "ndk_headers", + Bzl_load_location: "//build/bazel/rules/cc:ndk_headers.bzl", + } + globPattern := headerGlobPattern(proptools.String(h.properties.From)) + attrs := &bazelNdkHeadersAttributes{ + Strip_import_prefix: h.properties.From, + Import_prefix: h.properties.To, + Run_versioner: proptools.BoolPtr(true), + Hdrs: bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, []string{globPattern})), + } + ctx.CreateBazelTargetModule( + props, + android.CommonAttributes{Name: h.Name()}, + attrs, + ) +} + func processHeadersWithVersioner(ctx android.ModuleContext, srcDir, outDir android.Path, srcPaths android.Paths, installPaths []android.WritablePath) android.Path { // The versioner depends on a dependencies directory to simplify determining include paths @@ -298,12 +320,13 @@ func processHeadersWithVersioner(ctx android.ModuleContext, srcDir, outDir andro // Unlike the ndk_headers soong module, versioned_ndk_headers operates on a // directory level specified in `from` property. This is only used to process // the bionic/libc/include directory. -func versionedNdkHeadersFactory() android.Module { +func VersionedNdkHeadersFactory() android.Module { module := &versionedHeaderModule{} module.AddProperties(&module.properties) android.InitAndroidModule(module) + android.InitBazelModule(module) return module } diff --git a/cc/ndk_library.go b/cc/ndk_library.go index 56c57b94c..2064b1b41 100644 --- a/cc/ndk_library.go +++ b/cc/ndk_library.go @@ -61,7 +61,7 @@ var ( // because we don't want to spam the build output with "nothing // changed" messages, so redirect output message to $out, and if // changes were detected print the output and fail. - Command: "$stgdiff $args --stg $in -o $out || (cat $out && false)", + Command: "$stgdiff $args --stg $in -o $out || (cat $out && false; echo 'Run $$ANDROID_BUILD_TOP/development/tools/ndk/update_ndk_abi.sh to update the ABI dumps.')", CommandDeps: []string{"$stgdiff"}, }, "args") @@ -580,15 +580,6 @@ type bazelCcApiContributionAttributes struct { Library_name string } -// Names of the cc_api_header targets in the bp2build workspace -func apiHeaderLabels(ctx android.TopDownMutatorContext, hdrLibs []string) bazel.LabelList { - addSuffix := func(ctx android.BazelConversionPathContext, module blueprint.Module) string { - label := android.BazelModuleLabel(ctx, module) - return android.ApiContributionTargetName(label) - } - return android.BazelLabelForModuleDepsWithFn(ctx, hdrLibs, addSuffix) -} - func ndkLibraryBp2build(ctx android.Bp2buildMutatorContext, c *Module) { ndk, _ := c.linker.(*stubDecorator) props := bazel.BazelTargetModuleProperties{ diff --git a/cc/ndk_sysroot.go b/cc/ndk_sysroot.go index 54a2ee267..483d23bd7 100644 --- a/cc/ndk_sysroot.go +++ b/cc/ndk_sysroot.go @@ -64,7 +64,7 @@ func init() { func RegisterNdkModuleTypes(ctx android.RegistrationContext) { ctx.RegisterModuleType("ndk_headers", NdkHeadersFactory) ctx.RegisterModuleType("ndk_library", NdkLibraryFactory) - ctx.RegisterModuleType("versioned_ndk_headers", versionedNdkHeadersFactory) + ctx.RegisterModuleType("versioned_ndk_headers", VersionedNdkHeadersFactory) ctx.RegisterModuleType("preprocessed_ndk_headers", preprocessedNdkHeadersFactory) ctx.RegisterParallelSingletonType("ndk", NdkSingleton) } diff --git a/cc/test.go b/cc/test.go index 8c63dc614..f128187d2 100644 --- a/cc/test.go +++ b/cc/test.go @@ -799,7 +799,7 @@ func testBinaryBp2build(ctx android.Bp2buildMutatorContext, m *Module) { // cc_test that builds using gtest needs some additional deps // addImplicitGtestDeps makes these deps explicit in the generated BUILD files -func addImplicitGtestDeps(ctx android.BazelConversionPathContext, attrs *testBinaryAttributes, gtest, gtestIsolated bool) { +func addImplicitGtestDeps(ctx android.Bp2buildMutatorContext, attrs *testBinaryAttributes, gtest, gtestIsolated bool) { addDepsAndDedupe := func(lla *bazel.LabelListAttribute, modules []string) { moduleLabels := android.BazelLabelForModuleDeps(ctx, modules) lla.Value.Append(moduleLabels) diff --git a/java/config/kotlin.go b/java/config/kotlin.go index fc63f4dfb..e5e187cad 100644 --- a/java/config/kotlin.go +++ b/java/config/kotlin.go @@ -49,8 +49,5 @@ func init() { "-J--add-opens=java.base/java.util=ALL-UNNAMED", // https://youtrack.jetbrains.com/issue/KT-43704 }, " ")) - pctx.StaticVariable("KotlincGlobalFlags", strings.Join([]string{ - // b/222162908: prevent kotlinc from reading /tmp/build.txt - "-Didea.plugins.compatible.build=999.SNAPSHOT", - }, " ")) + pctx.StaticVariable("KotlincGlobalFlags", strings.Join([]string{}, " ")) } diff --git a/java/dex.go b/java/dex.go index 1aa4d1c69..348c93921 100644 --- a/java/dex.go +++ b/java/dex.go @@ -140,9 +140,7 @@ var r8, r8RE = pctx.MultiCommandRemoteStaticRules("r8", Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + `rm -f "$outDict" && rm -f "$outConfig" && rm -rf "${outUsageDir}" && ` + `mkdir -p $$(dirname ${outUsage}) && ` + - `mkdir -p $$(dirname $tmpJar) && ` + - `${config.Zip2ZipCmd} -i $in -o $tmpJar -x '**/*.dex' && ` + - `$r8Template${config.R8Cmd} ${config.R8Flags} -injars $tmpJar --output $outDir ` + + `$r8Template${config.R8Cmd} ${config.R8Flags} -injars $in --output $outDir ` + `--no-data-resources ` + `-printmapping ${outDict} ` + `-printconfiguration ${outConfig} ` + @@ -187,7 +185,7 @@ var r8, r8RE = pctx.MultiCommandRemoteStaticRules("r8", Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"}, }, }, []string{"outDir", "outDict", "outConfig", "outUsage", "outUsageZip", "outUsageDir", - "r8Flags", "zipFlags", "tmpJar", "mergeZipsFlags"}, []string{"implicits"}) + "r8Flags", "zipFlags", "mergeZipsFlags"}, []string{"implicits"}) func (d *dexer) dexCommonFlags(ctx android.ModuleContext, dexParams *compileDexParams) (flags []string, deps android.Paths) { @@ -370,7 +368,6 @@ func (d *dexer) compileDex(ctx android.ModuleContext, dexParams *compileDexParam // Compile classes.jar into classes.dex and then javalib.jar javalibJar := android.PathForModuleOut(ctx, "dex", dexParams.jarName).OutputPath outDir := android.PathForModuleOut(ctx, "dex") - tmpJar := android.PathForModuleOut(ctx, "withres-withoutdex", dexParams.jarName) zipFlags := "--ignore_missing_files" if proptools.Bool(d.dexProperties.Uncompress_dex) { @@ -408,7 +405,6 @@ func (d *dexer) compileDex(ctx android.ModuleContext, dexParams *compileDexParam "outUsage": proguardUsage.String(), "outUsageZip": proguardUsageZip.String(), "outDir": outDir.String(), - "tmpJar": tmpJar.String(), "mergeZipsFlags": mergeZipsFlags, } if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_R8") { @@ -428,6 +424,7 @@ func (d *dexer) compileDex(ctx android.ModuleContext, dexParams *compileDexParam Args: args, }) } else { + tmpJar := android.PathForModuleOut(ctx, "withres-withoutdex", dexParams.jarName) d8Flags, d8Deps := d8Flags(dexParams.flags) d8Deps = append(d8Deps, commonDeps...) rule := d8 diff --git a/java/droiddoc.go b/java/droiddoc.go index d5547d05c..87588f377 100644 --- a/java/droiddoc.go +++ b/java/droiddoc.go @@ -136,6 +136,9 @@ type DroiddocProperties struct { // At some point, this might be improved to show more warnings. Todo_file *string `android:"path"` + // A file containing a baseline for allowed lint errors. + Lint_baseline *string `android:"path"` + // directory under current module source that provide additional resources (images). Resourcesdir *string @@ -665,6 +668,10 @@ func (d *Droiddoc) doclavaDocsFlags(ctx android.ModuleContext, cmd *android.Rule ImplicitOutput(android.PathForModuleOut(ctx, String(d.properties.Todo_file))) } + if String(d.properties.Lint_baseline) != "" { + cmd.FlagWithInput("-lintbaseline ", android.PathForModuleSrc(ctx, String(d.properties.Lint_baseline))) + } + if String(d.properties.Resourcesdir) != "" { // TODO: should we add files under resourcesDir to the implicits? It seems that // resourcesDir is one sub dir of htmlDir diff --git a/rust/compiler.go b/rust/compiler.go index 6f61798be..b3f574d57 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -327,16 +327,18 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags) Flag flags.LinkFlags = append(flags.LinkFlags, cc.RpathFlags(ctx)...) } - if !ctx.toolchain().Bionic() && ctx.Os() != android.LinuxMusl && !ctx.Windows() { - // Add -lc, -lrt, -ldl, -lpthread, -lm, -lrt and -lgcc_s to host builds to match the default behavior of device - // builds. This is irrelevant for the Windows target as these are Posix specific. + if ctx.Os() == android.Linux { + // Add -lc, -lrt, -ldl, -lpthread, -lm and -lgcc_s to glibc builds to match + // the default behavior of device builds. + flags.LinkFlags = append(flags.LinkFlags, config.LinuxHostGlobalLinkFlags...) + } else if ctx.Os() == android.Darwin { + // Add -lc, -ldl, -lpthread and -lm to glibc darwin builds to match the default + // behavior of device builds. flags.LinkFlags = append(flags.LinkFlags, "-lc", - "-lrt", "-ldl", "-lpthread", "-lm", - "-lgcc_s", ) } return flags diff --git a/rust/config/global.go b/rust/config/global.go index f397ce90d..c37ac4e21 100644 --- a/rust/config/global.go +++ b/rust/config/global.go @@ -52,11 +52,22 @@ var ( "-C force-unwind-tables=yes", // Use v0 mangling to distinguish from C++ symbols "-C symbol-mangling-version=v0", - "--color always", + // This flag requires to have no space so that when it's exported to bazel + // it can be removed. See aosp/2768339 + "--color=always", "-Zdylib-lto", "-Z link-native-libraries=no", } + LinuxHostGlobalLinkFlags = []string{ + "-lc", + "-lrt", + "-ldl", + "-lpthread", + "-lm", + "-lgcc_s", + } + deviceGlobalRustFlags = []string{ "-C panic=abort", // Generate additional debug info for AutoFDO @@ -101,6 +112,8 @@ func init() { pctx.StaticVariable("DeviceGlobalLinkFlags", strings.Join(deviceGlobalLinkFlags, " ")) exportedVars.ExportStringStaticVariable("RUST_DEFAULT_VERSION", RustDefaultVersion) + exportedVars.ExportStringListStaticVariable("GLOBAL_RUSTC_FLAGS", GlobalRustFlags) + exportedVars.ExportStringListStaticVariable("LINUX_HOST_GLOBAL_LINK_FLAGS", LinuxHostGlobalLinkFlags) } func HostPrebuiltTag(config android.Config) string { diff --git a/rust/rust_test.go b/rust/rust_test.go index 566b76b29..d609c2faa 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -40,7 +40,6 @@ var prepareForRustTest = android.GroupFixturePreparers( PrepareForTestWithRustIncludeVndk, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.DeviceVndkVersion = StringPtr("current") - variables.ProductVndkVersion = StringPtr("current") variables.Platform_vndk_version = StringPtr("29") }), ) @@ -105,7 +104,6 @@ func testRustVndkFsVersions(t *testing.T, bp string, fs android.MockFS, device_v android.FixtureModifyProductVariables( func(variables android.FixtureProductVariables) { variables.DeviceVndkVersion = StringPtr(device_version) - variables.ProductVndkVersion = StringPtr(product_version) variables.Platform_vndk_version = StringPtr(vndk_version) }, ), @@ -173,7 +171,6 @@ func testRustVndkFsError(t *testing.T, pattern string, bp string, fs android.Moc android.FixtureModifyProductVariables( func(variables android.FixtureProductVariables) { variables.DeviceVndkVersion = StringPtr("current") - variables.ProductVndkVersion = StringPtr("current") variables.Platform_vndk_version = StringPtr("VER") }, ), diff --git a/sysprop/sysprop_test.go b/sysprop/sysprop_test.go index 80b86e059..e51fe39c9 100644 --- a/sysprop/sysprop_test.go +++ b/sysprop/sysprop_test.go @@ -42,6 +42,7 @@ func test(t *testing.T, bp string) *android.TestResult { cc_library_headers { name: "libbase_headers", vendor_available: true, + product_available: true, recovery_available: true, } @@ -250,6 +251,16 @@ func TestSyspropLibrary(t *testing.T) { result.ModuleForTests("libsysprop-odm", variant) } + // product variant of vendor-owned sysprop_library + for _, variant := range []string{ + "android_product.29_arm_armv7-a-neon_shared", + "android_product.29_arm_armv7-a-neon_static", + "android_product.29_arm64_armv8-a_shared", + "android_product.29_arm64_armv8-a_static", + } { + result.ModuleForTests("libsysprop-vendor-on-product", variant) + } + for _, variant := range []string{ "android_arm_armv7-a-neon_shared", "android_arm_armv7-a-neon_static", @@ -259,9 +270,6 @@ func TestSyspropLibrary(t *testing.T) { library := result.ModuleForTests("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) - - // product variant of vendor-owned sysprop_library - result.ModuleForTests("libsysprop-vendor-on-product", variant) } result.ModuleForTests("sysprop-platform", "android_common") @@ -272,15 +280,15 @@ func TestSyspropLibrary(t *testing.T) { // Check for exported includes coreVariant := "android_arm64_armv8-a_static" vendorVariant := "android_vendor.29_arm64_armv8-a_static" + productVariant := "android_product.29_arm64_armv8-a_static" platformInternalPath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/include" - platformPublicCorePath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/public/include" platformPublicVendorPath := "libsysprop-platform/android_vendor.29_arm64_armv8-a_static/gen/sysprop/public/include" - platformOnProductPath := "libsysprop-platform-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include" + platformOnProductPath := "libsysprop-platform-on-product/android_product.29_arm64_armv8-a_static/gen/sysprop/public/include" vendorInternalPath := "libsysprop-vendor/android_vendor.29_arm64_armv8-a_static/gen/sysprop/include" - vendorPublicPath := "libsysprop-vendor-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include" + vendorOnProductPath := "libsysprop-vendor-on-product/android_product.29_arm64_armv8-a_static/gen/sysprop/public/include" platformClient := result.ModuleForTests("cc-client-platform", coreVariant) platformFlags := platformClient.Rule("cc").Args["cFlags"] @@ -294,14 +302,14 @@ func TestSyspropLibrary(t *testing.T) { // platform-static should use platform's internal header android.AssertStringDoesContain(t, "flags for platform-static", platformStaticFlags, platformInternalPath) - productClient := result.ModuleForTests("cc-client-product", coreVariant) + productClient := result.ModuleForTests("cc-client-product", productVariant) productFlags := productClient.Rule("cc").Args["cFlags"] // Product should use platform's and vendor's public headers if !strings.Contains(productFlags, platformOnProductPath) || - !strings.Contains(productFlags, vendorPublicPath) { + !strings.Contains(productFlags, vendorOnProductPath) { t.Errorf("flags for product must contain %#v and %#v, but was %#v.", - platformPublicCorePath, vendorPublicPath, productFlags) + platformOnProductPath, vendorOnProductPath, productFlags) } vendorClient := result.ModuleForTests("cc-client-vendor", vendorVariant) |