makefile語法?比較參數(shù)“arg1”和“arg2”的值是否相同。當(dāng)然,參數(shù)中我們還可以使用make的函數(shù)。如:ifeq ($(strip $(foo)),)
Makefile語法基礎(chǔ)
在Linux下,自動(dòng)化編譯是通過make命令來完成的(一些廠商也提供了它們自己的make命令,如gmake等),make命令的基本格式如下:
make
[-f
makefile]
[label]
它可以通過-f參數(shù)指定輸入文件,當(dāng)省略-f參數(shù)時(shí),默認(rèn)輸入文件名為Makefile,由于我們通常不用這個(gè)-f參數(shù),往往就用默認(rèn)的Makefile文件名。
Makefile是一個(gè)文本文件,它是基于一定的語法規(guī)則的,它的基本執(zhí)行規(guī)則定義如下:
target
:
[prerequisites]
command
target
標(biāo)簽,用于標(biāo)志當(dāng)前構(gòu)建的規(guī)則,它也可以是文件。
prerequisites
依賴項(xiàng),在構(gòu)建該標(biāo)簽的時(shí)候先執(zhí)行的規(guī)則
command
make需要執(zhí)行的命令。(任意的Shell命令)
注意:Makefile的target是頂格寫的,而Command需要加一個(gè)Tab鍵。我這里為了排版看起來舒服點(diǎn),每一行都多加了一個(gè)Tab鍵,如果要使用本文的Makefile示例,請(qǐng)去掉各行的第一個(gè)Tab鍵,否則make的時(shí)候報(bào)錯(cuò)。
例如,我們編寫一個(gè)簡(jiǎn)單的Makefile:
clean:
@echo
"clean"
all:
@echo
"all"
當(dāng)我們直接執(zhí)行make命令的時(shí)候,輸出如下:
tianfang
>
make
clean
tianfang
>
make
all
all
tianfang
>
make
clean
clean
從中我們可以看到:默認(rèn)情況下構(gòu)建第一個(gè)標(biāo)簽。
makefile中ifeq,ifneq,ifdef和ifndef的區(qū)別與用法
使用條件判斷,可以讓make根據(jù)運(yùn)行時(shí)的不同情況選擇不同的執(zhí)行分支。條件表達(dá)式可以是比較變量的值,或是比較變量和常量的值。
一、示例
下面的例子,判斷$(CC)變量是否“gcc”,如果是的話,則使用GNU函數(shù)編譯目標(biāo)。
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
可見,在上面示例的這個(gè)規(guī)則中,目標(biāo)“foo”可以根據(jù)變量“$(CC)”值來選取不同的函數(shù)庫來編譯程序。
我們可以從上面的示例中看到三個(gè)關(guān)鍵字:ifeq、else和endif。ifeq的意思表示條件語句的開始,并指定一個(gè)條件表達(dá)式,表達(dá)式包含兩個(gè)參數(shù),以逗號(hào)分隔,表達(dá)式以圓括號(hào)括起。else表示條件表達(dá)式為假的情況。endif表示一個(gè)條件語句的結(jié)束,任何一個(gè)條件表達(dá)式都應(yīng)該以endif結(jié)束。
@在Makefile一般用來解析shell命令,
如
@if [ ! -d $(CPU) ]; then mkdir $(CPU); fi
后面跟的是shell的判斷語句。
你可以用@把shell命令放在Makefile中執(zhí)行。
$@是Makfile里的一種自動(dòng)化變量,代表目前規(guī)則中所有的目標(biāo)的集合,在模式規(guī)則中,如果有多個(gè)目標(biāo),那么,"$@"就是匹配于目標(biāo)中模式定義的集合。
Makefile規(guī)則語法
targets : prerequisites
command
...
$@就是對(duì)應(yīng)targets目標(biāo)集合。
舉個(gè)例子具體說明:
objects = t1.o t2.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
這里objects包含兩個(gè)目標(biāo),t1.o和t2.o,$@就代表objects,也即{t1.o t2.o}這個(gè)目標(biāo)集合。
makefile 語法里沒有直接類似if...elseif...else.....的這種結(jié)構(gòu),但是有類似 if ...else ...語句的結(jié)構(gòu): ifeq...else...endif。所以可用嵌套的方式 實(shí)現(xiàn)if...elseif...else.....的這種結(jié)構(gòu)
ifeq (
例如:
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
ifeq ($(CC),gplus)
libs=$(libs_for_gplus)
else
libs=$(normal_libs)
endif
endif
以上就是makefile語法的全部?jī)?nèi)容,(RM) *.o *.d $(EXES)這個(gè) Makefile 文件實(shí)現(xiàn)了在編譯程序“ foo”使用優(yōu)化選項(xiàng)“ -O2”但不使用調(diào)試選項(xiàng) “ -g”,而在編譯“ bar”時(shí)采用了“ -g”但沒有“ -O2”。這就是目標(biāo)指定變量的靈活之 處。