日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

GNU Make 簡介( 二 )


命令(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ī)則中,可以省略命令 。

推薦閱讀