Makefile的宏
程序员文章站
2022-03-15 22:23:42
...
Makefile的宏分为俩种:普通的宏和特殊的宏
-
普通的宏:
Makefile中普通的宏类似于变量。可以使用类似于下例的方式来定义:
MACROS = -me #后续需要使用 -me时 可以使用 MACROS 与一些运算符进行配合使用 #例如: $(MACROS) #主要用于增加代码的可读性 PSROFF = groff -Tps DITROFF = groff -Tdvi CFLAGS = -O -systype bsd43 LIBS = "-lncurses -lm -lsdl" #编译当中使用了哪些库 也可以使用宏来进行替换, #这样就大大的减少了代码的复杂度,让代码更加容易理解。 LIBS += -lstdc++ #可以使用运算往宏的内容中追加内容 MYFACE = ":*)" #使用示例 $(MYFACE) #增加了可阅读性 Myface(笑脸) = ":*)" 可以放其他使用者很快的明白其中的意义 #宏可以随意命名 #例如: PROJ_HOME = /home/lavendercc/projects #使用宏来替换具体路径,同样增加了代码的可读性 #同时也减少了代码的复杂度 #调用方法 $(宏的名称) #例如: $(PROJ_HOME)
注意点:一旦宏被定义了,在这个宏之前同名的定义都将作废。
-
特殊的宏
在目标规则集发出任何命令之前,有一些特殊的宏
[email protected] #表示目标文件
$? #表示比目标文件还要新的依赖文件列表
可以使用下面一个例子来测试一下:
hello: main.cpp hello.cpp factorial.cpp
$(CC) $(CFLAGS) $? $(LDFLAGS) -o [email protected]
#hello 编译生成的执行文件名
#main.cpp hello.cpp factorial.cpp 编译所需要的条件(文件)
#$(CC) $(CFLAGS) $? $(LDFLAGS) -o [email protected] 编译所要执行的规则
#[email protected] 代替的 hello 这个目标文件 CC表示进行的是 C++ 的编译
#$? 会将所需要的条件(文件)按顺序填入(如果其中有文件的修改时间比目标文件更新,
#则修改时间比目标文件旧的文件不会被编译,修改时间比目标文件新的会进行编译
alternatively:
hello: main.cpp hello.cpp factorial.cpp
$(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]
#[email protected] 将hello 下面所依赖的 .cpp文件全部进行编译
#(不存在时间筛选,每次编译时都会将全部 .cpp文件都再次编译一次)
常用的一些特殊的宏:
#俩个特殊的隐含规则中使用的宏
$< #表示第一个依赖文件
$* #这个变量表示目标模式中 "%"及其之前的部分
#注意点:如果目标模式是Make工具可以天然识别的模式可以不需要 %符号也可以进行识别
#例如:
#对于$* 如果目标是"dir/a.foo.b",并且目标模式是"a.%.b",那么"$*"的值就是"dir/a.foo"
#(%之前的所有文件)。
#如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是Make所识别的,
#那么"$*"就是除了后缀的那一部分。
#例如:
#如果目标是 "foo.c",因为".c"是Make所能识别的后缀名,所以"$*"的值就是"foo"
#这个特性是GNU make的,很有可能不兼容于其他版本的make,所以应该尽量避免使用"$*",
#除非在隐含规则或是静态模式中。如果目标中的后辍是make所不能识别的,那么"$*"就是空值。
#使用示例:
.o.cpp:
$(CC) $(CFLAGS) -c $<
#常见的隐含规则的构造 .o(对象)文件 , .cpp(源文件)
#$< 相当于 main.cpp == $*.cpp
alternatively:
.o.cpp:
$(CC) $(CFLAGS) -c $*.cpp
-
传统的宏
在Makefile中有许多传统的默认宏(输入”make -p“打印出来的默认值)。大多数情况下它们使用的规则是很明显的: 这些预定义变量,即:在隐含规则中使用的宏分为俩大类:
- 程序名(例如CC)
- 含有参数的程序(如CFLAGS)
下面是一些比较常见的变量用作内置规则:makefile文件的程序名称的表
注:可以取消 ‘-R’或 “—no-builtin-variables”选项隐含规则使用的所有变量。
//例如
make CPP = /home/lavendercc/projects