【发布时间】: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。