Sandbox inputs to aidl rule in cc
Bug: 279960133
Test: go test
Test: Remove hdrs prop from IDropBoxManagerService_aidl && run BUILD_BROKEN_DISABLE_BAZEL=true m libservices && Expect an error from aidl
(cherry picked from https://android-review.googlesource.com/q/commit:095819530af067884e1b131d9332c8c4ace31295)
Merged-In: Ifdb260d8e2da9a5767f1e212393de4134b210616
Change-Id: Ifdb260d8e2da9a5767f1e212393de4134b210616
diff --git a/aidl_library/aidl_library.go b/aidl_library/aidl_library.go
index 8a84e6b..5985103 100644
--- a/aidl_library/aidl_library.go
+++ b/aidl_library/aidl_library.go
@@ -107,8 +107,10 @@
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 @@
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 d9b410a..d9dd245 100644
--- a/aidl_library/aidl_library_test.go
+++ b/aidl_library/aidl_library_test.go
@@ -37,7 +37,7 @@
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 @@
[]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 @@
aidl_library {
name: "bar",
srcs: ["x/y/Bar.aidl"],
+ hdrs: ["BarHeader.aidl"],
}
`),
}.AddToFixture(),
@@ -80,7 +88,6 @@
aidl_library {
name: "foo",
srcs: ["a/b/Foo.aidl"],
- hdrs: ["Header.aidl"],
deps: ["bar"],
}
`),
@@ -103,6 +110,13 @@
[]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 980460a..dfbb46f 100644
--- a/android/config.go
+++ b/android/config.go
@@ -702,6 +702,14 @@
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 81212c8..d6b969a 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -39,7 +39,6 @@
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 TestAidlLibraryWithHeader(t *testing.T) {
+func TestAidlLibraryWithHeaders(t *testing.T) {
t.Parallel()
ctx := android.GroupFixturePreparers(
prepareForCcTest,
@@ -4431,6 +4430,7 @@
aidl_library {
name: "bar",
srcs: ["x/y/Bar.aidl"],
+ hdrs: ["x/HeaderBar.aidl"],
strip_import_prefix: "x",
}
`)}.AddToFixture(),
@@ -4439,6 +4439,7 @@
aidl_library {
name: "foo",
srcs: ["a/b/Foo.aidl"],
+ hdrs: ["a/HeaderFoo.aidl"],
strip_import_prefix: "a",
deps: ["bar"],
}
@@ -4453,7 +4454,20 @@
).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 @@
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 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 @@
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 5da745e..16f4a6e 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -565,6 +565,11 @@
"-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 @@
}
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 dbb9560..b15f164 100644
--- a/cc/gen.go
+++ b/cc/gen.go
@@ -107,7 +107,14 @@
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 @@
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 @@
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 @@
headerBp,
})
+ if aidlHdrs != nil {
+ cmd.Implicits(aidlHdrs)
+ }
+
return cppFile, android.Paths{
headerI,
headerBn,
@@ -283,14 +296,19 @@
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 @@
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 @@
}
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 @@
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 313a1ee..d5f5b40 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -2113,8 +2113,14 @@
// 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...)