我想根据是否启用并行构建来设置一些变量,所以我尝试了这个:
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
答案 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
中呼叫位置:
/* 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;
/* Set up MAKEFLAGS and MFLAGS again, so they will be right. */
define_makeflags (1, 0);
/* 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模式,如下所示。
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
如果MAKEFLAGS
包含带参数的长选项或选项,则无法在MAKEFLAGS
中搜索单个字符标记。
我的回答有一些猜测。也许参与设计决策的人也可以权衡。鉴于此change保罗史密斯可能有一个想法。