本系列文章均翻譯自make官方文檔:make Manual,github同步項目:question
make
指明瞭一個大程序的哪一部分需要重新構建,然後發出命令來重新編譯它們。
Makefile介紹
Makefile
文件告訴make如何編譯和鏈接一個程序。
規則介紹
rule模型
target … : prerequisites …
recipe
…
…
target通常是被一個程序生成的文件名(可執行的),也可以是一個可執行的動作。
prerequisites是輸入文件。
recipe是將要執行的動作。需要在每行的開頭鍵入一個tab字符。
通常一個recipe是一個帶有先決條件和表現的規則來創建一個目標文件如果任何條件發生改變。但是,爲目標指定一個recipe的rule不需要先決條件。
rule解釋如何、何時重新構建某些特定規則的目標文件。make執行帶有prerequisites的recipe創建、更新目標;rule也可以解釋如何、何時執行動作。
Makefile還可以包含除了規則以外的其他文本。
那些不引用文件僅僅是操作的目標稱爲phony targets(僞目標)。 See Phony Targets。
See Errors in Recipes查看如何忽略錯誤。
make如何執行Makefile
make默認伴隨着第一個目標開始。叫做default goal。Goals是make最終要更新的目標。
執行rule之前,需要滿足prerequisites,所以會先執行滿足prerequisites的rule。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
使用變量
定義變量:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
使用變量:
$(objects)
讓make推測recipe
例子:
不必爲了單個C源文件拼寫recipe
,因爲make可以自動地解決:它有implicit rule(隱含規則)使用cc -c
命令更新一個.o
文件從相關的.c
文件。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
Makefile的另一種風格
當Makefile文件只由implicit rule組成時,可以寫成另一種的風格:通過他們的prerequisites將對象分組而不是他們的targets。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
清理文件夾的規則
.PHONY : clean
clean :
-rm edit $(objects)
防止make被一個叫做clean的文件弄糊塗,並使其在出錯的情況下繼續執行。