makefile是在編譯中大型程序中使用的自動化編譯工具make
依賴的指令文件。這樣可以使得程序的編譯更加便捷快速。
makefile的一般規則如下:
target ... : prerequisites ...
command
target
即是一個目標文件,它可以是可執行程序、目標中間文件、標記(label)等。這個目標要想編譯出來需要的前提條件就是prerequisites
這些已存在的文件。編譯過程中的規則則是由command
裏面的各個命令組成。command
以一個Tab
起頭。make
會比較目標文件與條件中的文件更新時間,一旦有文件被修改,make
就會依賴於這些前提文件進行重新編譯。makefile
中第一個target
會被認爲是make
的默認目標。
當prerequisites
是空的時候,前面的目標文件被當成一個命令,使用make
執行時會直接執行command
裏的命令。
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
執行這個make clean
會將當前文件夾下的幾個中間文件刪除掉。
makefile
中可以使用變量,類似於C語言中的宏:
edit : main.o kda.o command.o
gcc -o edit main.o kda.o command.o
這裏面如果要向edit
的依賴項中添加文件,那麼也得向command
中加入同樣的文件,makefile
一大,就很難批量處理,這時候可以聲明變量:
objects = main.o kda.o command.o
那麼上面的makefile可以改成:
objects = main.o kda.o command.o
edit : $(objects)
gcc -o edit $(objects)
通過美元符號$(變量名)
的方式來引用變量。
make
工具會.o
文件對應的.c
文件自動的添加到依賴關係中。如果找到一個foo.o
,那麼對應的foo.c
就會自動的加入到依賴關係並且會在command
中自動隱式添加一行gcc -o
。那麼foo,o
的生成就可以簡寫爲:
foo.o : other_files_list
其中的command
直接就不用寫了。
.PHONY
用來修飾target
,表示它是一個“僞目標”。
總結:
- 顯式規則
- 隱式規則
- 變量定義
- 引用文件
- 註釋
makefile中只有行註釋,註釋以#
開頭。