gmake和make有什么区别?

153

我试图理解"gmake"和"make"之间的区别?

在我的Linux操作系统上它们是相同的:

% gmake --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.

% 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.

我猜这不是所有平台都一样吧?使用其中一个是否有很好的理由?
为什么会有这两个名称,是否存在历史上的重要意义?

4个回答

198

'gmake' 特指GNU make。'make' 指的是系统默认的make实现;在大多数Linux发行版中,这是GNU make,但在其他Unix上,它可能指的是一些其他的make实现,例如BSD make或各种商业Unix的make实现。

GNU make所接受的语言是传统make实用程序支持的语言的超集。

通过专门使用“gmake”,您可以使用GNU make扩展而不必担心它们被其他make实现误解。


36
好的回答。请注意,对于GCC和CC,遵循相同的约定。 - Tim Hoolihan
4
这也适用于其他g工具:例如,gawk和gtar是Solaris上使人困惑的工具之一。 - Dan Davies Brackett
3
GNU Make的语言扩展不提供兼容的功能超集。例如,在gmake(1)中不存在$^,但在其BSD的pmake(1)中存在。这可能会导致灾难性结果,尝试编写可同时被GNU Make和pmake使用的Makefile时(想象一个刻意无害的例子:gcc -o $@ $<),因为$ <将计算为空字符串而在gmake中没有输入源。更糟糕的组合也存在,可能导致gcc覆盖文件。 - Sean
4
@Sean, 这个 $^ 是什么意思?在 GNU Make 中有一个叫做 $^ 的变量(详见 https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html),根据我了解,它与传统的 Make 兼容。但是,在 BSD Make 中语义是否不同呢?请您解答一下。 - tripleee
问题:make和gmake脚本是否跨平台兼容? - rsonx
显示剩余2条评论

14

在我的系统上没有区别(gmake 是 make 的软链接):

-> ls -l $(which gmake make)
lrwxrwxrwx 1 root root      4 Jun  5  2007 /usr/bin/gmake -> make
-rwxr-xr-x 1 root root 168976 Jul 13  2006 /usr/bin/make

gmake是GNU make的简称。存在不同的make实现方式。在Linux机器上,很可能使用的是GNU make,并且为了让用户的生活更轻松,make被软链接到了gmake。


3

"gmake"的通常“对立面”是BSD系统上的make,这并不奇怪。如果您想了解BSD make的详细信息,在Debian派生系统中可以使用apt-get install pmake命令进行安装。


3
为什么pmake毫不意外地是BSD make?>.< - stackoverflowuser95
在BSD系统上,默认的构建工具 unsurprisingly 是 BSD make。 - Mongus Pong

-3

显然,GNU make现在已经几乎普及了,所以几乎不应该有任何区别。


2
除非使用不同版本的make,否则应该没有区别。 - user636044
13
嗯...你需要这样说 - GNU make 在Linux系统上已经几乎是普遍使用的了。但需要说明,BSD使用自己的make工具,其语法不同等等。 - Alex
是的,Solaris肯定也使用自己的make,这与gnu make不同。 - Paulus
大多数BSD的实现都是POSIX的。而使用GNU make无法实现POSIX兼容性。 - Volodymyr Boiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接