Merge changes I19f0e104,I7994bee6
* changes: Emit mkpatsubst call for $(patsubst ...) Emit mksubst call for $(subst ...)
This commit is contained in:
@@ -93,13 +93,14 @@ var knownFunctions = map[string]struct {
|
|||||||
"is-vendor-board-platform": {"!is-vendor-board-platform", starlarkTypeBool},
|
"is-vendor-board-platform": {"!is-vendor-board-platform", starlarkTypeBool},
|
||||||
callLoadAlways: {"!inherit-product", starlarkTypeVoid},
|
callLoadAlways: {"!inherit-product", starlarkTypeVoid},
|
||||||
callLoadIf: {"!inherit-product-if-exists", starlarkTypeVoid},
|
callLoadIf: {"!inherit-product-if-exists", starlarkTypeVoid},
|
||||||
|
"patsubst": {baseName + ".mkpatsubst", starlarkTypeString},
|
||||||
"produce_copy_files": {baseName + ".produce_copy_files", starlarkTypeList},
|
"produce_copy_files": {baseName + ".produce_copy_files", starlarkTypeList},
|
||||||
"require-artifacts-in-path": {baseName + ".require_artifacts_in_path", starlarkTypeVoid},
|
"require-artifacts-in-path": {baseName + ".require_artifacts_in_path", starlarkTypeVoid},
|
||||||
"require-artifacts-in-path-relaxed": {baseName + ".require_artifacts_in_path_relaxed", starlarkTypeVoid},
|
"require-artifacts-in-path-relaxed": {baseName + ".require_artifacts_in_path_relaxed", starlarkTypeVoid},
|
||||||
// TODO(asmundak): remove it once all calls are removed from configuration makefiles. see b/183161002
|
// TODO(asmundak): remove it once all calls are removed from configuration makefiles. see b/183161002
|
||||||
"shell": {baseName + ".shell", starlarkTypeString},
|
"shell": {baseName + ".shell", starlarkTypeString},
|
||||||
"strip": {baseName + ".mkstrip", starlarkTypeString},
|
"strip": {baseName + ".mkstrip", starlarkTypeString},
|
||||||
"subst": {baseName + ".subst", starlarkTypeString},
|
"subst": {baseName + ".mksubst", starlarkTypeString},
|
||||||
"warning": {baseName + ".mkwarning", starlarkTypeVoid},
|
"warning": {baseName + ".mkwarning", starlarkTypeVoid},
|
||||||
"word": {baseName + "!word", starlarkTypeString},
|
"word": {baseName + "!word", starlarkTypeString},
|
||||||
"wildcard": {baseName + ".expand_wildcard", starlarkTypeList},
|
"wildcard": {baseName + ".expand_wildcard", starlarkTypeList},
|
||||||
@@ -509,13 +510,7 @@ func (ctx *parseContext) handleAssignment(a *mkparser.Assignment) {
|
|||||||
}
|
}
|
||||||
inferred_type := asgn.value.typ()
|
inferred_type := asgn.value.typ()
|
||||||
if inferred_type != starlarkTypeUnknown {
|
if inferred_type != starlarkTypeUnknown {
|
||||||
if ogv, ok := lhs.(*otherGlobalVariable); ok {
|
lhs.setValueType(inferred_type)
|
||||||
ogv.typ = inferred_type
|
|
||||||
} else if pcv, ok := lhs.(*productConfigVariable); ok {
|
|
||||||
pcv.typ = inferred_type
|
|
||||||
} else {
|
|
||||||
panic(fmt.Errorf("cannot assign new type to a variable %s, its flavor is %T", lhs.name(), lhs))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if lhs.valueType() == starlarkTypeList {
|
if lhs.valueType() == starlarkTypeList {
|
||||||
@@ -1085,8 +1080,8 @@ func (ctx *parseContext) parseReference(node mkparser.Node, ref *mkparser.MakeSt
|
|||||||
switch expr.name {
|
switch expr.name {
|
||||||
case "word":
|
case "word":
|
||||||
return ctx.parseWordFunc(node, args)
|
return ctx.parseWordFunc(node, args)
|
||||||
case "subst":
|
case "subst", "patsubst":
|
||||||
return ctx.parseSubstFunc(node, args)
|
return ctx.parseSubstFunc(node, expr.name, args)
|
||||||
default:
|
default:
|
||||||
for _, arg := range args.Split(",") {
|
for _, arg := range args.Split(",") {
|
||||||
arg.TrimLeftSpaces()
|
arg.TrimLeftSpaces()
|
||||||
@@ -1101,24 +1096,33 @@ func (ctx *parseContext) parseReference(node mkparser.Node, ref *mkparser.MakeSt
|
|||||||
return expr
|
return expr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *parseContext) parseSubstFunc(node mkparser.Node, args *mkparser.MakeString) starlarkExpr {
|
func (ctx *parseContext) parseSubstFunc(node mkparser.Node, fname string, args *mkparser.MakeString) starlarkExpr {
|
||||||
words := args.Split(",")
|
words := args.Split(",")
|
||||||
if len(words) != 3 {
|
if len(words) != 3 {
|
||||||
return ctx.newBadExpr(node, "subst function should have 3 arguments")
|
return ctx.newBadExpr(node, "%s function should have 3 arguments", fname)
|
||||||
}
|
}
|
||||||
if !words[0].Const() || !words[1].Const() {
|
if !words[0].Const() || !words[1].Const() {
|
||||||
return ctx.newBadExpr(node, "subst function's from and to arguments should be constant")
|
return ctx.newBadExpr(node, "%s function's from and to arguments should be constant", fname)
|
||||||
}
|
}
|
||||||
from := words[0].Strings[0]
|
from := words[0].Strings[0]
|
||||||
to := words[1].Strings[0]
|
to := words[1].Strings[0]
|
||||||
words[2].TrimLeftSpaces()
|
words[2].TrimLeftSpaces()
|
||||||
words[2].TrimRightSpaces()
|
words[2].TrimRightSpaces()
|
||||||
obj := ctx.parseMakeString(node, words[2])
|
obj := ctx.parseMakeString(node, words[2])
|
||||||
|
typ := obj.typ()
|
||||||
|
if typ == starlarkTypeString && fname == "subst" {
|
||||||
|
// Optimization: if it's $(subst from, to, string), emit string.replace(from, to)
|
||||||
|
return &callExpr{
|
||||||
|
object: obj,
|
||||||
|
name: "replace",
|
||||||
|
args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}},
|
||||||
|
returnType: typ,
|
||||||
|
}
|
||||||
|
}
|
||||||
return &callExpr{
|
return &callExpr{
|
||||||
object: obj,
|
name: fname,
|
||||||
name: "replace",
|
args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}, obj},
|
||||||
args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}},
|
returnType: obj.typ(),
|
||||||
returnType: starlarkTypeString,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -628,6 +628,7 @@ def init(g, handle):
|
|||||||
PRODUCT_COPY_FILES := $(addprefix pfx-,a b c)
|
PRODUCT_COPY_FILES := $(addprefix pfx-,a b c)
|
||||||
PRODUCT_COPY_FILES := $(addsuffix .sff, a b c)
|
PRODUCT_COPY_FILES := $(addsuffix .sff, a b c)
|
||||||
PRODUCT_NAME := $(word 1, $(subst ., ,$(TARGET_BOARD_PLATFORM)))
|
PRODUCT_NAME := $(word 1, $(subst ., ,$(TARGET_BOARD_PLATFORM)))
|
||||||
|
$(info $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS)))
|
||||||
|
|
||||||
`,
|
`,
|
||||||
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
||||||
@@ -637,6 +638,23 @@ def init(g, handle):
|
|||||||
cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c")
|
cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c")
|
||||||
cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c")
|
cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c")
|
||||||
cfg["PRODUCT_NAME"] = ((g.get("TARGET_BOARD_PLATFORM", "")).replace(".", " ")).split()[0]
|
cfg["PRODUCT_NAME"] = ((g.get("TARGET_BOARD_PLATFORM", "")).replace(".", " ")).split()[0]
|
||||||
|
rblf.mkinfo("product.mk", rblf.mkpatsubst("%.pub", "%", g.get("PRODUCT_ADB_KEYS", "")))
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: "subst in list",
|
||||||
|
mkname: "product.mk",
|
||||||
|
in: `
|
||||||
|
files = $(call find-copy-subdir-files,*,from,to)
|
||||||
|
PRODUCT_COPY_FILES += $(subst foo,bar,$(files))
|
||||||
|
`,
|
||||||
|
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
||||||
|
|
||||||
|
def init(g, handle):
|
||||||
|
cfg = rblf.cfg(handle)
|
||||||
|
_files = rblf.find_and_copy("*", "from", "to")
|
||||||
|
rblf.setdefault(handle, "PRODUCT_COPY_FILES")
|
||||||
|
cfg["PRODUCT_COPY_FILES"] += rblf.mksubst("foo", "bar", _files)
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@@ -26,6 +26,7 @@ type variable interface {
|
|||||||
emitSet(gctx *generationContext, asgn *assignmentNode)
|
emitSet(gctx *generationContext, asgn *assignmentNode)
|
||||||
emitDefined(gctx *generationContext)
|
emitDefined(gctx *generationContext)
|
||||||
valueType() starlarkType
|
valueType() starlarkType
|
||||||
|
setValueType(t starlarkType)
|
||||||
defaultValueString() string
|
defaultValueString() string
|
||||||
isPreset() bool
|
isPreset() bool
|
||||||
}
|
}
|
||||||
@@ -44,6 +45,10 @@ func (v baseVariable) valueType() starlarkType {
|
|||||||
return v.typ
|
return v.typ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *baseVariable) setValueType(t starlarkType) {
|
||||||
|
v.typ = t
|
||||||
|
}
|
||||||
|
|
||||||
func (v baseVariable) isPreset() bool {
|
func (v baseVariable) isPreset() bool {
|
||||||
return v.preset
|
return v.preset
|
||||||
}
|
}
|
||||||
@@ -279,7 +284,7 @@ func (ctx *parseContext) addVariable(name string) variable {
|
|||||||
} else if name == strings.ToLower(name) {
|
} else if name == strings.ToLower(name) {
|
||||||
// Heuristics: if variable's name is all lowercase, consider it local
|
// Heuristics: if variable's name is all lowercase, consider it local
|
||||||
// string variable.
|
// string variable.
|
||||||
v = &localVariable{baseVariable{nam: name, typ: starlarkTypeString}}
|
v = &localVariable{baseVariable{nam: name, typ: starlarkTypeUnknown}}
|
||||||
} else {
|
} else {
|
||||||
vt := starlarkTypeUnknown
|
vt := starlarkTypeUnknown
|
||||||
if strings.HasPrefix(name, "LOCAL_") {
|
if strings.HasPrefix(name, "LOCAL_") {
|
||||||
|
Reference in New Issue
Block a user