Allow seeing include $(x) when there is an include_top comment
Previously, seeing anything other than an interpolate variable was not allowed. Bug: 226974242 Test: go test Change-Id: I48a060f9a3fd19cd67a114d2cb0756ab2be25ce1
This commit is contained in:
parent
12097e3109
commit
9df1d73657
3 changed files with 57 additions and 22 deletions
|
@ -811,35 +811,40 @@ func (ctx *parseContext) handleSubConfig(
|
||||||
// rblf.inherit(handle, _e[0], _e[1])
|
// rblf.inherit(handle, _e[0], _e[1])
|
||||||
//
|
//
|
||||||
var matchingPaths []string
|
var matchingPaths []string
|
||||||
varPath, ok := pathExpr.(*interpolateExpr)
|
var needsWarning = false
|
||||||
if !ok {
|
if interpolate, ok := pathExpr.(*interpolateExpr); ok {
|
||||||
|
pathPattern := []string{interpolate.chunks[0]}
|
||||||
|
for _, chunk := range interpolate.chunks[1:] {
|
||||||
|
if chunk != "" {
|
||||||
|
pathPattern = append(pathPattern, chunk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pathPattern[0] == "" && len(ctx.includeTops) > 0 {
|
||||||
|
// If pattern starts from the top. restrict it to the directories where
|
||||||
|
// we know inherit-product uses dynamically calculated path.
|
||||||
|
for _, p := range ctx.includeTops {
|
||||||
|
pathPattern[0] = p
|
||||||
|
matchingPaths = append(matchingPaths, ctx.findMatchingPaths(pathPattern)...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
matchingPaths = ctx.findMatchingPaths(pathPattern)
|
||||||
|
}
|
||||||
|
needsWarning = pathPattern[0] == "" && len(ctx.includeTops) == 0
|
||||||
|
} else if len(ctx.includeTops) > 0 {
|
||||||
|
for _, p := range ctx.includeTops {
|
||||||
|
matchingPaths = append(matchingPaths, ctx.findMatchingPaths([]string{p, ""})...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
return []starlarkNode{ctx.newBadNode(v, "inherit-product/include argument is too complex")}
|
return []starlarkNode{ctx.newBadNode(v, "inherit-product/include argument is too complex")}
|
||||||
}
|
}
|
||||||
|
|
||||||
pathPattern := []string{varPath.chunks[0]}
|
|
||||||
for _, chunk := range varPath.chunks[1:] {
|
|
||||||
if chunk != "" {
|
|
||||||
pathPattern = append(pathPattern, chunk)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pathPattern[0] == "" && len(ctx.includeTops) > 0 {
|
|
||||||
// If pattern starts from the top. restrict it to the directories where
|
|
||||||
// we know inherit-product uses dynamically calculated path.
|
|
||||||
for _, p := range ctx.includeTops {
|
|
||||||
pathPattern[0] = p
|
|
||||||
matchingPaths = append(matchingPaths, ctx.findMatchingPaths(pathPattern)...)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
matchingPaths = ctx.findMatchingPaths(pathPattern)
|
|
||||||
}
|
|
||||||
// Safeguard against $(call inherit-product,$(PRODUCT_PATH))
|
// Safeguard against $(call inherit-product,$(PRODUCT_PATH))
|
||||||
const maxMatchingFiles = 150
|
const maxMatchingFiles = 150
|
||||||
if len(matchingPaths) > maxMatchingFiles {
|
if len(matchingPaths) > maxMatchingFiles {
|
||||||
return []starlarkNode{ctx.newBadNode(v, "there are >%d files matching the pattern, please rewrite it", maxMatchingFiles)}
|
return []starlarkNode{ctx.newBadNode(v, "there are >%d files matching the pattern, please rewrite it", maxMatchingFiles)}
|
||||||
}
|
}
|
||||||
|
|
||||||
needsWarning := pathPattern[0] == "" && len(ctx.includeTops) == 0
|
res := inheritedDynamicModule{pathExpr, []*moduleInfo{}, loadAlways, ctx.errorLocation(v), needsWarning}
|
||||||
res := inheritedDynamicModule{*varPath, []*moduleInfo{}, loadAlways, ctx.errorLocation(v), needsWarning}
|
|
||||||
for _, p := range matchingPaths {
|
for _, p := range matchingPaths {
|
||||||
// A product configuration files discovered dynamically may attempt to inherit
|
// A product configuration files discovered dynamically may attempt to inherit
|
||||||
// from another one which does not exist in this source tree. Prevent load errors
|
// from another one which does not exist in this source tree. Prevent load errors
|
||||||
|
@ -1587,6 +1592,16 @@ func transformNode(node starlarkNode, transformer func(expr starlarkExpr) starla
|
||||||
for _, n := range a.actions {
|
for _, n := range a.actions {
|
||||||
transformNode(n, transformer)
|
transformNode(n, transformer)
|
||||||
}
|
}
|
||||||
|
case *inheritNode:
|
||||||
|
if b, ok := a.module.(inheritedDynamicModule); ok {
|
||||||
|
b.path = b.path.transform(transformer)
|
||||||
|
a.module = b
|
||||||
|
}
|
||||||
|
case *includeNode:
|
||||||
|
if b, ok := a.module.(inheritedDynamicModule); ok {
|
||||||
|
b.path = b.path.transform(transformer)
|
||||||
|
a.module = b
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1142,6 +1142,11 @@ def init(g, handle):
|
||||||
MY_PATH:=foo
|
MY_PATH:=foo
|
||||||
#RBC# include_top vendor/foo1
|
#RBC# include_top vendor/foo1
|
||||||
$(call inherit-product,$(MY_PATH)/cfg.mk)
|
$(call inherit-product,$(MY_PATH)/cfg.mk)
|
||||||
|
#RBC# include_top vendor/foo1
|
||||||
|
$(call inherit-product,$(MY_OTHER_PATH))
|
||||||
|
#RBC# include_top vendor/foo1
|
||||||
|
$(foreach f,$(MY_MAKEFILES), \
|
||||||
|
$(call inherit-product,$(f)))
|
||||||
`,
|
`,
|
||||||
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
||||||
load("//vendor/foo1:cfg.star|init", _cfg_init = "init")
|
load("//vendor/foo1:cfg.star|init", _cfg_init = "init")
|
||||||
|
@ -1156,6 +1161,21 @@ def init(g, handle):
|
||||||
if not _varmod_init:
|
if not _varmod_init:
|
||||||
rblf.mkerror("product.mk", "Cannot find %s" % ("%s/cfg.mk" % g["MY_PATH"]))
|
rblf.mkerror("product.mk", "Cannot find %s" % ("%s/cfg.mk" % g["MY_PATH"]))
|
||||||
rblf.inherit(handle, _varmod, _varmod_init)
|
rblf.inherit(handle, _varmod, _varmod_init)
|
||||||
|
_entry = {
|
||||||
|
"vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init),
|
||||||
|
}.get(g.get("MY_OTHER_PATH", ""))
|
||||||
|
(_varmod, _varmod_init) = _entry if _entry else (None, None)
|
||||||
|
if not _varmod_init:
|
||||||
|
rblf.mkerror("product.mk", "Cannot find %s" % (g.get("MY_OTHER_PATH", "")))
|
||||||
|
rblf.inherit(handle, _varmod, _varmod_init)
|
||||||
|
for f in rblf.words(g.get("MY_MAKEFILES", "")):
|
||||||
|
_entry = {
|
||||||
|
"vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init),
|
||||||
|
}.get(f)
|
||||||
|
(_varmod, _varmod_init) = _entry if _entry else (None, None)
|
||||||
|
if not _varmod_init:
|
||||||
|
rblf.mkerror("product.mk", "Cannot find %s" % (f))
|
||||||
|
rblf.inherit(handle, _varmod, _varmod_init)
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,7 +83,7 @@ func (im inheritedStaticModule) needsLoadCheck() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
type inheritedDynamicModule struct {
|
type inheritedDynamicModule struct {
|
||||||
path interpolateExpr
|
path starlarkExpr
|
||||||
candidateModules []*moduleInfo
|
candidateModules []*moduleInfo
|
||||||
loadAlways bool
|
loadAlways bool
|
||||||
location ErrorLocation
|
location ErrorLocation
|
||||||
|
@ -120,7 +120,7 @@ func (i inheritedDynamicModule) emitSelect(gctx *generationContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i inheritedDynamicModule) pathExpr() starlarkExpr {
|
func (i inheritedDynamicModule) pathExpr() starlarkExpr {
|
||||||
return &i.path
|
return i.path
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i inheritedDynamicModule) needsLoadCheck() bool {
|
func (i inheritedDynamicModule) needsLoadCheck() bool {
|
||||||
|
|
Loading…
Reference in a new issue