定義規則

快速開始

規則描述了何時以及如何建立某些檔案(規則的目標 )。如果目標檔案的建立所需的任何檔案(目標的先決條件 )比目標檔案更新,它也可以用於更新目標檔案。

規則遵循以下語法:(請注意,遵循規則的命令選項卡縮排 )

targets: prerequisites
        <commands>

其中目標先決條件是檔名或特殊保留名稱和命令 (如果存在)由 shell 執行以構建/重建過時的目標

要執行規則,只需從 Makefile 所在的同一目錄在終端中執行 make 命令即可。在不指定目標的情況下執行 make 將執行 Makefile 中定義的第一個規則。按照慣例, Makefile 中的第一個規則通常稱為 alldefault ,通常將所有有效的構建目標列為先決條件。

make 僅在目標已過期時執行規則,這意味著它不存在或其修改時間早於其任何先決條件。如果先決條件列表為空,則只有在首次呼叫規則以構建目標時才會執行該規則。但是,當規則不建立檔案且目標是虛擬變數時,將始終執行規則。

Version = GNU make

模式規則

模式規則用於指定多個目標並從目標名稱構造先決條件名稱。與普通規則相比,它們更通用,更強大,因為每個目標都有自己的先決條件。在模式規則中,目標和先決條件之間的關係是基於字首(包括路徑名和字尾或兩者)構建的。

想象一下,我們想通過分別編譯 C 指令碼 foo.cbar.c 來構建目標 foo.obar.o。這可以通過使用以下普通規則來完成:

foo.o: foo.c
    cc -c $< -o $@

bar.o: bar.c
    cc -c $< -o $@

其中自動變數 $< 是第一個先決條件的名稱,$@ 是目標的名稱(可在此處找到自動變數的完整列表 )。

但是,由於目標共享相同的字尾,現在可以使用以下模式規則替換上述兩個規則:

%.o: %.c
    cc -c $< -o $@

隱含規則

隱式規則告訴 make 如何使用習慣方法來構建某些型別的目標檔案,這些目標檔案經常被使用。make 使用目標檔名來確定要呼叫的隱式規則。

我們在上一節中看到的模式規則示例實際上並不需要在 Makefile 中宣告,因為 make 具有 C 編譯的隱式規則。因此,在以下規則中,在構建 foo 之前,將使用 C 編譯的隱式規則構建先決條件 foo.obar.o

foo : foo.o bar.o
    cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)

可以在此處找到隱式規則的目錄及其使用的變數。