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

Makefile 如何让GNU make删除由隐式规则创建的中间目录?,makefile,gnu-make,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

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

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

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

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

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

不要这样做

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