内部宏

make 命令有在描述文件中使用的内置宏定义。

这些宏有助于在描述文件中指定变量。 make 命令将宏替换为下面的值之一:

$@ 当前目标文件的名称
$$@ 相关行上的标签名
$? 更改时间比目标更新的文件名
$< 导致创建目标文件的过时文件的父文件名
$* 不带后缀的当前父文件名
$% 归档库成员名

目标文件名

如果 $@ 宏符合描述文件中的命令顺序,那么 make 命令在将命令传递给要运行的 shell 之前会将此符号替换为当前目标文件的全名。 make 命令仅在从描述文件运行命令以创建目标文件时替换此符号。

标签名称

如果 $$@ 宏在描述文件的相关行上,那么 make 命令会将此符号替换为相关行中冒号左边的标签名。 例如,如果相关行中包含以下内容:

cat:     $$@.c

make 命令将它转变为:

cat:     cat.c

make 命令对表达式求值时。 使用此宏构建一组文件,每个文件仅有一个源文件。 例如,要维持系统命令的目录,请使用类似下面的描述文件:

# Define macro CMDS as a series
# of command names
CMDS = cat dd echo date cc cmp comm ar ld chown
# Each command depends on a .c file
$(CMDS):      $$@.c
# Create the new command set by compiling the out of
# date files ($?) to the target file name ($@)
         $(CC) -O $? -o $@

make 命令在 $$(@F) 宏运行时将它更改为是 $@ 一部分的文件。 例如,在使用其他的目录中的描述文件的同时维护 usr/include 目录时,请使用此符号。 该描述文件与下面的类似:

# Define directory name macro INCDIR
INCDIR = /usr/include
# Define a group of files in the directory
# with the macro name INCLUDES
INCLUDES = \
         $(INCDIR)/stdio.h \
         $(INCDIR)/pwd.h \
         $(INCDIR)/dir.h \
         $(INCDIR)/a.out.h \
# Each file in the list depends on a file
# of the same name in the current directory
$(INCLUDES):       $$(@F)
# Copy the younger files from the current
# directory to /usr/include
         cp $? $@
# Set the target files to read only status
         chmod 0444 $@

当前目录下的相应文件已被更改时,前面的描述文件将在 /usr/include 目录中创建文件。

已更改的文件

如果 $? 宏符合描述文件中的命令顺序,那么 make 命令会将此符号替换为上次更新目标文件以来发生更改的父文件列表。 make 命令仅在从描述文件运行命令以创建目标文件时替换此符号。

第一个过时文件

如果 $< 宏在描述文件中的命令序列中,那么 make 命令会将符号替换为启动文件创建的文件的名称。 "过期" 文件名是其时间戳记与目标文件的时间戳记不匹配的父文件的名称,因此导致 make 命令再次创建目标文件。

In addition, use a letter (D. or F.) after the < (less-than sign) to get either the directory name (D.) or the file name (F.) of the first out-of-date file. 例如,如果第一个过时文件为:

/home/linda/sample.c

make 命令将给出下面的值:

$(<D)   =   /home/linda
$(<F)   =   sample.c
$<      =   /home/linda/sample.c

make 命令仅在程序从其内部规则或者从 .DEFAULT 列表运行命令时替换此符号。

当前文件名前缀

如果 $* 宏符合描述文件中的命令顺序,那么 make 命令会将此符号替换为 make 命令当前正在用来生成目标文件的父文件的文件名部分(不带后缀)。 例如,如果 make 命令正在使用文件:

test.c

那么 $* 宏表示文件名test.

此外,在 *(星号)后面使用字母(D 或者 F)可获取当前文件的目录名 (D) 或者文件名 (F)。

例如,make 命令使用(在描述文件或者内部规则中指定的)很多文件创建目标文件。 在任何时刻仅使用这些文件(当前文件)中的一个。 如果当前文件为:

/home/tom/sample.c

make 命令将对宏给出下面的值:

$(*D)  =  /home/tom
$(*F)  =  sample
$*     =  /home/tom/sample

make 命令仅在从其内部规则(或者从 .DEFAULT 列表)运行命令时替换此符号,但是在从描述文件运行命令时不会进行替换。

归档库成员

如果 $% 宏在描述文件中,并且目标文件是归档库成员,那么 make 命令会将宏符号替换为库成员的名称。 例如,如果目标文件为:

lib(file.o)

那么make 命令会将 $% 宏替换为成员名file.o.