Makefile 指令
有好幾種指令以不同的形式。讓程序可能不支持所有指令。因此,請檢查make是否支持指令,我們這裡解釋。 GNU make支持這些指令
條件指令
條件的指令
-
ifeq 指令開始的條件,指定的條件。它包含兩個參數,用逗號分隔,並用括號括起。兩個參數進行變量替換,然後對它們進行比較。該行的makefile繼IFEQ的服從如果兩個參數的匹配,否則會被忽略。
-
ifneq 指令開始的條件,指定的條件。它包含兩個參數,用逗號分隔,並用括號括起。兩個參數進行變量替換,然後對它們進行比較。makefile ifneq 遵守如果兩個參數不匹配,否則會被忽略。
-
ifdef 指令開始的條件,指定的條件。它包含單參數。如果給定的參數為真,則條件為真。
-
ifndef 指令開始的條件,指定的條件。它包含單參數。如果給定的是假的,那麼條件為真。
-
else 指令會導致以下行如果前麵的條件未能被遵守。在上麵的例子中,這意味著第二個選擇連接命令時使用的第一種選擇是不使用。它是可選的,在有條件有一個else。
-
endif 指令結束條件。每一個條件必須與endif結束。
條件式指令的語法
一個簡單的條件,冇有其他的語法如下:
conditional-directive text-if-true endif |
文本如果真可以是任何行文字,被視為makefile文件的一部分,如果條件為真。如果條件是假的,冇有文字來代替。
一個複雜的語法條件如下:
conditional-directive text-if-true else text-if-false endif |
如果條件為真時,文本,如果真正的使用,否則,如果假文本來代替。的文本,如果錯誤的數量可以是任意的文本行。
有條件的指令的語法是相同的,無論是簡單或複雜的條件。有四種不同的測試不同條件下的指令。這裡是一個表:
ifeq (arg1, arg2) ifeq 'arg1' 'arg2' ifeq "arg1" "arg2" ifeq "arg1" 'arg2' ifeq 'arg1' "arg2" |
上述條件相反的指令如下
ifneq (arg1, arg2) ifneq 'arg1' 'arg2' ifneq "arg1" "arg2" ifneq "arg1" 'arg2' ifneq 'arg1' "arg2" |
條件式指令示例
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 |
include 指令
include指令告訴make暫停讀取當前makefile文件和讀取一個或多個其它的makefile,然後再繼續。該指令是一行在makefile中,看起來像這樣:
include filenames... |
文件名可以包含shell文件名模式。允許額外的空格開頭的行被忽略,但不允許一個標簽。例如,如果有三個`.mk',`.mk' files, `a.mk', `b.mk', and `c.mk', and $(bar) 擴展到bash中,然後下麵的表達式。
include foo *.mk $(bar) is equivalent to include foo a.mk b.mk c.mk bish bash |
當MAKE處理包括指令,它包含的makefile暫停讀取,並從各列出文件中依次讀取。當這個過程完成,使讀取指令出現在其中的makefile的恢複。
override 指令
如果一個變量已經設置的命令參數,在makefile中被忽略的普通任務。如果要設置makefile的變量,即使它被設置的命令參數,可以使用一個override指令,這是一行看起來像這樣:
override variable = value or override variable := value |