我可以判断--jobs是否在Makefile中使用?

时间:2014-04-03 15:44:51

标签: makefile gnu-make

我想根据是否启用并行构建来设置一些变量,所以我尝试了这个:

jobs:
»·echo "executing jobs job"

ifneq (,$(findstring -j,$(MAKEFLAGS)))
»·$(warning "parallel!")
else
»·$(warning "not parallel!")
endif

这就是发生的事情:

$ make -j2
Makefile:2: "not parallel!"
echo "executing jobs job"
executing jobs job

我也尝试过测试$(JOBS),但没有运气。

有没有办法让我在Makefile中告诉使用了--jobs参数?


其他信息:

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu

2 个答案:

答案 0 :(得分:2)

令人惊讶的是,${MAKEFLAGS}只会在配方扩展时扩展时获得-j

生成文件:

$(warning [${MAKEFLAGS}])

.PHONY: all
all:
    $(warning [${MAKEFLAGS}])
    echo Now do something useful

执行命令

$ make -j5
1:1: []
1:5: [ -j --jobserver-fds=3,4]
echo Now do something useful
Now do something useful

答案 1 :(得分:1)

关于@ bobbogo answer中的MAKEFLAGS扩展:如果我们查看代码,我认为我可以解释这种行为:

查看代码,make的main函数多次调用define_makeflags函数。

/* Define the MAKEFLAGS and MFLAGS variables to reflect the settings of the
   command switches.  Include options with args if ALL is nonzero.
   Don't include options with the 'no_makefile' flag set if MAKEFILE.  */

static struct variable *
define_makeflags (int all, int makefile)
{
......

main中呼叫位置:

1)

 /* Set up the MAKEFLAGS and MFLAGS variables for makefiles to see.
    Initialize it to be exported but allow the makefile to reset it.  */
 define_makeflags (0, 0)->export = v_export;

2)

 /* Set up MAKEFLAGS and MFLAGS again, so they will be right.  */

 define_makeflags (1, 0);

3)

 /* Set up 'MAKEFLAGS' specially while remaking makefiles.  */
 define_makeflags (1, 1);

子功能中还有其他调用,但这应该足以解释。

第一个调用将all参数设置为false。其他人设定为真。将all设置为false,define_makeflags函数仅解析"简单标记"并且j不是其中之一。为了理解解析,需要查看此switch语句和definition of command line params

我的SWAG如下:

我认为ifneq语句的解析是在第一次调用define_makeflags之后但在后续调用之前发生的。我可以猜测在开始时保持MAKEFLAGS简单的原因是继续支持文档化的Makefile模式,如下所示。

来自doc1doc2

archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
        +touch archive.a
        +ranlib -t archive.a
else
        ranlib archive.a
endif

如果MAKEFLAGS包含带参数的长选项或选项,则无法在MAKEFLAGS中搜索单个字符标记。

我的回答有一些猜测。也许参与设计决策的人也可以权衡。鉴于此change保罗史密斯可能有一个想法。