过去,GNU make 两次毁掉了我的工作,因为它的一些内置规则以.c文件为目标。
如果您有一个名为 的文件foo.c,并且还有foo.lLex 扫描器或foo.yYacc 解析器,请注意!GNU make 假设该.c文件是由这些文件组成的目标(这显然是 POSIX 要求!),并且它将执行类似mv y.tab.c foo.c或 的操作lex -t foo.l > foo.c。
如何禁用所有这些隐藏的危险规则(无论已知或未知),同时保留有用的规则?
具体来说,我们如何向 GNU Make 提出此请求:“请保留与(例如).c 和 .o 文件相关的所有规则,并禁用涉及任何其他文件类型的所有规则”?
从手册中:
许多预定义的隐式规则在 make 中实现为后缀规则,因此将定义哪些规则取决于后缀列表...如果修改后缀列表,则唯一有效的预定义后缀规则将是由一两个命名的规则您指定的列表中的后缀;后缀未能出现在列表中的规则将被禁用...如果您希望消除默认的已知后缀而不是仅仅添加它们,请为 .SUFFIXES 编写一条没有先决条件的规则。通过特殊分配,这消除了 .SUFFIXES 的所有现有先决条件。然后,您可以编写另一条规则来添加所需的后缀。
.SUFFIXES: # Delete the default suffixes
.SUFFIXES: .c .o # Define a new suffix list
Run Code Online (Sandbox Code Playgroud)