如何让GNU make删除隐式规则创建的中间目录?

时间:2013-03-01 05:26:45

标签: makefile gnu-make

GNU make会自动删除隐式规则创建的中间文件,最后调用rm filename。如果其中一个目标实际上是一个目录,这显然不起作用。请看以下示例:

.PHONY: all 

all: test.target

%.target: tempdir.% 
  touch $@

tempdir.%:
  mkdir -p $@

make -n揭示了行动计划:

mkdir -p tempdir.test
touch test.target
rm tempdir.test

是否可以让GNU make正确处理中间目录?也许将rm更改为rm -rf

1 个答案:

答案 0 :(得分:5)

没有办法实现这一目标。虽然GNU make打印命令“rm”,但实际上它在内部运行unlink(2)系统调用而不是调用shell命令。无法配置或修改GNU make运行的命令(当然,除非通过更改源代码)。

但是,我觉得我应该指出,使用目录作为目标的正常先决条件是不行的。 GNU make使用时间最后修改的比较来判断目标是否是最新的,并且目录的最后修改时间不符合标准规则。每次创建,删除或重命名该目录中的文件(或子目录)时,目录的TLM都会更新。这意味着您将创建目录,然后拥有一堆依赖于它的文件:第一个构建并具有时间戳N.最后一个构建并具有时间戳N + x。这也将目录的时间戳设置为N + x。然后,当您下次运行make时,它会注意到第一个时间戳(N)比其先决条件(目录,N + x)更旧,并且重建。

这将永远发生,直到它能够足够快地构建剩余的“过时”先决条件,使得它们的时间戳不比目录更新。

而且,如果您要删除该目录中的临时文件或编辑器备份文件,它将重新开始。

就是不要这样做。

有些人使用显式shell命令来创建目录。有些人将它们创建为目标创建的副作用。有些人使用仅限订单的先决条件来确保按时创建。