gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:03:18 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

而且,如果您要删除该目录中的临时文件或编辑器备份文件或其他内容,一切都会重新开始。

只是不要这样做。

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

关于makefile - 如何让 GNU make 删除由隐式规则创建的中间目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15151118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com