====== make ====== Things worth knowing about ''make'' and ''Makefiles''. ====== Makefiles ====== ===== Hints ===== * a literal '''$''' has to be escaped by doubling it: bla: rm $$(echo "-rf /") * place a dash ('''-''') in front of a command to have ''make'' ignore it's return value: bla: -rm $$(echo "-rf /") ===== $(builtins ) ===== * subst $(OBJECTS) : javac $(subst .class,.java,$@) * filter FILES = Bla.java Blub.java Wrong.here $(filter %.java,$(FILES)) : javac $@ $(filter %.here,$(FILES)) : echo "Wrong here?!" ===== Static Patterns ===== targets ...: target-pattern: prereq-patterns ... commands Sample usage: objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ ===== Misc Goodies ===== * recursing paths: PATH=/a/b/c/d/e/f/g/h PLIST:= define recurse ifneq ($(strip $(shell dirname ${1})),/) $$(eval $$(call recurse,$(shell dirname ${1}))) PLIST+= $(shell dirname ${1}) endif endef all: $(eval $(call recurse,${PATH})) @for i in ${PLIST}; do echo $$i; done * a more advanced version of the above: PATH=/a/b/c/d/e/f/g/h ifneq (${REVERSE},) REVERSE:=true endif REVERSE?=false PLIST:= define get_dirname $(strip $(shell dirname ${1})) endef define list_add ifneq (${2},${3}) PLIST += $$(call get_dirname,${1}) endif endef define recurse DNAME:=$$(call get_dirname,${1}) ifneq ($${DNAME},/) $$(eval $$(call list_add,${1},$${REVERSE},true)) $$(eval $$(call recurse,$${DNAME})) $$(eval $$(call list_add,${1},$${REVERSE},false)) endif endef all: $(eval $(call recurse, ${PATH})) @for i in ${PLIST}; do echo $$i; done ====== Links ====== [[http://www.gnu.org/software/make/manual/html_node/index.html|GNU Make Manual]]