接下來: Makefile 中的工具程式, 上一層: 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.man 和 sedscript 位於原始碼目錄中。
當使用 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 中的工具程式, 上一層: Makefile 慣例 [目錄][索引]