$# => 添加到Shell的参数个数
//
$1~$n => 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
............................
esac
下述的條件語句的例子告訴make如果變數CC 的值是gcc時使用一個資料庫,如不是
則使用其他資料庫。它通過控制選擇兩命令行之一作為該規則的命令來工作。CC=gcc作為
make改變的參數的結果不僅用於決定使用哪一個編譯器,而且決定連接哪一個資料庫。
libs_for_gcc = -
normal_libs =
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
。有四種不同的指令用於測試不同的條件。
ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"
字串替換和分析函數
這裏有一些用於操作字串的函數:
$(subst from,to,text)
在文本text中使用to替換每一處from。例如:
$(subst ee,EE,feet on the street)
結果為fEEt on the strEEt
$(patsubst pattern,replacement,text)
尋找text中符合格式pattern的字,用replacement替換它們。這裏pattern中包含通配符
%,它和一個字中任意個數的字元相匹配。如果replacement中也含有通配符%,則這個%
被和pattern中通配符%匹配的文本代替。在函數patsubst中的%可以用反斜杠(\)引用。
引用字元%的反斜杠可以被更多反斜杠引用。引用字元%和其他反斜杠的反斜杠在比較檔
案名或有一個stem(徑)代替它之前從格式中移出。使用反斜杠引用字元%不會帶來其他
麻煩。例如,格式the\%weird\\%pattern\\'是the%weird\' 加上通配符%'然後和字串pattern\\'
連接。最後的兩個反斜杠由於不能影響任何統配符%所以保持不變。在字之間的空格間被
壓縮為單個空格,前導以及結尾空格被丟棄。例如:
$(patsubst %.c,%.o,x.c.c bar.c)
的結果為:x.c.o bar.o'。
$(strip string)
去掉前導和結尾空格,並將中間的多個空格壓縮為單個空格。這樣,$(strip a b c )'結果為a
b c。函數strip和條件語句連用非常有用。
$(findstring find,in)
在字串in中搜尋find,如果找到,則返回值是find,否則返回值為空。您可以在一個條件
中使用該函數測試給定的字串中是否含有特定的子字串。這樣,下面兩個例子:
$(findstring a,a b c)
$(findstring a,b c)
將分別產生值a和。
$(filter pattern...,text)
返回在text中由空格隔開且匹配格式pattern...的字,對於不符合格式pattern...的字移出。
格式用%寫出,和前面論述過的函數patsubst的格式相同。函數filter可以用來變數分離類
型不同的字串。例如:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
表明foo' 依靠foo.c',bar.c',baz.s' 和ugh.h';但僅有foo.c',bar.c' 和 baz.s' 指明用命
令編譯。
$(filter-out pattern...,text)
返回在text中由空格隔開且不匹配格式pattern...的字,對於符合格式pattern...的字移出。
只是函數filter的反函數。例如:
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
下面產生不包含在變數mains中的OBJ檔的檔列表:
$(filter-out $(mains),$(objects))