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