diff --git a/aidl_library/aidl_library.go b/aidl_library/aidl_library.go index 8a84e6bfa..598510386 100644 --- a/aidl_library/aidl_library.go +++ b/aidl_library/aidl_library.go @@ -107,8 +107,10 @@ func (lib *AidlLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) { type AidlLibraryInfo struct { // The direct aidl files of the module Srcs android.Paths - // The include dirs to the direct aidl files and those provided from aidl_library deps + // The include dirs to the direct aidl files and those provided from transitive aidl_library deps IncludeDirs android.DepSet + // The direct hdrs and hdrs from transitive deps + Hdrs android.DepSet } // AidlLibraryProvider provides the srcs and the transitive include dirs @@ -116,37 +118,48 @@ var AidlLibraryProvider = blueprint.NewProvider(AidlLibraryInfo{}) func (lib *AidlLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { includeDirsDepSetBuilder := android.NewDepSetBuilder(android.PREORDER) + hdrsDepSetBuilder := android.NewDepSetBuilder(android.PREORDER) if len(lib.properties.Srcs) == 0 && len(lib.properties.Hdrs) == 0 { ctx.ModuleErrorf("at least srcs or hdrs prop must be non-empty") } srcs := android.PathsForModuleSrc(ctx, lib.properties.Srcs) + hdrs := android.PathsForModuleSrc(ctx, lib.properties.Hdrs) + if lib.properties.Strip_import_prefix != nil { srcs = android.PathsWithModuleSrcSubDir( ctx, srcs, - android.String(lib.properties.Strip_import_prefix)) + android.String(lib.properties.Strip_import_prefix), + ) + + hdrs = android.PathsWithModuleSrcSubDir( + ctx, + hdrs, + android.String(lib.properties.Strip_import_prefix), + ) } + hdrsDepSetBuilder.Direct(hdrs...) includeDir := android.PathForModuleSrc( ctx, proptools.StringDefault(lib.properties.Strip_import_prefix, ""), ) - includeDirsDepSetBuilder.Direct(includeDir) for _, dep := range ctx.GetDirectDepsWithTag(aidlLibraryTag) { if ctx.OtherModuleHasProvider(dep, AidlLibraryProvider) { info := ctx.OtherModuleProvider(dep, AidlLibraryProvider).(AidlLibraryInfo) includeDirsDepSetBuilder.Transitive(&info.IncludeDirs) + hdrsDepSetBuilder.Transitive(&info.Hdrs) } } - // TODO(b/279960133) Propagate direct and transitive headers/srcs when aidl action sandboxes inputs ctx.SetProvider(AidlLibraryProvider, AidlLibraryInfo{ Srcs: srcs, IncludeDirs: *includeDirsDepSetBuilder.Build(), + Hdrs: *hdrsDepSetBuilder.Build(), }) } diff --git a/aidl_library/aidl_library_test.go b/aidl_library/aidl_library_test.go index d9b410acc..d9dd24515 100644 --- a/aidl_library/aidl_library_test.go +++ b/aidl_library/aidl_library_test.go @@ -37,7 +37,7 @@ func TestAidlLibrary(t *testing.T) { aidl_library { name: "foo", srcs: ["a/b/Foo.aidl"], - hdrs: ["Header.aidl"], + hdrs: ["a/Header.aidl"], strip_import_prefix: "a", deps: ["bar"], } @@ -61,6 +61,13 @@ func TestAidlLibrary(t *testing.T) { []string{"package_foo/a/b/Foo.aidl"}, actualInfo.Srcs, ) + + android.AssertPathsRelativeToTopEquals( + t, + "aidl hdrs paths", + []string{"package_foo/a/Header.aidl"}, + actualInfo.Hdrs.ToList(), + ) } func TestAidlLibraryWithoutStripImportPrefix(t *testing.T) { @@ -72,6 +79,7 @@ func TestAidlLibraryWithoutStripImportPrefix(t *testing.T) { aidl_library { name: "bar", srcs: ["x/y/Bar.aidl"], + hdrs: ["BarHeader.aidl"], } `), }.AddToFixture(), @@ -80,7 +88,6 @@ func TestAidlLibraryWithoutStripImportPrefix(t *testing.T) { aidl_library { name: "foo", srcs: ["a/b/Foo.aidl"], - hdrs: ["Header.aidl"], deps: ["bar"], } `), @@ -103,6 +110,13 @@ func TestAidlLibraryWithoutStripImportPrefix(t *testing.T) { []string{"package_foo/a/b/Foo.aidl"}, actualInfo.Srcs, ) + + android.AssertPathsRelativeToTopEquals( + t, + "aidl hdrs paths", + []string{"package_bar/BarHeader.aidl"}, + actualInfo.Hdrs.ToList(), + ) } func TestAidlLibraryWithNoSrcsHdrsDeps(t *testing.T) { diff --git a/android/config.go b/android/config.go index 980460a7b..dfbb46fb7 100644 --- a/android/config.go +++ b/android/config.go @@ -702,6 +702,14 @@ func (c *config) HostJavaToolPath(ctx PathContext, tool string) Path { return path } +func (c *config) HostCcSharedLibPath(ctx PathContext, lib string) Path { + libDir := "lib" + if ctx.Config().BuildArch.Multilib == "lib64" { + libDir = "lib64" + } + return pathForInstall(ctx, ctx.Config().BuildOS, ctx.Config().BuildArch, libDir, false, lib+".so") +} + // PrebuiltOS returns the name of the host OS used in prebuilts directories. func (c *config) PrebuiltOS() string { switch runtime.GOOS { diff --git a/cc/cc_test.go b/cc/cc_test.go index 81212c84b..d6b969a3b 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -39,7 +39,6 @@ func TestMain(m *testing.M) { var prepareForCcTest = android.GroupFixturePreparers( PrepareForTestWithCcIncludeVndk, - aidl_library.PrepareForTestWithAidlLibrary, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.DeviceVndkVersion = StringPtr("current") variables.ProductVndkVersion = StringPtr("current") @@ -4421,7 +4420,7 @@ func TestStubsLibReexportsHeaders(t *testing.T) { } } -func TestAidlLibraryWithHeader(t *testing.T) { +func TestAidlLibraryWithHeaders(t *testing.T) { t.Parallel() ctx := android.GroupFixturePreparers( prepareForCcTest, @@ -4431,6 +4430,7 @@ func TestAidlLibraryWithHeader(t *testing.T) { aidl_library { name: "bar", srcs: ["x/y/Bar.aidl"], + hdrs: ["x/HeaderBar.aidl"], strip_import_prefix: "x", } `)}.AddToFixture(), @@ -4439,6 +4439,7 @@ func TestAidlLibraryWithHeader(t *testing.T) { aidl_library { name: "foo", srcs: ["a/b/Foo.aidl"], + hdrs: ["a/HeaderFoo.aidl"], strip_import_prefix: "a", deps: ["bar"], } @@ -4453,7 +4454,20 @@ func TestAidlLibraryWithHeader(t *testing.T) { ).RunTest(t).TestContext libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static") - manifest := android.RuleBuilderSboxProtoForTests(t, libfoo.Output("aidl.sbox.textproto")) + + android.AssertPathsRelativeToTopEquals( + t, + "aidl headers", + []string{ + "package_bar/x/HeaderBar.aidl", + "package_foo/a/HeaderFoo.aidl", + "package_foo/a/b/Foo.aidl", + "out/soong/.intermediates/package_foo/libfoo/android_arm64_armv8-a_static/gen/aidl_library.sbox.textproto", + }, + libfoo.Rule("aidl_library").Implicits, + ) + + manifest := android.RuleBuilderSboxProtoForTests(t, libfoo.Output("aidl_library.sbox.textproto")) aidlCommand := manifest.Commands[0].GetCommand() expectedAidlFlags := "-Ipackage_foo/a -Ipackage_bar/x" @@ -4463,14 +4477,14 @@ func TestAidlLibraryWithHeader(t *testing.T) { outputs := strings.Join(libfoo.AllOutputs(), " ") - android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl/b/BpFoo.h") - android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl/b/BnFoo.h") - android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl/b/Foo.h") + android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl_library/b/BpFoo.h") + android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl_library/b/BnFoo.h") + android.AssertStringDoesContain(t, "aidl-generated header", outputs, "gen/aidl_library/b/Foo.h") android.AssertStringDoesContain(t, "aidl-generated cpp", outputs, "b/Foo.cpp") // Confirm that the aidl header doesn't get compiled to cpp and h files - android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl/y/BpBar.h") - android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl/y/BnBar.h") - android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl/y/Bar.h") + android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl_library/y/BpBar.h") + android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl_library/y/BnBar.h") + android.AssertStringDoesNotContain(t, "aidl-generated header", outputs, "gen/aidl_library/y/Bar.h") android.AssertStringDoesNotContain(t, "aidl-generated cpp", outputs, "y/Bar.cpp") } @@ -4549,6 +4563,55 @@ func TestAidlFlagsWithMinSdkVersion(t *testing.T) { } } +func TestInvalidAidlProp(t *testing.T) { + t.Parallel() + + testCases := []struct { + description string + bp string + }{ + { + description: "Invalid use of aidl.libs and aidl.include_dirs", + bp: ` + cc_library { + name: "foo", + aidl: { + libs: ["foo_aidl"], + include_dirs: ["bar/include"], + } + } + `, + }, + { + description: "Invalid use of aidl.libs and aidl.local_include_dirs", + bp: ` + cc_library { + name: "foo", + aidl: { + libs: ["foo_aidl"], + local_include_dirs: ["include"], + } + } + `, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.description, func(t *testing.T) { + bp := ` + aidl_library { + name: "foo_aidl", + srcs: ["Foo.aidl"], + } ` + testCase.bp + android.GroupFixturePreparers( + prepareForCcTest, + aidl_library.PrepareForTestWithAidlLibrary. + ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("For aidl headers, please only use aidl.libs prop")), + ).RunTestWithBp(t, bp) + }) + } +} + func TestMinSdkVersionInClangTriple(t *testing.T) { t.Parallel() ctx := testCc(t, ` @@ -4790,23 +4853,24 @@ func TestIncludeDirsExporting(t *testing.T) { checkIncludeDirs(t, ctx, foo, expectedIncludeDirs(` .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library `), expectedSystemIncludeDirs(``), expectedGeneratedHeaders(` .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/b.h .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bnb.h .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bpb.h - .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/y/Bar.h - .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/y/BnBar.h - .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/y/BpBar.h + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/Bar.h + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BnBar.h + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BpBar.h `), expectedOrderOnlyDeps(` .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/b.h .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bnb.h .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/Bpb.h - .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/y/Bar.h - .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/y/BnBar.h - .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl/y/BpBar.h + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/Bar.h + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BnBar.h + .intermediates/libfoo/android_arm64_armv8-a_shared/gen/aidl_library/y/BpBar.h `), ) }) diff --git a/cc/compiler.go b/cc/compiler.go index 5da745e02..16f4a6ec0 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -565,6 +565,11 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps "-I"+android.PathForModuleGen(ctx, "yacc", ctx.ModuleDir()).String()) } + if len(compiler.Properties.Aidl.Libs) > 0 && + (len(compiler.Properties.Aidl.Include_dirs) > 0 || len(compiler.Properties.Aidl.Local_include_dirs) > 0) { + ctx.ModuleErrorf("aidl.libs and (aidl.include_dirs or aidl.local_include_dirs) can't be set at the same time. For aidl headers, please only use aidl.libs prop") + } + if compiler.hasAidl(deps) { flags.aidlFlags = append(flags.aidlFlags, compiler.Properties.Aidl.Flags...) if len(compiler.Properties.Aidl.Local_include_dirs) > 0 { @@ -594,8 +599,14 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps } flags.aidlFlags = append(flags.aidlFlags, "--min_sdk_version="+aidlMinSdkVersion) - flags.Local.CommonFlags = append(flags.Local.CommonFlags, - "-I"+android.PathForModuleGen(ctx, "aidl").String()) + if compiler.hasSrcExt(".aidl") { + flags.Local.CommonFlags = append(flags.Local.CommonFlags, + "-I"+android.PathForModuleGen(ctx, "aidl").String()) + } + if len(deps.AidlLibraryInfos) > 0 { + flags.Local.CommonFlags = append(flags.Local.CommonFlags, + "-I"+android.PathForModuleGen(ctx, "aidl_library").String()) + } } if compiler.hasSrcExt(".rscript") || compiler.hasSrcExt(".fs") { diff --git a/cc/gen.go b/cc/gen.go index dbb9560ba..b15f16496 100644 --- a/cc/gen.go +++ b/cc/gen.go @@ -107,7 +107,14 @@ func genYacc(ctx android.ModuleContext, rule *android.RuleBuilder, yaccFile andr return ret } -func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile android.Path, aidlFlags string) (cppFile android.OutputPath, headerFiles android.Paths) { +func genAidl( + ctx android.ModuleContext, + rule *android.RuleBuilder, + outDirBase string, + aidlFile android.Path, + aidlHdrs android.Paths, + aidlFlags string, +) (cppFile android.OutputPath, headerFiles android.Paths) { aidlPackage := strings.TrimSuffix(aidlFile.Rel(), aidlFile.Base()) baseName := strings.TrimSuffix(aidlFile.Base(), aidlFile.Ext()) shortName := baseName @@ -119,7 +126,7 @@ func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile andr shortName = strings.TrimPrefix(baseName, "I") } - outDir := android.PathForModuleGen(ctx, "aidl") + outDir := android.PathForModuleGen(ctx, outDirBase) cppFile = outDir.Join(ctx, aidlPackage, baseName+".cpp") depFile := outDir.Join(ctx, aidlPackage, baseName+".cpp.d") headerI := outDir.Join(ctx, aidlPackage, baseName+".h") @@ -128,6 +135,8 @@ func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile andr cmd := rule.Command() cmd.BuiltTool("aidl-cpp"). + // libc++ is default stl for aidl-cpp (a cc_binary_host module) + ImplicitTool(ctx.Config().HostCcSharedLibPath(ctx, "libc++")). FlagWithDepFile("-d", depFile). Flag("--ninja"). Flag(aidlFlags). @@ -140,6 +149,10 @@ func genAidl(ctx android.ModuleContext, rule *android.RuleBuilder, aidlFile andr headerBp, }) + if aidlHdrs != nil { + cmd.Implicits(aidlHdrs) + } + return cppFile, android.Paths{ headerI, headerBn, @@ -283,14 +296,19 @@ func genSources( ctx android.ModuleContext, aidlLibraryInfos []aidl_library.AidlLibraryInfo, srcFiles android.Paths, - buildFlags builderFlags) (android.Paths, android.Paths, generatedSourceInfo) { + buildFlags builderFlags, +) (android.Paths, android.Paths, generatedSourceInfo) { var info generatedSourceInfo var deps android.Paths var rsFiles android.Paths + // aidlRule supports compiling aidl files from srcs prop while aidlLibraryRule supports + // compiling aidl files from aidl_library modules specified in aidl.libs prop. + // The rules are separated so that they don't wipe out the other's outputDir var aidlRule *android.RuleBuilder + var aidlLibraryRule *android.RuleBuilder var yaccRule_ *android.RuleBuilder yaccRule := func() *android.RuleBuilder { @@ -331,7 +349,14 @@ func genSources( android.PathForModuleGen(ctx, "aidl.sbox.textproto")) } baseDir := strings.TrimSuffix(srcFile.String(), srcFile.Rel()) - cppFile, aidlHeaders := genAidl(ctx, aidlRule, srcFile, buildFlags.aidlFlags+" -I"+baseDir) + cppFile, aidlHeaders := genAidl( + ctx, + aidlRule, + "aidl", + srcFile, + nil, + buildFlags.aidlFlags+" -I"+baseDir, + ) srcFiles[i] = cppFile info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...) @@ -354,13 +379,21 @@ func genSources( } for _, aidlLibraryInfo := range aidlLibraryInfos { + if aidlLibraryRule == nil { + aidlLibraryRule = android.NewRuleBuilder(pctx, ctx).Sbox( + android.PathForModuleGen(ctx, "aidl_library"), + android.PathForModuleGen(ctx, "aidl_library.sbox.textproto"), + ).SandboxInputs() + } for _, aidlSrc := range aidlLibraryInfo.Srcs { - if aidlRule == nil { - // TODO(b/279960133): Sandbox inputs to ensure aidl headers are explicitly specified - aidlRule = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "aidl"), - android.PathForModuleGen(ctx, "aidl.sbox.textproto")) - } - cppFile, aidlHeaders := genAidl(ctx, aidlRule, aidlSrc, buildFlags.aidlFlags) + cppFile, aidlHeaders := genAidl( + ctx, + aidlLibraryRule, + "aidl_library", + aidlSrc, + aidlLibraryInfo.Hdrs.ToList(), + buildFlags.aidlFlags, + ) srcFiles = append(srcFiles, cppFile) info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...) @@ -375,6 +408,10 @@ func genSources( aidlRule.Build("aidl", "gen aidl") } + if aidlLibraryRule != nil { + aidlLibraryRule.Build("aidl_library", "gen aidl_library") + } + if yaccRule_ != nil { yaccRule_.Build("yacc", "gen yacc") } diff --git a/cc/library.go b/cc/library.go index 313a1ee93..d5f5b404c 100644 --- a/cc/library.go +++ b/cc/library.go @@ -2113,8 +2113,14 @@ func (library *libraryDecorator) link(ctx ModuleContext, // Optionally export aidl headers. if Bool(library.Properties.Aidl.Export_aidl_headers) { if library.baseCompiler.hasAidl(deps) { - dir := android.PathForModuleGen(ctx, "aidl") - library.reexportDirs(dir) + if library.baseCompiler.hasSrcExt(".aidl") { + dir := android.PathForModuleGen(ctx, "aidl") + library.reexportDirs(dir) + } + if len(deps.AidlLibraryInfos) > 0 { + dir := android.PathForModuleGen(ctx, "aidl_library") + library.reexportDirs(dir) + } library.reexportDeps(library.baseCompiler.aidlOrderOnlyDeps...) library.addExportedGeneratedHeaders(library.baseCompiler.aidlHeaders...)