扫码一下
查看教程更方便
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 $@
在这个例子中,$@
代表你好,$?
或 $@.cpp
获取所有更改的源文件。
隐式规则中还使用了两个特殊的宏。 他们是
$<
导致操作的相关文件的名称。$*
目标和依赖文件共享的前缀。常见的隐含规则是从 .cpp(源文件)构建 .o(对象)文件。
.cpp.o:
$(CC) $(CFLAGS) -c $<
Alternatively:
.cpp.o:
$(CC) $(CFLAGS) -c $*.c
有各种默认宏。 我们可以通过键入“make -p”打印出默认值来查看它们。 从使用它们的规则来看,大多数都非常明显。
这些预定义变量,即隐式规则中使用的宏,分为两类。 它们如下
下表列出了在 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 合作程序的额外标志。 |
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 | 为 Ratfor 程序提供给 Fortran 编译器的额外标志。 |
14 | LINTFLAGS | 给 lint 的额外标志。 |
注意
我们可以使用“-R
”或“--no-builtin-variables
”选项取消隐式规则使用的所有变量。
我们还可以在命令行定义宏,如下所示
make CPP = /home/courses/cop4530/spring02