Add mksubst

Bug: 181797530
Test: rbcrun build/make/tests/run.rbc
Change-Id: I196c69259b830b6466430f6c933afb49fa787948
diff --git a/core/product_config.rbc b/core/product_config.rbc
index 2432e64..355d41d 100644
--- a/core/product_config.rbc
+++ b/core/product_config.rbc
@@ -450,6 +450,17 @@
         was_space = is_space
     return result
 
+def _mksubst(old, new, s):
+    """Emulates Make's subst.
+
+    Replaces each occurence of 'old' with 'new'.
+    If 's' is a list, applies substitution to each item.
+    """
+    if type(s) == "list":
+        return [e.replace(old, new) for e in s]
+    return s.replace(old, new)
+
+
 def __get_options():
     """Returns struct containing runtime global settings."""
     settings = dict(
@@ -498,6 +509,7 @@
     mkerror = _mkerror,
     mkwarning = _mkwarning,
     mkstrip = _mkstrip,
+    mksubst = _mksubst,
     printvars = _printvars,
     product_configuration = _product_configuration,
     require_artifacts_in_path = _require_artifacts_in_path,
diff --git a/tests/run.rbc b/tests/run.rbc
index 6478159..c7eaf3b 100644
--- a/tests/run.rbc
+++ b/tests/run.rbc
@@ -31,6 +31,9 @@
 assert_eq("", rblf.mkstrip(" \n \t    "))
 assert_eq("a b c", rblf.mkstrip("  a b   \n  c \t"))
 
+assert_eq("b1 b2", rblf.mksubst("a", "b", "a1 a2"))
+assert_eq(["b1", "x2"], rblf.mksubst("a", "b", ["a1", "x2"]))
+
 globals, config = rblf.product_configuration("test/device", init)
 assert_eq(
     {