在我的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中的正确规则是什么,以避免此警告?
(注意我查看了this和this SO问题,但找不到令人满意的答案。特别是+$(MAKE) -C foo
没有工作。也许我也应该说父母按照预期进行并行制作。)
或者我的操作系统不支持并行子制作? (this文档说大多数unix系统都这样做)。我怎么能确定?
答案 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中断。