# $(if) is even less useful than test(1). undefined = $(subst undefined,,$(flavor $(1))) defined = $(if $(call undefined,$(1)),defined,) FOO = $(if $(call defined,$(__FOO)),,$(eval __FOO := foo))$(__FOO) lazyval = $(if $(call defined,__$(1)),,$(eval __$(1) := $$(value 2)))$(__$(1)) lazydef = $(eval $(1) = $(call lazyval,$(1),$(value 2))) $(call lazydef,BAR,$$(shell sleep 1; echo bar)) all: foo bar foo: @echo FOO is $(call defined,FOO) @echo FOO\'s value is $(FOO) bar: @echo BAR is $(call defined,BAR) @echo BAR\'s value is $(BAR)