其他一些系统所附带的 make 程序提供了若干 GNU make 未实现的功能。不过,规定 make 规范的 POSIX.2 标准(IEEE Standard 1003.2-1992)并未要求其中任何一项功能。
形如「file((entry))」的目标表示归档文件 (archive) file 中的一个成员。但该成员不是按名称选择的,而是依据它是否为定义了链接器符号 entry 的目标文件(object)来选择的。
之所以没有把这个功能引入 GNU make,是因为让 make 了解归档文件符号表这一内部格式的知识,会破坏模块性。请参见更新归档文件的符号目录。
(用于后缀规则的)以字符「~」结尾的后缀,在 System V 的 make 中具有特殊含义:它们指向去掉「~」后所得名称的文件所对应的 SCCS 文件。例如,后缀规则「.c~.o」会从 SCCS 文件 s.n.c 生成文件 n.o。要覆盖所有情况,需要准备一整套这样的后缀规则。请参见古老的后缀规则。
在 GNU make 中,这一整套情况是通过两条用于从 SCCS 提取文件的模式规则,结合规则链接这一通用功能来处理的。请参见隐含规则的链接。
在 System V 和 4.3 BSD 的 make 中,通过 VPATH 搜索(请参见为前置条件 (prerequisite) 搜索目录)找到的文件,其名称会在命令 (recipe) 中被改写。我们认为始终使用自动变量要清爽得多,这样一来该功能也就没有必要了。
在某些 Unix 的 make 中,出现在规则前置条件里的自动变量 $* 有一个极其古怪的「功能」:它居然会展开为该规则目标的全名。我们无法想象 Unix make 的开发者究竟是怎么想出这种做法的;它与 $* 的通常定义完全不一致。
在某些 Unix 的 make 中,隐含规则的搜索(请参见使用隐含规则)似乎不仅对没有命令的目标进行,而是对所有目标都进行。这样一来你就可以写成:
foo.o:
cc -c foo.c
于是 Unix 的 make 会自作聪明地推断 foo.o 依赖于 foo.c。
我们认为这种用法是有问题的。在 make 中,前置条件的性质(至少在 GNU make 中)是有明确定义的,而这样做并不符合那个模型。
GNU make 不包含任何用于编译或预处理 EFL 程序的内置隐含规则。如果我们听说有谁在使用 EFL,会很乐意添加它们。
在 SVR4 的 make 中,似乎可以指定一条没有命令的后缀规则,并将其视为带有空命令(请参见使用空命令)。例如,写成:
.c.a:
就能覆盖内置的 .c.a 后缀规则。
我们认为,让一条没有命令的规则始终只是向目标的前置条件列表追加内容,会更为清爽。要在 GNU make 中获得与上述示例相同的行为,可以很简单地改写成:
.c.a: ;
某些版本的 make 会以「-e」标志启动 shell,除非指定了「-k」(请参见测试程序的编译)。「-e」标志指示 shell 一旦其运行的任何程序返回非零状态就立即退出。我们认为把命令的每一行都写成能够独立成立、从而不需要这种特殊处理,会更为清爽。