sources := \ $(shell \ for each in *.c; \ do \ echo $$each | sed -e 's, ,__whitespace__,g'; \ done \ ) objects := $(sources:.c=.o) main: $(objects) gcc -o $@ $(^) .PHONY: clean clean: rm -f $(objects) main empty := space := $(empty) $(empty) reconstitute = $(subst __whitespace__,\ ,$(1)) shell-escape = $(subst $(space),\ ,$(1)) $(foreach source,$(sources), \ $(eval \ $(source:.c=.o) : \ $$(call reconstitute,$(source)) ; \ gcc -c -o $$@ $$(call shell-escape,$$<) \ ) \ )