教程 > Makefile > Makefile 基础 阅读:39

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 $@

在这个例子中,$@ 代表你好,$?$@.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 合作程序的额外标志。
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

查看笔记

扫码一下
查看教程更方便