3.6.7 隐含规则中的自动变量
如果通过目录搜寻一个先决条件(依赖对象)在另一个目录中被找到,此时规则的命令将被如期执行。因此我们必须小心地设置命令,使得命令能够在此目录中找到需要的先决条件。这可通过使用自动变量来做到。属于隐含规则的自动变量是一种在命令行上能够根据具体情况被自动替换的变量。自动变量的值是在规则命令执行前被设置。例如,自动变量"$^"的值表示规则的所有先决条件,包括它们所处目录的名称;"$<"的值表示规则中的第一个先决条件;"$@"表示目标对象(另外还有一些自动变量的含义请参考make手册)。有时,先决条件还常包含头文件,而这些头文件并不愿在命令中说明。此时自动变量"$<"正是第一个先决条件。例如:
foo.o : foo.c defs.h hack.h cc -c $(CFLAGS) $< -o $@ |
其中的"$<"就会被自动替换成foo.c,而$@则会被替换为foo.o。
为了让make能使用习惯用法来更新一个目标,我们可以不指定命令,写一个不带命令的规则或者不写规则。此时make程序将会根据源程序文件的类型(程序的扩展名)来判断要使用哪个隐含规则。
另外,还有一种被称为后缀规则的隐含规则。它是为make程序定义隐含规则的老式方法(现在这种规则已经不用了,取而代之的是使用更通用更清晰的模式匹配规则)。因为在Linux 0.1x内核的Makefile文件中使用了这种规则,所以这里对其作一些简单说明。下面的例子就是一种双后缀规则的应用。双后缀规则是用一对后缀定义的:源后缀和目标后缀。相应的隐式先决条件是通过使用文件名中的源后缀替换目标后缀后得到。因此,此时下面的"$<"值是"*.c"文件名。而这条make规则的含义是将"*.c"程序编译成"*.s"代码。
.c.s: $(CC) $(CFLAGS) \ -nostdinc -Iinclude -S -o $*.s $< |
通常,命令是属于一个具有先决条件(依赖对象)的规则,并在任何先决条件改变时用于生成一个目标(target)文件。然而,为目标而指定命令的规则也并不一定要有先决条件。例如,与目标clean相关的含有删除(delete)命令的规则并不需要有先决条件。此时,一个规则说明了如何以及何时来重新制作某些文件,而这些文件是特定规则的目标。make根据先决条件来执行命令以创建或更新目标。一个规则也可以说明如何及何时执行一个操作。
Makefile文件也可以含有除规则以外的其他文字,但简单的Makefile文件只需要含有适当的规则。规则可能看上去要比上面的模板复杂得多,但本质是一样的。
Makefile文件最后还可以包含一些说明文件之间引用的依赖关系,这些依赖关系用于make来确定是否需要重建一个目标。比如当某个头文件被改动过后,make就通过这些依赖关系,重新编译与该头文件有关的所有*.c文件。有关依赖关系的例子请参考内核源代码中的Makefile文件。