如何平行子制作?

时间:2015-06-10 09:17:16

标签: makefile gnu-make

在我的makefile中,我有一行

# in makefile:
SHELL   := csh
.PHONY  : foo
foo :
        $(MAKE) -C foo

当调用make -j8(使用GNU Make 3.81运行linux)时,我得到了

make -C foo
make[1]: Entering directory `/some/dir/foo'
make[1]: warning: jobserver unavailable: using -j1.  Add `+' to parent make rule.
make[1]: Nothing to be done for `default'.
make[1]: Leaving directory `/some/dir/foo'

我的父makefile中的正确规则是什么,以避免此警告?

(注意我查看了thisthis SO问题,但找不到令人满意的答案。特别是+$(MAKE) -C foo没有工作。也许我也应该说父母按照预期进行并行制作。)

或者我的操作系统不支持并行子制作? (this文档说大多数unix系统都这样做)。我怎么能确定?

1 个答案:

答案 0 :(得分:4)

根据您上面的评论,如果您想使用GNU make的作业服务器功能,则无法将SHELL设置为csh(或类似tcsh的变体)。

SHELL设置为csh允许您在csh脚本中编写shell配方而不是sh(Bourne / POSIX shell)脚本。

不幸的是,csh是a terrible scripting language。其中一个可怕的事情就是它“有用”地使用你的文件描述符......包括GNU制作用于控制作业服务器的那些。

所以,不要使用csh。或者至少,不要在makefile配方中使用csh。不幸的是,如果您使用csh脚本而不是脚本来编写配方,那么仅更改此值可能会导致makefile中断。