Add mksort implementation

Bug: 218736658
Test: ./out/rbcrun ./build/make/tests/run.rbc
Change-Id: I0069e7059453c16d299cc650f56c320d905f1958
diff --git a/core/product_config.rbc b/core/product_config.rbc
index 0187251..8617fa1 100644
--- a/core/product_config.rbc
+++ b/core/product_config.rbc
@@ -676,6 +676,20 @@
     return out_words if type(s) == "list" else " ".join(out_words)
 
 
+def _mksort(input):
+    """Emulate Make's sort.
+
+    This is unique from a regular sort in that it also strips
+    the input, and removes duplicate words from the input.
+    """
+    input = sorted(__words(input))
+    result = []
+    for w in input:
+        if len(result) == 0 or result[-1] != w:
+            result.append(w)
+    return result
+
+
 def _mkstrip(s):
     """Emulates Make's strip.
 
@@ -785,6 +799,7 @@
     mkerror = _mkerror,
     mkpatsubst = _mkpatsubst,
     mkwarning = _mkwarning,
+    mksort = _mksort,
     mkstrip = _mkstrip,
     mksubst = _mksubst,
     notdir = _notdir,
diff --git a/tests/run.rbc b/tests/run.rbc
index 82a5e72..58cc4d6 100644
--- a/tests/run.rbc
+++ b/tests/run.rbc
@@ -32,6 +32,9 @@
         fail("Expected '%s', got '%s'" % (expected, actual))
 
 # Unit tests for non-trivial runtime functions
+assert_eq(["a", "b", "c"], rblf.mksort("b a    c c"))
+assert_eq(["a", "b", "c"], rblf.mksort(["b", "a", "c", "c"]))
+
 assert_eq("", rblf.mkstrip(" \n \t    "))
 assert_eq("a b c", rblf.mkstrip("  a b   \n  c \t"))
 assert_eq(1, rblf.mkstrip(1))