在Makefile中使用选项的值
有没有办法获取并使用传递给Makefile的选项(不是env变量)的值?例如,如果在命令行上传递了-j选项(用于并行性),如何在Makefile中访问它?在GNU Make中,大多数选项都可以通过检查在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
MAKEFLAGS
(使用findstring
)的值来检测。该值通常是选项的“规范”单字母变体字符串。例如,如果运行Make asMake--keep go--question
,MAKEFLAGS
将是“kq”
然而,-j
是不同的。如果运行make-j
,MAKEFLAGS
将包含-j
。如果运行make-j2
,MAKEFLAGS
将包含-j--jobserver id,3,4
因此,您有足够的信息来区分“完全不平行”、“平行且无限”和“平行且有限”的情况。恐怕没有办法知道最后一种情况下的
是什么。在GNU Make中,大多数选项都可以通过检查MAKEFLAGS
的值来检测(使用findstring
)。该值通常是选项的“规范”单字母变体字符串。例如,如果运行Make asMake--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).