At a high level, Makefile is a tool to build files when they are out of date. In partice Makefiles are used to produce software modules only on chnage. This is particularly useful in languages such as C and C++ where modules only need to be recompiled and linked on change. There are many Makefile flavors, most notably in the Open Source world are BSD Make and GNU Make.
GNU Make is commonly used under the Linux family of operating systems to build binaries.
This is useful for generating targets. The following will dynamically generate targets
define build_target $1_target: $$(MAKE) -C $1 all endef TARGETS=yeah aha $(foreach d,$(TARGETS),$(eval $(call build_target,$d)))