【发布时间】:2021-01-01 21:21:14
【问题描述】:
我希望虚假的 clean 目标始终在 build 目标之前执行,但没有别的(比如 build 目标不会触发 clean)。
我知道不依赖 GNU Make 语言的解决方案:
- 需要订购时按顺序启动它们:
make clean
make build
- 将顺序执行编码为所需的配方:
.PHONY: install
install:
$(MAKE) clean
$(MAKE) build
上述“解决方法”受非泛型影响。我必须记住不要运行make clean build!
我的问题是关于 GNU Make 语言的表达能力,是否可以在不强加依赖的情况下定义顺序。
其他构建系统有可选的依赖声明服从顺序,如 Gradle 的mustRunAfter。
【问题讨论】:
-
听起来你在找order only prerequisites。
-
@G.M.不,order-only 强加了硬依赖,我只需要 order。当您不关心时间戳时,仅订购适用于目录。恐怕在 GNU Make 中不强加依赖就不可能表达顺序。可能
.NOTPARALLEL有什么黑客行为,谁知道呢…… -
没有比您提供的更好的方法了。事实上,即使有这样的事情,它也不能按照你建议的方式工作:make 使用 depth-first 搜索目标,所以即使有办法说“如果两个目标都需要要构建,这个必须首先出现”,您必须将这种关系放在 所有 目标(所有 .o 文件等)上,而不仅仅是放在最顶层 构建目标。
-
您能帮我们解释一下吗?您要解决的实际情况是什么?
-
@MadScientist 您可以将
clean目标动态添加到.EXTRA_PREREQS来做到这一点,不是吗?