- 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) [email protected] $(LDFLAGS) -o $@
在此示例中,$@ 代表 hello,而 $? 或 [email protected] 则获取所有已更改的源文件。
隐式规则中还使用了另外两个特殊的宏。它们是:
$< 导致操作的相关文件的名称。
$* 目标文件和依赖文件共享的前缀。
常见的隐式规则是根据 .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