14space :=$= $(space)$(space)$(space)$(space) 2invert_bool =$= $(if $(strip $(1)),,true) 3 4# Converts a list to a JSON list. 5# $1: List separator. 6# $2: List. 7_json_list =$= [$(if $(2),"$(subst $(1),"$(comma)",$(2))")] 8 9# Converts a space-separated list to a JSON list. 10json_list =$= $(call _json_list,$(space),$(1)) 11 12# Converts a comma-separated list to a JSON list. 13csv_to_json_list =$= $(call _json_list,$(comma),$(1)) 14 15# Adds or removes 4 spaces from _json_indent 16json_increase_indent =$= $(eval _json_indent := $$(_json_indent)$$(4space)) 17json_decrease_indent =$= $(eval _json_indent := $$(subst _,$$(space),$$(patsubst %____,%,$$(subst $$(space),_,$$(_json_indent))))) 18 19# 1: Key name 20# 2: Value 21add_json_val =$= $(eval _json_contents := $$(_json_contents)$$(_json_indent)"$$(strip $$(1))": $$(strip $$(2))$$(comma)$$(newline)) 22add_json_str =$= $(call add_json_val,$(1),"$(strip $(2))") 23add_json_list =$= $(call add_json_val,$(1),$(call json_list,$(patsubst %,%,$(2)))) 24add_json_csv =$= $(call add_json_val,$(1),$(call csv_to_json_list,$(strip $(2)))) 25add_json_bool =$= $(call add_json_val,$(1),$(if $(strip $(2)),true,false)) 26add_json_map =$= $(eval _json_contents := $$(_json_contents)$$(_json_indent)"$$(strip $$(1))": {$$(newline))$(json_increase_indent) 27add_json_map_anon =$= $(eval _json_contents := $$(_json_contents)$$(_json_indent){$$(newline))$(json_increase_indent) 28end_json_map =$= $(json_decrease_indent)$(eval _json_contents := $$(_json_contents)$$(if $$(filter %$$(comma),$$(lastword $$(_json_contents))),__SV_END)$$(_json_indent)},$$(newline)) 29add_json_array =$= $(eval _json_contents := $$(_json_contents)$$(_json_indent)"$$(strip $$(1))": [$$(newline))$(json_increase_indent) 30end_json_array =$= $(json_decrease_indent)$(eval _json_contents := $$(_json_contents)$$(if $$(filter %$$(comma),$$(lastword $$(_json_contents))),__SV_END)$$(_json_indent)],$$(newline)) 31 32# Clears _json_contents to start a new json file 33json_start =$= $(eval _json_contents := {$$(newline))$(eval _json_indent := $$(4space)) 34 35# Adds the trailing close brace to _json_contents, and removes any trailing commas if necessary 36json_end =$= $(eval _json_contents := $$(subst $$(comma)$$(newline)__SV_END,$$(newline),$$(_json_contents)__SV_END}$$(newline))) 37 38json_contents =$= $(_json_contents) 39