在Makefile中使用选项的值

在Makefile中使用选项的值,makefile,Makefile,有没有办法获取并使用传递给Makefile的选项(不是env变量)的值?例如,如果在命令行上传递了-j选项(用于并行性),如何在Makefile中访问它?在GNU Make中,大多数选项都可以通过检查MAKEFLAGS(使用findstring)的值来检测。该值通常是选项的“规范”单字母变体字符串。例如,如果运行Make asMake--keep go--question,MAKEFLAGS将是“kq” 然而,-j是不同的。如果运行make-j,MAKEFLAGS将包含-j。如果运行make-j

有没有办法获取并使用传递给Makefile的选项(不是env变量)的值?例如,如果在命令行上传递了-j选项(用于并行性),如何在Makefile中访问它?

在GNU Make中,大多数选项都可以通过检查
MAKEFLAGS
(使用
findstring
)的值来检测。该值通常是选项的“规范”单字母变体字符串。例如,如果运行Make as
Make--keep go--question
MAKEFLAGS
将是
“kq”

然而,
-j
是不同的。如果运行
make-j
MAKEFLAGS
将包含
-j
。如果运行
make-j2
MAKEFLAGS
将包含
-j--jobserver id,3,4


因此,您有足够的信息来区分“完全不平行”、“平行且无限”和“平行且有限”的情况。恐怕没有办法知道最后一种情况下的
是什么。

在GNU Make中,大多数选项都可以通过检查
MAKEFLAGS
的值来检测(使用
findstring
)。该值通常是选项的“规范”单字母变体字符串。例如,如果运行Make as
Make--keep go--question
MAKEFLAGS
将是
“kq”

然而,
-j
是不同的。如果运行
make-j
MAKEFLAGS
将包含
-j
。如果运行
make-j2
MAKEFLAGS
将包含
-j--jobserver id,3,4


因此,您有足够的信息来区分“完全不平行”、“平行且无限”和“平行且有限”的情况。恐怕无法知道最后一种情况下的
是什么。

如果需要
-j
的参数,可以使用
.MAKE.JOBS
。通常,
MAKEFLAGS
变量是您需要的变量


可能不是每个
make
(它们在FreeBSD的
make
)中都可用。

如果需要
-j
的参数,可以使用
.make.JOBS
。通常,
MAKEFLAGS
变量是您需要的变量


也许不是每个
make
(它们在FreeBSD的
make
)中都可用。

正如Michael Livshin所说,你不知道。。。除非您升级到GNU make 4.2或更高版本;从文件中:

这基本上意味着
-j2
将始终出现在
MAKEFLAGS
中,而不仅仅像以前那样出现在
-j


请注意,更改此值不会产生任何效果,但是,如果您感兴趣的是。。。当调用第一个make命令并且所有其他make命令将使用相同的值时,将设置并行度。你所能做的就是完全禁用并行性,你不能改变它的数量。

正如Michael Livshin所说,你不知道。。。除非您升级到GNU make 4.2或更高版本;从文件中:

这基本上意味着
-j2
将始终出现在
MAKEFLAGS
中,而不仅仅像以前那样出现在
-j


请注意,更改此值不会产生任何效果,但是,如果您感兴趣的是。。。当调用第一个make命令并且所有其他make命令将使用相同的值时,将设置并行度。您所能做的就是完全禁用并行性,无法更改并行量。

看起来.MAKE.JOBS在GNU MAKE中不可用。看起来.MAKE.JOBS在GNU MAKE中不可用。谢谢。我不是想改变它,而是想把它传递给一个支持类似选项的编译器(gox for Go)。请注意,你在CPU上是“双蘸”,因为make将使用N个作业来启动N个不同的gox操作,每个gox操作将使用N个不同的线程进行构建。。。所以我想更像是“方形浸渍”:。谢谢。我不是想改变它,而是想把它传递给一个支持类似选项的编译器(gox for Go)。请注意,你在CPU上是“双蘸”,因为make将使用N个作业来启动N个不同的gox操作,每个gox操作将使用N个不同的线程进行构建。。。所以我猜更像是“方浸”:。
* The amount of parallelism can be determined by querying MAKEFLAGS, even when
  the job server is enabled (previously MAKEFLAGS would always contain only
  "-j", with no number, when job server was enabled).