diff options
| -rw-r--r-- | androidmk/parser/parser.go | 3 | ||||
| -rw-r--r-- | androidmk/parser/parser_test.go | 16 | ||||
| -rw-r--r-- | apex/aconfig_test.go | 151 | ||||
| -rw-r--r-- | java/dex.go | 10 | ||||
| -rw-r--r-- | rust/rust.go | 6 | ||||
| -rw-r--r-- | sysprop/sysprop_library.go | 86 | ||||
| -rw-r--r-- | sysprop/sysprop_test.go | 10 |
7 files changed, 236 insertions, 46 deletions
diff --git a/androidmk/parser/parser.go b/androidmk/parser/parser.go index fb6be38e9..8a20bb052 100644 --- a/androidmk/parser/parser.go +++ b/androidmk/parser/parser.go @@ -413,6 +413,9 @@ loop: p.accept('\t') newLine = false continue loop + } else if p.tok == '\n' { + p.accept('\n') + continue loop } else if p.parseDirective() { newLine = false continue diff --git a/androidmk/parser/parser_test.go b/androidmk/parser/parser_test.go index 9efebf8e1..db3313d27 100644 --- a/androidmk/parser/parser_test.go +++ b/androidmk/parser/parser_test.go @@ -84,6 +84,22 @@ endif`, }, }, }, + { + name: "Blank line in rule's command", + in: `all: + echo first line + + echo second line`, + out: []Node{ + &Rule{ + Target: SimpleMakeString("all", NoPos), + RecipePos: NoPos, + Recipe: "echo first line\necho second line", + Prerequisites: SimpleMakeString("", NoPos), + }, + }, + }, + } func TestParse(t *testing.T) { diff --git a/apex/aconfig_test.go b/apex/aconfig_test.go index be98d457b..a179dbffd 100644 --- a/apex/aconfig_test.go +++ b/apex/aconfig_test.go @@ -193,6 +193,70 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) { mode: "exported", }`, }, + { + name: "Rust lib passes for exported containers cross", + bp: apex_default_bp + ` + apex { + name: "myapex", + manifest: ":myapex.manifest", + androidManifest: ":myapex.androidmanifest", + key: "myapex.key", + native_shared_libs: ["libmy_rust_library"], + binaries: ["my_rust_binary"], + updatable: false, + } + rust_library { + name: "libflags_rust", // test mock + crate_name: "flags_rust", + srcs: ["lib.rs"], + apex_available: ["myapex"], + } + rust_library { + name: "liblazy_static", // test mock + crate_name: "lazy_static", + srcs: ["src/lib.rs"], + apex_available: ["myapex"], + } + rust_ffi_shared { + name: "libmy_rust_library", + srcs: ["src/lib.rs"], + rustlibs: ["libmy_rust_aconfig_library_foo"], + crate_name: "my_rust_library", + apex_available: ["myapex"], + } + rust_binary { + name: "my_rust_binary", + srcs: ["foo/bar/MyClass.rs"], + rustlibs: ["libmy_rust_aconfig_library_bar"], + apex_available: ["myapex"], + } + aconfig_declarations { + name: "my_aconfig_declarations_foo", + package: "com.example.package", + container: "otherapex", + srcs: ["foo.aconfig"], + } + aconfig_declarations { + name: "my_aconfig_declarations_bar", + package: "com.example.package", + container: "otherapex", + srcs: ["bar.aconfig"], + } + rust_aconfig_library { + name: "libmy_rust_aconfig_library_foo", + aconfig_declarations: "my_aconfig_declarations_foo", + crate_name: "my_rust_aconfig_library_foo", + apex_available: ["myapex"], + mode: "exported", + } + rust_aconfig_library { + name: "libmy_rust_aconfig_library_bar", + aconfig_declarations: "my_aconfig_declarations_bar", + crate_name: "my_rust_aconfig_library_bar", + apex_available: ["myapex"], + mode: "exported", + }`, + }, } for _, test := range testCases { t.Run(test.name, func(t *testing.T) { @@ -394,6 +458,93 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { expectedError: `.*my_cc_binary_foo/myapex depends on my_cc_aconfig_library_foo/otherapex/production across containers`, }, { + name: "Rust lib fails for non-exported containers cross", + bp: apex_default_bp + ` + apex { + name: "myapex", + manifest: ":myapex.manifest", + androidManifest: ":myapex.androidmanifest", + key: "myapex.key", + native_shared_libs: ["libmy_rust_library"], + updatable: false, + } + rust_library { + name: "libflags_rust", // test mock + crate_name: "flags_rust", + srcs: ["lib.rs"], + apex_available: ["myapex"], + } + rust_library { + name: "liblazy_static", // test mock + crate_name: "lazy_static", + srcs: ["src/lib.rs"], + apex_available: ["myapex"], + } + rust_ffi_shared { + name: "libmy_rust_library", + srcs: ["src/lib.rs"], + rustlibs: ["libmy_rust_aconfig_library_foo"], + crate_name: "my_rust_library", + apex_available: ["myapex"], + } + aconfig_declarations { + name: "my_aconfig_declarations_foo", + package: "com.example.package", + container: "otherapex", + srcs: ["foo.aconfig"], + } + rust_aconfig_library { + name: "libmy_rust_aconfig_library_foo", + aconfig_declarations: "my_aconfig_declarations_foo", + crate_name: "my_rust_aconfig_library_foo", + apex_available: ["myapex"], + }`, + expectedError: `.*libmy_rust_aconfig_library_foo/myapex depends on libmy_rust_aconfig_library_foo/otherapex/production across containers`, + }, + { + name: "Rust binary fails for non-exported containers cross", + bp: apex_default_bp + ` + apex { + name: "myapex", + manifest: ":myapex.manifest", + androidManifest: ":myapex.androidmanifest", + key: "myapex.key", + binaries: ["my_rust_binary"], + updatable: false, + } + rust_library { + name: "libflags_rust", // test mock + crate_name: "flags_rust", + srcs: ["lib.rs"], + apex_available: ["myapex"], + } + rust_library { + name: "liblazy_static", // test mock + crate_name: "lazy_static", + srcs: ["src/lib.rs"], + apex_available: ["myapex"], + } + rust_binary { + name: "my_rust_binary", + srcs: ["foo/bar/MyClass.rs"], + rustlibs: ["libmy_rust_aconfig_library_bar"], + apex_available: ["myapex"], + } + aconfig_declarations { + name: "my_aconfig_declarations_bar", + package: "com.example.package", + container: "otherapex", + srcs: ["bar.aconfig"], + } + rust_aconfig_library { + name: "libmy_rust_aconfig_library_bar", + aconfig_declarations: "my_aconfig_declarations_bar", + crate_name: "my_rust_aconfig_library_bar", + apex_available: ["myapex"], + }`, + expectedError: `.*libmy_rust_aconfig_library_bar/myapex depends on libmy_rust_aconfig_library_bar/otherapex/production across containers`, + }, + { name: "Aconfig validation propagate along sourceOrOutputDependencyTag", bp: apex_default_bp + ` apex { diff --git a/java/dex.go b/java/dex.go index b721f5888..4474c636a 100644 --- a/java/dex.go +++ b/java/dex.go @@ -223,16 +223,6 @@ func (d *dexer) dexCommonFlags(ctx android.ModuleContext, if err != nil { ctx.PropertyErrorf("min_sdk_version", "%s", err) } - if effectiveVersion.FinalOrFutureInt() >= 35 { - // V is 35, but we have not bumped the SDK version yet, so check for both. - if ctx.Config().PlatformSdkVersion().FinalInt() >= 35 || - ctx.Config().PlatformSdkCodename() == "VanillaIceCream" { - // TODO(b/329465418): Skip this module since it causes issue with app DRM - if ctx.ModuleName() != "framework-minus-apex" { - flags = append([]string{"-JDcom.android.tools.r8.dexContainerExperiment"}, flags...) - } - } - } // If the specified SDK level is 10000, then configure the compiler to use the // current platform SDK level and to compile the build as a platform build. diff --git a/rust/rust.go b/rust/rust.go index 245ed2e8e..668dd8f08 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -1063,6 +1063,12 @@ func (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation { return nil } +func (d dependencyTag) PropagateAconfigValidation() bool { + return d == rlibDepTag || d == sourceDepTag +} + +var _ android.PropagateAconfigValidationDependencyTag = dependencyTag{} + var _ android.LicenseAnnotationsDependencyTag = dependencyTag{} var ( diff --git a/sysprop/sysprop_library.go b/sysprop/sysprop_library.go index 698aaf29a..b9b68be2d 100644 --- a/sysprop/sysprop_library.go +++ b/sysprop/sysprop_library.go @@ -54,15 +54,13 @@ type syspropJavaGenRule struct { } type syspropRustGenRule struct { - android.ModuleBase - - properties syspropGenProperties + *rust.BaseSourceProvider - genSrcs android.Paths + properties rustLibraryProperties } var _ android.OutputFileProducer = (*syspropJavaGenRule)(nil) -var _ android.OutputFileProducer = (*syspropRustGenRule)(nil) +var _ rust.SourceProvider = (*syspropRustGenRule)(nil) var ( syspropJava = pctx.AndroidStaticRule("syspropJava", @@ -144,7 +142,7 @@ func syspropJavaGenFactory() android.Module { // syspropRustGenRule module generates rust source files containing generated rust APIs. // It also depends on check api rule, so api check has to pass to use sysprop_library. -func (g *syspropRustGenRule) GenerateAndroidBuildActions(ctx android.ModuleContext) { +func (g *syspropRustGenRule) GenerateSource(ctx rust.ModuleContext, deps rust.PathDeps) android.Path { var checkApiFileTimeStamp android.WritablePath ctx.VisitDirectDeps(func(dep android.Module) { @@ -153,25 +151,47 @@ func (g *syspropRustGenRule) GenerateAndroidBuildActions(ctx android.ModuleConte } }) - for _, syspropFile := range android.PathsForModuleSrc(ctx, g.properties.Srcs) { - syspropDir := android.GenPathWithExt(ctx, "sysprop", syspropFile, "srcrust") - outputDir := syspropDir.Join(ctx, "src") - libPath := syspropDir.Join(ctx, "src", "lib.rs") + outputDir := android.PathForModuleOut(ctx, "src") + libFile := outputDir.Join(ctx, "lib.rs") + g.BaseSourceProvider.OutputFiles = append(g.BaseSourceProvider.OutputFiles, libFile) + libFileLines := []string{"//! Autogenerated system property accessors."} + + for _, syspropFile := range android.PathsForModuleSrc(ctx, g.properties.Sysprop_srcs) { + moduleName := syspropPathToRustModule(syspropFile) + moduleDir := outputDir.Join(ctx, moduleName) + modulePath := moduleDir.Join(ctx, "mod.rs") ctx.Build(pctx, android.BuildParams{ Rule: syspropRust, Description: "sysprop_rust " + syspropFile.Rel(), - Outputs: android.WritablePaths{libPath}, + Output: modulePath, Input: syspropFile, Implicit: checkApiFileTimeStamp, Args: map[string]string{ "scope": g.properties.Scope, - "out_dir": outputDir.String(), + "out_dir": moduleDir.String(), }, }) - g.genSrcs = append(g.genSrcs, libPath) + g.BaseSourceProvider.OutputFiles = append(g.BaseSourceProvider.OutputFiles, modulePath) + libFileLines = append(libFileLines, fmt.Sprintf("pub mod %s;", moduleName)) } + + libFileSource := strings.Join(libFileLines, "\n") + android.WriteFileRule(ctx, libFile, libFileSource) + + return libFile +} + +func (g *syspropRustGenRule) SourceProviderProps() []interface{} { + return append(g.BaseSourceProvider.SourceProviderProps(), &g.Properties) +} + +// syspropPathToRustModule takes a path to a .sysprop file and returns the name to use for the +// corresponding Rust module. +func syspropPathToRustModule(syspropFilename android.Path) string { + filenameBase := strings.TrimSuffix(syspropFilename.Base(), ".sysprop") + return strings.ToLower(filenameBase) } func (g *syspropRustGenRule) DepsMutator(ctx android.BottomUpMutatorContext) { @@ -180,15 +200,13 @@ func (g *syspropRustGenRule) DepsMutator(ctx android.BottomUpMutatorContext) { ctx.AddFarVariationDependencies(nil, nil, proptools.String(g.properties.Check_api)) } -func (g *syspropRustGenRule) OutputFiles(_ string) (android.Paths, error) { - return g.genSrcs, nil -} - func syspropRustGenFactory() android.Module { - g := &syspropRustGenRule{} - g.AddProperties(&g.properties) - android.InitAndroidModule(g) - return g + g := &syspropRustGenRule{ + BaseSourceProvider: rust.NewSourceProvider(), + } + sourceProvider := rust.NewSourceProviderModule(android.DeviceSupported, g, false, false) + sourceProvider.AddProperties(&g.properties) + return sourceProvider.Init() } type syspropLibrary struct { @@ -308,10 +326,6 @@ func (m *syspropLibrary) javaGenPublicStubName() string { return m.BaseModuleName() + "_java_gen_public" } -func (m *syspropLibrary) rustGenModuleName() string { - return m.rustCrateName() + "_rust_gen" -} - func (m *syspropLibrary) rustGenStubName() string { return "lib" + m.rustCrateName() + "_rust" } @@ -528,6 +542,9 @@ type javaLibraryProperties struct { type rustLibraryProperties struct { Name *string + Sysprop_srcs []string `android:"path"` + Scope string + Check_api *string Srcs []string Installable *bool Crate_name string @@ -667,18 +684,15 @@ func syspropLibraryHook(ctx android.LoadHookContext, m *syspropLibrary) { } // Generate a Rust implementation library. - ctx.CreateModule(syspropRustGenFactory, &syspropGenProperties{ - Srcs: m.properties.Srcs, - Scope: scope, - Name: proptools.StringPtr(m.rustGenModuleName()), - Check_api: proptools.StringPtr(ctx.ModuleName()), - }) rustProps := rustLibraryProperties{ - Name: proptools.StringPtr(m.rustGenStubName()), - Srcs: []string{":" + m.rustGenModuleName()}, - Installable: proptools.BoolPtr(false), - Crate_name: m.rustCrateName(), + Name: proptools.StringPtr(m.rustGenStubName()), + Sysprop_srcs: m.properties.Srcs, + Scope: scope, + Check_api: proptools.StringPtr(ctx.ModuleName()), + Installable: proptools.BoolPtr(false), + Crate_name: m.rustCrateName(), Rustlibs: []string{ + "liblog_rust", "librustutils", }, Vendor_available: m.properties.Vendor_available, @@ -686,7 +700,7 @@ func syspropLibraryHook(ctx android.LoadHookContext, m *syspropLibrary) { Apex_available: m.ApexProperties.Apex_available, Min_sdk_version: proptools.StringPtr("29"), } - ctx.CreateModule(rust.RustLibraryFactory, &rustProps) + ctx.CreateModule(syspropRustGenFactory, &rustProps) // syspropLibraries will be used by property_contexts to check types. // Record absolute paths of sysprop_library to prevent soong_namespace problem. diff --git a/sysprop/sysprop_test.go b/sysprop/sysprop_test.go index 9dd696f75..dfbbe7dd9 100644 --- a/sysprop/sysprop_test.go +++ b/sysprop/sysprop_test.go @@ -72,6 +72,15 @@ func test(t *testing.T, bp string) *android.TestResult { vendor_available: true, min_sdk_version: "29", } + + rust_library { + name: "liblog_rust", + crate_name: "log", + srcs: ["log/src/lib.rs"], + product_available: true, + vendor_available: true, + min_sdk_version: "29", + } ` mockFS := android.MockFS{ @@ -115,6 +124,7 @@ func test(t *testing.T, bp string) *android.TestResult { "com/android2/OdmProperties.sysprop": nil, "librustutils/lib.rs": nil, + "log/src/lib.rs": nil, } result := android.GroupFixturePreparers( |