Makefile – Macros
make 程序允许你使用宏,它类似于变量。宏在Makefile中被定义为=对。下面是一个例子
MACROS = -me
PSROFF = groff -Tps
DITROFF = groff -Tdvi
CFLAGS = -O -systype bsd43
LIBS = "-lncurses -lm -lsdl"
MYFACE = ":*)"
特殊Macros
在发布目标规则集的任何命令之前,有一些预定义的特殊宏–
- $@是要做的文件的名称。
-
$? 是被改变的附属文件的名称。
例如,我们可以使用如下的规则 −
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
传统的Macros
有各种默认的宏。你可以通过输入 “make -p “打印出默认值来查看它们。大多数从它们所使用的规则中是非常明显的。
这些预定义的变量,即隐含规则中使用的宏,分为两类。它们是这样的
- 作为程序名称的宏(如CC)。
-
含有程序参数的宏(如CFLAGS)。
下面是一些在makefiles的内置规则中作为程序名称使用的常见变量的表格。
序号 | 变量和描述 |
---|---|
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语言翻译成C语言的程序;默认为 “ctangle”。 |
21 | RM 删除文件的命令;默认为`rm -f’。 |
下面是一个变量表,这些变量的值是上述程序的附加参数。所有这些的默认值都是空字符串,除非另有说明。
Sr.No. | 变量和描述 |
---|---|
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获取程序。 |
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