下面是定義變量的一般方法:
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)的標志,沒有默認值