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


7.2.3 指定命令的變數

Makefile 應提供變數來覆寫特定的命令、選項等等。

特別是,您應該透過變數來執行大多數的工具程式。因此,如果您使用 Bison,請建立一個名為 BISON 的變數,其預設值設定為 ‘BISON = bison’,並且在您需要使用 Bison 時,使用 $(BISON) 來引用它。

檔案管理工具程式,例如 lnrmmv 等等,不需要以這種方式透過變數來引用,因為使用者不需要將它們替換成其他程式。

每個程式名稱變數都應該帶有一個選項變數,用於為程式提供選項。在程式名稱變數名稱後附加 ‘FLAGS’ 以取得選項變數名稱—例如,BISONFLAGS。(C 編譯器的 CFLAGS、yacc 的 YFLAGS 和 lex 的 LFLAGS 名稱是此規則的例外,但我們保留它們因為它們是標準。)在任何執行前處理器的編譯命令中使用 CPPFLAGS,在任何執行連結的編譯命令以及任何直接使用 ld 的情況下使用 LDFLAGS

如果有些 C 編譯器選項必須用於正確編譯某些檔案,請不要將它們包含在 CFLAGS 中。使用者期望能夠自由地指定 CFLAGS。相反地,安排將必要的選項獨立於 CFLAGS 傳遞給 C 編譯器,方法是在編譯命令中明確地寫出它們,或是定義一個隱含規則,像這樣

CFLAGS = -g
ALL_CFLAGS = -I. $(CFLAGS)
.c.o:
        $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<

請將 ‘-g’ 選項包含在 CFLAGS 中,因為這不是正確編譯必要的。您可以將其視為僅建議的預設值。如果套件預設設定為使用 GCC 編譯,那麼您不妨也將 ‘-O’ 包含在 CFLAGS 的預設值中。

CFLAGS 放在編譯命令的最後,在包含編譯器選項的其他變數之後,以便使用者可以使用 CFLAGS 來覆寫其他選項。

CFLAGS 應該在每次調用 C 編譯器時使用,無論是執行編譯還是執行連結。

每個 Makefile 都應該定義變數 INSTALL,它是將檔案安裝到系統的基本命令。

每個 Makefile 也應該定義變數 INSTALL_PROGRAMINSTALL_DATA。(INSTALL_PROGRAM 的預設值應該是 $(INSTALL)INSTALL_DATA 的預設值應該是 ${INSTALL} -m 644。)然後它應該使用這些變數作為實際安裝的命令,分別用於可執行檔和非可執行檔。這些變數的最小用法如下

$(INSTALL_PROGRAM) foo $(bindir)/foo
$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a

然而,最好在目標檔案上支援 DESTDIR 前綴,這將在下一節中說明。

在一個命令中安裝多個檔案是可以接受的,但不是必需的,最後一個參數是一個目錄,例如

$(INSTALL_PROGRAM) foo bar baz $(bindir)

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