
- Makefile 教程
- Makefile - 首頁
- Makefile - 為什麼使用 Makefile?
- Makefile - 宏
- Makefile - 依賴關係
- Makefile - 規則
- Makefile - 字尾規則
- Makefile - 指令
- Makefile - 重新編譯
- Makefile - 其他功能
- Makefile - 示例
- Makefile 快速指南
- Makefile - 快速指南
- Makefile - 有用資源
- Makefile - 討論
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