我能区分强制重建目标的依赖关系和仅仅允许重建目标的依赖关系吗?



是否存在允许我们创建不同"级别"的依赖关系的构建系统?让我们称它们为"必需的"one_answers"可选的"(尽管我知道有些系统对"可选依赖"有特殊的含义)。其思想是允许在正常的增量重建和完全重建之间进行一些事情。

"required"依赖项只是一个普通的makefile依赖项。如果依赖项的时间戳发生了变化,则会重新构建目标。如果你输入"make",没有任何过时的内容,那么什么也不会发生。

一个"可选的"依赖项会说,某个目标的输入已经改变,可以重新编译,但目标实际上并不是无效的。

例如,假设我在一堆dll上运行配置文件引导优化(PGO)。从技术上讲,对代码的任何部分的任何更改都可能使概要文件结果无效,因此I 可能想要重新运行PGO。但是,如果我不这样做,只要更新了所有的硬依赖项,程序就可以完全正确地运行。这可能很好,因为PGO可能需要一段时间才能运行。

当然,今天我可以通过从"all"目标中排除PGO来解决这个问题,如果我想运行它,则手动调用"make PGO"。或者,我可以简单地省略PGO目标的大部分依赖项,以确保它只在"make clean"之后构建。然而,这是手工工作,不能轻易概括。

我希望做的是能够说一些类似"make"的东西,只重建那些必需的依赖项过期的目标,而"make -optional"可以重建任何可选的(或必需的,显然)依赖项过期的目标。

是否有任何构建系统或整洁的makefile技巧支持这种行为?

如果你愿意,你可以自己做。如果您将OPTIONAL=true添加到命令行:

make OPTIONAL=true

然后在makefile中,您可以测试OPTIONAL,如果设置了该变量,则向目标添加先决条件,如果未设置则不添加先决条件。

据我所知,make(至少)没有一个版本可以通过命令行选项来实现这种功能。

最新更新