【问题标题】:how to parallel sub-make?如何并行子制作?
【发布时间】:2015-06-10 09:17:16
【问题描述】:

在我的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 系统都这样做)。我怎样才能确定?

【问题讨论】:

  • 可能是子make调用了另一个没有+的子make并导致了这个警告?
  • @MaximEgorushkin 显然不是 从问题中给出的make 的输出中可以清楚地看出。
  • 嗯,输出提到了目标default,而你的make规则在命令行中没有default。你在看正确的规则吗?
  • @MaximEgorushkin 您正确地观察到了这一点。我确实在我的 makefile 中查看了错误的行,但即使使用正确的行(并且在修改它以使用 $(MAKE) 之后),事情仍然保持不变。我已经修改了问题
  • 我同意 Maxim 的观点:您向我们展示的示例运行良好,不会生成该消息。因此,如果您看到该消息,那么它是由您没有向我们展示的某些内容引起的。显然,我们无法帮助您发现您没有向我们展示的问题。您需要提出一个实际可重现的案例 (SSCCE)。例如,您是否在 makefile 中设置了 SHELL 变量?也许是,我不知道.../usr/bin/csh?如果是这样,请不要这样做。

标签: makefile gnu-make


【解决方案1】:

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

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

不幸的是,csh 是a terrible scripting language。它的可怕之处之一是它“有用”地弄乱了你的文件描述符……包括 GNU 用来控制作业服务器的那些。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 2010-10-29
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多