1.makefile的簡介
自動化編譯鏈接生成目標程序
2.makefile的規則
2.1
TARGET... :PREREQUISITES...
COMMAND
...
...
command:規則的命令行。是規則所要執行的動作(shell命令或者是在shell下執行的程序)。它限定了make執行這條規則時所需要的動作。
一個規則可以有多個命令行,每一條命令佔一行。注意:每一個命令行必須以[Tab]字符開始,[Tab]字符告訴make此行是一個命令行當在shell提示符下輸入“make”命令以後。make讀取當前目錄下的Makefile文件,並將Makefile文件中的第一個目標作爲其執行的“終極目標”,開始處理第一個規則(終極目標所在的規則)。
例如:
#sample Makefile
edit : main.o kbd.ocommand.o display.o \
insert.osearch.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.osearch.o files.o utils.o
main.o : main.cdefs.h
cc -c main.c
kbd.o : kbd.c defs.hcommand.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.cdefs.h buffer.h
cc -cinsert.c
search.o : search.cdefs.h buffer.h
cc -c search.c
files.o : files.cdefs.h buffer.h command.h
cc -cfiles.c
utils.o : utils.cdefs.h
cc -cutils.c
clean :
rm editmain.o kbd.o command.o display.o \
insert.osearch.o files.o utils.o
注意事項:書寫時,可以將一個較長行使用反斜線(\)來分解爲多行,這樣可以使我們的Makefile書寫清晰、容易閱讀理解。但需要注意:反斜線之後不能有空格(這也是大家最容易犯的錯誤,錯誤比較隱蔽)。
2.2.指定變量
objects = main.okbd.o command.o display.o \
insert.o search.ofiles.o utils.o
“objects”作爲一個變量,它代表所有的.o文件的列表。在定義了此變量後,我們就可以在需要使用這些.o文件列表的地方使用“$(objects)”來表示它,而不需要羅列所有的.o文件列表2.3 清除工作目錄過程文件
clean :
rm edit $(objects)
在實際應用時,我們把這個規則寫成如下稍微複雜一些的樣子。以防止出現始料未及的情況。
2004年9月11日18GNU make中文手冊
.PHONY : clean
clean :
-rm edit $(objects)
這兩個實現有兩點不同: 1. 通過“.PHONY”特殊目標將“clean”目標聲明爲僞目標。避免當磁盤上存在一個名爲“clean”文件時,目標“clean”所在規則的命令無法執行。 在rm前加 ‘-’,避免rm執行時的錯誤。1.當前目錄下存在一個源文件foo.c的,我們可以使用“make foo.o”來使用make的隱含規則自動生成foo.o。當執行“make foo.o”時。我們可以看到其執行的命令爲:
cc –c –o foo.o foo.c
foo.o將會被創建或者更新。
2.如果當前目錄下沒有foo.c文件時,就是make對.o文件目標的隱含規則中依賴文件不存在。如果使用命令“make foo.o”時,將回到到如下提示:
make: *** No rule to make target ‘foo.o’. Stop.
3. 如果直接使用命令“make”時,得到的提示信息如下:
make: *** No targetsspecified and no makefile found. Stop.3 makefile的規則
我們來看一個規則的例子:
foo.o : foo.c defs.h# module for twiddling the frobs
cc -c -g foo.c
4.函數wildcard
作用:使通配符有效,就需要使用函數“wildcard”,它的用法是:$(wildcardPATTERN...)
例如:
#sample Makefile
objects :=$(patsubst %.c,%.o,$(wildcard *.c)) #定義變量
foo : $(objects) #引用變量
cc -o foo $(objects) #command