gnu make -j8没有并行运行的东西

时间:2015-10-13 14:39:47

标签: c++ makefile android-ndk gnu-make

我正在使用ndk-build运行Android NDK制作文件,这只是使用google makefile模板运行的普通gnu make。我使用ndk-build -j8运行它,我可以确认make命令行确实与-j8一起运行了 然而,编译继续逐个编译我的源文件,从不再一次运行clang++一次。这并不总是那样。就在几天前,我使用了相同的完整脚本,它使用了所有8个核心并且速度更快 什么可能使gnu突然变得不尊重-j8? 有没有办法让gnu make产生关于此的任何解释性信息?各种 - 调查选项似乎都没有谈论它。

从OSX 10.10.5运行,gnu make版本为3.81

更新:如果我之前做过ndk-build clean,我之后立即执行的构建会在所有8个核心上运行。在返回仅使用1核心

后一天完成后续构建

3 个答案:

答案 0 :(得分:3)

您可以检查make实际上是make(使用which maketype make来查看是否包含了包装脚本,函数或别名。

这也可以发挥作用:Communicating options to a s submake

  

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

与您相关:

  

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

答案 1 :(得分:1)

猜猜:

  1. 在您的make文件中搜索.NOTPARALLEL伪目标。它可以防止gnu make并行构建。
  2. 你有-l设置并且负载高于那个吗?然后make不会一次启动多个工作。
  3. 你确定,在你重建的时候,有一些难以建立的东西吗?当然,make只能并行化任务,它知道彼此独立

答案 2 :(得分:1)

上面的答案给出了与您的问题有关的问题的已知链接。

在不了解您的设置的情况下,我只能猜测:

也许,不知何故,运行构建脚本会影响MAKEFLAGS。

您可以尝试直接将作业数传递到ndk-build脚本中。像这样编辑你的ndk-build脚本:

$GNUMAKE -j8 -f $YourProgramDir/.../build-local.mk "$@"