概念

自动推导是根据隐式规则产生的,隐式规则的依据是人们的习惯用法。比如编译C程序时,specific-name.o 目标文件由 specific-name.c 源文件产生。

隐式规则使用一些隐式变量来生成编译命令,可以通过修改这些变量值来修改推导出来的命令。

# 这是一条隐式规则,只由目标文件和依赖文件组成
robust_io.o: robust_io.h

上面的规则推导时会变成

# CC CPPFLAGS CFLAGS是内建的隐式变量,它们有默认值
# 只要自定义这些变量,那么就可以生成自定义的隐式命令
$(CC) $(CPPFLAGS) $(CFLAGS) -c robust_io.c

除了内建的隐式规则,我们可以通过自定义模式规则来指引make进行推导,常与模式规则搭配的是自动变量

隐式规则

  1. 写一条没有命令的规则
  2. 或什么都不写
main.o: foo.o

这里的main.o使用了第一种条件;而make在寻找foo.o时,没找到它的规则,因此使用了第二种条件

隐式规则一览表,通过查表可以看到C/C++的生成规则,除此以外其实还有链接库的变量可以定义使用

隐式变量一览表,修改相应的标量可以达到自定义的目的

模式规则

模式规则属于隐式规则的一种,它的特别之处在于目标文件和依赖文件可以使通配符来 % 来匹配文件。

# 这条模式规则匹配任何名字相应的文件,并执行相应的规则
%.o: %.c
    command

%匹配任何非空字符串,初次之外的字符只匹配字符本身。比如%匹配”hello”字符串,而”.o”匹配”.o”字符串。

自动变量

# 这是一个更加具体的例子,使用的自动变量
# $<是指依赖文件中的第一项,这里是%.c推导出来的东西
# $@指目标文件的,这里是%.o推导出来的东西
%.o : %.c
        $(CC) -c $(CFLAGS) $< -o $@

所谓的自动变量即复用模式规则中的内容,根据需要可以参考自动变量表




Zhu

有问题欢迎发邮件交流