禁用子目录的并行构建,仅针对单个目标进行。

11

我有一个使用autotools构建的巨大项目,它位于由许多具有子目录的目录组成的目录树中。它有一个名为check的目标(在每个子目录以及主目录中),用于执行大量自动化测试。 check目标进行递归构建。

通过使用-j选项来并行构建和测试(通过make命令),对大多数目录都有效。但是,有一个目录包含的测试在并行执行时不起作用(时间敏感性),但在串行运行时通过。

问题是:是否有一种方法可以强制make在只有这个子目录中以串行方式构建check目标,同时在构建其他所有内容时进行并行构建?


我能想到的唯一诀窍是为串行检查插入一个虚假依赖项。手册中有一个基本思路。 - Brett Hale
为什么不通过使目标相互依赖来解决这个问题呢? - reinierpost
2个回答

24

将以下内容添加到您的 Makefile 文件中:

.NOTPARALLEL:

有关GNU make的文档,请参见此处


5

如果我理解正确的话,当你运行递归构建check目标的make时,你可以专门传递-j1来确保它串行运行:

check: ; $(MAKE) -j1 ...

我找到几分钟的时间就会尝试。 - arne
这个不起作用:这给了我一个警告:“在子make中强制使用-jN”。 - Vincent Fourmond
4
它确实有效。是的,你会得到一个警告。但它不会并行运行作业。如果您希望每次调用该makefile时都不并行运行(而不仅仅是调用特定目标的特定调用),并且您可以更改makefile,则使用NOTPARALLEL更清晰。如果这两个条件中的任何一个不成立,则NOTPARALLEL的帮助较少。 - MadScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接