123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967 |
- // Copyright 2021 Google LLC
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package mk2rbc
- import (
- "bytes"
- "io/fs"
- "path/filepath"
- "strings"
- "testing"
- )
- var testCases = []struct {
- desc string
- mkname string
- in string
- expected string
- }{
- {
- desc: "Comment",
- mkname: "product.mk",
- in: `
- # Comment
- # FOO= a\
- b
- `,
- expected: `# Comment
- # FOO= a
- # b
- load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- `,
- },
- {
- desc: "Name conversion",
- mkname: "path/bar-baz.mk",
- in: `
- # Comment
- `,
- expected: `# Comment
- load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- `,
- },
- {
- desc: "Item variable",
- mkname: "pixel3.mk",
- in: `
- PRODUCT_NAME := Pixel 3
- PRODUCT_MODEL :=
- local_var = foo
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_NAME"] = "Pixel 3"
- cfg["PRODUCT_MODEL"] = ""
- _local_var = "foo"
- `,
- },
- {
- desc: "List variable",
- mkname: "pixel4.mk",
- in: `
- PRODUCT_PACKAGES = package1 package2
- PRODUCT_COPY_FILES += file2:target
- PRODUCT_PACKAGES += package3
- PRODUCT_COPY_FILES =
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_PACKAGES"] = [
- "package1",
- "package2",
- ]
- rblf.setdefault(handle, "PRODUCT_COPY_FILES")
- cfg["PRODUCT_COPY_FILES"] += ["file2:target"]
- cfg["PRODUCT_PACKAGES"] += ["package3"]
- cfg["PRODUCT_COPY_FILES"] = []
- `,
- },
- {
- desc: "Unknown function",
- mkname: "product.mk",
- in: `
- PRODUCT_NAME := $(call foo1, bar)
- PRODUCT_NAME := $(call foo0)
- `,
- expected: `# MK2RBC TRANSLATION ERROR: cannot handle invoking foo1
- # PRODUCT_NAME := $(call foo1, bar)
- # MK2RBC TRANSLATION ERROR: cannot handle invoking foo0
- # PRODUCT_NAME := $(call foo0)
- load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- rblf.warning("product.mk", "partially successful conversion")
- `,
- },
- {
- desc: "Inherit configuration always",
- mkname: "product.mk",
- in: `
- ifdef PRODUCT_NAME
- $(call inherit-product, part.mk)
- else # Comment
- $(call inherit-product, $(LOCAL_PATH)/part.mk)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- load(":part.star", _part_init = "init")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("PRODUCT_NAME") != None:
- rblf.inherit(handle, "part", _part_init)
- else:
- # Comment
- rblf.inherit(handle, "part", _part_init)
- `,
- },
- {
- desc: "Inherit configuration if it exists",
- mkname: "product.mk",
- in: `
- $(call inherit-product-if-exists, part.mk)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- load(":part.star|init", _part_init = "init")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if _part_init:
- rblf.inherit(handle, "part", _part_init)
- `,
- },
- {
- desc: "Include configuration",
- mkname: "product.mk",
- in: `
- ifdef PRODUCT_NAME
- include part.mk
- else
- -include $(LOCAL_PATH)/part.mk)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- load(":part.star|init", _part_init = "init")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("PRODUCT_NAME") != None:
- _part_init(g, handle)
- else:
- if _part_init != None:
- _part_init(g, handle)
- `,
- },
- {
- desc: "Synonymous inherited configurations",
- mkname: "path/product.mk",
- in: `
- $(call inherit-product, */font.mk)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- load("//foo:font.star", _font_init = "init")
- load("//bar:font.star", _font1_init = "init")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- rblf.inherit(handle, "foo/font", _font_init)
- rblf.inherit(handle, "bar/font", _font1_init)
- `,
- },
- {
- desc: "Directive define",
- mkname: "product.mk",
- in: `
- define some-macro
- $(info foo)
- endef
- `,
- expected: `# MK2RBC TRANSLATION ERROR: define is not supported: some-macro
- # define some-macro
- # $(info foo)
- # endef
- load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- rblf.warning("product.mk", "partially successful conversion")
- `,
- },
- {
- desc: "Ifdef",
- mkname: "product.mk",
- in: `
- ifdef PRODUCT_NAME
- PRODUCT_NAME = gizmo
- else
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("PRODUCT_NAME") != None:
- cfg["PRODUCT_NAME"] = "gizmo"
- else:
- pass
- `,
- },
- {
- desc: "Simple functions",
- mkname: "product.mk",
- in: `
- $(warning this is the warning)
- $(warning)
- $(info this is the info)
- $(error this is the error)
- PRODUCT_NAME:=$(shell echo *)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- rblf.mkwarning("product.mk", "this is the warning")
- rblf.mkwarning("product.mk", "")
- rblf.mkinfo("product.mk", "this is the info")
- rblf.mkerror("product.mk", "this is the error")
- cfg["PRODUCT_NAME"] = rblf.shell("echo *")
- `,
- },
- {
- desc: "Empty if",
- mkname: "product.mk",
- in: `
- ifdef PRODUCT_NAME
- # Comment
- else
- TARGET_COPY_OUT_VENDOR := foo
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("PRODUCT_NAME") != None:
- # Comment
- pass
- else:
- # MK2RBC TRANSLATION ERROR: cannot set predefined variable TARGET_COPY_OUT_VENDOR to "foo", its value should be "||VENDOR-PATH-PH||"
- pass
- rblf.warning("product.mk", "partially successful conversion")
- `,
- },
- {
- desc: "if/else/endif",
- mkname: "product.mk",
- in: `
- ifndef PRODUCT_NAME
- PRODUCT_NAME=gizmo1
- else
- PRODUCT_NAME=gizmo2
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if not g.get("PRODUCT_NAME") != None:
- cfg["PRODUCT_NAME"] = "gizmo1"
- else:
- cfg["PRODUCT_NAME"] = "gizmo2"
- `,
- },
- {
- desc: "else if",
- mkname: "product.mk",
- in: `
- ifdef PRODUCT_NAME
- PRODUCT_NAME = gizmo
- else ifndef PRODUCT_PACKAGES # Comment
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("PRODUCT_NAME") != None:
- cfg["PRODUCT_NAME"] = "gizmo"
- elif not g.get("PRODUCT_PACKAGES") != None:
- # Comment
- pass
- `,
- },
- {
- desc: "ifeq / ifneq",
- mkname: "product.mk",
- in: `
- ifeq (aosp_arm, $(TARGET_PRODUCT))
- PRODUCT_MODEL = pix2
- else
- PRODUCT_MODEL = pix21
- endif
- ifneq (aosp_x86, $(TARGET_PRODUCT))
- PRODUCT_MODEL = pix3
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if "aosp_arm" == g["TARGET_PRODUCT"]:
- cfg["PRODUCT_MODEL"] = "pix2"
- else:
- cfg["PRODUCT_MODEL"] = "pix21"
- if "aosp_x86" != g["TARGET_PRODUCT"]:
- cfg["PRODUCT_MODEL"] = "pix3"
- `,
- },
- {
- desc: "Check filter result",
- mkname: "product.mk",
- in: `
- ifeq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
- endif
- ifneq (,$(filter userdebug,$(TARGET_BUILD_VARIANT))
- endif
- ifneq (,$(filter plaf,$(PLATFORM_LIST)))
- endif
- ifeq ($(TARGET_BUILD_VARIANT), $(filter $(TARGET_BUILD_VARIANT), userdebug eng))
- endif
- ifneq (,$(filter true, $(v1)$(v2)))
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g["TARGET_BUILD_VARIANT"] not in ["userdebug", "eng"]:
- pass
- if g["TARGET_BUILD_VARIANT"] == "userdebug":
- pass
- if "plaf" in g.get("PLATFORM_LIST", []):
- pass
- if g["TARGET_BUILD_VARIANT"] in ["userdebug", "eng"]:
- pass
- if "%s%s" % (_v1, _v2) == "true":
- pass
- `,
- },
- {
- desc: "Get filter result",
- mkname: "product.mk",
- in: `
- PRODUCT_LIST2=$(filter-out %/foo.ko,$(wildcard path/*.ko))
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_LIST2"] = rblf.filter_out("%/foo.ko", rblf.expand_wildcard("path/*.ko"))
- `,
- },
- {
- desc: "filter $(VAR), values",
- mkname: "product.mk",
- in: `
- ifeq (,$(filter $(TARGET_PRODUCT), yukawa_gms yukawa_sei510_gms)
- ifneq (,$(filter $(TARGET_PRODUCT), yukawa_gms)
- endif
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g["TARGET_PRODUCT"] not in ["yukawa_gms", "yukawa_sei510_gms"]:
- if g["TARGET_PRODUCT"] == "yukawa_gms":
- pass
- `,
- },
- {
- desc: "filter $(V1), $(V2)",
- mkname: "product.mk",
- in: `
- ifneq (, $(filter $(PRODUCT_LIST), $(TARGET_PRODUCT)))
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if rblf.filter(g.get("PRODUCT_LIST", ""), g["TARGET_PRODUCT"]):
- pass
- `,
- },
- {
- desc: "ifeq",
- mkname: "product.mk",
- in: `
- ifeq (aosp, $(TARGET_PRODUCT)) # Comment
- else ifneq (, $(TARGET_PRODUCT))
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if "aosp" == g["TARGET_PRODUCT"]:
- # Comment
- pass
- elif g["TARGET_PRODUCT"]:
- pass
- `,
- },
- {
- desc: "Nested if",
- mkname: "product.mk",
- in: `
- ifdef PRODUCT_NAME
- PRODUCT_PACKAGES = pack-if0
- ifdef PRODUCT_MODEL
- PRODUCT_PACKAGES = pack-if-if
- else ifdef PRODUCT_NAME
- PRODUCT_PACKAGES = pack-if-elif
- else
- PRODUCT_PACKAGES = pack-if-else
- endif
- PRODUCT_PACKAGES = pack-if
- else ifneq (,$(TARGET_PRODUCT))
- PRODUCT_PACKAGES = pack-elif
- else
- PRODUCT_PACKAGES = pack-else
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("PRODUCT_NAME") != None:
- cfg["PRODUCT_PACKAGES"] = ["pack-if0"]
- if g.get("PRODUCT_MODEL") != None:
- cfg["PRODUCT_PACKAGES"] = ["pack-if-if"]
- elif g.get("PRODUCT_NAME") != None:
- cfg["PRODUCT_PACKAGES"] = ["pack-if-elif"]
- else:
- cfg["PRODUCT_PACKAGES"] = ["pack-if-else"]
- cfg["PRODUCT_PACKAGES"] = ["pack-if"]
- elif g["TARGET_PRODUCT"]:
- cfg["PRODUCT_PACKAGES"] = ["pack-elif"]
- else:
- cfg["PRODUCT_PACKAGES"] = ["pack-else"]
- `,
- },
- {
- desc: "Wildcard",
- mkname: "product.mk",
- in: `
- ifeq (,$(wildcard foo.mk))
- endif
- ifneq (,$(wildcard foo*.mk))
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if not rblf.file_exists("foo.mk"):
- pass
- if rblf.file_wildcard_exists("foo*.mk"):
- pass
- `,
- },
- {
- desc: "ifneq $(X),true",
- mkname: "product.mk",
- in: `
- ifneq ($(VARIABLE),true)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("VARIABLE", "") != "true":
- pass
- `,
- },
- {
- desc: "Const neq",
- mkname: "product.mk",
- in: `
- ifneq (1,0)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if "1" != "0":
- pass
- `,
- },
- {
- desc: "is-board calls",
- mkname: "product.mk",
- in: `
- ifeq ($(call is-board-platform-in-list,msm8998), true)
- else ifneq ($(call is-board-platform,copper),true)
- else ifneq ($(call is-vendor-board-platform,QCOM),true)
- else ifeq ($(call is-product-in-list, $(PLATFORM_LIST)), true)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if g.get("TARGET_BOARD_PLATFORM", "") in ["msm8998"]:
- pass
- elif g.get("TARGET_BOARD_PLATFORM", "") != "copper":
- pass
- elif g.get("TARGET_BOARD_PLATFORM", "") not in g["QCOM_BOARD_PLATFORMS"]:
- pass
- elif g["TARGET_PRODUCT"] in g.get("PLATFORM_LIST", []):
- pass
- `,
- },
- {
- desc: "findstring call",
- mkname: "product.mk",
- in: `
- ifneq ($(findstring foo,$(PRODUCT_PACKAGES)),)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1:
- pass
- `,
- },
- {
- desc: "rhs call",
- mkname: "product.mk",
- in: `
- PRODUCT_COPY_FILES = $(call add-to-product-copy-files-if-exists, path:distpath) \
- $(call find-copy-subdir-files, *, fromdir, todir) $(wildcard foo.*)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_COPY_FILES"] = (rblf.copy_if_exists("path:distpath") +
- rblf.find_and_copy("*", "fromdir", "todir") +
- rblf.expand_wildcard("foo.*"))
- `,
- },
- {
- desc: "inferred type",
- mkname: "product.mk",
- in: `
- HIKEY_MODS := $(wildcard foo/*.ko)
- BOARD_VENDOR_KERNEL_MODULES += $(HIKEY_MODS)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- g["HIKEY_MODS"] = rblf.expand_wildcard("foo/*.ko")
- g.setdefault("BOARD_VENDOR_KERNEL_MODULES", [])
- g["BOARD_VENDOR_KERNEL_MODULES"] += g["HIKEY_MODS"]
- `,
- },
- {
- desc: "list with vars",
- mkname: "product.mk",
- in: `
- PRODUCT_COPY_FILES += path1:$(TARGET_PRODUCT)/path1 $(PRODUCT_MODEL)/path2:$(TARGET_PRODUCT)/path2
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- rblf.setdefault(handle, "PRODUCT_COPY_FILES")
- cfg["PRODUCT_COPY_FILES"] += (("path1:%s/path1" % g["TARGET_PRODUCT"]).split() +
- ("%s/path2:%s/path2" % (cfg.get("PRODUCT_MODEL", ""), g["TARGET_PRODUCT"])).split())
- `,
- },
- {
- desc: "misc calls",
- mkname: "product.mk",
- in: `
- $(call enforce-product-packages-exist,)
- $(call enforce-product-packages-exist, foo)
- $(call require-artifacts-in-path, foo, bar)
- $(call require-artifacts-in-path-relaxed, foo, bar)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- rblf.enforce_product_packages_exist("")
- rblf.enforce_product_packages_exist("foo")
- rblf.require_artifacts_in_path("foo", "bar")
- rblf.require_artifacts_in_path_relaxed("foo", "bar")
- `,
- },
- {
- desc: "list with functions",
- mkname: "product.mk",
- in: `
- PRODUCT_COPY_FILES := $(call find-copy-subdir-files,*.kl,from1,to1) \
- $(call find-copy-subdir-files,*.kc,from2,to2) \
- foo bar
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_COPY_FILES"] = (rblf.find_and_copy("*.kl", "from1", "to1") +
- rblf.find_and_copy("*.kc", "from2", "to2") +
- [
- "foo",
- "bar",
- ])
- `,
- },
- {
- desc: "Text functions",
- mkname: "product.mk",
- in: `
- PRODUCT_COPY_FILES := $(addprefix pfx-,a b c)
- PRODUCT_COPY_FILES := $(addsuffix .sff, a b c)
- PRODUCT_NAME := $(word 1, $(subst ., ,$(TARGET_BOARD_PLATFORM)))
- $(info $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS)))
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c")
- cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c")
- 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)
- `,
- },
- {
- desc: "assignment flavors",
- mkname: "product.mk",
- in: `
- PRODUCT_LIST1 := a
- PRODUCT_LIST2 += a
- PRODUCT_LIST1 += b
- PRODUCT_LIST2 += b
- PRODUCT_LIST3 ?= a
- PRODUCT_LIST1 = c
- PLATFORM_LIST += x
- PRODUCT_PACKAGES := $(PLATFORM_LIST)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_LIST1"] = ["a"]
- rblf.setdefault(handle, "PRODUCT_LIST2")
- cfg["PRODUCT_LIST2"] += ["a"]
- cfg["PRODUCT_LIST1"] += ["b"]
- cfg["PRODUCT_LIST2"] += ["b"]
- if cfg.get("PRODUCT_LIST3") == None:
- cfg["PRODUCT_LIST3"] = ["a"]
- cfg["PRODUCT_LIST1"] = ["c"]
- g.setdefault("PLATFORM_LIST", [])
- g["PLATFORM_LIST"] += ["x"]
- cfg["PRODUCT_PACKAGES"] = g["PLATFORM_LIST"][:]
- `,
- },
- {
- desc: "assigment flavors2",
- mkname: "product.mk",
- in: `
- PRODUCT_LIST1 = a
- ifeq (0,1)
- PRODUCT_LIST1 += b
- PRODUCT_LIST2 += b
- endif
- PRODUCT_LIST1 += c
- PRODUCT_LIST2 += c
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_LIST1"] = ["a"]
- if "0" == "1":
- cfg["PRODUCT_LIST1"] += ["b"]
- rblf.setdefault(handle, "PRODUCT_LIST2")
- cfg["PRODUCT_LIST2"] += ["b"]
- cfg["PRODUCT_LIST1"] += ["c"]
- rblf.setdefault(handle, "PRODUCT_LIST2")
- cfg["PRODUCT_LIST2"] += ["c"]
- `,
- },
- {
- desc: "string split",
- mkname: "product.mk",
- in: `
- PRODUCT_LIST1 = a
- local = b
- local += c
- FOO = d
- FOO += e
- PRODUCT_LIST1 += $(local)
- PRODUCT_LIST1 += $(FOO)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_LIST1"] = ["a"]
- _local = "b"
- _local += " " + "c"
- g["FOO"] = "d"
- g["FOO"] += " " + "e"
- cfg["PRODUCT_LIST1"] += (_local).split()
- cfg["PRODUCT_LIST1"] += (g["FOO"]).split()
- `,
- },
- {
- desc: "apex_jars",
- mkname: "product.mk",
- in: `
- PRODUCT_BOOT_JARS := $(ART_APEX_JARS) framework-minus-apex
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- cfg["PRODUCT_BOOT_JARS"] = (g.get("ART_APEX_JARS", []) +
- ["framework-minus-apex"])
- `,
- },
- {
- desc: "strip function",
- mkname: "product.mk",
- in: `
- ifeq ($(filter hwaddress,$(PRODUCT_PACKAGES)),)
- PRODUCT_PACKAGES := $(strip $(PRODUCT_PACKAGES) hwaddress)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if "hwaddress" not in cfg.get("PRODUCT_PACKAGES", []):
- cfg["PRODUCT_PACKAGES"] = (rblf.mkstrip("%s hwaddress" % " ".join(cfg.get("PRODUCT_PACKAGES", [])))).split()
- `,
- },
- {
- desc: "strip func in condition",
- mkname: "product.mk",
- in: `
- ifneq ($(strip $(TARGET_VENDOR)),)
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- if rblf.mkstrip(g.get("TARGET_VENDOR", "")):
- pass
- `,
- },
- {
- desc: "ref after set",
- mkname: "product.mk",
- in: `
- PRODUCT_ADB_KEYS:=value
- FOO := $(PRODUCT_ADB_KEYS)
- ifneq (,$(PRODUCT_ADB_KEYS))
- endif
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- g["PRODUCT_ADB_KEYS"] = "value"
- g["FOO"] = g["PRODUCT_ADB_KEYS"]
- if g["PRODUCT_ADB_KEYS"]:
- pass
- `,
- },
- {
- desc: "ref before set",
- mkname: "product.mk",
- in: `
- V1 := $(PRODUCT_ADB_KEYS)
- ifeq (,$(PRODUCT_ADB_KEYS))
- V2 := $(PRODUCT_ADB_KEYS)
- PRODUCT_ADB_KEYS:=foo
- V3 := $(PRODUCT_ADB_KEYS)
- endif`,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- g["V1"] = g.get("PRODUCT_ADB_KEYS", "")
- if not g.get("PRODUCT_ADB_KEYS", ""):
- g["V2"] = g.get("PRODUCT_ADB_KEYS", "")
- g["PRODUCT_ADB_KEYS"] = "foo"
- g["V3"] = g["PRODUCT_ADB_KEYS"]
- `,
- },
- {
- desc: "Dynamic inherit path",
- mkname: "product.mk",
- in: `
- MY_PATH=foo
- $(call inherit-product,vendor/$(MY_PATH)/cfg.mk)
- `,
- expected: `load("//build/make/core:product_config.rbc", "rblf")
- load("//vendor/foo1:cfg.star|init", _cfg_init = "init")
- load("//vendor/bar/baz:cfg.star|init", _cfg1_init = "init")
- def init(g, handle):
- cfg = rblf.cfg(handle)
- g["MY_PATH"] = "foo"
- _entry = {
- "vendor/foo1/cfg.mk": ("_cfg", _cfg_init),
- "vendor/bar/baz/cfg.mk": ("_cfg1", _cfg1_init),
- }.get("vendor/%s/cfg.mk" % g["MY_PATH"])
- (_varmod, _varmod_init) = _entry if _entry else (None, None)
- if not _varmod_init:
- rblf.mkerror("cannot")
- rblf.inherit(handle, _varmod, _varmod_init)
- `,
- },
- }
- var known_variables = []struct {
- name string
- class varClass
- starlarkType
- }{
- {"PRODUCT_NAME", VarClassConfig, starlarkTypeString},
- {"PRODUCT_MODEL", VarClassConfig, starlarkTypeString},
- {"PRODUCT_PACKAGES", VarClassConfig, starlarkTypeList},
- {"PRODUCT_BOOT_JARS", VarClassConfig, starlarkTypeList},
- {"PRODUCT_COPY_FILES", VarClassConfig, starlarkTypeList},
- {"PRODUCT_IS_64BIT", VarClassConfig, starlarkTypeString},
- {"PRODUCT_LIST1", VarClassConfig, starlarkTypeList},
- {"PRODUCT_LIST2", VarClassConfig, starlarkTypeList},
- {"PRODUCT_LIST3", VarClassConfig, starlarkTypeList},
- {"TARGET_PRODUCT", VarClassSoong, starlarkTypeString},
- {"TARGET_BUILD_VARIANT", VarClassSoong, starlarkTypeString},
- {"TARGET_BOARD_PLATFORM", VarClassSoong, starlarkTypeString},
- {"QCOM_BOARD_PLATFORMS", VarClassSoong, starlarkTypeString},
- {"PLATFORM_LIST", VarClassSoong, starlarkTypeList}, // TODO(asmundak): make it local instead of soong
- }
- type testMakefileFinder struct {
- fs fs.FS
- root string
- files []string
- }
- func (t *testMakefileFinder) Find(root string) []string {
- if t.files != nil || root == t.root {
- return t.files
- }
- t.files = make([]string, 0)
- fs.WalkDir(t.fs, root, func(path string, d fs.DirEntry, err error) error {
- if err != nil {
- return err
- }
- if d.IsDir() {
- base := filepath.Base(path)
- if base[0] == '.' && len(base) > 1 {
- return fs.SkipDir
- }
- return nil
- }
- if strings.HasSuffix(path, ".mk") {
- t.files = append(t.files, path)
- }
- return nil
- })
- return t.files
- }
- func TestGood(t *testing.T) {
- for _, v := range known_variables {
- KnownVariables.NewVariable(v.name, v.class, v.starlarkType)
- }
- fs := NewFindMockFS([]string{
- "vendor/foo1/cfg.mk",
- "vendor/bar/baz/cfg.mk",
- "part.mk",
- "foo/font.mk",
- "bar/font.mk",
- })
- for _, test := range testCases {
- t.Run(test.desc,
- func(t *testing.T) {
- ss, err := Convert(Request{
- MkFile: test.mkname,
- Reader: bytes.NewBufferString(test.in),
- RootDir: ".",
- OutputSuffix: ".star",
- WarnPartialSuccess: true,
- SourceFS: fs,
- MakefileFinder: &testMakefileFinder{fs: fs},
- })
- if err != nil {
- t.Error(err)
- return
- }
- got := ss.String()
- if got != test.expected {
- t.Errorf("%q failed\nExpected:\n%s\nActual:\n%s\n", test.desc,
- strings.ReplaceAll(test.expected, "\n", "\n"),
- strings.ReplaceAll(got, "\n", "\n"))
- }
- })
- }
- }
|