diff --git a/core/product_config.rbc b/core/product_config.rbc index 7a5e50110b..b3156c6f39 100644 --- a/core/product_config.rbc +++ b/core/product_config.rbc @@ -830,6 +830,37 @@ def _product_copy_files_by_pattern(src, dest, s): return [ __mkpatsubst_word(parsed_percent, parsed_src, x) + ":" + __mkpatsubst_word(parsed_percent, parsed_dest, x) for x in words] +__zero_values = { + "string": "", + "list": [], + "int": 0, + "float": 0, + "bool": False, + "dict": {}, + "NoneType": None, + "tuple": (), +} +def __zero_value(x): + t = type(x) + if t in __zero_values: + return __zero_values[t] + else: + fail("Unknown type: "+t) + + +def _clear_var_list(g, h, var_list): + cfg = __h_cfg(h) + for v in __words(var_list): + # Set these variables to their zero values rather than None + # or removing them from the dictionary because if they were + # removed entirely, ?= would set their value, when it would not + # after a make-based clear_var_list call. + if v in g: + g[v] = __zero_value(g[v]) + if v in cfg: + cfg[v] = __zero_value(cfg[v]) + + def __get_options(): """Returns struct containing runtime global settings.""" settings = dict( @@ -873,6 +904,7 @@ rblf = struct( addsuffix = _addsuffix, board_platform_in = _board_platform_in, board_platform_is = _board_platform_is, + clear_var_list = _clear_var_list, copy_files = _copy_files, copy_if_exists = _copy_if_exists, cfg = __h_cfg, diff --git a/tests/run.rbc b/tests/run.rbc index c6dfeba405..06f56d324d 100644 --- a/tests/run.rbc +++ b/tests/run.rbc @@ -162,6 +162,16 @@ assert_eq( assert_eq({"A_LIST_VARIABLE": ["foo", "bar"]}, board_globals) assert_eq({"A_LIST_VARIABLE": ["foo"]}, board_globals_base) +g = {"FOO": "a", "BAR": "c", "BAZ": "e"} +cfg = {"FOO": "b", "BAR": "d", "BAZ": "f"} +rblf.clear_var_list(g, struct(cfg=cfg), "FOO BAR") +assert_eq("", g["FOO"]) +assert_eq("", cfg["FOO"]) +assert_eq("", g["BAR"]) +assert_eq("", cfg["BAR"]) +assert_eq("e", g["BAZ"]) +assert_eq("f", cfg["BAZ"]) + test_single_value_inheritance() test_artifact_path_requirements() test_prefixed_sort_order()