Makefile - 宏



make 程式允許您使用宏,宏類似於變數。宏在 Makefile 中定義為 = 對。下面顯示了一個示例:

MACROS  = -me
PSROFF  = groff -Tps
DITROFF = groff -Tdvi
CFLAGS  = -O -systype bsd43
LIBS    = "-lncurses -lm -lsdl"
MYFACE  = ":*)"

特殊宏

在目標規則集中發出任何命令之前,都預定義了一些特殊的宏:

  • $@ 是要建立的檔名。

  • $? 是已更改的依賴項的名稱。

例如,我們可以使用如下規則:

hello: main.cpp hello.cpp factorial.cpp
   $(CC) $(CFLAGS) $? $(LDFLAGS) -o $@

Alternatively:

hello: main.cpp hello.cpp factorial.cpp
   $(CC) $(CFLAGS) $@.cpp $(LDFLAGS) -o $@

在此示例中,$@ 代表 hello,而 $? 或 $@.cpp 則獲取所有已更改的原始檔。

隱式規則中還使用了另外兩個特殊的宏。它們是:

  • $< 導致操作的相關檔案的名稱。

  • $* 目標檔案和依賴檔案共享的字首。

常見的隱式規則是根據 .cpp(原始檔)構建 .o(目標檔案)。

.cpp.o:
   $(CC) $(CFLAGS) -c $<

Alternatively:

.cpp.o:
   $(CC) $(CFLAGS) -c $*.c

常規宏

有各種預設宏。您可以透過鍵入“make -p”來列印預設值。從它們使用的規則中,大多數都很明顯。

這些預定義的變數,即隱式規則中使用的宏,分為兩類。如下所示:

  • 程式名稱的宏(例如 CC)

  • 包含程式引數的宏(例如 CFLAGS)。

以下是 Makefile 內建規則中用作程式名稱的一些常用變數的表格:

序號 變數及描述
1

AR

維護檔案的程式;預設為 `ar`。

2

AS

編譯彙編檔案的程式;預設為 `as`。

3

CC

編譯 C 程式的程式;預設為 `cc`。

4

CO

從 RCS 中檢出檔案的程式;預設為 `co`。

5

CXX

編譯 C++ 程式的程式;預設為 `g++`。

6

CPP

執行 C 預處理器的程式,結果輸出到標準輸出;預設為 `$(CC) -E`。

7

FC

編譯或預處理 Fortran 和 Ratfor 程式的程式;預設為 `f77`。

8

GET

從 SCCS 中提取檔案的程式;預設為 `get`。

9

LEX

用於將 Lex 語法轉換為原始碼的程式;預設為 `lex`。

10

YACC

用於將 Yacc 語法轉換為原始碼的程式;預設為 `yacc`。

11

LINT

用於對原始碼執行 lint 的程式;預設為 `lint`。

12

M2C

用於編譯 Modula-2 原始碼的程式;預設為 `m2c`。

13

PC

編譯 Pascal 程式的程式;預設為 `pc`。

14

MAKEINFO

將 Texinfo 原始檔轉換為 Info 檔案的程式;預設為 `makeinfo`。

15

TEX

從 TeX 原始檔建立 TeX dvi 檔案的程式;預設為 `tex`。

16

TEXI2DVI

從 Texinfo 原始檔建立 TeX dvi 檔案的程式;預設為 `texi2dvi`。

17

WEAVE

將 Web 轉換為 TeX 的程式;預設為 `weave`。

18

CWEAVE

將 C Web 轉換為 TeX 的程式;預設為 `cweave`。

19

TANGLE

將 Web 轉換為 Pascal 的程式;預設為 `tangle`。

20

CTANGLE

將 C Web 轉換為 C 的程式;預設為 `ctangle`。

21

RM

刪除檔案的命令;預設為 `rm -f`。

以下是對上述程式提供額外引數的變數的表格。所有這些變數的預設值為空字串,除非另有說明。

序號 變數及描述
1

ARFLAGS

傳遞給檔案維護程式的標誌;預設為 `rv`。

2

ASFLAGS

在顯式呼叫 `.s` 或 `.S` 檔案上的彙編程式時,要傳遞的額外標誌。

3

CFLAGS

傳遞給 C 編譯器的額外標誌。

4

CXXFLAGS

傳遞給 C 編譯器的額外標誌。

5

COFLAGS

傳遞給 RCS co 程式的額外標誌。

6

CPPFLAGS

傳遞給 C 預處理器和使用它的程式(例如 C 和 Fortran 編譯器)的額外標誌。

7

FFLAGS

傳遞給 Fortran 編譯器的額外標誌。

8

GFLAGS

傳遞給 SCCS get 程式的額外標誌。

9

LDFLAGS

當編譯器應該呼叫連結器 `ld` 時,要傳遞給編譯器的額外標誌。

10

LFLAGS

傳遞給 Lex 的額外標誌。

11

YFLAGS

傳遞給 Yacc 的額外標誌。

12

PFLAGS

傳遞給 Pascal 編譯器的額外標誌。

13

RFLAGS

傳遞給 Fortran 編譯器以用於 Ratfor 程式的額外標誌。

14

LINTFLAGS

傳遞給 lint 的額外標誌。

注意 - 您可以使用 `-R` 或 `--no-builtin-variables` 選項取消隱式規則使用的所有變數。

您也可以在命令列中定義宏,如下所示:

make CPP = /home/courses/cop4530/spring02
廣告