- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!