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
?
答案 0 :(得分:5)
没有办法实现这一目标。虽然GNU make打印命令“rm”,但实际上它在内部运行unlink(2)系统调用而不是调用shell命令。无法配置或修改GNU make运行的命令(当然,除非通过更改源代码)。
但是,我觉得我应该指出,使用目录作为目标的正常先决条件是不行的。 GNU make使用时间最后修改的比较来判断目标是否是最新的,并且目录的最后修改时间不符合标准规则。每次创建,删除或重命名该目录中的文件(或子目录)时,目录的TLM都会更新。这意味着您将创建目录,然后拥有一堆依赖于它的文件:第一个构建并具有时间戳N.最后一个构建并具有时间戳N + x。这也将目录的时间戳设置为N + x。然后,当您下次运行make时,它会注意到第一个时间戳(N)比其先决条件(目录,N + x)更旧,并且重建。
这将永远发生,直到它能够足够快地构建剩余的“过时”先决条件,使得它们的时间戳不比目录更新。
而且,如果您要删除该目录中的临时文件或编辑器备份文件,它将重新开始。
就是不要这样做。
有些人使用显式shell命令来创建目录。有些人将它们创建为目标创建的副作用。有些人使用仅限订单的先决条件来确保按时创建。