【问题标题】:Makefile - Pass jobs param to sub makefilesMakefile - 将作业参数传递给子 makefile
【发布时间】:2012-02-05 05:40:46
【问题描述】:

我有一个调用多个其他 makefile 的 makefile。

我想将 -j 参数传递给其他 makefile 调用。

类似(make -j8):

 all:
     make -f libpng_linux.mk -j$(J)

其中 $(J) 是来自 -j8 的值 8。我绝对发誓我以前做过这个,但我找不到我的例子。

$(MAKEFLAGS) 似乎包含 --jobserver-fds=3,4 -j 无论是什么 -j2 或 -j8

编辑:可能的解决方案:

将尽快发布此作为答案。

这似乎是一种不用担心的解决方案。调用主 makefile 时包括 -j8。子调用 make 应该是这样的:

 all:
      +make -f libpng_linux.mk -j$(J)

注意make前面的“+”。当我尝试并行构建时,我注意到 make 抛出警告:make [1]:警告:jobserver 不可用:使用 -j1。将 `+' 添加到父 make 规则。

【问题讨论】:

  • 在构建中添加默认的-j 是一件“邪恶”的事情。如果设置得较低,它可能不会产生重大影响,但即使设置得比较高,也会在多用户环境中产生问题。强迫开发人员明确选择一个值会迫使他们做出选择——希望基于机器上有多少人,它将如何影响当前正在运行的进程等。话虽如此,“jobserver 不可用”警告会在两种情况下发生:gmake 无法可靠地确定子进程是 make,或者您将 -j 传递给没有 + 的子进程(如您所述)。
  • 您的警告绝对有效,应予以考虑。现在这是不久前的事了,但我相信我们明白了,所以如果 -j 没有设置,我们默认为 j=1。如果在调用父 makefile 时设置了 -j,它会将 j 值传递给子 makefile。

标签: makefile jobs


【解决方案1】:

Only certain flags go into $(MAKEFLAGS)-j 不包括在内,因为子制作相互通信以确保发生适当数量的作业

此外,您应该使用$(MAKE) 而不是make,因为$(MAKE) 的计算结果总是正确的可执行文件名称(可能不是make)。

【讨论】:

  • 其实-j的。但是,它仅在 make 扩展配方时出现。例如,如果您将一个裸露的 $(info [${MAKEFLAGS}]) 放入您的 makefile 的顶层,您将看不到它。
【解决方案2】:

“不要那样做”并不总是答案,但在这种情况下它是,至少对于 GNU make

GNU make 父进程有一个内部jobserver。如果顶级Makefile 使用-j 运行,则子进程makes 将与作业服务器通信并从中读取并行级别,而无需显式-j

与父级作业服务器的持续协调对于核心利用率来说要好得多。例如,在与-j6 相同的构建期间,父级可能运行 2 个作业,子级运行 4 个以上,下一刻两者可能各自运行 3 个作业,然后父级运行 1 个,子级运行 5 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2016-04-02
    • 2011-09-10
    • 2021-02-26
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多