diff --git a/android/module.go b/android/module.go index 0ab9be777..dda526f09 100644 --- a/android/module.go +++ b/android/module.go @@ -1038,6 +1038,13 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) } if m.Enabled() { + // ensure all direct android.Module deps are enabled + ctx.VisitDirectDepsBlueprint(func(bm blueprint.Module) { + if _, ok := bm.(Module); ok { + ctx.validateAndroidModule(bm, ctx.baseModuleContext.strictVisitDeps) + } + }) + notice := proptools.StringDefault(m.commonProperties.Notice, "NOTICE") if module := SrcIsModule(notice); module != "" { m.noticeFile = ctx.ExpandOptionalSource(¬ice, "notice") diff --git a/android/module_test.go b/android/module_test.go index c790a6854..6dca29f79 100644 --- a/android/module_test.go +++ b/android/module_test.go @@ -14,7 +14,9 @@ package android -import "testing" +import ( + "testing" +) func TestSrcIsModule(t *testing.T) { type args struct { @@ -139,3 +141,55 @@ func TestSrcIsModuleWithTag(t *testing.T) { }) } } + +type depsModule struct { + ModuleBase + props struct { + Deps []string + } +} + +func (m *depsModule) GenerateAndroidBuildActions(ctx ModuleContext) { +} + +func (m *depsModule) DepsMutator(ctx BottomUpMutatorContext) { + ctx.AddDependency(ctx.Module(), nil, m.props.Deps...) +} + +func depsModuleFactory() Module { + m := &depsModule{} + m.AddProperties(&m.props) + InitAndroidModule(m) + return m +} + +func TestErrorDependsOnDisabledModule(t *testing.T) { + ctx := NewTestContext() + ctx.RegisterModuleType("deps", ModuleFactoryAdaptor(depsModuleFactory)) + + bp := ` + deps { + name: "foo", + deps: ["bar"], + } + deps { + name: "bar", + enabled: false, + } + ` + + mockFS := map[string][]byte{ + "Android.bp": []byte(bp), + } + + ctx.MockFileSystem(mockFS) + + ctx.Register() + + config := TestConfig(buildDir, nil) + + _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) + FailIfErrored(t, errs) + _, errs = ctx.PrepareBuildActions(config) + FailIfNoMatchingErrors(t, `module "foo": depends on disabled module "bar"`, errs) +} diff --git a/apex/apex_test.go b/apex/apex_test.go index 0845b20f8..8de4cef59 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -1932,6 +1932,51 @@ func TestApexUsesFailsIfUseNoApex(t *testing.T) { } +func TestErrorsIfDepsAreNotEnabled(t *testing.T) { + testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, ` + apex { + name: "myapex", + key: "myapex.key", + native_shared_libs: ["libfoo"], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + cc_library { + name: "libfoo", + stl: "none", + system_shared_libs: [], + enabled: false, + } + `) + testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, ` + apex { + name: "myapex", + key: "myapex.key", + java_libs: ["myjar"], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + java_library { + name: "myjar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "none", + system_modules: "none", + compile_dex: true, + enabled: false, + } + `) +} + func TestMain(m *testing.M) { run := func() int { setUp() diff --git a/cc/cc_test.go b/cc/cc_test.go index 52234a8d4..c9eb42116 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -2264,6 +2264,24 @@ func TestStaticDepsOrderWithStubs(t *testing.T) { } } +func TestErrorsIfAModuleDependsOnDisabled(t *testing.T) { + testCcError(t, `module "libA" .* depends on disabled module "libB"`, ` + cc_library { + name: "libA", + srcs: ["foo.c"], + shared_libs: ["libB"], + stl: "none", + } + + cc_library { + name: "libB", + srcs: ["foo.c"], + enabled: false, + stl: "none", + } + `) +} + // Simple smoke test for the cc_fuzz target that ensures the rule compiles // correctly. func TestFuzzTarget(t *testing.T) {