make and Makefile學習之一Makefile檔案書寫規則
- 一、基礎使用
- 附A.1 關于變數的說明
- 附 B.1 vpath關鍵字使用
- 附 C.1 使用格式
- 附 D.1隱式規則
- 附 E.1 偽目標
一、基礎使用
test $ ls -l
總用量 20
drwxrwxr-x 2 hww-arm hww-arm 4096 9月 12 13:14 file
drwxrwxr-x 2 hww-arm hww-arm 4096 9月 12 13:14 hello
drwxrwxr-x 2 hww-arm hww-arm 4096 9月 12 11:03 include
-rw-rw-r-- 1 hww-arm hww-arm 558 9月 12 11:02 main.c
-rw-rw-r-- 1 hww-arm hww-arm 339 9月 12 13:26 Makefile
test $ vim Makefile
#以下為Makefile檔案內容
#/*以下為常用模板,用于Makefile資訊*/
VERSION = 1
PATCHLEVEL = 0
SUBLEVEL = 0
EXTRAVERSION =
NAME = TEST
CC =gcc #變數CC定義編譯器,關于變數說明, 見附A.1
FLAGS = #變數FLAGS為編譯器引數
LD = #變數LD為編譯器的鏈接,如使用到執行緒時,需要定義變數LD = lpthread
vpath %.c ./hello/ #見附B.1
vpath %.c ./file/
MYOBJ_o = main.o file.o hello.o #變數MYOBJ_o,用于保存所有的依賴檔案*.o
myobj : $(MYOBJ_o) #見附C.1
$(CC) -o myobj $(MYOBJ_o)
main.o : main.c
$(CC) -c main.c
file.o : file.c #見附D.1
hello.o : hello.c
clean :
-rm -f *.o myobj
.PHONY:clean #見附E.1
#/* Makefile end */
test $ make
gcc -c main.c
gcc -c -o hello.o ./hello/hello.c
gcc -c -o file.o ./file/file.c
gcc -o myobj main.o hello.o file.o
附A.1 關于變數的說明
1、Makefile檔案中,變數名可以自定義,一般能表達其意思即可,在linux內核中,一般前面幾行都用如下變數用于表達Kernel版本資訊:
VERSION =
PATCHLEVEL =
SUBLEVEL =
EXTRAVERSION =
NAME =
以上普通變數類似于c語言中的宏,在C語言中,但使用變數方式和C語言中的宏有區別,Makefile中變數的使用方式:
$(VERSION)
2、變數中的變數 : ’ = ’ 、 ’ := ’ 、 ’ ?= ’ 、 ‘ += ’
2.1 = 運算子
1、 = 左側為變數,右側為變數的值,但這個值可以也是變數;
2、 = 右側的值不一定是已經定義好的,可以是在后續行中定義的,即,支持以下方式:
NAME = $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
3、例:
#/*vim Makefile start */
NAME = $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
.PHONY:all
#/* end*/
test $ make
echo Zhang San
Zhang San
2.2 := 運算子
:=運算子和=運算子不同之處在于,使用 := 右側的變數前,變數必須賦值,否則認為主空,
例:
#/*vim Makefile start */
NAME := $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
.PHONY:all
#/* end*/
test $ make
echo
2.3 ?= 運算子
?=運算子和=運算子不同之處在于,如果事先變數被賦值,此次將不再被賦值,如果沒有賦值,將被賦值
例:
#/*vim Makefile start */
NAME = Li Si
NAME ?= $(FIRST) $(LAST)
NAME2 ?= $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
echo $(NAME2)
.PHONY:all
#/* end*/
test $ make
echo Li Si
Li Si
echo Zhang San
Zhang San
2.4 += 運算子
+=運算子功能:如果變數事先定義了值,現在需要進行增加值,此時可以使用
例:
#/*vim Makefile start */
NAME = Li Si
NAME += $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
.PHONY:all
#/* end*/
test $ make
echo Li Si Zhang San
Li Si Zhang San
附 B.1 vpath關鍵字使用
vpath關鍵字使用方法:
vpath <pattern> <dir> //在dir目錄中搜索pattern規則的檔案如:%.c檔案 、%.o檔案 、.h檔案等
vpath <pattern> //洗掉某個搜索規則,如不搜索.h檔案
vpath //取消所有的搜索,只搜索當前目錄
一般可用于配合隱匿規則使用
附 C.1 使用格式
1、Makefile檔案中,使用目標檔案有兩種表達方式:
方式一:
targets(即目標檔案) : prerequistites(即依賴檔案)
command1(即生成目標檔案需要執行的命令)
command2
............
方式二:
targets(即目標檔案) : prerequistites(即依賴檔案);command1
command2
............
附 D.1隱式規則
make工具會自動使用gcc -c 命令,將一個擴展名為.c的源檔案編譯成一個同名的.o的目標檔案,
因此,當編譯一個單獨的.c檔案到.o檔案時,可以使用隱含的規則,讓make工具自己推導
此案例中,使用vpath關鍵字和隱式規則配合使用,
附 E.1 偽目標
1、偽目標格式:
偽目標 :
command
.PHONY 偽目標
2、使用
make 偽目標
3、例
test $ make clean
根據實體,執行make clean命令后,將會執行執行命令:
-rm *.o myobj
這個命令比shell中多了一個符號 ‘ - ’,其作用是忽略命令執行錯誤,繼續向下執行,即,如果沒有.o檔案,也會洗掉myobj檔案,反之相同,
和上述命令具有相同功能的命令方式如下:
clean :
rm *.o myobj
.IGNORE:clean
#//同樣宣告clean為偽目標,并且忽略命令執行程序中的錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42377.html
標籤:java
