我正在使用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核心
答案 0 :(得分:3)
您可以检查make
实际上是make
(使用which make
和type make
来查看是否包含了包装脚本,函数或别名。
这也可以发挥作用:Communicating options to a s submake:
-j
选项是一种特殊情况(请参阅Parallel Execution)。如果您将其设置为某个数值N
并且您的操作系统支持它(大多数UNIX系统将支持;其他人通常不支持),则父make和所有子make将进行通信以确保只有N
个作业在他们之间同时运行。请注意,任何标记为递归的作业(请参阅而不是执行配方)都不会计入总作业数(否则我们可能会使N
子作品运行并且没有留下任何实际工作的插槽!)< / p>
与您相关:
如果您的操作系统不支持上述通信,则
-j 1
始终放入MAKEFLAGS
,而不是您指定的值。这是因为如果将-j
选项传递给子制作,您将获得比您要求的并行运行的更多作业。如果你给-j
没有数字参数,意味着并行运行尽可能多的作业,那就传递下来,因为多个无穷大不超过一个。
答案 1 :(得分:1)
猜猜:
.NOTPARALLEL
伪目标。它可以防止gnu make并行构建。 -l
设置并且负载高于那个吗?然后make不会一次启动多个工作。make
只能并行化任务,它知道彼此独立答案 2 :(得分:1)
上面的答案给出了与您的问题有关的问题的已知链接。
在不了解您的设置的情况下,我只能猜测:
也许,不知何故,运行构建脚本会影响MAKEFLAGS。
您可以尝试直接将作业数传递到ndk-build脚本中。像这样编辑你的ndk-build脚本:
$GNUMAKE -j8 -f $YourProgramDir/.../build-local.mk "$@"