1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 Google LLC 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage mk2rbc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "bytes" 19*333d2b36SAndroid Build Coastguard Worker "io/fs" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "strings" 22*333d2b36SAndroid Build Coastguard Worker "testing" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workervar testCases = []struct { 26*333d2b36SAndroid Build Coastguard Worker desc string 27*333d2b36SAndroid Build Coastguard Worker mkname string 28*333d2b36SAndroid Build Coastguard Worker in string 29*333d2b36SAndroid Build Coastguard Worker expected string 30*333d2b36SAndroid Build Coastguard Worker}{ 31*333d2b36SAndroid Build Coastguard Worker { 32*333d2b36SAndroid Build Coastguard Worker desc: "Comment", 33*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 34*333d2b36SAndroid Build Coastguard Worker in: ` 35*333d2b36SAndroid Build Coastguard Worker# Comment 36*333d2b36SAndroid Build Coastguard Worker# FOO= a\ 37*333d2b36SAndroid Build Coastguard Worker b 38*333d2b36SAndroid Build Coastguard Worker`, 39*333d2b36SAndroid Build Coastguard Worker expected: `# Comment 40*333d2b36SAndroid Build Coastguard Worker# FOO= a 41*333d2b36SAndroid Build Coastguard Worker# b 42*333d2b36SAndroid Build Coastguard Workerload("//build/make/core:product_config.rbc", "rblf") 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 45*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 46*333d2b36SAndroid Build Coastguard Worker`, 47*333d2b36SAndroid Build Coastguard Worker }, 48*333d2b36SAndroid Build Coastguard Worker { 49*333d2b36SAndroid Build Coastguard Worker desc: "Name conversion", 50*333d2b36SAndroid Build Coastguard Worker mkname: "path/bar-baz.mk", 51*333d2b36SAndroid Build Coastguard Worker in: ` 52*333d2b36SAndroid Build Coastguard Worker# Comment 53*333d2b36SAndroid Build Coastguard Worker`, 54*333d2b36SAndroid Build Coastguard Worker expected: `# Comment 55*333d2b36SAndroid Build Coastguard Workerload("//build/make/core:product_config.rbc", "rblf") 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 58*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 59*333d2b36SAndroid Build Coastguard Worker`, 60*333d2b36SAndroid Build Coastguard Worker }, 61*333d2b36SAndroid Build Coastguard Worker { 62*333d2b36SAndroid Build Coastguard Worker desc: "Item variable", 63*333d2b36SAndroid Build Coastguard Worker mkname: "pixel3.mk", 64*333d2b36SAndroid Build Coastguard Worker in: ` 65*333d2b36SAndroid Build Coastguard WorkerPRODUCT_NAME := Pixel 3 66*333d2b36SAndroid Build Coastguard WorkerPRODUCT_MODEL := 67*333d2b36SAndroid Build Coastguard Workerlocal_var = foo 68*333d2b36SAndroid Build Coastguard Workerlocal-var-with-dashes := bar 69*333d2b36SAndroid Build Coastguard Worker$(warning local-var-with-dashes: $(local-var-with-dashes)) 70*333d2b36SAndroid Build Coastguard WorkerGLOBAL-VAR-WITH-DASHES := baz 71*333d2b36SAndroid Build Coastguard Worker$(warning GLOBAL-VAR-WITH-DASHES: $(GLOBAL-VAR-WITH-DASHES)) 72*333d2b36SAndroid Build Coastguard Worker`, 73*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 76*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 77*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = "Pixel 3" 78*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_MODEL"] = "" 79*333d2b36SAndroid Build Coastguard Worker _local_var = "foo" 80*333d2b36SAndroid Build Coastguard Worker _local_var_with_dashes = "bar" 81*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("pixel3.mk", "local-var-with-dashes: %s" % _local_var_with_dashes) 82*333d2b36SAndroid Build Coastguard Worker g["GLOBAL-VAR-WITH-DASHES"] = "baz" 83*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("pixel3.mk", "GLOBAL-VAR-WITH-DASHES: %s" % g["GLOBAL-VAR-WITH-DASHES"]) 84*333d2b36SAndroid Build Coastguard Worker`, 85*333d2b36SAndroid Build Coastguard Worker }, 86*333d2b36SAndroid Build Coastguard Worker { 87*333d2b36SAndroid Build Coastguard Worker desc: "List variable", 88*333d2b36SAndroid Build Coastguard Worker mkname: "pixel4.mk", 89*333d2b36SAndroid Build Coastguard Worker in: ` 90*333d2b36SAndroid Build Coastguard WorkerPRODUCT_PACKAGES = package1 package2 91*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES += file2:target 92*333d2b36SAndroid Build Coastguard WorkerPRODUCT_PACKAGES += package3 93*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES = 94*333d2b36SAndroid Build Coastguard Worker`, 95*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 98*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 99*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = [ 100*333d2b36SAndroid Build Coastguard Worker "package1", 101*333d2b36SAndroid Build Coastguard Worker "package2", 102*333d2b36SAndroid Build Coastguard Worker ] 103*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_COPY_FILES") 104*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] += ["file2:target"] 105*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] += ["package3"] 106*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = [] 107*333d2b36SAndroid Build Coastguard Worker`, 108*333d2b36SAndroid Build Coastguard Worker }, 109*333d2b36SAndroid Build Coastguard Worker { 110*333d2b36SAndroid Build Coastguard Worker desc: "Unknown function", 111*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 112*333d2b36SAndroid Build Coastguard Worker in: ` 113*333d2b36SAndroid Build Coastguard WorkerPRODUCT_NAME := $(call foo1, bar) 114*333d2b36SAndroid Build Coastguard WorkerPRODUCT_NAME := $(call foo0) 115*333d2b36SAndroid Build Coastguard Worker`, 116*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 117*333d2b36SAndroid Build Coastguard Worker 118*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 119*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 120*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = rblf.mk2rbc_error("product.mk:2", "cannot handle invoking foo1") 121*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = rblf.mk2rbc_error("product.mk:3", "cannot handle invoking foo0") 122*333d2b36SAndroid Build Coastguard Worker`, 123*333d2b36SAndroid Build Coastguard Worker }, 124*333d2b36SAndroid Build Coastguard Worker { 125*333d2b36SAndroid Build Coastguard Worker desc: "Inherit configuration always", 126*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 127*333d2b36SAndroid Build Coastguard Worker in: ` 128*333d2b36SAndroid Build Coastguard Worker$(call inherit-product, part.mk) 129*333d2b36SAndroid Build Coastguard Workerifdef PRODUCT_NAME 130*333d2b36SAndroid Build Coastguard Worker$(call inherit-product, part1.mk) 131*333d2b36SAndroid Build Coastguard Workerelse # Comment 132*333d2b36SAndroid Build Coastguard Worker$(call inherit-product, $(LOCAL_PATH)/part.mk) 133*333d2b36SAndroid Build Coastguard Workerendif 134*333d2b36SAndroid Build Coastguard Worker`, 135*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 136*333d2b36SAndroid Build Coastguard Workerload(":part.star", _part_init = "init") 137*333d2b36SAndroid Build Coastguard Workerload(":part1.star|init", _part1_init = "init") 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 140*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 141*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "part", _part_init) 142*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_NAME", ""): 143*333d2b36SAndroid Build Coastguard Worker if not _part1_init: 144*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % (":part1.star")) 145*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "part1", _part1_init) 146*333d2b36SAndroid Build Coastguard Worker else: 147*333d2b36SAndroid Build Coastguard Worker # Comment 148*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "part", _part_init) 149*333d2b36SAndroid Build Coastguard Worker`, 150*333d2b36SAndroid Build Coastguard Worker }, 151*333d2b36SAndroid Build Coastguard Worker { 152*333d2b36SAndroid Build Coastguard Worker desc: "Inherit configuration if it exists", 153*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 154*333d2b36SAndroid Build Coastguard Worker in: ` 155*333d2b36SAndroid Build Coastguard Worker$(call inherit-product-if-exists, part.mk) 156*333d2b36SAndroid Build Coastguard Worker`, 157*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 158*333d2b36SAndroid Build Coastguard Workerload(":part.star|init", _part_init = "init") 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 161*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 162*333d2b36SAndroid Build Coastguard Worker if _part_init: 163*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "part", _part_init) 164*333d2b36SAndroid Build Coastguard Worker`, 165*333d2b36SAndroid Build Coastguard Worker }, 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker { 168*333d2b36SAndroid Build Coastguard Worker desc: "Include configuration", 169*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 170*333d2b36SAndroid Build Coastguard Worker in: ` 171*333d2b36SAndroid Build Coastguard Workerinclude part.mk 172*333d2b36SAndroid Build Coastguard Workerifdef PRODUCT_NAME 173*333d2b36SAndroid Build Coastguard Workerinclude part1.mk 174*333d2b36SAndroid Build Coastguard Workerelse 175*333d2b36SAndroid Build Coastguard Worker-include $(LOCAL_PATH)/part1.mk) 176*333d2b36SAndroid Build Coastguard Workerendif 177*333d2b36SAndroid Build Coastguard Worker`, 178*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 179*333d2b36SAndroid Build Coastguard Workerload(":part.star", _part_init = "init") 180*333d2b36SAndroid Build Coastguard Workerload(":part1.star|init", _part1_init = "init") 181*333d2b36SAndroid Build Coastguard Worker 182*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 183*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 184*333d2b36SAndroid Build Coastguard Worker _part_init(g, handle) 185*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_NAME", ""): 186*333d2b36SAndroid Build Coastguard Worker if not _part1_init: 187*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % (":part1.star")) 188*333d2b36SAndroid Build Coastguard Worker _part1_init(g, handle) 189*333d2b36SAndroid Build Coastguard Worker else: 190*333d2b36SAndroid Build Coastguard Worker if _part1_init != None: 191*333d2b36SAndroid Build Coastguard Worker _part1_init(g, handle) 192*333d2b36SAndroid Build Coastguard Worker`, 193*333d2b36SAndroid Build Coastguard Worker }, 194*333d2b36SAndroid Build Coastguard Worker 195*333d2b36SAndroid Build Coastguard Worker { 196*333d2b36SAndroid Build Coastguard Worker desc: "Include with trailing whitespace", 197*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 198*333d2b36SAndroid Build Coastguard Worker in: ` 199*333d2b36SAndroid Build Coastguard Worker# has a trailing whitespace after cfg.mk 200*333d2b36SAndroid Build Coastguard Workerinclude vendor/$(foo)/cfg.mk 201*333d2b36SAndroid Build Coastguard Worker`, 202*333d2b36SAndroid Build Coastguard Worker expected: `# has a trailing whitespace after cfg.mk 203*333d2b36SAndroid Build Coastguard Workerload("//build/make/core:product_config.rbc", "rblf") 204*333d2b36SAndroid Build Coastguard Workerload("//vendor/foo1:cfg.star|init", _cfg_init = "init") 205*333d2b36SAndroid Build Coastguard Workerload("//vendor/bar/baz:cfg.star|init", _cfg1_init = "init") 206*333d2b36SAndroid Build Coastguard Worker 207*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 208*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 209*333d2b36SAndroid Build Coastguard Worker _entry = { 210*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 211*333d2b36SAndroid Build Coastguard Worker "vendor/bar/baz/cfg.mk": ("vendor/bar/baz/cfg", _cfg1_init), 212*333d2b36SAndroid Build Coastguard Worker }.get("vendor/%s/cfg.mk" % _foo) 213*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 214*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 215*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("vendor/%s/cfg.mk" % _foo)) 216*333d2b36SAndroid Build Coastguard Worker _varmod_init(g, handle) 217*333d2b36SAndroid Build Coastguard Worker`, 218*333d2b36SAndroid Build Coastguard Worker }, 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Worker { 221*333d2b36SAndroid Build Coastguard Worker desc: "Synonymous inherited configurations", 222*333d2b36SAndroid Build Coastguard Worker mkname: "path/product.mk", 223*333d2b36SAndroid Build Coastguard Worker in: ` 224*333d2b36SAndroid Build Coastguard Worker$(call inherit-product, */font.mk) 225*333d2b36SAndroid Build Coastguard Worker$(call inherit-product, $(sort $(wildcard */font.mk))) 226*333d2b36SAndroid Build Coastguard Worker$(call inherit-product, $(wildcard */font.mk)) 227*333d2b36SAndroid Build Coastguard Worker 228*333d2b36SAndroid Build Coastguard Workerinclude */font.mk 229*333d2b36SAndroid Build Coastguard Workerinclude $(sort $(wildcard */font.mk)) 230*333d2b36SAndroid Build Coastguard Workerinclude $(wildcard */font.mk) 231*333d2b36SAndroid Build Coastguard Worker`, 232*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 233*333d2b36SAndroid Build Coastguard Workerload("//bar:font.star", _font_init = "init") 234*333d2b36SAndroid Build Coastguard Workerload("//foo:font.star", _font1_init = "init") 235*333d2b36SAndroid Build Coastguard Worker 236*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 237*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 238*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "bar/font", _font_init) 239*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "foo/font", _font1_init) 240*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "bar/font", _font_init) 241*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "foo/font", _font1_init) 242*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "bar/font", _font_init) 243*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "foo/font", _font1_init) 244*333d2b36SAndroid Build Coastguard Worker _font_init(g, handle) 245*333d2b36SAndroid Build Coastguard Worker _font1_init(g, handle) 246*333d2b36SAndroid Build Coastguard Worker _font_init(g, handle) 247*333d2b36SAndroid Build Coastguard Worker _font1_init(g, handle) 248*333d2b36SAndroid Build Coastguard Worker _font_init(g, handle) 249*333d2b36SAndroid Build Coastguard Worker _font1_init(g, handle) 250*333d2b36SAndroid Build Coastguard Worker`, 251*333d2b36SAndroid Build Coastguard Worker }, 252*333d2b36SAndroid Build Coastguard Worker { 253*333d2b36SAndroid Build Coastguard Worker desc: "Directive define", 254*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 255*333d2b36SAndroid Build Coastguard Worker in: ` 256*333d2b36SAndroid Build Coastguard Workerdefine some-macro 257*333d2b36SAndroid Build Coastguard Worker $(info foo) 258*333d2b36SAndroid Build Coastguard Workerendef 259*333d2b36SAndroid Build Coastguard Worker`, 260*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 261*333d2b36SAndroid Build Coastguard Worker 262*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 263*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 264*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:2", "define is not supported: some-macro") 265*333d2b36SAndroid Build Coastguard Worker`, 266*333d2b36SAndroid Build Coastguard Worker }, 267*333d2b36SAndroid Build Coastguard Worker { 268*333d2b36SAndroid Build Coastguard Worker desc: "Ifdef", 269*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 270*333d2b36SAndroid Build Coastguard Worker in: ` 271*333d2b36SAndroid Build Coastguard Workerifdef PRODUCT_NAME 272*333d2b36SAndroid Build Coastguard Worker PRODUCT_NAME = gizmo 273*333d2b36SAndroid Build Coastguard Workerelse 274*333d2b36SAndroid Build Coastguard Workerendif 275*333d2b36SAndroid Build Coastguard Workerlocal_var := 276*333d2b36SAndroid Build Coastguard Workerifdef local_var 277*333d2b36SAndroid Build Coastguard Workerendif 278*333d2b36SAndroid Build Coastguard Worker`, 279*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 282*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 283*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_NAME", ""): 284*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = "gizmo" 285*333d2b36SAndroid Build Coastguard Worker else: 286*333d2b36SAndroid Build Coastguard Worker pass 287*333d2b36SAndroid Build Coastguard Worker _local_var = "" 288*333d2b36SAndroid Build Coastguard Worker if _local_var: 289*333d2b36SAndroid Build Coastguard Worker pass 290*333d2b36SAndroid Build Coastguard Worker`, 291*333d2b36SAndroid Build Coastguard Worker }, 292*333d2b36SAndroid Build Coastguard Worker { 293*333d2b36SAndroid Build Coastguard Worker desc: "Simple functions", 294*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 295*333d2b36SAndroid Build Coastguard Worker in: ` 296*333d2b36SAndroid Build Coastguard Worker$(warning this is the warning) 297*333d2b36SAndroid Build Coastguard Worker$(warning) 298*333d2b36SAndroid Build Coastguard Worker$(warning # this warning starts with a pound) 299*333d2b36SAndroid Build Coastguard Worker$(warning this warning has a # in the middle) 300*333d2b36SAndroid Build Coastguard Worker$(info this is the info) 301*333d2b36SAndroid Build Coastguard Worker$(error this is the error) 302*333d2b36SAndroid Build Coastguard WorkerPRODUCT_NAME:=$(shell echo *) 303*333d2b36SAndroid Build Coastguard Worker`, 304*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 305*333d2b36SAndroid Build Coastguard Worker 306*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 307*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 308*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("product.mk", "this is the warning") 309*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("product.mk", "") 310*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("product.mk", "# this warning starts with a pound") 311*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("product.mk", "this warning has a # in the middle") 312*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", "this is the info") 313*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "this is the error") 314*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = rblf.shell("echo *") 315*333d2b36SAndroid Build Coastguard Worker`, 316*333d2b36SAndroid Build Coastguard Worker }, 317*333d2b36SAndroid Build Coastguard Worker { 318*333d2b36SAndroid Build Coastguard Worker desc: "Empty if", 319*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 320*333d2b36SAndroid Build Coastguard Worker in: ` 321*333d2b36SAndroid Build Coastguard Workerifdef PRODUCT_NAME 322*333d2b36SAndroid Build Coastguard Worker# Comment 323*333d2b36SAndroid Build Coastguard Workerelse 324*333d2b36SAndroid Build Coastguard Worker TARGET_COPY_OUT_RECOVERY := foo 325*333d2b36SAndroid Build Coastguard Workerendif 326*333d2b36SAndroid Build Coastguard Worker`, 327*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 328*333d2b36SAndroid Build Coastguard Worker 329*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 330*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 331*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_NAME", ""): 332*333d2b36SAndroid Build Coastguard Worker # Comment 333*333d2b36SAndroid Build Coastguard Worker pass 334*333d2b36SAndroid Build Coastguard Worker else: 335*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:5", "cannot set predefined variable TARGET_COPY_OUT_RECOVERY to \"foo\", its value should be \"recovery\"") 336*333d2b36SAndroid Build Coastguard Worker`, 337*333d2b36SAndroid Build Coastguard Worker }, 338*333d2b36SAndroid Build Coastguard Worker { 339*333d2b36SAndroid Build Coastguard Worker desc: "if/else/endif", 340*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 341*333d2b36SAndroid Build Coastguard Worker in: ` 342*333d2b36SAndroid Build Coastguard Workerifndef PRODUCT_NAME 343*333d2b36SAndroid Build Coastguard Worker PRODUCT_NAME=gizmo1 344*333d2b36SAndroid Build Coastguard Workerelse 345*333d2b36SAndroid Build Coastguard Worker PRODUCT_NAME=gizmo2 346*333d2b36SAndroid Build Coastguard Workerendif 347*333d2b36SAndroid Build Coastguard Worker`, 348*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 349*333d2b36SAndroid Build Coastguard Worker 350*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 351*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 352*333d2b36SAndroid Build Coastguard Worker if not cfg.get("PRODUCT_NAME", ""): 353*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = "gizmo1" 354*333d2b36SAndroid Build Coastguard Worker else: 355*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = "gizmo2" 356*333d2b36SAndroid Build Coastguard Worker`, 357*333d2b36SAndroid Build Coastguard Worker }, 358*333d2b36SAndroid Build Coastguard Worker { 359*333d2b36SAndroid Build Coastguard Worker desc: "else if", 360*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 361*333d2b36SAndroid Build Coastguard Worker in: ` 362*333d2b36SAndroid Build Coastguard Workerifdef PRODUCT_NAME 363*333d2b36SAndroid Build Coastguard Worker PRODUCT_NAME = gizmo 364*333d2b36SAndroid Build Coastguard Workerelse ifndef PRODUCT_PACKAGES # Comment 365*333d2b36SAndroid Build Coastguard Workerendif 366*333d2b36SAndroid Build Coastguard Worker `, 367*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 368*333d2b36SAndroid Build Coastguard Worker 369*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 370*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 371*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_NAME", ""): 372*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = "gizmo" 373*333d2b36SAndroid Build Coastguard Worker elif not cfg.get("PRODUCT_PACKAGES", []): 374*333d2b36SAndroid Build Coastguard Worker # Comment 375*333d2b36SAndroid Build Coastguard Worker pass 376*333d2b36SAndroid Build Coastguard Worker`, 377*333d2b36SAndroid Build Coastguard Worker }, 378*333d2b36SAndroid Build Coastguard Worker { 379*333d2b36SAndroid Build Coastguard Worker desc: "ifeq / ifneq", 380*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 381*333d2b36SAndroid Build Coastguard Worker in: ` 382*333d2b36SAndroid Build Coastguard Workerifeq (aosp_arm, $(TARGET_PRODUCT)) 383*333d2b36SAndroid Build Coastguard Worker PRODUCT_MODEL = pix2 384*333d2b36SAndroid Build Coastguard Workerelse 385*333d2b36SAndroid Build Coastguard Worker PRODUCT_MODEL = pix21 386*333d2b36SAndroid Build Coastguard Workerendif 387*333d2b36SAndroid Build Coastguard Workerifneq (aosp_x86, $(TARGET_PRODUCT)) 388*333d2b36SAndroid Build Coastguard Worker PRODUCT_MODEL = pix3 389*333d2b36SAndroid Build Coastguard Workerendif 390*333d2b36SAndroid Build Coastguard Worker`, 391*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 392*333d2b36SAndroid Build Coastguard Worker 393*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 394*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 395*333d2b36SAndroid Build Coastguard Worker if "aosp_arm" == g["TARGET_PRODUCT"]: 396*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_MODEL"] = "pix2" 397*333d2b36SAndroid Build Coastguard Worker else: 398*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_MODEL"] = "pix21" 399*333d2b36SAndroid Build Coastguard Worker if "aosp_x86" != g["TARGET_PRODUCT"]: 400*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_MODEL"] = "pix3" 401*333d2b36SAndroid Build Coastguard Worker`, 402*333d2b36SAndroid Build Coastguard Worker }, 403*333d2b36SAndroid Build Coastguard Worker { 404*333d2b36SAndroid Build Coastguard Worker desc: "ifeq with soong_config_get", 405*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 406*333d2b36SAndroid Build Coastguard Worker in: ` 407*333d2b36SAndroid Build Coastguard Workerifeq (true,$(call soong_config_get,art_module,source_build)) 408*333d2b36SAndroid Build Coastguard Workerendif 409*333d2b36SAndroid Build Coastguard Worker`, 410*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 411*333d2b36SAndroid Build Coastguard Worker 412*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 413*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 414*333d2b36SAndroid Build Coastguard Worker if "true" == rblf.soong_config_get(g, "art_module", "source_build"): 415*333d2b36SAndroid Build Coastguard Worker pass 416*333d2b36SAndroid Build Coastguard Worker`, 417*333d2b36SAndroid Build Coastguard Worker }, 418*333d2b36SAndroid Build Coastguard Worker { 419*333d2b36SAndroid Build Coastguard Worker desc: "ifeq with $(NATIVE_COVERAGE)", 420*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 421*333d2b36SAndroid Build Coastguard Worker in: ` 422*333d2b36SAndroid Build Coastguard Workerifeq ($(NATIVE_COVERAGE),true) 423*333d2b36SAndroid Build Coastguard Workerendif 424*333d2b36SAndroid Build Coastguard Worker`, 425*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 426*333d2b36SAndroid Build Coastguard Worker 427*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 428*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 429*333d2b36SAndroid Build Coastguard Worker if g.get("NATIVE_COVERAGE", False): 430*333d2b36SAndroid Build Coastguard Worker pass 431*333d2b36SAndroid Build Coastguard Worker`, 432*333d2b36SAndroid Build Coastguard Worker }, 433*333d2b36SAndroid Build Coastguard Worker { 434*333d2b36SAndroid Build Coastguard Worker desc: "Check filter result", 435*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 436*333d2b36SAndroid Build Coastguard Worker in: ` 437*333d2b36SAndroid Build Coastguard Workerifeq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) 438*333d2b36SAndroid Build Coastguard Workerendif 439*333d2b36SAndroid Build Coastguard Workerifneq (,$(filter userdebug,$(TARGET_BUILD_VARIANT)) 440*333d2b36SAndroid Build Coastguard Workerendif 441*333d2b36SAndroid Build Coastguard Workerifneq (,$(filter plaf,$(PLATFORM_LIST))) 442*333d2b36SAndroid Build Coastguard Workerendif 443*333d2b36SAndroid Build Coastguard Workerifeq ($(TARGET_BUILD_VARIANT), $(filter $(TARGET_BUILD_VARIANT), userdebug eng)) 444*333d2b36SAndroid Build Coastguard Workerendif 445*333d2b36SAndroid Build Coastguard Workerifneq (, $(filter $(TARGET_BUILD_VARIANT), userdebug eng)) 446*333d2b36SAndroid Build Coastguard Workerendif 447*333d2b36SAndroid Build Coastguard Workerifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) 448*333d2b36SAndroid Build Coastguard Workerendif 449*333d2b36SAndroid Build Coastguard Workerifneq (,$(filter true, $(v1)$(v2))) 450*333d2b36SAndroid Build Coastguard Workerendif 451*333d2b36SAndroid Build Coastguard Workerifeq (,$(filter barbet coral%,$(TARGET_PRODUCT))) 452*333d2b36SAndroid Build Coastguard Workerelse ifneq (,$(filter barbet%,$(TARGET_PRODUCT))) 453*333d2b36SAndroid Build Coastguard Workerendif 454*333d2b36SAndroid Build Coastguard Workerifeq (,$(filter-out sunfish_kasan, $(TARGET_PRODUCT))) 455*333d2b36SAndroid Build Coastguard Workerendif 456*333d2b36SAndroid Build Coastguard Worker`, 457*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 458*333d2b36SAndroid Build Coastguard Worker 459*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 460*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 461*333d2b36SAndroid Build Coastguard Worker if not rblf.filter("userdebug eng", g["TARGET_BUILD_VARIANT"]): 462*333d2b36SAndroid Build Coastguard Worker pass 463*333d2b36SAndroid Build Coastguard Worker if rblf.filter("userdebug", g["TARGET_BUILD_VARIANT"]): 464*333d2b36SAndroid Build Coastguard Worker pass 465*333d2b36SAndroid Build Coastguard Worker if "plaf" in g.get("PLATFORM_LIST", []): 466*333d2b36SAndroid Build Coastguard Worker pass 467*333d2b36SAndroid Build Coastguard Worker if g["TARGET_BUILD_VARIANT"] == " ".join(rblf.filter(g["TARGET_BUILD_VARIANT"], "userdebug eng")): 468*333d2b36SAndroid Build Coastguard Worker pass 469*333d2b36SAndroid Build Coastguard Worker if g["TARGET_BUILD_VARIANT"] in ["userdebug", "eng"]: 470*333d2b36SAndroid Build Coastguard Worker pass 471*333d2b36SAndroid Build Coastguard Worker if rblf.filter("userdebug eng", g["TARGET_BUILD_VARIANT"]): 472*333d2b36SAndroid Build Coastguard Worker pass 473*333d2b36SAndroid Build Coastguard Worker if rblf.filter("true", "%s%s" % (_v1, _v2)): 474*333d2b36SAndroid Build Coastguard Worker pass 475*333d2b36SAndroid Build Coastguard Worker if not rblf.filter("barbet coral%", g["TARGET_PRODUCT"]): 476*333d2b36SAndroid Build Coastguard Worker pass 477*333d2b36SAndroid Build Coastguard Worker elif rblf.filter("barbet%", g["TARGET_PRODUCT"]): 478*333d2b36SAndroid Build Coastguard Worker pass 479*333d2b36SAndroid Build Coastguard Worker if not rblf.filter_out("sunfish_kasan", g["TARGET_PRODUCT"]): 480*333d2b36SAndroid Build Coastguard Worker pass 481*333d2b36SAndroid Build Coastguard Worker`, 482*333d2b36SAndroid Build Coastguard Worker }, 483*333d2b36SAndroid Build Coastguard Worker { 484*333d2b36SAndroid Build Coastguard Worker desc: "Get filter result", 485*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 486*333d2b36SAndroid Build Coastguard Worker in: ` 487*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST2=$(filter-out %/foo.ko,$(wildcard path/*.ko)) 488*333d2b36SAndroid Build Coastguard Worker`, 489*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 490*333d2b36SAndroid Build Coastguard Worker 491*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 492*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 493*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST2"] = rblf.filter_out("%/foo.ko", rblf.expand_wildcard("path/*.ko")) 494*333d2b36SAndroid Build Coastguard Worker`, 495*333d2b36SAndroid Build Coastguard Worker }, 496*333d2b36SAndroid Build Coastguard Worker { 497*333d2b36SAndroid Build Coastguard Worker desc: "filter $(VAR), values", 498*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 499*333d2b36SAndroid Build Coastguard Worker in: ` 500*333d2b36SAndroid Build Coastguard Workerifeq (,$(filter $(TARGET_PRODUCT), yukawa_gms yukawa_sei510_gms) 501*333d2b36SAndroid Build Coastguard Worker ifneq (,$(filter $(TARGET_PRODUCT), yukawa_gms) 502*333d2b36SAndroid Build Coastguard Worker endif 503*333d2b36SAndroid Build Coastguard Workerendif 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker`, 506*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 507*333d2b36SAndroid Build Coastguard Worker 508*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 509*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 510*333d2b36SAndroid Build Coastguard Worker if g["TARGET_PRODUCT"] not in ["yukawa_gms", "yukawa_sei510_gms"]: 511*333d2b36SAndroid Build Coastguard Worker if g["TARGET_PRODUCT"] == "yukawa_gms": 512*333d2b36SAndroid Build Coastguard Worker pass 513*333d2b36SAndroid Build Coastguard Worker`, 514*333d2b36SAndroid Build Coastguard Worker }, 515*333d2b36SAndroid Build Coastguard Worker { 516*333d2b36SAndroid Build Coastguard Worker desc: "filter $(V1), $(V2)", 517*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 518*333d2b36SAndroid Build Coastguard Worker in: ` 519*333d2b36SAndroid Build Coastguard Workerifneq (, $(filter $(PRODUCT_LIST), $(TARGET_PRODUCT))) 520*333d2b36SAndroid Build Coastguard Workerendif 521*333d2b36SAndroid Build Coastguard Worker`, 522*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 523*333d2b36SAndroid Build Coastguard Worker 524*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 525*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 526*333d2b36SAndroid Build Coastguard Worker if rblf.filter(g.get("PRODUCT_LIST", []), g["TARGET_PRODUCT"]): 527*333d2b36SAndroid Build Coastguard Worker pass 528*333d2b36SAndroid Build Coastguard Worker`, 529*333d2b36SAndroid Build Coastguard Worker }, 530*333d2b36SAndroid Build Coastguard Worker { 531*333d2b36SAndroid Build Coastguard Worker desc: "ifeq", 532*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 533*333d2b36SAndroid Build Coastguard Worker in: ` 534*333d2b36SAndroid Build Coastguard Workerifeq (aosp, $(TARGET_PRODUCT)) # Comment 535*333d2b36SAndroid Build Coastguard Workerelse ifneq (, $(TARGET_PRODUCT)) 536*333d2b36SAndroid Build Coastguard Workerendif 537*333d2b36SAndroid Build Coastguard Worker`, 538*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 539*333d2b36SAndroid Build Coastguard Worker 540*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 541*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 542*333d2b36SAndroid Build Coastguard Worker if "aosp" == g["TARGET_PRODUCT"]: 543*333d2b36SAndroid Build Coastguard Worker # Comment 544*333d2b36SAndroid Build Coastguard Worker pass 545*333d2b36SAndroid Build Coastguard Worker elif g["TARGET_PRODUCT"]: 546*333d2b36SAndroid Build Coastguard Worker pass 547*333d2b36SAndroid Build Coastguard Worker`, 548*333d2b36SAndroid Build Coastguard Worker }, 549*333d2b36SAndroid Build Coastguard Worker { 550*333d2b36SAndroid Build Coastguard Worker desc: "Nested if", 551*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 552*333d2b36SAndroid Build Coastguard Worker in: ` 553*333d2b36SAndroid Build Coastguard Workerifdef PRODUCT_NAME 554*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-if0 555*333d2b36SAndroid Build Coastguard Worker ifdef PRODUCT_MODEL 556*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-if-if 557*333d2b36SAndroid Build Coastguard Worker else ifdef PRODUCT_NAME 558*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-if-elif 559*333d2b36SAndroid Build Coastguard Worker else 560*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-if-else 561*333d2b36SAndroid Build Coastguard Worker endif 562*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-if 563*333d2b36SAndroid Build Coastguard Workerelse ifneq (,$(TARGET_PRODUCT)) 564*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-elif 565*333d2b36SAndroid Build Coastguard Workerelse 566*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES = pack-else 567*333d2b36SAndroid Build Coastguard Workerendif 568*333d2b36SAndroid Build Coastguard Worker`, 569*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 570*333d2b36SAndroid Build Coastguard Worker 571*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 572*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 573*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_NAME", ""): 574*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-if0"] 575*333d2b36SAndroid Build Coastguard Worker if cfg.get("PRODUCT_MODEL", ""): 576*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-if-if"] 577*333d2b36SAndroid Build Coastguard Worker elif cfg.get("PRODUCT_NAME", ""): 578*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-if-elif"] 579*333d2b36SAndroid Build Coastguard Worker else: 580*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-if-else"] 581*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-if"] 582*333d2b36SAndroid Build Coastguard Worker elif g["TARGET_PRODUCT"]: 583*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-elif"] 584*333d2b36SAndroid Build Coastguard Worker else: 585*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = ["pack-else"] 586*333d2b36SAndroid Build Coastguard Worker`, 587*333d2b36SAndroid Build Coastguard Worker }, 588*333d2b36SAndroid Build Coastguard Worker { 589*333d2b36SAndroid Build Coastguard Worker desc: "Wildcard", 590*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 591*333d2b36SAndroid Build Coastguard Worker in: ` 592*333d2b36SAndroid Build Coastguard Workerifeq (,$(wildcard foo.mk)) 593*333d2b36SAndroid Build Coastguard Workerendif 594*333d2b36SAndroid Build Coastguard Workerifneq (,$(wildcard foo*.mk)) 595*333d2b36SAndroid Build Coastguard Workerendif 596*333d2b36SAndroid Build Coastguard Workerifeq (foo1.mk foo2.mk barxyz.mk,$(wildcard foo*.mk bar*.mk)) 597*333d2b36SAndroid Build Coastguard Workerendif 598*333d2b36SAndroid Build Coastguard Worker`, 599*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 600*333d2b36SAndroid Build Coastguard Worker 601*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 602*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 603*333d2b36SAndroid Build Coastguard Worker if not rblf.expand_wildcard("foo.mk"): 604*333d2b36SAndroid Build Coastguard Worker pass 605*333d2b36SAndroid Build Coastguard Worker if rblf.expand_wildcard("foo*.mk"): 606*333d2b36SAndroid Build Coastguard Worker pass 607*333d2b36SAndroid Build Coastguard Worker if rblf.expand_wildcard("foo*.mk bar*.mk") == ["foo1.mk", "foo2.mk", "barxyz.mk"]: 608*333d2b36SAndroid Build Coastguard Worker pass 609*333d2b36SAndroid Build Coastguard Worker`, 610*333d2b36SAndroid Build Coastguard Worker }, 611*333d2b36SAndroid Build Coastguard Worker { 612*333d2b36SAndroid Build Coastguard Worker desc: "if with interpolation", 613*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 614*333d2b36SAndroid Build Coastguard Worker in: ` 615*333d2b36SAndroid Build Coastguard Workerifeq ($(VARIABLE1)text$(VARIABLE2),true) 616*333d2b36SAndroid Build Coastguard Workerendif 617*333d2b36SAndroid Build Coastguard Worker`, 618*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 619*333d2b36SAndroid Build Coastguard Worker 620*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 621*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 622*333d2b36SAndroid Build Coastguard Worker if "%stext%s" % (g.get("VARIABLE1", ""), g.get("VARIABLE2", "")) == "true": 623*333d2b36SAndroid Build Coastguard Worker pass 624*333d2b36SAndroid Build Coastguard Worker`, 625*333d2b36SAndroid Build Coastguard Worker }, 626*333d2b36SAndroid Build Coastguard Worker { 627*333d2b36SAndroid Build Coastguard Worker desc: "ifneq $(X),true", 628*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 629*333d2b36SAndroid Build Coastguard Worker in: ` 630*333d2b36SAndroid Build Coastguard Workerifneq ($(VARIABLE),true) 631*333d2b36SAndroid Build Coastguard Workerendif 632*333d2b36SAndroid Build Coastguard Worker`, 633*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 634*333d2b36SAndroid Build Coastguard Worker 635*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 636*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 637*333d2b36SAndroid Build Coastguard Worker if g.get("VARIABLE", "") != "true": 638*333d2b36SAndroid Build Coastguard Worker pass 639*333d2b36SAndroid Build Coastguard Worker`, 640*333d2b36SAndroid Build Coastguard Worker }, 641*333d2b36SAndroid Build Coastguard Worker { 642*333d2b36SAndroid Build Coastguard Worker desc: "Const neq", 643*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 644*333d2b36SAndroid Build Coastguard Worker in: ` 645*333d2b36SAndroid Build Coastguard Workerifneq (1,0) 646*333d2b36SAndroid Build Coastguard Workerendif 647*333d2b36SAndroid Build Coastguard Worker`, 648*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 649*333d2b36SAndroid Build Coastguard Worker 650*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 651*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 652*333d2b36SAndroid Build Coastguard Worker if "1" != "0": 653*333d2b36SAndroid Build Coastguard Worker pass 654*333d2b36SAndroid Build Coastguard Worker`, 655*333d2b36SAndroid Build Coastguard Worker }, 656*333d2b36SAndroid Build Coastguard Worker { 657*333d2b36SAndroid Build Coastguard Worker desc: "is-board calls", 658*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 659*333d2b36SAndroid Build Coastguard Worker in: ` 660*333d2b36SAndroid Build Coastguard Workerifeq ($(call is-board-platform-in-list,msm8998), true) 661*333d2b36SAndroid Build Coastguard Workerelse ifneq ($(call is-board-platform,copper),true) 662*333d2b36SAndroid Build Coastguard Workerelse ifneq ($(call is-vendor-board-platform,QCOM),true) 663*333d2b36SAndroid Build Coastguard Workerelse ifeq ($(call is-product-in-list, $(PLATFORM_LIST)), true) 664*333d2b36SAndroid Build Coastguard Workerendif 665*333d2b36SAndroid Build Coastguard Worker`, 666*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 667*333d2b36SAndroid Build Coastguard Worker 668*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 669*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 670*333d2b36SAndroid Build Coastguard Worker if rblf.board_platform_in(g, "msm8998"): 671*333d2b36SAndroid Build Coastguard Worker pass 672*333d2b36SAndroid Build Coastguard Worker elif not rblf.board_platform_is(g, "copper"): 673*333d2b36SAndroid Build Coastguard Worker pass 674*333d2b36SAndroid Build Coastguard Worker elif g.get("TARGET_BOARD_PLATFORM", "") not in g.get("QCOM_BOARD_PLATFORMS", ""): 675*333d2b36SAndroid Build Coastguard Worker pass 676*333d2b36SAndroid Build Coastguard Worker elif g["TARGET_PRODUCT"] in g.get("PLATFORM_LIST", []): 677*333d2b36SAndroid Build Coastguard Worker pass 678*333d2b36SAndroid Build Coastguard Worker`, 679*333d2b36SAndroid Build Coastguard Worker }, 680*333d2b36SAndroid Build Coastguard Worker { 681*333d2b36SAndroid Build Coastguard Worker desc: "new is-board calls", 682*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 683*333d2b36SAndroid Build Coastguard Worker in: ` 684*333d2b36SAndroid Build Coastguard Workerifneq (,$(call is-board-platform-in-list2,msm8998 $(X)) 685*333d2b36SAndroid Build Coastguard Workerelse ifeq (,$(call is-board-platform2,copper) 686*333d2b36SAndroid Build Coastguard Workerelse ifneq (,$(call is-vendor-board-qcom)) 687*333d2b36SAndroid Build Coastguard Workerendif 688*333d2b36SAndroid Build Coastguard Worker`, 689*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 690*333d2b36SAndroid Build Coastguard Worker 691*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 692*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 693*333d2b36SAndroid Build Coastguard Worker if rblf.board_platform_in(g, "msm8998 %s" % g.get("X", "")): 694*333d2b36SAndroid Build Coastguard Worker pass 695*333d2b36SAndroid Build Coastguard Worker elif not rblf.board_platform_is(g, "copper"): 696*333d2b36SAndroid Build Coastguard Worker pass 697*333d2b36SAndroid Build Coastguard Worker elif g.get("TARGET_BOARD_PLATFORM", "") in g.get("QCOM_BOARD_PLATFORMS", ""): 698*333d2b36SAndroid Build Coastguard Worker pass 699*333d2b36SAndroid Build Coastguard Worker`, 700*333d2b36SAndroid Build Coastguard Worker }, 701*333d2b36SAndroid Build Coastguard Worker { 702*333d2b36SAndroid Build Coastguard Worker desc: "findstring call", 703*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 704*333d2b36SAndroid Build Coastguard Worker in: ` 705*333d2b36SAndroid Build Coastguard Workerresult := $(findstring a,a b c) 706*333d2b36SAndroid Build Coastguard Workerresult := $(findstring b,x y z) 707*333d2b36SAndroid Build Coastguard Worker`, 708*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 709*333d2b36SAndroid Build Coastguard Worker 710*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 711*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 712*333d2b36SAndroid Build Coastguard Worker _result = rblf.findstring("a", "a b c") 713*333d2b36SAndroid Build Coastguard Worker _result = rblf.findstring("b", "x y z") 714*333d2b36SAndroid Build Coastguard Worker`, 715*333d2b36SAndroid Build Coastguard Worker }, 716*333d2b36SAndroid Build Coastguard Worker { 717*333d2b36SAndroid Build Coastguard Worker desc: "findstring in if statement", 718*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 719*333d2b36SAndroid Build Coastguard Worker in: ` 720*333d2b36SAndroid Build Coastguard Workerifeq ($(findstring foo,$(PRODUCT_PACKAGES)),) 721*333d2b36SAndroid Build Coastguard Workerendif 722*333d2b36SAndroid Build Coastguard Workerifneq ($(findstring foo,$(PRODUCT_PACKAGES)),) 723*333d2b36SAndroid Build Coastguard Workerendif 724*333d2b36SAndroid Build Coastguard Workerifeq ($(findstring foo,$(PRODUCT_PACKAGES)),foo) 725*333d2b36SAndroid Build Coastguard Workerendif 726*333d2b36SAndroid Build Coastguard Workerifneq ($(findstring foo,$(PRODUCT_PACKAGES)),foo) 727*333d2b36SAndroid Build Coastguard Workerendif 728*333d2b36SAndroid Build Coastguard Worker`, 729*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 730*333d2b36SAndroid Build Coastguard Worker 731*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 732*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 733*333d2b36SAndroid Build Coastguard Worker if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") == -1: 734*333d2b36SAndroid Build Coastguard Worker pass 735*333d2b36SAndroid Build Coastguard Worker if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1: 736*333d2b36SAndroid Build Coastguard Worker pass 737*333d2b36SAndroid Build Coastguard Worker if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1: 738*333d2b36SAndroid Build Coastguard Worker pass 739*333d2b36SAndroid Build Coastguard Worker if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") == -1: 740*333d2b36SAndroid Build Coastguard Worker pass 741*333d2b36SAndroid Build Coastguard Worker`, 742*333d2b36SAndroid Build Coastguard Worker }, 743*333d2b36SAndroid Build Coastguard Worker { 744*333d2b36SAndroid Build Coastguard Worker desc: "rhs call", 745*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 746*333d2b36SAndroid Build Coastguard Worker in: ` 747*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES = $(call add-to-product-copy-files-if-exists, path:distpath) \ 748*333d2b36SAndroid Build Coastguard Worker $(call find-copy-subdir-files, *, fromdir, todir) $(wildcard foo.*) 749*333d2b36SAndroid Build Coastguard Worker`, 750*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 751*333d2b36SAndroid Build Coastguard Worker 752*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 753*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 754*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = (rblf.copy_if_exists("path:distpath") + 755*333d2b36SAndroid Build Coastguard Worker rblf.find_and_copy("*", "fromdir", "todir") + 756*333d2b36SAndroid Build Coastguard Worker rblf.expand_wildcard("foo.*")) 757*333d2b36SAndroid Build Coastguard Worker`, 758*333d2b36SAndroid Build Coastguard Worker }, 759*333d2b36SAndroid Build Coastguard Worker { 760*333d2b36SAndroid Build Coastguard Worker desc: "inferred type", 761*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 762*333d2b36SAndroid Build Coastguard Worker in: ` 763*333d2b36SAndroid Build Coastguard WorkerHIKEY_MODS := $(wildcard foo/*.ko) 764*333d2b36SAndroid Build Coastguard WorkerBOARD_VENDOR_KERNEL_MODULES += $(HIKEY_MODS) 765*333d2b36SAndroid Build Coastguard Worker`, 766*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 767*333d2b36SAndroid Build Coastguard Worker 768*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 769*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 770*333d2b36SAndroid Build Coastguard Worker g["HIKEY_MODS"] = rblf.expand_wildcard("foo/*.ko") 771*333d2b36SAndroid Build Coastguard Worker g.setdefault("BOARD_VENDOR_KERNEL_MODULES", []) 772*333d2b36SAndroid Build Coastguard Worker g["BOARD_VENDOR_KERNEL_MODULES"] += g["HIKEY_MODS"] 773*333d2b36SAndroid Build Coastguard Worker`, 774*333d2b36SAndroid Build Coastguard Worker }, 775*333d2b36SAndroid Build Coastguard Worker { 776*333d2b36SAndroid Build Coastguard Worker desc: "list with vars", 777*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 778*333d2b36SAndroid Build Coastguard Worker in: ` 779*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES += path1:$(TARGET_PRODUCT)/path1 $(PRODUCT_MODEL)/path2:$(TARGET_PRODUCT)/path2 780*333d2b36SAndroid Build Coastguard Worker`, 781*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 782*333d2b36SAndroid Build Coastguard Worker 783*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 784*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 785*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_COPY_FILES") 786*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] += (("path1:%s/path1" % g["TARGET_PRODUCT"]).split() + 787*333d2b36SAndroid Build Coastguard Worker ("%s/path2:%s/path2" % (cfg.get("PRODUCT_MODEL", ""), g["TARGET_PRODUCT"])).split()) 788*333d2b36SAndroid Build Coastguard Worker`, 789*333d2b36SAndroid Build Coastguard Worker }, 790*333d2b36SAndroid Build Coastguard Worker { 791*333d2b36SAndroid Build Coastguard Worker desc: "misc calls", 792*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 793*333d2b36SAndroid Build Coastguard Worker in: ` 794*333d2b36SAndroid Build Coastguard Worker$(call enforce-product-packages-exist,) 795*333d2b36SAndroid Build Coastguard Worker$(call enforce-product-packages-exist, foo) 796*333d2b36SAndroid Build Coastguard Worker$(call require-artifacts-in-path, foo, bar) 797*333d2b36SAndroid Build Coastguard Worker$(call require-artifacts-in-path-relaxed, foo, bar) 798*333d2b36SAndroid Build Coastguard Worker$(call dist-for-goals, goal, from:to) 799*333d2b36SAndroid Build Coastguard Worker$(call add-product-dex-preopt-module-config,MyModule,disable) 800*333d2b36SAndroid Build Coastguard Worker`, 801*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 802*333d2b36SAndroid Build Coastguard Worker 803*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 804*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 805*333d2b36SAndroid Build Coastguard Worker rblf.enforce_product_packages_exist(handle, "") 806*333d2b36SAndroid Build Coastguard Worker rblf.enforce_product_packages_exist(handle, "foo") 807*333d2b36SAndroid Build Coastguard Worker rblf.require_artifacts_in_path(handle, "foo", "bar") 808*333d2b36SAndroid Build Coastguard Worker rblf.require_artifacts_in_path_relaxed(handle, "foo", "bar") 809*333d2b36SAndroid Build Coastguard Worker rblf.mkdist_for_goals(g, "goal", "from:to") 810*333d2b36SAndroid Build Coastguard Worker rblf.add_product_dex_preopt_module_config(handle, "MyModule", "disable") 811*333d2b36SAndroid Build Coastguard Worker`, 812*333d2b36SAndroid Build Coastguard Worker }, 813*333d2b36SAndroid Build Coastguard Worker { 814*333d2b36SAndroid Build Coastguard Worker desc: "list with functions", 815*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 816*333d2b36SAndroid Build Coastguard Worker in: ` 817*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES := $(call find-copy-subdir-files,*.kl,from1,to1) \ 818*333d2b36SAndroid Build Coastguard Worker $(call find-copy-subdir-files,*.kc,from2,to2) \ 819*333d2b36SAndroid Build Coastguard Worker foo bar 820*333d2b36SAndroid Build Coastguard Worker`, 821*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 822*333d2b36SAndroid Build Coastguard Worker 823*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 824*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 825*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = (rblf.find_and_copy("*.kl", "from1", "to1") + 826*333d2b36SAndroid Build Coastguard Worker rblf.find_and_copy("*.kc", "from2", "to2") + 827*333d2b36SAndroid Build Coastguard Worker [ 828*333d2b36SAndroid Build Coastguard Worker "foo", 829*333d2b36SAndroid Build Coastguard Worker "bar", 830*333d2b36SAndroid Build Coastguard Worker ]) 831*333d2b36SAndroid Build Coastguard Worker`, 832*333d2b36SAndroid Build Coastguard Worker }, 833*333d2b36SAndroid Build Coastguard Worker { 834*333d2b36SAndroid Build Coastguard Worker desc: "Text functions", 835*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 836*333d2b36SAndroid Build Coastguard Worker in: ` 837*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES := $(addprefix pfx-,a b c) 838*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES := $(addsuffix .sff, a b c) 839*333d2b36SAndroid Build Coastguard WorkerPRODUCT_NAME := $(word 1, $(subst ., ,$(TARGET_BOARD_PLATFORM))) 840*333d2b36SAndroid Build Coastguard Workerifeq (1,$(words $(SOME_UNKNOWN_VARIABLE))) 841*333d2b36SAndroid Build Coastguard Workerendif 842*333d2b36SAndroid Build Coastguard Workerifeq ($(words $(SOME_OTHER_VARIABLE)),$(SOME_INT_VARIABLE)) 843*333d2b36SAndroid Build Coastguard Workerendif 844*333d2b36SAndroid Build Coastguard Worker$(info $(patsubst %.pub,$(PRODUCT_NAME)%,$(PRODUCT_ADB_KEYS))) 845*333d2b36SAndroid Build Coastguard Worker$(info $$(dir foo/bar): $(dir foo/bar)) 846*333d2b36SAndroid Build Coastguard Worker$(info $(firstword $(PRODUCT_COPY_FILES))) 847*333d2b36SAndroid Build Coastguard Worker$(info $(lastword $(PRODUCT_COPY_FILES))) 848*333d2b36SAndroid Build Coastguard Worker$(info $(dir $(lastword $(MAKEFILE_LIST)))) 849*333d2b36SAndroid Build Coastguard Worker$(info $(dir $(lastword $(PRODUCT_COPY_FILES)))) 850*333d2b36SAndroid Build Coastguard Worker$(info $(dir $(lastword $(foobar)))) 851*333d2b36SAndroid Build Coastguard Worker$(info $(abspath foo/bar)) 852*333d2b36SAndroid Build Coastguard Worker$(info $(notdir foo/bar)) 853*333d2b36SAndroid Build Coastguard Worker$(call add_soong_config_namespace,snsconfig) 854*333d2b36SAndroid Build Coastguard Worker$(call add_soong_config_var_value,snsconfig,imagetype,odm_image) 855*333d2b36SAndroid Build Coastguard Worker$(call soong_config_set, snsconfig, foo, foo_value) 856*333d2b36SAndroid Build Coastguard Worker$(call soong_config_set_bool, snsconfig, bar, true) 857*333d2b36SAndroid Build Coastguard Worker$(call soong_config_append, snsconfig, bar, bar_value) 858*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES := $(call copy-files,$(wildcard foo*.mk),etc) 859*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES := $(call product-copy-files-by-pattern,from/%,to/%,a b c) 860*333d2b36SAndroid Build Coastguard Worker`, 861*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 862*333d2b36SAndroid Build Coastguard Worker 863*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 864*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 865*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c") 866*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c") 867*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_NAME"] = rblf.words((g.get("TARGET_BOARD_PLATFORM", "")).replace(".", " "))[0] 868*333d2b36SAndroid Build Coastguard Worker if len(rblf.words(g.get("SOME_UNKNOWN_VARIABLE", ""))) == 1: 869*333d2b36SAndroid Build Coastguard Worker pass 870*333d2b36SAndroid Build Coastguard Worker if ("%d" % (len(rblf.words(g.get("SOME_OTHER_VARIABLE", ""))))) == g.get("SOME_INT_VARIABLE", ""): 871*333d2b36SAndroid Build Coastguard Worker pass 872*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.mkpatsubst("%.pub", "%s%%" % cfg["PRODUCT_NAME"], g.get("PRODUCT_ADB_KEYS", ""))) 873*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", "$(dir foo/bar): %s" % rblf.dir("foo/bar")) 874*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.first_word(cfg["PRODUCT_COPY_FILES"])) 875*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.last_word(cfg["PRODUCT_COPY_FILES"])) 876*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.dir(rblf.last_word("product.mk"))) 877*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.dir(rblf.last_word(cfg["PRODUCT_COPY_FILES"]))) 878*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.dir(rblf.last_word(_foobar))) 879*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.abspath("foo/bar")) 880*333d2b36SAndroid Build Coastguard Worker rblf.mkinfo("product.mk", rblf.notdir("foo/bar")) 881*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_namespace(g, "snsconfig") 882*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_set(g, "snsconfig", "imagetype", "odm_image") 883*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_set(g, "snsconfig", "foo", "foo_value") 884*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_set_bool(g, "snsconfig", "bar", "true") 885*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_append(g, "snsconfig", "bar", "bar_value") 886*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = rblf.copy_files(rblf.expand_wildcard("foo*.mk"), "etc") 887*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] = rblf.product_copy_files_by_pattern("from/%", "to/%", "a b c") 888*333d2b36SAndroid Build Coastguard Worker`, 889*333d2b36SAndroid Build Coastguard Worker }, 890*333d2b36SAndroid Build Coastguard Worker { 891*333d2b36SAndroid Build Coastguard Worker desc: "subst in list", 892*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 893*333d2b36SAndroid Build Coastguard Worker in: ` 894*333d2b36SAndroid Build Coastguard Workerfiles = $(call find-copy-subdir-files,*,from,to) 895*333d2b36SAndroid Build Coastguard WorkerPRODUCT_COPY_FILES += $(subst foo,bar,$(files)) 896*333d2b36SAndroid Build Coastguard Worker`, 897*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 898*333d2b36SAndroid Build Coastguard Worker 899*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 900*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 901*333d2b36SAndroid Build Coastguard Worker _files = rblf.find_and_copy("*", "from", "to") 902*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_COPY_FILES") 903*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] += rblf.mksubst("foo", "bar", _files) 904*333d2b36SAndroid Build Coastguard Worker`, 905*333d2b36SAndroid Build Coastguard Worker }, 906*333d2b36SAndroid Build Coastguard Worker { 907*333d2b36SAndroid Build Coastguard Worker desc: "assignment flavors", 908*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 909*333d2b36SAndroid Build Coastguard Worker in: ` 910*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 := a 911*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST2 += a 912*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 += b 913*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST2 += b 914*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST3 ?= a 915*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 = c 916*333d2b36SAndroid Build Coastguard WorkerPLATFORM_LIST += x 917*333d2b36SAndroid Build Coastguard WorkerPRODUCT_PACKAGES := $(PLATFORM_LIST) 918*333d2b36SAndroid Build Coastguard Worker`, 919*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 920*333d2b36SAndroid Build Coastguard Worker 921*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 922*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 923*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] = ["a"] 924*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_LIST2") 925*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST2"] += ["a"] 926*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] += ["b"] 927*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST2"] += ["b"] 928*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] = ["c"] 929*333d2b36SAndroid Build Coastguard Worker g.setdefault("PLATFORM_LIST", []) 930*333d2b36SAndroid Build Coastguard Worker g["PLATFORM_LIST"] += ["x"] 931*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = g["PLATFORM_LIST"][:] 932*333d2b36SAndroid Build Coastguard Worker`, 933*333d2b36SAndroid Build Coastguard Worker }, 934*333d2b36SAndroid Build Coastguard Worker { 935*333d2b36SAndroid Build Coastguard Worker desc: "assigment flavors2", 936*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 937*333d2b36SAndroid Build Coastguard Worker in: ` 938*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 = a 939*333d2b36SAndroid Build Coastguard Workerifeq (0,1) 940*333d2b36SAndroid Build Coastguard Worker PRODUCT_LIST1 += b 941*333d2b36SAndroid Build Coastguard Worker PRODUCT_LIST2 += b 942*333d2b36SAndroid Build Coastguard Workerendif 943*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 += c 944*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST2 += c 945*333d2b36SAndroid Build Coastguard Worker`, 946*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 947*333d2b36SAndroid Build Coastguard Worker 948*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 949*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 950*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] = ["a"] 951*333d2b36SAndroid Build Coastguard Worker if "0" == "1": 952*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] += ["b"] 953*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_LIST2") 954*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST2"] += ["b"] 955*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] += ["c"] 956*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_LIST2") 957*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST2"] += ["c"] 958*333d2b36SAndroid Build Coastguard Worker`, 959*333d2b36SAndroid Build Coastguard Worker }, 960*333d2b36SAndroid Build Coastguard Worker { 961*333d2b36SAndroid Build Coastguard Worker desc: "assigment setdefaults", 962*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 963*333d2b36SAndroid Build Coastguard Worker in: ` 964*333d2b36SAndroid Build Coastguard Worker# All of these should have a setdefault because they're self-referential and not defined before 965*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 = a $(PRODUCT_LIST1) 966*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST2 ?= a $(PRODUCT_LIST2) 967*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST3 += a 968*333d2b36SAndroid Build Coastguard Worker 969*333d2b36SAndroid Build Coastguard Worker# Now doing them again should not have a setdefault because they've already been set, except 2 970*333d2b36SAndroid Build Coastguard Worker# which did not emit an assignment before 971*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 = a $(PRODUCT_LIST1) 972*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST2 = a $(PRODUCT_LIST2) 973*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST3 += a 974*333d2b36SAndroid Build Coastguard Worker`, 975*333d2b36SAndroid Build Coastguard Worker expected: `# All of these should have a setdefault because they're self-referential and not defined before 976*333d2b36SAndroid Build Coastguard Workerload("//build/make/core:product_config.rbc", "rblf") 977*333d2b36SAndroid Build Coastguard Worker 978*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 979*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 980*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_LIST1") 981*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] = (["a"] + 982*333d2b36SAndroid Build Coastguard Worker cfg.get("PRODUCT_LIST1", [])) 983*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_LIST3") 984*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST3"] += ["a"] 985*333d2b36SAndroid Build Coastguard Worker # Now doing them again should not have a setdefault because they've already been set, except 2 986*333d2b36SAndroid Build Coastguard Worker # which did not emit an assignment before 987*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] = (["a"] + 988*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"]) 989*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_LIST2") 990*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST2"] = (["a"] + 991*333d2b36SAndroid Build Coastguard Worker cfg.get("PRODUCT_LIST2", [])) 992*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST3"] += ["a"] 993*333d2b36SAndroid Build Coastguard Worker`, 994*333d2b36SAndroid Build Coastguard Worker }, 995*333d2b36SAndroid Build Coastguard Worker { 996*333d2b36SAndroid Build Coastguard Worker desc: "soong namespace assignments", 997*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 998*333d2b36SAndroid Build Coastguard Worker in: ` 999*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_NAMESPACES += cvd 1000*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd += launch_configs 1001*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd_launch_configs = cvd_config_auto.json 1002*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd += grub_config 1003*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd_grub_config += grub.cfg 1004*333d2b36SAndroid Build Coastguard Workerx := $(SOONG_CONFIG_cvd_grub_config) 1005*333d2b36SAndroid Build Coastguard Worker`, 1006*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1007*333d2b36SAndroid Build Coastguard Worker 1008*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1009*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1010*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_namespace(g, "cvd") 1011*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_set(g, "cvd", "launch_configs", "cvd_config_auto.json") 1012*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_append(g, "cvd", "grub_config", "grub.cfg") 1013*333d2b36SAndroid Build Coastguard Worker _x = rblf.mk2rbc_error("product.mk:7", "SOONG_CONFIG_ variables cannot be referenced, use soong_config_get instead: SOONG_CONFIG_cvd_grub_config") 1014*333d2b36SAndroid Build Coastguard Worker`, 1015*333d2b36SAndroid Build Coastguard Worker }, { 1016*333d2b36SAndroid Build Coastguard Worker desc: "soong namespace accesses", 1017*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1018*333d2b36SAndroid Build Coastguard Worker in: ` 1019*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_NAMESPACES += cvd 1020*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd += launch_configs 1021*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd_launch_configs = cvd_config_auto.json 1022*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd += grub_config 1023*333d2b36SAndroid Build Coastguard WorkerSOONG_CONFIG_cvd_grub_config += grub.cfg 1024*333d2b36SAndroid Build Coastguard Workerx := $(call soong_config_get,cvd,grub_config) 1025*333d2b36SAndroid Build Coastguard Worker`, 1026*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1027*333d2b36SAndroid Build Coastguard Worker 1028*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1029*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1030*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_namespace(g, "cvd") 1031*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_set(g, "cvd", "launch_configs", "cvd_config_auto.json") 1032*333d2b36SAndroid Build Coastguard Worker rblf.soong_config_append(g, "cvd", "grub_config", "grub.cfg") 1033*333d2b36SAndroid Build Coastguard Worker _x = rblf.soong_config_get(g, "cvd", "grub_config") 1034*333d2b36SAndroid Build Coastguard Worker`, 1035*333d2b36SAndroid Build Coastguard Worker }, 1036*333d2b36SAndroid Build Coastguard Worker { 1037*333d2b36SAndroid Build Coastguard Worker desc: "string split", 1038*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1039*333d2b36SAndroid Build Coastguard Worker in: ` 1040*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 = a 1041*333d2b36SAndroid Build Coastguard Workerlocal = b 1042*333d2b36SAndroid Build Coastguard Workerlocal += c 1043*333d2b36SAndroid Build Coastguard WorkerFOO = d 1044*333d2b36SAndroid Build Coastguard WorkerFOO += e 1045*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 += $(local) 1046*333d2b36SAndroid Build Coastguard WorkerPRODUCT_LIST1 += $(FOO) 1047*333d2b36SAndroid Build Coastguard Worker`, 1048*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1049*333d2b36SAndroid Build Coastguard Worker 1050*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1051*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1052*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] = ["a"] 1053*333d2b36SAndroid Build Coastguard Worker _local = "b" 1054*333d2b36SAndroid Build Coastguard Worker _local += " " + "c" 1055*333d2b36SAndroid Build Coastguard Worker g["FOO"] = "d" 1056*333d2b36SAndroid Build Coastguard Worker g["FOO"] += " " + "e" 1057*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] += (_local).split() 1058*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_LIST1"] += (g["FOO"]).split() 1059*333d2b36SAndroid Build Coastguard Worker`, 1060*333d2b36SAndroid Build Coastguard Worker }, 1061*333d2b36SAndroid Build Coastguard Worker { 1062*333d2b36SAndroid Build Coastguard Worker desc: "apex_jars", 1063*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1064*333d2b36SAndroid Build Coastguard Worker in: ` 1065*333d2b36SAndroid Build Coastguard WorkerPRODUCT_BOOT_JARS := $(ART_APEX_JARS) framework-minus-apex 1066*333d2b36SAndroid Build Coastguard Worker`, 1067*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1068*333d2b36SAndroid Build Coastguard Worker 1069*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1070*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1071*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_BOOT_JARS"] = (g.get("ART_APEX_JARS", []) + 1072*333d2b36SAndroid Build Coastguard Worker ["framework-minus-apex"]) 1073*333d2b36SAndroid Build Coastguard Worker`, 1074*333d2b36SAndroid Build Coastguard Worker }, 1075*333d2b36SAndroid Build Coastguard Worker { 1076*333d2b36SAndroid Build Coastguard Worker desc: "strip/sort functions", 1077*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1078*333d2b36SAndroid Build Coastguard Worker in: ` 1079*333d2b36SAndroid Build Coastguard Workerifeq ($(filter hwaddress,$(PRODUCT_PACKAGES)),) 1080*333d2b36SAndroid Build Coastguard Worker PRODUCT_PACKAGES := $(strip $(PRODUCT_PACKAGES) hwaddress) 1081*333d2b36SAndroid Build Coastguard Workerendif 1082*333d2b36SAndroid Build Coastguard WorkerMY_VAR := $(sort b a c) 1083*333d2b36SAndroid Build Coastguard Worker`, 1084*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1085*333d2b36SAndroid Build Coastguard Worker 1086*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1087*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1088*333d2b36SAndroid Build Coastguard Worker if "hwaddress" not in cfg.get("PRODUCT_PACKAGES", []): 1089*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_PACKAGES") 1090*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_PACKAGES"] = (rblf.mkstrip("%s hwaddress" % " ".join(cfg.get("PRODUCT_PACKAGES", [])))).split() 1091*333d2b36SAndroid Build Coastguard Worker g["MY_VAR"] = rblf.mksort("b a c") 1092*333d2b36SAndroid Build Coastguard Worker`, 1093*333d2b36SAndroid Build Coastguard Worker }, 1094*333d2b36SAndroid Build Coastguard Worker { 1095*333d2b36SAndroid Build Coastguard Worker desc: "strip func in condition", 1096*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1097*333d2b36SAndroid Build Coastguard Worker in: ` 1098*333d2b36SAndroid Build Coastguard Workerifneq ($(strip $(TARGET_VENDOR)),) 1099*333d2b36SAndroid Build Coastguard Workerendif 1100*333d2b36SAndroid Build Coastguard Worker`, 1101*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1102*333d2b36SAndroid Build Coastguard Worker 1103*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1104*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1105*333d2b36SAndroid Build Coastguard Worker if rblf.mkstrip(g.get("TARGET_VENDOR", "")): 1106*333d2b36SAndroid Build Coastguard Worker pass 1107*333d2b36SAndroid Build Coastguard Worker`, 1108*333d2b36SAndroid Build Coastguard Worker }, 1109*333d2b36SAndroid Build Coastguard Worker { 1110*333d2b36SAndroid Build Coastguard Worker desc: "ref after set", 1111*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1112*333d2b36SAndroid Build Coastguard Worker in: ` 1113*333d2b36SAndroid Build Coastguard WorkerPRODUCT_ADB_KEYS:=value 1114*333d2b36SAndroid Build Coastguard WorkerFOO := $(PRODUCT_ADB_KEYS) 1115*333d2b36SAndroid Build Coastguard Workerifneq (,$(PRODUCT_ADB_KEYS)) 1116*333d2b36SAndroid Build Coastguard Workerendif 1117*333d2b36SAndroid Build Coastguard Worker`, 1118*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1119*333d2b36SAndroid Build Coastguard Worker 1120*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1121*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1122*333d2b36SAndroid Build Coastguard Worker g["PRODUCT_ADB_KEYS"] = "value" 1123*333d2b36SAndroid Build Coastguard Worker g["FOO"] = g["PRODUCT_ADB_KEYS"] 1124*333d2b36SAndroid Build Coastguard Worker if g["PRODUCT_ADB_KEYS"]: 1125*333d2b36SAndroid Build Coastguard Worker pass 1126*333d2b36SAndroid Build Coastguard Worker`, 1127*333d2b36SAndroid Build Coastguard Worker }, 1128*333d2b36SAndroid Build Coastguard Worker { 1129*333d2b36SAndroid Build Coastguard Worker desc: "ref before set", 1130*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1131*333d2b36SAndroid Build Coastguard Worker in: ` 1132*333d2b36SAndroid Build Coastguard WorkerV1 := $(PRODUCT_ADB_KEYS) 1133*333d2b36SAndroid Build Coastguard Workerifeq (,$(PRODUCT_ADB_KEYS)) 1134*333d2b36SAndroid Build Coastguard Worker V2 := $(PRODUCT_ADB_KEYS) 1135*333d2b36SAndroid Build Coastguard Worker PRODUCT_ADB_KEYS:=foo 1136*333d2b36SAndroid Build Coastguard Worker V3 := $(PRODUCT_ADB_KEYS) 1137*333d2b36SAndroid Build Coastguard Workerendif`, 1138*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1139*333d2b36SAndroid Build Coastguard Worker 1140*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1141*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1142*333d2b36SAndroid Build Coastguard Worker g["V1"] = g.get("PRODUCT_ADB_KEYS", "") 1143*333d2b36SAndroid Build Coastguard Worker if not g.get("PRODUCT_ADB_KEYS", ""): 1144*333d2b36SAndroid Build Coastguard Worker g["V2"] = g.get("PRODUCT_ADB_KEYS", "") 1145*333d2b36SAndroid Build Coastguard Worker g["PRODUCT_ADB_KEYS"] = "foo" 1146*333d2b36SAndroid Build Coastguard Worker g["V3"] = g["PRODUCT_ADB_KEYS"] 1147*333d2b36SAndroid Build Coastguard Worker`, 1148*333d2b36SAndroid Build Coastguard Worker }, 1149*333d2b36SAndroid Build Coastguard Worker { 1150*333d2b36SAndroid Build Coastguard Worker desc: "Dynamic inherit path", 1151*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1152*333d2b36SAndroid Build Coastguard Worker in: ` 1153*333d2b36SAndroid Build Coastguard WorkerMY_PATH:=foo 1154*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,vendor/$(MY_PATH)/cfg.mk) 1155*333d2b36SAndroid Build Coastguard Worker`, 1156*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1157*333d2b36SAndroid Build Coastguard Workerload("//vendor/foo1:cfg.star|init", _cfg_init = "init") 1158*333d2b36SAndroid Build Coastguard Workerload("//vendor/bar/baz:cfg.star|init", _cfg1_init = "init") 1159*333d2b36SAndroid Build Coastguard Worker 1160*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1161*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1162*333d2b36SAndroid Build Coastguard Worker g["MY_PATH"] = "foo" 1163*333d2b36SAndroid Build Coastguard Worker _entry = { 1164*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1165*333d2b36SAndroid Build Coastguard Worker "vendor/bar/baz/cfg.mk": ("vendor/bar/baz/cfg", _cfg1_init), 1166*333d2b36SAndroid Build Coastguard Worker }.get("vendor/%s/cfg.mk" % g["MY_PATH"]) 1167*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1168*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1169*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("vendor/%s/cfg.mk" % g["MY_PATH"])) 1170*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1171*333d2b36SAndroid Build Coastguard Worker`, 1172*333d2b36SAndroid Build Coastguard Worker }, 1173*333d2b36SAndroid Build Coastguard Worker { 1174*333d2b36SAndroid Build Coastguard Worker desc: "Dynamic inherit with hint", 1175*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1176*333d2b36SAndroid Build Coastguard Worker in: ` 1177*333d2b36SAndroid Build Coastguard WorkerMY_PATH:=foo 1178*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1179*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_PATH)/cfg.mk) 1180*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1181*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_OTHER_PATH)) 1182*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1183*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,vendor/$(MY_OTHER_PATH)) 1184*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1185*333d2b36SAndroid Build Coastguard Worker$(foreach f,$(MY_MAKEFILES), \ 1186*333d2b36SAndroid Build Coastguard Worker $(call inherit-product,$(f))) 1187*333d2b36SAndroid Build Coastguard Worker`, 1188*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1189*333d2b36SAndroid Build Coastguard Workerload("//vendor/foo1:cfg.star|init", _cfg_init = "init") 1190*333d2b36SAndroid Build Coastguard Worker 1191*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1192*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1193*333d2b36SAndroid Build Coastguard Worker g["MY_PATH"] = "foo" 1194*333d2b36SAndroid Build Coastguard Worker _entry = { 1195*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1196*333d2b36SAndroid Build Coastguard Worker }.get("%s/cfg.mk" % g["MY_PATH"]) 1197*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1198*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1199*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("%s/cfg.mk" % g["MY_PATH"])) 1200*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1201*333d2b36SAndroid Build Coastguard Worker _entry = { 1202*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1203*333d2b36SAndroid Build Coastguard Worker }.get(g.get("MY_OTHER_PATH", "")) 1204*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1205*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1206*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % (g.get("MY_OTHER_PATH", ""))) 1207*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1208*333d2b36SAndroid Build Coastguard Worker _entry = { 1209*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1210*333d2b36SAndroid Build Coastguard Worker }.get("vendor/%s" % g.get("MY_OTHER_PATH", "")) 1211*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1212*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1213*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("vendor/%s" % g.get("MY_OTHER_PATH", ""))) 1214*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1215*333d2b36SAndroid Build Coastguard Worker for f in rblf.words(g.get("MY_MAKEFILES", "")): 1216*333d2b36SAndroid Build Coastguard Worker _entry = { 1217*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1218*333d2b36SAndroid Build Coastguard Worker }.get(f) 1219*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1220*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1221*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % (f)) 1222*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1223*333d2b36SAndroid Build Coastguard Worker`, 1224*333d2b36SAndroid Build Coastguard Worker }, 1225*333d2b36SAndroid Build Coastguard Worker { 1226*333d2b36SAndroid Build Coastguard Worker desc: "Dynamic inherit with duplicated hint", 1227*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1228*333d2b36SAndroid Build Coastguard Worker in: ` 1229*333d2b36SAndroid Build Coastguard WorkerMY_PATH:=foo 1230*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1231*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_PATH)/cfg.mk) 1232*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1233*333d2b36SAndroid Build Coastguard Worker#RBC# include_top vendor/foo1 1234*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_PATH)/cfg.mk) 1235*333d2b36SAndroid Build Coastguard Worker`, 1236*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1237*333d2b36SAndroid Build Coastguard Workerload("//vendor/foo1:cfg.star|init", _cfg_init = "init") 1238*333d2b36SAndroid Build Coastguard Worker 1239*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1240*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1241*333d2b36SAndroid Build Coastguard Worker g["MY_PATH"] = "foo" 1242*333d2b36SAndroid Build Coastguard Worker _entry = { 1243*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1244*333d2b36SAndroid Build Coastguard Worker }.get("%s/cfg.mk" % g["MY_PATH"]) 1245*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1246*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1247*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("%s/cfg.mk" % g["MY_PATH"])) 1248*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1249*333d2b36SAndroid Build Coastguard Worker _entry = { 1250*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk": ("vendor/foo1/cfg", _cfg_init), 1251*333d2b36SAndroid Build Coastguard Worker }.get("%s/cfg.mk" % g["MY_PATH"]) 1252*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1253*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1254*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("%s/cfg.mk" % g["MY_PATH"])) 1255*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1256*333d2b36SAndroid Build Coastguard Worker`, 1257*333d2b36SAndroid Build Coastguard Worker }, 1258*333d2b36SAndroid Build Coastguard Worker { 1259*333d2b36SAndroid Build Coastguard Worker desc: "Dynamic inherit path that lacks hint", 1260*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1261*333d2b36SAndroid Build Coastguard Worker in: ` 1262*333d2b36SAndroid Build Coastguard Worker#RBC# include_top foo 1263*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_VAR)/font.mk) 1264*333d2b36SAndroid Build Coastguard Worker 1265*333d2b36SAndroid Build Coastguard Worker#RBC# include_top foo 1266*333d2b36SAndroid Build Coastguard Worker 1267*333d2b36SAndroid Build Coastguard Worker# There's some space and even this comment between the include_top and the inherit-product 1268*333d2b36SAndroid Build Coastguard Worker 1269*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_VAR)/font.mk) 1270*333d2b36SAndroid Build Coastguard Worker 1271*333d2b36SAndroid Build Coastguard Worker$(call inherit-product,$(MY_VAR)/font.mk) 1272*333d2b36SAndroid Build Coastguard Worker`, 1273*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1274*333d2b36SAndroid Build Coastguard Workerload("//foo:font.star|init", _font_init = "init") 1275*333d2b36SAndroid Build Coastguard Workerload("//bar:font.star|init", _font1_init = "init") 1276*333d2b36SAndroid Build Coastguard Worker 1277*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1278*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1279*333d2b36SAndroid Build Coastguard Worker _entry = { 1280*333d2b36SAndroid Build Coastguard Worker "foo/font.mk": ("foo/font", _font_init), 1281*333d2b36SAndroid Build Coastguard Worker }.get("%s/font.mk" % g.get("MY_VAR", "")) 1282*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1283*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1284*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("%s/font.mk" % g.get("MY_VAR", ""))) 1285*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1286*333d2b36SAndroid Build Coastguard Worker # There's some space and even this comment between the include_top and the inherit-product 1287*333d2b36SAndroid Build Coastguard Worker _entry = { 1288*333d2b36SAndroid Build Coastguard Worker "foo/font.mk": ("foo/font", _font_init), 1289*333d2b36SAndroid Build Coastguard Worker }.get("%s/font.mk" % g.get("MY_VAR", "")) 1290*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1291*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1292*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("%s/font.mk" % g.get("MY_VAR", ""))) 1293*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1294*333d2b36SAndroid Build Coastguard Worker rblf.mkwarning("product.mk:11", "Please avoid starting an include path with a variable. See https://source.android.com/setup/build/bazel/product_config/issues/includes for details.") 1295*333d2b36SAndroid Build Coastguard Worker _entry = { 1296*333d2b36SAndroid Build Coastguard Worker "foo/font.mk": ("foo/font", _font_init), 1297*333d2b36SAndroid Build Coastguard Worker "bar/font.mk": ("bar/font", _font1_init), 1298*333d2b36SAndroid Build Coastguard Worker }.get("%s/font.mk" % g.get("MY_VAR", "")) 1299*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1300*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1301*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("%s/font.mk" % g.get("MY_VAR", ""))) 1302*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, _varmod, _varmod_init) 1303*333d2b36SAndroid Build Coastguard Worker`, 1304*333d2b36SAndroid Build Coastguard Worker }, 1305*333d2b36SAndroid Build Coastguard Worker { 1306*333d2b36SAndroid Build Coastguard Worker desc: "Ignore make rules", 1307*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1308*333d2b36SAndroid Build Coastguard Worker in: ` 1309*333d2b36SAndroid Build Coastguard Workerfoo: PRIVATE_VARIABLE = some_tool $< $@ 1310*333d2b36SAndroid Build Coastguard Workerfoo: foo.c 1311*333d2b36SAndroid Build Coastguard Worker gcc -o $@ $*`, 1312*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1313*333d2b36SAndroid Build Coastguard Worker 1314*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1315*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1316*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:2", "Only simple variables are handled") 1317*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:3", "unsupported line rule: foo: foo.c\n#gcc -o $@ $*") 1318*333d2b36SAndroid Build Coastguard Worker`, 1319*333d2b36SAndroid Build Coastguard Worker }, 1320*333d2b36SAndroid Build Coastguard Worker { 1321*333d2b36SAndroid Build Coastguard Worker desc: "Flag override", 1322*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1323*333d2b36SAndroid Build Coastguard Worker in: ` 1324*333d2b36SAndroid Build Coastguard Workeroverride FOO:=`, 1325*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1326*333d2b36SAndroid Build Coastguard Worker 1327*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1328*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1329*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:2", "cannot handle override directive") 1330*333d2b36SAndroid Build Coastguard Worker`, 1331*333d2b36SAndroid Build Coastguard Worker }, 1332*333d2b36SAndroid Build Coastguard Worker { 1333*333d2b36SAndroid Build Coastguard Worker desc: "Bad expression", 1334*333d2b36SAndroid Build Coastguard Worker mkname: "build/product.mk", 1335*333d2b36SAndroid Build Coastguard Worker in: ` 1336*333d2b36SAndroid Build Coastguard Workerifeq (,$(call foobar)) 1337*333d2b36SAndroid Build Coastguard Workerendif 1338*333d2b36SAndroid Build Coastguard Workermy_sources := $(local-generated-sources-dir) 1339*333d2b36SAndroid Build Coastguard Worker`, 1340*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1341*333d2b36SAndroid Build Coastguard Worker 1342*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1343*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1344*333d2b36SAndroid Build Coastguard Worker if rblf.mk2rbc_error("build/product.mk:2", "cannot handle invoking foobar"): 1345*333d2b36SAndroid Build Coastguard Worker pass 1346*333d2b36SAndroid Build Coastguard Worker _my_sources = rblf.mk2rbc_error("build/product.mk:4", "local-generated-sources-dir is not supported") 1347*333d2b36SAndroid Build Coastguard Worker`, 1348*333d2b36SAndroid Build Coastguard Worker }, 1349*333d2b36SAndroid Build Coastguard Worker { 1350*333d2b36SAndroid Build Coastguard Worker desc: "if expression", 1351*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1352*333d2b36SAndroid Build Coastguard Worker in: ` 1353*333d2b36SAndroid Build Coastguard WorkerTEST_VAR := foo 1354*333d2b36SAndroid Build Coastguard WorkerTEST_VAR_LIST := foo 1355*333d2b36SAndroid Build Coastguard WorkerTEST_VAR_LIST += bar 1356*333d2b36SAndroid Build Coastguard WorkerTEST_VAR_2 := $(if $(TEST_VAR),bar) 1357*333d2b36SAndroid Build Coastguard WorkerTEST_VAR_3 := $(if $(TEST_VAR),bar,baz) 1358*333d2b36SAndroid Build Coastguard WorkerTEST_VAR_4 := $(if $(TEST_VAR),$(TEST_VAR_LIST)) 1359*333d2b36SAndroid Build Coastguard Worker`, 1360*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1361*333d2b36SAndroid Build Coastguard Worker 1362*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1363*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1364*333d2b36SAndroid Build Coastguard Worker g["TEST_VAR"] = "foo" 1365*333d2b36SAndroid Build Coastguard Worker g["TEST_VAR_LIST"] = ["foo"] 1366*333d2b36SAndroid Build Coastguard Worker g["TEST_VAR_LIST"] += ["bar"] 1367*333d2b36SAndroid Build Coastguard Worker g["TEST_VAR_2"] = ("bar" if g["TEST_VAR"] else "") 1368*333d2b36SAndroid Build Coastguard Worker g["TEST_VAR_3"] = ("bar" if g["TEST_VAR"] else "baz") 1369*333d2b36SAndroid Build Coastguard Worker g["TEST_VAR_4"] = (g["TEST_VAR_LIST"] if g["TEST_VAR"] else []) 1370*333d2b36SAndroid Build Coastguard Worker`, 1371*333d2b36SAndroid Build Coastguard Worker }, 1372*333d2b36SAndroid Build Coastguard Worker { 1373*333d2b36SAndroid Build Coastguard Worker desc: "substitution references", 1374*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1375*333d2b36SAndroid Build Coastguard Worker in: ` 1376*333d2b36SAndroid Build Coastguard WorkerSOURCES := foo.c bar.c 1377*333d2b36SAndroid Build Coastguard WorkerOBJECTS := $(SOURCES:.c=.o) 1378*333d2b36SAndroid Build Coastguard WorkerOBJECTS2 := $(SOURCES:%.c=%.o) 1379*333d2b36SAndroid Build Coastguard Worker`, 1380*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1381*333d2b36SAndroid Build Coastguard Worker 1382*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1383*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1384*333d2b36SAndroid Build Coastguard Worker g["SOURCES"] = "foo.c bar.c" 1385*333d2b36SAndroid Build Coastguard Worker g["OBJECTS"] = rblf.mkpatsubst("%.c", "%.o", g["SOURCES"]) 1386*333d2b36SAndroid Build Coastguard Worker g["OBJECTS2"] = rblf.mkpatsubst("%.c", "%.o", g["SOURCES"]) 1387*333d2b36SAndroid Build Coastguard Worker`, 1388*333d2b36SAndroid Build Coastguard Worker }, 1389*333d2b36SAndroid Build Coastguard Worker { 1390*333d2b36SAndroid Build Coastguard Worker desc: "foreach expressions", 1391*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1392*333d2b36SAndroid Build Coastguard Worker in: ` 1393*333d2b36SAndroid Build Coastguard WorkerBOOT_KERNEL_MODULES := foo.ko bar.ko 1394*333d2b36SAndroid Build Coastguard WorkerBOOT_KERNEL_MODULES_FILTER := $(foreach m,$(BOOT_KERNEL_MODULES),%/$(m)) 1395*333d2b36SAndroid Build Coastguard WorkerBOOT_KERNEL_MODULES_LIST := foo.ko 1396*333d2b36SAndroid Build Coastguard WorkerBOOT_KERNEL_MODULES_LIST += bar.ko 1397*333d2b36SAndroid Build Coastguard WorkerBOOT_KERNEL_MODULES_FILTER_2 := $(foreach m,$(BOOT_KERNEL_MODULES_LIST),%/$(m)) 1398*333d2b36SAndroid Build Coastguard WorkerNESTED_LISTS := $(foreach m,$(SOME_VAR),$(BOOT_KERNEL_MODULES_LIST)) 1399*333d2b36SAndroid Build Coastguard WorkerNESTED_LISTS_2 := $(foreach x,$(SOME_VAR),$(foreach y,$(x),prefix$(y))) 1400*333d2b36SAndroid Build Coastguard Worker 1401*333d2b36SAndroid Build Coastguard WorkerFOREACH_WITH_IF := $(foreach module,\ 1402*333d2b36SAndroid Build Coastguard Worker $(BOOT_KERNEL_MODULES_LIST),\ 1403*333d2b36SAndroid Build Coastguard Worker $(if $(filter $(module),foo.ko),,$(error module "$(module)" has an error!))) 1404*333d2b36SAndroid Build Coastguard Worker 1405*333d2b36SAndroid Build Coastguard Worker# Same as above, but not assigning it to a variable allows it to be converted to statements 1406*333d2b36SAndroid Build Coastguard Worker$(foreach module,\ 1407*333d2b36SAndroid Build Coastguard Worker $(BOOT_KERNEL_MODULES_LIST),\ 1408*333d2b36SAndroid Build Coastguard Worker $(if $(filter $(module),foo.ko),,$(error module "$(module)" has an error!))) 1409*333d2b36SAndroid Build Coastguard Worker`, 1410*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1413*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1414*333d2b36SAndroid Build Coastguard Worker g["BOOT_KERNEL_MODULES"] = "foo.ko bar.ko" 1415*333d2b36SAndroid Build Coastguard Worker g["BOOT_KERNEL_MODULES_FILTER"] = ["%%/%s" % m for m in rblf.words(g["BOOT_KERNEL_MODULES"])] 1416*333d2b36SAndroid Build Coastguard Worker g["BOOT_KERNEL_MODULES_LIST"] = ["foo.ko"] 1417*333d2b36SAndroid Build Coastguard Worker g["BOOT_KERNEL_MODULES_LIST"] += ["bar.ko"] 1418*333d2b36SAndroid Build Coastguard Worker g["BOOT_KERNEL_MODULES_FILTER_2"] = ["%%/%s" % m for m in g["BOOT_KERNEL_MODULES_LIST"]] 1419*333d2b36SAndroid Build Coastguard Worker g["NESTED_LISTS"] = rblf.flatten_2d_list([g["BOOT_KERNEL_MODULES_LIST"] for m in rblf.words(g.get("SOME_VAR", ""))]) 1420*333d2b36SAndroid Build Coastguard Worker g["NESTED_LISTS_2"] = rblf.flatten_2d_list([["prefix%s" % y for y in rblf.words(x)] for x in rblf.words(g.get("SOME_VAR", ""))]) 1421*333d2b36SAndroid Build Coastguard Worker g["FOREACH_WITH_IF"] = [("" if rblf.filter(module, "foo.ko") else rblf.mkerror("product.mk", "module \"%s\" has an error!" % module)) for module in g["BOOT_KERNEL_MODULES_LIST"]] 1422*333d2b36SAndroid Build Coastguard Worker # Same as above, but not assigning it to a variable allows it to be converted to statements 1423*333d2b36SAndroid Build Coastguard Worker for module in g["BOOT_KERNEL_MODULES_LIST"]: 1424*333d2b36SAndroid Build Coastguard Worker if not rblf.filter(module, "foo.ko"): 1425*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "module \"%s\" has an error!" % module) 1426*333d2b36SAndroid Build Coastguard Worker`, 1427*333d2b36SAndroid Build Coastguard Worker }, 1428*333d2b36SAndroid Build Coastguard Worker { 1429*333d2b36SAndroid Build Coastguard Worker desc: "List appended to string", 1430*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1431*333d2b36SAndroid Build Coastguard Worker in: ` 1432*333d2b36SAndroid Build Coastguard WorkerNATIVE_BRIDGE_PRODUCT_PACKAGES := \ 1433*333d2b36SAndroid Build Coastguard Worker libnative_bridge_vdso.native_bridge \ 1434*333d2b36SAndroid Build Coastguard Worker native_bridge_guest_app_process.native_bridge \ 1435*333d2b36SAndroid Build Coastguard Worker native_bridge_guest_linker.native_bridge 1436*333d2b36SAndroid Build Coastguard Worker 1437*333d2b36SAndroid Build Coastguard WorkerNATIVE_BRIDGE_MODIFIED_GUEST_LIBS := \ 1438*333d2b36SAndroid Build Coastguard Worker libaaudio \ 1439*333d2b36SAndroid Build Coastguard Worker libamidi \ 1440*333d2b36SAndroid Build Coastguard Worker libandroid \ 1441*333d2b36SAndroid Build Coastguard Worker libandroid_runtime 1442*333d2b36SAndroid Build Coastguard Worker 1443*333d2b36SAndroid Build Coastguard WorkerNATIVE_BRIDGE_PRODUCT_PACKAGES += \ 1444*333d2b36SAndroid Build Coastguard Worker $(addsuffix .native_bridge,$(NATIVE_BRIDGE_ORIG_GUEST_LIBS)) 1445*333d2b36SAndroid Build Coastguard Worker`, 1446*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1447*333d2b36SAndroid Build Coastguard Worker 1448*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1449*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1450*333d2b36SAndroid Build Coastguard Worker g["NATIVE_BRIDGE_PRODUCT_PACKAGES"] = "libnative_bridge_vdso.native_bridge native_bridge_guest_app_process.native_bridge native_bridge_guest_linker.native_bridge" 1451*333d2b36SAndroid Build Coastguard Worker g["NATIVE_BRIDGE_MODIFIED_GUEST_LIBS"] = "libaaudio libamidi libandroid libandroid_runtime" 1452*333d2b36SAndroid Build Coastguard Worker g["NATIVE_BRIDGE_PRODUCT_PACKAGES"] += " " + " ".join(rblf.addsuffix(".native_bridge", g.get("NATIVE_BRIDGE_ORIG_GUEST_LIBS", ""))) 1453*333d2b36SAndroid Build Coastguard Worker`, 1454*333d2b36SAndroid Build Coastguard Worker }, 1455*333d2b36SAndroid Build Coastguard Worker { 1456*333d2b36SAndroid Build Coastguard Worker desc: "Math functions", 1457*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1458*333d2b36SAndroid Build Coastguard Worker in: ` 1459*333d2b36SAndroid Build Coastguard Worker# Test the math functions defined in build/make/common/math.mk 1460*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_max,2,5),5) 1461*333d2b36SAndroid Build Coastguard Workerendif 1462*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_min,2,5),2) 1463*333d2b36SAndroid Build Coastguard Workerendif 1464*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt_or_eq,2,5),true) 1465*333d2b36SAndroid Build Coastguard Workerendif 1466*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt,2,5),true) 1467*333d2b36SAndroid Build Coastguard Workerendif 1468*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_lt,2,5),true) 1469*333d2b36SAndroid Build Coastguard Workerendif 1470*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt_or_eq,2,5),) 1471*333d2b36SAndroid Build Coastguard Workerendif 1472*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt,2,5),) 1473*333d2b36SAndroid Build Coastguard Workerendif 1474*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_lt,2,5),) 1475*333d2b36SAndroid Build Coastguard Workerendif 1476*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt_or_eq,$(MY_VAR), 5),true) 1477*333d2b36SAndroid Build Coastguard Workerendif 1478*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt_or_eq,$(MY_VAR),$(MY_OTHER_VAR)),true) 1479*333d2b36SAndroid Build Coastguard Workerendif 1480*333d2b36SAndroid Build Coastguard Workerifeq ($(call math_gt_or_eq,100$(MY_VAR),10),true) 1481*333d2b36SAndroid Build Coastguard Workerendif 1482*333d2b36SAndroid Build Coastguard Worker`, 1483*333d2b36SAndroid Build Coastguard Worker expected: `# Test the math functions defined in build/make/common/math.mk 1484*333d2b36SAndroid Build Coastguard Workerload("//build/make/core:product_config.rbc", "rblf") 1485*333d2b36SAndroid Build Coastguard Worker 1486*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1487*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1488*333d2b36SAndroid Build Coastguard Worker if max(2, 5) == 5: 1489*333d2b36SAndroid Build Coastguard Worker pass 1490*333d2b36SAndroid Build Coastguard Worker if min(2, 5) == 2: 1491*333d2b36SAndroid Build Coastguard Worker pass 1492*333d2b36SAndroid Build Coastguard Worker if 2 >= 5: 1493*333d2b36SAndroid Build Coastguard Worker pass 1494*333d2b36SAndroid Build Coastguard Worker if 2 > 5: 1495*333d2b36SAndroid Build Coastguard Worker pass 1496*333d2b36SAndroid Build Coastguard Worker if 2 < 5: 1497*333d2b36SAndroid Build Coastguard Worker pass 1498*333d2b36SAndroid Build Coastguard Worker if 2 < 5: 1499*333d2b36SAndroid Build Coastguard Worker pass 1500*333d2b36SAndroid Build Coastguard Worker if 2 <= 5: 1501*333d2b36SAndroid Build Coastguard Worker pass 1502*333d2b36SAndroid Build Coastguard Worker if 2 >= 5: 1503*333d2b36SAndroid Build Coastguard Worker pass 1504*333d2b36SAndroid Build Coastguard Worker if int(g.get("MY_VAR", "")) >= 5: 1505*333d2b36SAndroid Build Coastguard Worker pass 1506*333d2b36SAndroid Build Coastguard Worker if int(g.get("MY_VAR", "")) >= int(g.get("MY_OTHER_VAR", "")): 1507*333d2b36SAndroid Build Coastguard Worker pass 1508*333d2b36SAndroid Build Coastguard Worker if int("100%s" % g.get("MY_VAR", "")) >= 10: 1509*333d2b36SAndroid Build Coastguard Worker pass 1510*333d2b36SAndroid Build Coastguard Worker`, 1511*333d2b36SAndroid Build Coastguard Worker }, 1512*333d2b36SAndroid Build Coastguard Worker { 1513*333d2b36SAndroid Build Coastguard Worker desc: "Type hints", 1514*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1515*333d2b36SAndroid Build Coastguard Worker in: ` 1516*333d2b36SAndroid Build Coastguard Worker# Test type hints 1517*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint list MY_VAR MY_VAR_2 1518*333d2b36SAndroid Build Coastguard Worker# Unsupported type 1519*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint bool MY_VAR_3 1520*333d2b36SAndroid Build Coastguard Worker# Invalid syntax 1521*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint list 1522*333d2b36SAndroid Build Coastguard Worker# Duplicated variable 1523*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint list MY_VAR_2 1524*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint list my-local-var-with-dashes 1525*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint string MY_STRING_VAR 1526*333d2b36SAndroid Build Coastguard Worker 1527*333d2b36SAndroid Build Coastguard WorkerMY_VAR := foo 1528*333d2b36SAndroid Build Coastguard WorkerMY_VAR_UNHINTED := foo 1529*333d2b36SAndroid Build Coastguard Worker 1530*333d2b36SAndroid Build Coastguard Worker# Vars set after other statements still get the hint 1531*333d2b36SAndroid Build Coastguard WorkerMY_VAR_2 := foo 1532*333d2b36SAndroid Build Coastguard Worker 1533*333d2b36SAndroid Build Coastguard Worker# You can't specify a type hint after the first statement 1534*333d2b36SAndroid Build Coastguard Worker#RBC# type_hint list MY_VAR_4 1535*333d2b36SAndroid Build Coastguard WorkerMY_VAR_4 := foo 1536*333d2b36SAndroid Build Coastguard Worker 1537*333d2b36SAndroid Build Coastguard Workermy-local-var-with-dashes := foo 1538*333d2b36SAndroid Build Coastguard Worker 1539*333d2b36SAndroid Build Coastguard WorkerMY_STRING_VAR := $(wildcard foo/bar.mk) 1540*333d2b36SAndroid Build Coastguard Worker`, 1541*333d2b36SAndroid Build Coastguard Worker expected: `# Test type hints 1542*333d2b36SAndroid Build Coastguard Worker# Unsupported type 1543*333d2b36SAndroid Build Coastguard Workerload("//build/make/core:product_config.rbc", "rblf") 1544*333d2b36SAndroid Build Coastguard Worker 1545*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1546*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1547*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:5", "Invalid type_hint annotation. Only list/string types are accepted, found bool") 1548*333d2b36SAndroid Build Coastguard Worker # Invalid syntax 1549*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:7", "Invalid type_hint annotation: list. Must be a variable type followed by a list of variables of that type") 1550*333d2b36SAndroid Build Coastguard Worker # Duplicated variable 1551*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:9", "Duplicate type hint for variable MY_VAR_2") 1552*333d2b36SAndroid Build Coastguard Worker g["MY_VAR"] = ["foo"] 1553*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_UNHINTED"] = "foo" 1554*333d2b36SAndroid Build Coastguard Worker # Vars set after other statements still get the hint 1555*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_2"] = ["foo"] 1556*333d2b36SAndroid Build Coastguard Worker # You can't specify a type hint after the first statement 1557*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:20", "type_hint annotations must come before the first Makefile statement") 1558*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_4"] = "foo" 1559*333d2b36SAndroid Build Coastguard Worker _my_local_var_with_dashes = ["foo"] 1560*333d2b36SAndroid Build Coastguard Worker g["MY_STRING_VAR"] = " ".join(rblf.expand_wildcard("foo/bar.mk")) 1561*333d2b36SAndroid Build Coastguard Worker`, 1562*333d2b36SAndroid Build Coastguard Worker }, 1563*333d2b36SAndroid Build Coastguard Worker { 1564*333d2b36SAndroid Build Coastguard Worker desc: "Set LOCAL_PATH to my-dir", 1565*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1566*333d2b36SAndroid Build Coastguard Worker in: ` 1567*333d2b36SAndroid Build Coastguard WorkerLOCAL_PATH := $(call my-dir) 1568*333d2b36SAndroid Build Coastguard Worker`, 1569*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1570*333d2b36SAndroid Build Coastguard Worker 1571*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1572*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1573*333d2b36SAndroid Build Coastguard Worker 1574*333d2b36SAndroid Build Coastguard Worker`, 1575*333d2b36SAndroid Build Coastguard Worker }, 1576*333d2b36SAndroid Build Coastguard Worker { 1577*333d2b36SAndroid Build Coastguard Worker desc: "Evals", 1578*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1579*333d2b36SAndroid Build Coastguard Worker in: ` 1580*333d2b36SAndroid Build Coastguard Worker$(eval) 1581*333d2b36SAndroid Build Coastguard Worker$(eval MY_VAR := foo) 1582*333d2b36SAndroid Build Coastguard Worker$(eval # This is a test of eval functions) 1583*333d2b36SAndroid Build Coastguard Worker$(eval $(TOO_COMPLICATED) := bar) 1584*333d2b36SAndroid Build Coastguard Worker$(eval include foo/font.mk) 1585*333d2b36SAndroid Build Coastguard Worker$(eval $(call inherit-product,vendor/foo1/cfg.mk)) 1586*333d2b36SAndroid Build Coastguard Worker 1587*333d2b36SAndroid Build Coastguard Worker$(foreach x,$(MY_LIST_VAR), \ 1588*333d2b36SAndroid Build Coastguard Worker $(eval PRODUCT_COPY_FILES += foo/bar/$(x):$(TARGET_COPY_OUT_VENDOR)/etc/$(x)) \ 1589*333d2b36SAndroid Build Coastguard Worker $(if $(MY_OTHER_VAR),$(eval PRODUCT_COPY_FILES += $(MY_OTHER_VAR):foo/bar/$(x)))) 1590*333d2b36SAndroid Build Coastguard Worker 1591*333d2b36SAndroid Build Coastguard Worker$(foreach x,$(MY_LIST_VAR), \ 1592*333d2b36SAndroid Build Coastguard Worker $(eval include foo/$(x).mk)) 1593*333d2b36SAndroid Build Coastguard Worker 1594*333d2b36SAndroid Build Coastguard Worker# Check that we get as least close to correct line numbers for errors on statements inside evals 1595*333d2b36SAndroid Build Coastguard Worker$(eval $(call inherit-product,$(A_VAR))) 1596*333d2b36SAndroid Build Coastguard Worker`, 1597*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1598*333d2b36SAndroid Build Coastguard Workerload("//foo:font.star", _font_init = "init") 1599*333d2b36SAndroid Build Coastguard Workerload("//vendor/foo1:cfg.star", _cfg_init = "init") 1600*333d2b36SAndroid Build Coastguard Worker 1601*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1602*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1603*333d2b36SAndroid Build Coastguard Worker g["MY_VAR"] = "foo" 1604*333d2b36SAndroid Build Coastguard Worker # This is a test of eval functions 1605*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:5", "Eval expression too complex; only assignments, comments, includes, and inherit-products are supported") 1606*333d2b36SAndroid Build Coastguard Worker _font_init(g, handle) 1607*333d2b36SAndroid Build Coastguard Worker rblf.inherit(handle, "vendor/foo1/cfg", _cfg_init) 1608*333d2b36SAndroid Build Coastguard Worker for x in rblf.words(g.get("MY_LIST_VAR", "")): 1609*333d2b36SAndroid Build Coastguard Worker rblf.setdefault(handle, "PRODUCT_COPY_FILES") 1610*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] += ("foo/bar/%s:%s/etc/%s" % (x, g.get("TARGET_COPY_OUT_VENDOR", ""), x)).split() 1611*333d2b36SAndroid Build Coastguard Worker if g.get("MY_OTHER_VAR", ""): 1612*333d2b36SAndroid Build Coastguard Worker cfg["PRODUCT_COPY_FILES"] += ("%s:foo/bar/%s" % (g.get("MY_OTHER_VAR", ""), x)).split() 1613*333d2b36SAndroid Build Coastguard Worker for x in rblf.words(g.get("MY_LIST_VAR", "")): 1614*333d2b36SAndroid Build Coastguard Worker _entry = { 1615*333d2b36SAndroid Build Coastguard Worker "foo/font.mk": ("foo/font", _font_init), 1616*333d2b36SAndroid Build Coastguard Worker }.get("foo/%s.mk" % x) 1617*333d2b36SAndroid Build Coastguard Worker (_varmod, _varmod_init) = _entry if _entry else (None, None) 1618*333d2b36SAndroid Build Coastguard Worker if not _varmod_init: 1619*333d2b36SAndroid Build Coastguard Worker rblf.mkerror("product.mk", "Cannot find %s" % ("foo/%s.mk" % x)) 1620*333d2b36SAndroid Build Coastguard Worker _varmod_init(g, handle) 1621*333d2b36SAndroid Build Coastguard Worker # Check that we get as least close to correct line numbers for errors on statements inside evals 1622*333d2b36SAndroid Build Coastguard Worker rblf.mk2rbc_error("product.mk:17", "inherit-product/include argument is too complex") 1623*333d2b36SAndroid Build Coastguard Worker`, 1624*333d2b36SAndroid Build Coastguard Worker }, 1625*333d2b36SAndroid Build Coastguard Worker { 1626*333d2b36SAndroid Build Coastguard Worker desc: ".KATI_READONLY", 1627*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1628*333d2b36SAndroid Build Coastguard Worker in: ` 1629*333d2b36SAndroid Build Coastguard WorkerMY_VAR := foo 1630*333d2b36SAndroid Build Coastguard Worker.KATI_READONLY := MY_VAR 1631*333d2b36SAndroid Build Coastguard Worker`, 1632*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1633*333d2b36SAndroid Build Coastguard Worker 1634*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1635*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1636*333d2b36SAndroid Build Coastguard Worker g["MY_VAR"] = "foo" 1637*333d2b36SAndroid Build Coastguard Worker`, 1638*333d2b36SAndroid Build Coastguard Worker }, 1639*333d2b36SAndroid Build Coastguard Worker { 1640*333d2b36SAndroid Build Coastguard Worker desc: "Complicated variable references", 1641*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1642*333d2b36SAndroid Build Coastguard Worker in: ` 1643*333d2b36SAndroid Build Coastguard WorkerMY_VAR := foo 1644*333d2b36SAndroid Build Coastguard WorkerMY_VAR_2 := MY_VAR 1645*333d2b36SAndroid Build Coastguard WorkerMY_VAR_3 := $($(MY_VAR_2)) 1646*333d2b36SAndroid Build Coastguard WorkerMY_VAR_4 := $(foo bar) 1647*333d2b36SAndroid Build Coastguard WorkerMY_VAR_5 := $($(MY_VAR_2) bar) 1648*333d2b36SAndroid Build Coastguard Worker`, 1649*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1650*333d2b36SAndroid Build Coastguard Worker 1651*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1652*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1653*333d2b36SAndroid Build Coastguard Worker g["MY_VAR"] = "foo" 1654*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_2"] = "MY_VAR" 1655*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_3"] = (cfg).get(g["MY_VAR_2"], (g).get(g["MY_VAR_2"], "")) 1656*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_4"] = rblf.mk2rbc_error("product.mk:5", "cannot handle invoking foo") 1657*333d2b36SAndroid Build Coastguard Worker g["MY_VAR_5"] = rblf.mk2rbc_error("product.mk:6", "reference is too complex: $(MY_VAR_2) bar") 1658*333d2b36SAndroid Build Coastguard Worker`, 1659*333d2b36SAndroid Build Coastguard Worker }, 1660*333d2b36SAndroid Build Coastguard Worker { 1661*333d2b36SAndroid Build Coastguard Worker desc: "Conditional functions", 1662*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1663*333d2b36SAndroid Build Coastguard Worker in: ` 1664*333d2b36SAndroid Build Coastguard WorkerB := foo 1665*333d2b36SAndroid Build Coastguard WorkerX := $(or $(A)) 1666*333d2b36SAndroid Build Coastguard WorkerX := $(or $(A),$(B)) 1667*333d2b36SAndroid Build Coastguard WorkerX := $(or $(A),$(B),$(C)) 1668*333d2b36SAndroid Build Coastguard WorkerX := $(and $(A)) 1669*333d2b36SAndroid Build Coastguard WorkerX := $(and $(A),$(B)) 1670*333d2b36SAndroid Build Coastguard WorkerX := $(and $(A),$(B),$(C)) 1671*333d2b36SAndroid Build Coastguard WorkerX := $(or $(A),$(B)) Y 1672*333d2b36SAndroid Build Coastguard Worker 1673*333d2b36SAndroid Build Coastguard WorkerD := $(wildcard *.mk) 1674*333d2b36SAndroid Build Coastguard WorkerX := $(or $(B),$(D)) 1675*333d2b36SAndroid Build Coastguard Worker`, 1676*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1677*333d2b36SAndroid Build Coastguard Worker 1678*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1679*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1680*333d2b36SAndroid Build Coastguard Worker g["B"] = "foo" 1681*333d2b36SAndroid Build Coastguard Worker g["X"] = g.get("A", "") 1682*333d2b36SAndroid Build Coastguard Worker g["X"] = g.get("A", "") or g["B"] 1683*333d2b36SAndroid Build Coastguard Worker g["X"] = g.get("A", "") or g["B"] or g.get("C", "") 1684*333d2b36SAndroid Build Coastguard Worker g["X"] = g.get("A", "") 1685*333d2b36SAndroid Build Coastguard Worker g["X"] = g.get("A", "") and g["B"] 1686*333d2b36SAndroid Build Coastguard Worker g["X"] = g.get("A", "") and g["B"] and g.get("C", "") 1687*333d2b36SAndroid Build Coastguard Worker g["X"] = "%s Y" % g.get("A", "") or g["B"] 1688*333d2b36SAndroid Build Coastguard Worker g["D"] = rblf.expand_wildcard("*.mk") 1689*333d2b36SAndroid Build Coastguard Worker g["X"] = rblf.mk2rbc_error("product.mk:12", "Expected all arguments to $(or) or $(and) to have the same type, found \"string\" and \"list\"") 1690*333d2b36SAndroid Build Coastguard Worker`, 1691*333d2b36SAndroid Build Coastguard Worker }, 1692*333d2b36SAndroid Build Coastguard Worker { 1693*333d2b36SAndroid Build Coastguard Worker 1694*333d2b36SAndroid Build Coastguard Worker desc: "is-lower/is-upper", 1695*333d2b36SAndroid Build Coastguard Worker mkname: "product.mk", 1696*333d2b36SAndroid Build Coastguard Worker in: ` 1697*333d2b36SAndroid Build Coastguard WorkerX := $(call to-lower,aBc) 1698*333d2b36SAndroid Build Coastguard WorkerX := $(call to-upper,aBc) 1699*333d2b36SAndroid Build Coastguard WorkerX := $(call to-lower,$(VAR)) 1700*333d2b36SAndroid Build Coastguard WorkerX := $(call to-upper,$(VAR)) 1701*333d2b36SAndroid Build Coastguard Worker`, 1702*333d2b36SAndroid Build Coastguard Worker expected: `load("//build/make/core:product_config.rbc", "rblf") 1703*333d2b36SAndroid Build Coastguard Worker 1704*333d2b36SAndroid Build Coastguard Workerdef init(g, handle): 1705*333d2b36SAndroid Build Coastguard Worker cfg = rblf.cfg(handle) 1706*333d2b36SAndroid Build Coastguard Worker g["X"] = ("aBc").lower() 1707*333d2b36SAndroid Build Coastguard Worker g["X"] = ("aBc").upper() 1708*333d2b36SAndroid Build Coastguard Worker g["X"] = (g.get("VAR", "")).lower() 1709*333d2b36SAndroid Build Coastguard Worker g["X"] = (g.get("VAR", "")).upper() 1710*333d2b36SAndroid Build Coastguard Worker`, 1711*333d2b36SAndroid Build Coastguard Worker }, 1712*333d2b36SAndroid Build Coastguard Worker} 1713*333d2b36SAndroid Build Coastguard Worker 1714*333d2b36SAndroid Build Coastguard Workervar known_variables = []struct { 1715*333d2b36SAndroid Build Coastguard Worker name string 1716*333d2b36SAndroid Build Coastguard Worker class varClass 1717*333d2b36SAndroid Build Coastguard Worker starlarkType 1718*333d2b36SAndroid Build Coastguard Worker}{ 1719*333d2b36SAndroid Build Coastguard Worker {"NATIVE_COVERAGE", VarClassSoong, starlarkTypeBool}, 1720*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_NAME", VarClassConfig, starlarkTypeString}, 1721*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_MODEL", VarClassConfig, starlarkTypeString}, 1722*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_PACKAGES", VarClassConfig, starlarkTypeList}, 1723*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_BOOT_JARS", VarClassConfig, starlarkTypeList}, 1724*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_COPY_FILES", VarClassConfig, starlarkTypeList}, 1725*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_IS_64BIT", VarClassConfig, starlarkTypeString}, 1726*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_LIST1", VarClassConfig, starlarkTypeList}, 1727*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_LIST2", VarClassConfig, starlarkTypeList}, 1728*333d2b36SAndroid Build Coastguard Worker {"PRODUCT_LIST3", VarClassConfig, starlarkTypeList}, 1729*333d2b36SAndroid Build Coastguard Worker {"TARGET_PRODUCT", VarClassSoong, starlarkTypeString}, 1730*333d2b36SAndroid Build Coastguard Worker {"TARGET_BUILD_VARIANT", VarClassSoong, starlarkTypeString}, 1731*333d2b36SAndroid Build Coastguard Worker {"TARGET_BOARD_PLATFORM", VarClassSoong, starlarkTypeString}, 1732*333d2b36SAndroid Build Coastguard Worker {"QCOM_BOARD_PLATFORMS", VarClassSoong, starlarkTypeString}, 1733*333d2b36SAndroid Build Coastguard Worker {"PLATFORM_LIST", VarClassSoong, starlarkTypeList}, // TODO(asmundak): make it local instead of soong 1734*333d2b36SAndroid Build Coastguard Worker} 1735*333d2b36SAndroid Build Coastguard Worker 1736*333d2b36SAndroid Build Coastguard Workertype testMakefileFinder struct { 1737*333d2b36SAndroid Build Coastguard Worker fs fs.FS 1738*333d2b36SAndroid Build Coastguard Worker root string 1739*333d2b36SAndroid Build Coastguard Worker files []string 1740*333d2b36SAndroid Build Coastguard Worker} 1741*333d2b36SAndroid Build Coastguard Worker 1742*333d2b36SAndroid Build Coastguard Workerfunc (t *testMakefileFinder) Find(root string) []string { 1743*333d2b36SAndroid Build Coastguard Worker if t.files != nil || root == t.root { 1744*333d2b36SAndroid Build Coastguard Worker return t.files 1745*333d2b36SAndroid Build Coastguard Worker } 1746*333d2b36SAndroid Build Coastguard Worker t.files = make([]string, 0) 1747*333d2b36SAndroid Build Coastguard Worker fs.WalkDir(t.fs, root, func(path string, d fs.DirEntry, err error) error { 1748*333d2b36SAndroid Build Coastguard Worker if err != nil { 1749*333d2b36SAndroid Build Coastguard Worker return err 1750*333d2b36SAndroid Build Coastguard Worker } 1751*333d2b36SAndroid Build Coastguard Worker if d.IsDir() { 1752*333d2b36SAndroid Build Coastguard Worker base := filepath.Base(path) 1753*333d2b36SAndroid Build Coastguard Worker if base[0] == '.' && len(base) > 1 { 1754*333d2b36SAndroid Build Coastguard Worker return fs.SkipDir 1755*333d2b36SAndroid Build Coastguard Worker } 1756*333d2b36SAndroid Build Coastguard Worker return nil 1757*333d2b36SAndroid Build Coastguard Worker } 1758*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(path, ".mk") { 1759*333d2b36SAndroid Build Coastguard Worker t.files = append(t.files, path) 1760*333d2b36SAndroid Build Coastguard Worker } 1761*333d2b36SAndroid Build Coastguard Worker return nil 1762*333d2b36SAndroid Build Coastguard Worker }) 1763*333d2b36SAndroid Build Coastguard Worker return t.files 1764*333d2b36SAndroid Build Coastguard Worker} 1765*333d2b36SAndroid Build Coastguard Worker 1766*333d2b36SAndroid Build Coastguard Workerfunc TestGood(t *testing.T) { 1767*333d2b36SAndroid Build Coastguard Worker for _, v := range known_variables { 1768*333d2b36SAndroid Build Coastguard Worker KnownVariables.NewVariable(v.name, v.class, v.starlarkType) 1769*333d2b36SAndroid Build Coastguard Worker } 1770*333d2b36SAndroid Build Coastguard Worker fs := NewFindMockFS([]string{ 1771*333d2b36SAndroid Build Coastguard Worker "vendor/foo1/cfg.mk", 1772*333d2b36SAndroid Build Coastguard Worker "vendor/bar/baz/cfg.mk", 1773*333d2b36SAndroid Build Coastguard Worker "part.mk", 1774*333d2b36SAndroid Build Coastguard Worker "foo/font.mk", 1775*333d2b36SAndroid Build Coastguard Worker "bar/font.mk", 1776*333d2b36SAndroid Build Coastguard Worker }) 1777*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 1778*333d2b36SAndroid Build Coastguard Worker t.Run(test.desc, 1779*333d2b36SAndroid Build Coastguard Worker func(t *testing.T) { 1780*333d2b36SAndroid Build Coastguard Worker ss, err := Convert(Request{ 1781*333d2b36SAndroid Build Coastguard Worker MkFile: test.mkname, 1782*333d2b36SAndroid Build Coastguard Worker Reader: bytes.NewBufferString(test.in), 1783*333d2b36SAndroid Build Coastguard Worker OutputSuffix: ".star", 1784*333d2b36SAndroid Build Coastguard Worker SourceFS: fs, 1785*333d2b36SAndroid Build Coastguard Worker MakefileFinder: &testMakefileFinder{fs: fs}, 1786*333d2b36SAndroid Build Coastguard Worker }) 1787*333d2b36SAndroid Build Coastguard Worker if err != nil { 1788*333d2b36SAndroid Build Coastguard Worker t.Error(err) 1789*333d2b36SAndroid Build Coastguard Worker return 1790*333d2b36SAndroid Build Coastguard Worker } 1791*333d2b36SAndroid Build Coastguard Worker got := ss.String() 1792*333d2b36SAndroid Build Coastguard Worker if got != test.expected { 1793*333d2b36SAndroid Build Coastguard Worker t.Errorf("%q failed\nExpected:\n%s\nActual:\n%s\n", test.desc, 1794*333d2b36SAndroid Build Coastguard Worker strings.ReplaceAll(test.expected, "\n", "\n"), 1795*333d2b36SAndroid Build Coastguard Worker strings.ReplaceAll(got, "\n", "\n")) 1796*333d2b36SAndroid Build Coastguard Worker } 1797*333d2b36SAndroid Build Coastguard Worker }) 1798*333d2b36SAndroid Build Coastguard Worker } 1799*333d2b36SAndroid Build Coastguard Worker} 1800