ALL = a b c d

define template

.phony : run_$(1) 

run_$(1) : $(1)
	./$(1)

$(1) : $(1).o
	gcc -o $(1) $(1).o

$(1).o : $(1).c
	gcc -c $(1).c

$(1).c :
	echo 'main() { printf("$(1)\n"); exit(0); }' > $(1).c

endef

$(foreach EXE, $(ALL), $(eval $(call template,$(EXE))))

.phony : all run_all objs_built built 

all : $(foreach EXE, $(ALL), $(EXE))

run_all : $(foreach EXE, $(ALL), run_$(EXE))

objs=$(foreach EXE, $(ALL), $(EXE).o)

objs_built : | $(objs)
	@echo objs built

objs_built_file : | $(objs)
	@echo objs built file
	touch $@

clean :
	-rm list objs_built_file $(foreach EXE, $(ALL), $(EXE) $(EXE).o $(EXE).c) 

define lister
	echo $(1) >> $(2)

endef

list : $(objs)
	-rm  $@
	$(foreach L, $?, $(call lister, $(L), $(@)))
