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