Emit unconditional module load only when inherit/include is on the top level.
That is, when a makefile contains
```
ifneq (,$(foo))
$(call inherit-product,module.mk)
endif
```
module.mk has to be present only if `foo` is set.
Fixes: 200163602
Test: internal
Change-Id: Ic5f10ce8d49d6b87162bfe77922bba5e2cce228b
diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go
index b9b7e2c..3ae8ab9 100644
--- a/mk2rbc/mk2rbc.go
+++ b/mk2rbc/mk2rbc.go
@@ -726,7 +726,7 @@
func (ctx *parseContext) newDependentModule(path string, optional bool) *moduleInfo {
modulePath := ctx.loadedModulePath(path)
if mi, ok := ctx.dependentModules[modulePath]; ok {
- mi.optional = mi.optional || optional
+ mi.optional = mi.optional && optional
return mi
}
moduleName := moduleNameForFile(path)
@@ -753,16 +753,21 @@
// In a simple case, the name of a module to inherit/include is known statically.
if path, ok := maybeString(pathExpr); ok {
+ // Note that even if this directive loads a module unconditionally, a module may be
+ // absent without causing any harm if this directive is inside an if/else block.
+ moduleShouldExist := loadAlways && ctx.ifNestLevel == 0
if strings.Contains(path, "*") {
if paths, err := fs.Glob(ctx.script.sourceFS, path); err == nil {
for _, p := range paths {
- processModule(inheritedStaticModule{ctx.newDependentModule(p, !loadAlways), loadAlways})
+ mi := ctx.newDependentModule(p, !moduleShouldExist)
+ processModule(inheritedStaticModule{mi, loadAlways})
}
} else {
ctx.errorf(v, "cannot glob wildcard argument")
}
} else {
- processModule(inheritedStaticModule{ctx.newDependentModule(path, !loadAlways), loadAlways})
+ mi := ctx.newDependentModule(path, !moduleShouldExist)
+ processModule(inheritedStaticModule{mi, loadAlways})
}
return
}
@@ -852,13 +857,13 @@
func (ctx *parseContext) handleInheritModule(v mkparser.Node, pathExpr starlarkExpr, loadAlways bool) {
ctx.handleSubConfig(v, pathExpr, loadAlways, func(im inheritedModule) {
- ctx.receiver.newNode(&inheritNode{im})
+ ctx.receiver.newNode(&inheritNode{im, loadAlways})
})
}
func (ctx *parseContext) handleInclude(v mkparser.Node, pathExpr starlarkExpr, loadAlways bool) {
ctx.handleSubConfig(v, pathExpr, loadAlways, func(im inheritedModule) {
- ctx.receiver.newNode(&includeNode{im})
+ ctx.receiver.newNode(&includeNode{im, loadAlways})
})
}