(1) wildcard函數
作用是查找指定目錄下指定類型的文件,并最終返回一個環境變量,需要用$取值賦值給另一個環境變量!該函數只有一個參數,如取出當前目錄下的所有.c文件,并賦值給allc普通變量:??allc=$(wildcard ./*.c)。
(2) patsubst函數
作用是更換文件的后綴格式,共有三個參數。如將allc的所有.c的文件更換為.o的文件:?allo=$(patsubst %.c,%.o,$(allc))。?
注意以上兩個函數的返回值都為變量值,都必須用$取值。makefile中的所有函數都必須要有返回值。
allo1=$(patsubst %.c,./bin/%.o,$(allc))? 將替換后生成的.o文件都存放在./bin/中,指出路徑。
(3)不帶依賴條件的規則
對于沒有依賴條件,只有目標和命令的規則,說明為了實現該目標,不需要任何依賴條件,直接執行命令即可。makefile直接執行命令。下面舉例說明:? 再次強調一點,每一行的命令前必須有一個tab縮進,這是makefile識別命令的判斷符號。
clean:
??????? -mkdir /aa?? //加-表示,該條命令執行失敗了,也會繼續向下執行下一條命令
? ? ? ? rm -f $(allo) $(target)
?
hello:????????? //舉例說明,這一項在以后中不要
??????? echo "hello, makefile"
[root@localhost src]# make clean? ?//只是執行clea后面的命令即可
[root@localhost src]# make hello? ?//只是執行hello后面的命令即可
如果在makefile文件目錄中有一個以clean或hello名字為名的文件(即相同了),則make clean和make hello不會執行命令,需要進行偽目標聲明,即:
.PHONY:clean??????? //偽目標的聲明
clean:
??????? -mkdir /aa?? //加-表示,該條命令執行失敗了,也會繼續向下執行下一條命令
? ? ? ? rm -f $(allo) $(target)
?
.PHONY:hello? ? ? ? //偽目標的聲明
hello:????????? //舉例說明,這一項在以后中不要
??????? echo "hello, makefile"
最后,如果makefile文件不是以makefile或Makefile為名字,需要加上-f參數:make -f filename
下面給出之前例子makefile書寫的最終版,即把一個規則,兩個變量和三個函數結合:
[root@localhost src]# ls
a ?add.c ?div.c ?main.c ?makefile ?mul.c ?sub.c
[root@localhost src]# vim zsxmakefile
allc=$(wildcard ./*.c)? ? //獲取所有的.c文件
obj=$(patsubst %.c,%.o,$(allc))? ?//更換為.o文件,取得目標文件
target=zsx
$(target):$(obj)
? ? ? ? $(CC) -ggdb3 $^ -o $@
main.o:main.c
? ? ? ? $(CC) -pedantic -Wall -pipe -c $^ -o $@ -I ../include
%.o:%.c
? ? ? ? $(CC) -pedantic -Wall -pipe -c $< -o $@
? ? ? ??
.PHONY:clean1? //偽目標的聲明
clean1:
? ? ? ? -mkdir b? ? //-代表該條命令執行失敗了,也會繼續向下執行下一條命令
? ? ? ? rm -f $(obj) $(target)
.PHONY:hello? ?? //偽目標的聲明
hello:
? ? ? ? echo "hello, makefile"
[root@localhost src]# rm -f makefile?
[root@localhost src]# ls
a ?add.c ?div.c ?main.c ?mul.c ?sub.c ?zsxmakefile
[root@localhost src]# make -f zsxmakefile? ?//此時需要加-f參數
cc -pedantic -Wall -pipe -c mul.c -o mul.o
cc -pedantic -Wall -pipe -c main.c -o main.o -I ../include
cc -pedantic -Wall -pipe -c add.c -o add.o
cc -pedantic -Wall -pipe -c div.c -o div.o
cc -pedantic -Wall -pipe -c sub.c -o sub.o
cc -ggdb3 mul.o main.o add.o div.o sub.o -o zsx
[root@localhost src]# ls
a ?add.c ?add.o ?div.c ?div.o ?main.c ?main.o ?mul.c ?mul.o ?sub.c ?sub.o ?zsx ?zsxmakefile
[root@localhost src]# make -f zsxmakefile clean1? ? //注意使用方法? 如果文件名字是makefile或Makefile,則直接為make clean1
mkdir b
rm -f ./mul.o ./main.o ./add.o ./div.o ./sub.o zsx
[root@localhost src]# ls
a ?add.c ?b ?div.c ?main.c ?mul.c ?sub.c ?zsxmakefile
[root@localhost src]# make -f zsxmakefile hello //注意使用方法
echo "hello, makefile"
hello, makefile
?
//注意區分make、make clean、make hello的作用