下面是定義變量的一般方法:
VARNAME=some_text [...]
把變量用括號起來,并在前面加上"$"符號,就可以引用變量的值:
$(VARNAME)
變量一般都在makefile的頭部定義,并且,按照慣例,所有的makefile變量都應該大寫.
在makefile中使用變量
OBJS = howdy.o helper.o
HDRS = helper.h
howdy: $(OBJS) $(HDRS)
gcc $(OBJS) -o howdy
helper.o: helper.c $(HDRS)
gcc -c helper.c
howdy.o: howdy.c
gcc -c howdy.c
hello: hello.c
gcc hello.c -o hello
all: howdy hello
clean:
rm howdy hello *.o
make使用兩種變量:遞歸展開變量和簡單展開變量.遞歸展開變量在引用時逐層展開,即如果在展開式中包含了對其他變量的引用,則這些變量也將被展開,直到沒有需要展開的變量為止,這就是所謂的遞歸展開.
考慮下面的變量定義:
CC = gcc
CC = $(CC) -o
CC在被引用時遞歸展開,從而陷入一個無限循環中:CC將展開為$(CC)的值,從而永遠也讀不到-o選項.
為了避免這個問題,可以使用簡單展開變量.與遞歸展開變量在引用時展開不同,簡單展開變量在定義處展開,并且只展開一次,從而取消了變量的嵌套引用.在定義時,其語法與遞歸展開變量有細微的不同:
CC := gcc -o
CC += -O2
第一個定義使用":="設置CC的值為gcc -o, 第二個定義使用"+="在前面定義的CC后附加了-O2,從而CC最終的值是gcc -o -O2.
除用戶定義變量外,make也允許使用環境變量,自動變量和預定義變量.使用環境變量非常簡單.在啟動時,make讀取已定義的環境變量,并且創建與之同名同值的變量.但是,如果makefile中有同名的變量,則這個變量將取代與之相應的環境變量,所以應當注意這一點.
自動變量
變量 說明
$@ 規則的目標所對應的文件名
$< 規則中的第一個相關文件名
$^ 規則中所有相關文件的列表,以空格為分界符
$? 規則中日期新于目標的所有相關文件的列表,以空格為分隔符
$(@D) 目標文件的目錄部分(如果目標在子目錄中)
$(@F) 目標文件的文件名部分(如果目標在子目錄中)
用于文件名和標志的預定義變量
變量 說明
AR 歸檔維護程序,默認值=ar
AS 匯編程序,默認值=as
CC C編譯程序,默認值=cc
CPP C預處理程序,默認值= cpp
RM 文件刪除程序,默認值="rm -f"
ARFLAGS 傳給歸檔維護程序的標志,默認值=rv
ASFLAGS 傳給匯編程序的標志,沒有默認值
CFLAGS 傳給C編譯器的標志,沒有默認值
CPPFLAGS 傳給C預處理程序的標志,沒有默認值
LDFLAGS 傳給鏈接程序(ld)的標志,沒有默認值
VARNAME=some_text [...]
把變量用括號起來,并在前面加上"$"符號,就可以引用變量的值:
$(VARNAME)
變量一般都在makefile的頭部定義,并且,按照慣例,所有的makefile變量都應該大寫.
在makefile中使用變量
OBJS = howdy.o helper.o
HDRS = helper.h
howdy: $(OBJS) $(HDRS)
gcc $(OBJS) -o howdy
helper.o: helper.c $(HDRS)
gcc -c helper.c
howdy.o: howdy.c
gcc -c howdy.c
hello: hello.c
gcc hello.c -o hello
all: howdy hello
clean:
rm howdy hello *.o
make使用兩種變量:遞歸展開變量和簡單展開變量.遞歸展開變量在引用時逐層展開,即如果在展開式中包含了對其他變量的引用,則這些變量也將被展開,直到沒有需要展開的變量為止,這就是所謂的遞歸展開.
考慮下面的變量定義:
CC = gcc
CC = $(CC) -o
CC在被引用時遞歸展開,從而陷入一個無限循環中:CC將展開為$(CC)的值,從而永遠也讀不到-o選項.
為了避免這個問題,可以使用簡單展開變量.與遞歸展開變量在引用時展開不同,簡單展開變量在定義處展開,并且只展開一次,從而取消了變量的嵌套引用.在定義時,其語法與遞歸展開變量有細微的不同:
CC := gcc -o
CC += -O2
第一個定義使用":="設置CC的值為gcc -o, 第二個定義使用"+="在前面定義的CC后附加了-O2,從而CC最終的值是gcc -o -O2.
除用戶定義變量外,make也允許使用環境變量,自動變量和預定義變量.使用環境變量非常簡單.在啟動時,make讀取已定義的環境變量,并且創建與之同名同值的變量.但是,如果makefile中有同名的變量,則這個變量將取代與之相應的環境變量,所以應當注意這一點.
自動變量
變量 說明
$@ 規則的目標所對應的文件名
$< 規則中的第一個相關文件名
$^ 規則中所有相關文件的列表,以空格為分界符
$? 規則中日期新于目標的所有相關文件的列表,以空格為分隔符
$(@D) 目標文件的目錄部分(如果目標在子目錄中)
$(@F) 目標文件的文件名部分(如果目標在子目錄中)
用于文件名和標志的預定義變量
變量 說明
AR 歸檔維護程序,默認值=ar
AS 匯編程序,默認值=as
CC C編譯程序,默認值=cc
CPP C預處理程序,默認值= cpp
RM 文件刪除程序,默認值="rm -f"
ARFLAGS 傳給歸檔維護程序的標志,默認值=rv
ASFLAGS 傳給匯編程序的標志,沒有默認值
CFLAGS 傳給C編譯器的標志,沒有默認值
CPPFLAGS 傳給C預處理程序的標志,沒有默認值
LDFLAGS 傳給鏈接程序(ld)的標志,沒有默認值