命令(COMMAND)是make 執(zhí)行的動作,一個可以有多個命令,每個占一行 。
注意:每個命令行的起始字符必須為TAB 字符!
有依賴關(guān)系規(guī)則中的命令通常在依賴文件變化時負責(zé)產(chǎn)生target 文件,make 執(zhí)行這些命令更新或產(chǎn)生target 。規(guī)則可以沒有依賴關(guān)系,如包含target “clean”的規(guī)則 。
規(guī)則解釋如何和何時重做該規(guī)則中的文件,make 根據(jù)依賴關(guān)系執(zhí)行產(chǎn)生或更新目標(biāo);規(guī)則也說明如何和何時執(zhí)行動作 。有的規(guī)則看起來很復(fù)雜,但都符合上述模式 。
1.4 make 工作原理
缺省make 從第一個target 開始(第一個非 "." 開始的target),這稱作缺省目標(biāo) 。在上述的makefile 中,缺省目標(biāo)是更新執(zhí)行程序"edit",將這個目標(biāo)置于最前面 。當(dāng)執(zhí)行make 的時候,make 程序從當(dāng)前目錄讀入makefile 開始處理第一個規(guī)則;在例子中,這個規(guī)則是重新鏈接"edit";在make 處理這個規(guī)則之前,必須處理"edit"所依賴的那些文件的規(guī)則,例子中是目標(biāo)文件 。這些文件按照他們自己的規(guī)則處理:通過編譯源文件來更新每個".o"文件;當(dāng)依賴關(guān)系中的源文件或頭文件比目標(biāo)文件新,或目標(biāo)文件不存在時,必須重新編譯 。
其它的規(guī)則被處理是因為他們的target是目標(biāo)的依賴,和目標(biāo)沒有依賴關(guān)系的規(guī)則不會被處理,除非指定make 處理(如make clean) 。在重新編譯目標(biāo)文件之前,make 會試圖更新它的依賴:源文件和頭文件 。例子中的makefile 對源文件和頭文件未指定任何操作:".c"和".h"文件不是任何規(guī)則的目標(biāo) 。確認所有的目標(biāo)文件都是最新的之后,make 決定是否重新鏈接"edit":如果"edit"不存在,或者任何一個目標(biāo)文件都比它新,則鏈接工作將進行 。
這樣,如果我們改變insert.c 運行make,make 會編譯這個文件來更新"insert.o",然后鏈接"edit";如果修改了"command.h"運行make,"kbd.o","command.o","files.o"會重新生成,鏈接"edit" 。
1.5 使用變量
在例子中,在規(guī)則"edit"中,目標(biāo)文件被列出來兩次:
edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
這樣的重復(fù)容易出錯:假設(shè)工程中加入了一個新的目標(biāo)文件,可能只將其加入了一個列表中;通過使用變量可以消除這種風(fēng)險:變量允許一個預(yù)定義的字符串在多個地方被替換 。
在makefile 中,可以寫這樣一行來定義"object"變量:
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
于是在需要目標(biāo)文件名列表的地方,使用$(object) 來代替變量的值 。以下是使用了變量以后的makefile:
----------------------------------------------------------------------------
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)
--------------------------------------------------------------------------------
1.6 簡化命令
為每個文件寫出編譯命令不是必要的,因為make 可以自己來做;以".c"文件更新".o"文件有一個隱含的規(guī)則,使用"cc -c"命令 。Make 將利用"cc -c main.c -o main.o"來將main.c 編譯為main.o,因此在生成目標(biāo)文件的規(guī)則中,可以省略命令 。
推薦閱讀
- q點是什么 簡介q點是什么
- 布朗族主要分布在哪里 布朗族簡介
- 白居易字什么晚年號是什么 白居易的簡介晚年號
- gawk的使用方法
- vi 簡介
- 關(guān)于gcc、gdb 和gmake 的資料
- Makefile工具的使用
- 佛教八大菩薩簡介
- 白鹿原簡介
- FreeBSD中/etc下的文件簡介
