接下來: , 上一層: Makefile 慣例   [目錄][索引]


7.2.1 Makefile 的通用慣例

每個 Makefile 都應包含這行

SHELL = /bin/sh

以避免在 SHELL 變數可能從環境繼承的系統上發生問題。(這在使用 GNU make 時永遠不會是問題。)

不同的 make 程式有不相容的後綴列表和隱含規則,這有時會造成混淆或行為異常。因此,最好明確設定後綴列表,僅使用特定 Makefile 中需要的後綴,如下所示

.SUFFIXES:
.SUFFIXES: .c .o

第一行清除後綴列表,第二行引入所有可能受此 Makefile 中隱含規則約束的後綴。

請勿假設 . 在命令執行的路徑中。當您需要在 make 期間執行作為套件一部分的程式時,請確保如果程式是作為 make 的一部分建置的,則使用 ./,如果檔案是原始碼的不變部分,則使用 $(srcdir)/。若沒有這些前綴之一,則會使用目前搜尋路徑。

./ (建置目錄) 和 $(srcdir)/ (原始碼目錄) 之間的區別很重要,因為使用者可以使用 ‘--srcdir’ 選項到 configure 在不同的目錄中進行建置。 形式如下的規則

foo.1 : foo.man sedscript
        sed -f sedscript foo.man > foo.1

當建置目錄不是原始碼目錄時,將會失敗,因為 foo.mansedscript 位於原始碼目錄中。

當使用 GNU make 時,在只有單一相依性檔案的情況下,依賴 ‘VPATH’ 尋找原始檔會有效,因為 make 自動變數 ‘$<’ 將表示原始檔,無論它在哪裡。(許多版本的 make 僅在隱含規則中設定 ‘$<’。) 類似以下的 Makefile 目標

foo.o : bar.c
        $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o

應該改寫為

foo.o : bar.c
        $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@

為了讓 ‘VPATH’ 正常運作。當目標有多個相依性時,使用明確的 ‘$(srcdir)’ 是讓規則良好運作的最簡單方法。例如,上面 foo.1 的目標最好寫成

foo.1 : foo.man sedscript
        sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@

GNU 發行版通常包含一些非原始檔的檔案—例如,Info 檔案,以及來自 Autoconf、Automake、Bison 或 Flex 的輸出。由於這些檔案通常出現在原始碼目錄中,因此它們應始終出現在原始碼目錄中,而不是建置目錄中。因此,用於更新它們的 Makefile 規則應將更新後的檔案放在原始碼目錄中。

然而,如果檔案未出現在發行版中,則 Makefile 不應將其放在原始碼目錄中,因為在一般情況下建置程式不應以任何方式修改原始碼目錄。

嘗試使建置和安裝目標,至少 (以及它們的所有子目標) 在平行 make 下能正確運作。


接下來: , 上一層: Makefile 慣例   [目錄][索引]