Makefile =和:= x := foo y := $(x) bar x := later 其等價於: y := foo bar x := later 目標:$@ 表示規則中的目標文件集。若是有多個目標,那麼,"$@"就是匹配於目標中模式定義的集合。 依賴:$^ 全部的依賴集合。以空格分隔。若是在依賴目標中有多個重複的,那個這個變量會去除重複的依賴目標,只保留一份。 依賴:$< 依賴第一個名字。若是依賴目標是以模式(即"%")定義的,那麼"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。 變量:在Makefile中的定義的變量,就像是C/C++語言中的宏同樣 objects = program.o foo.o utils.o program : $(objects) cc -o program $(objects) Makefile shell注意點 http://www.blogjava.net/jasmine214--love/archive/2012/01/10/368191.html 1:盡在Makefile文件的目標項冒號後的另起一行的代碼纔是shell代碼。 2:Makefile中的shell,每一行是一個進程,不一樣行之間變量值不能傳遞。因此,Makefile中的shell無論多長也要寫在一行。 3:Makefile中的變量以$開頭, 因此,爲了不和shell的變量衝突,shell的變量以$$開頭 SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) OBJS= $(patsubst %.cpp,./obj/%.o,$(notdir $(SOURCES))) GCNOS= $(patsubst %.cpp,./obj/%.gcno,$(notdir $(SOURCES))) Makefile文件範例 注意使用tab鍵做爲命令的開始,行尾不須要空格,尤爲是wins->linux會出現問題 #BASE_DIR :=$(shell pwd) SUBDIRS= fnd_system fnd_pzasset #@取消命令自己的輸出 #$1 shell第一個參數 define make_subdir @for subdir in $(SUBDIRS); do \ pwd && echo $$subdir && echo $1 && echo $@ || exit $$?; \ done; endef #.PHONY 說明 all等等爲僞命令 .PHONY : all install clean all : @echo $(BASE_DIR) $(call make_subdir, all) install : $(call make_subdir, install) debug : $(call make_subdir, debug) clean : $(call make_subdir, clean)