覆盖一个源文件的-j设置?

时间:2016-05-05 09:51:59

标签: gnu-make

我有test script,需要几小时到几天才能运行。测试脚本重复构建库并在不同配置下运行自检。

在桌面和服务器上,脚本享有加速,因为它使用-j N,其中N是可用内核数。运行测试脚本大约需要2个小时。

在像LeMaker Hikey (8-core ARM64/2GB RAM)CubieTruck (8-core ARM/2GB RAM)这样的开发板上,我无法使用-j N(对于偶数N=2N=4),因为一个文件是一个真正的怪物并导致OOM杀死。在这种情况下,脚本可能需要数天才能运行。

我的问题是,我如何制作一个make食谱,告诉GNUmake使用-j 1来处理这个源文件?它甚至可能吗?

2 个答案:

答案 0 :(得分:1)

我不确定是否有可能。目前尚不清楚Make如何在核心之间分割作业。

4.9 Special Built-in Target Names提及

  

.NOTPARALLEL

     
      
  • 如果提到.NOTPARALLEL作为目标,则即使提供了-j选项,也会以串行方式运行此make调用。任何   递归调用make命令仍将并行运行配方   (除非它的makefile也包含这个目标)。任何先决条件   这个目标被忽略了。
  •   

但是,5.7.3 Communicating Options to a Sub-make说:

  

-j选项是一种特殊情况(请参阅Parallel Execution)。   如果将其设置为某个数值N和您的操作系统   支持它(大多数任何UNIX系统都会;其他人通常不支持),.   parent make和所有子make将进行通信以确保   它们之间只有N个作业同时运行。   请注意,任何标记为递归的作业(请参阅而不是执行   食谱)不计入总工作量(否则我们可以得到   N子进行运行并且没有留下任何实际工作的插槽!)

     

如果您的操作系统不支持上述通信,那么   始终将-j 1放入MAKEFLAGS而不是您的值   指定。这是因为如果传递-j选项   sub-make,你会获得比你更多的并行运行的工作   要求。如果你给-j没有数字参数,那就意味着要运行   尽可能多的工作并行,这是传递下来,因为   多个无穷大不超过一个。

这表明我无法将特定作业分配给单个核心。虽然值得一试。

答案 1 :(得分:0)

首先制作大目标, 然后其他一切事后并行。

.PHONY: all
all:
    ⋮

.PHONY: all-limited-memory
all-limited-memory:
    ${MAKE} -j1 bigfile
    ${MAKE} all

所以现在

  • $ make -j16 all按预期工作。
  • $ make -j4 all-memory-limited按顺序构建 bigfile (如果出错则退出),继续并行完成其余工作。