¿Cuál es la diferencia entre gmake y make?

127

Estoy tratando de entender la diferencia entre 'gmake' y 'make'?

En mi caja de linux son idénticos:

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

¿Supongo que esto no es lo mismo en todas las plataformas? ¿Hay una buena razón para usar uno sobre el otro?
¿Hay algún significado histórico de por qué existen los dos nombres?

Nick Haddad
fuente

Respuestas:

166

'gmake' se refiere específicamente a la marca GNU. 'make' se refiere a la implementación de make predeterminada del sistema; en la mayoría de las distribuciones de Linux es GNU make, pero en otros unixes, podría referirse a alguna otra implementación de make, como BSD make, o las implementaciones de make de varios unixes comerciales.

El lenguaje aceptado por GNU make es un superconjunto del soportado por la utilidad make tradicional.

Al usar 'gmake' específicamente, puede usar extensiones de creación de GNU sin tener que preocuparse de que sean mal interpretadas por alguna otra implementación de marca.

bdonlan
fuente
27
buena respuesta. en cuenta que la misma convención sigue para gcc y cc
Tim Hoolihan
Gracias chicos, esto tiene sentido! Gracias por aclarar esto.
Nick Haddad
44
También se aplica a otras herramientas: gawk y gtar, por ejemplo, son las que hacen tropezar a las personas en Solaris.
Dan Davies Brackett
2
GNU Make no presenta un superconjunto compatible de características en sus extensiones de lenguaje. $ ^, por ejemplo, no existe en gmake (1), pero sí en pmake (1) de su BSD. Esto puede conducir a resultados desastrosos cuando se intenta escribir un Makefile que puede ser usado tanto por GNU Make como por pmake (ejemplo inofensivo, imagínese: gcc -o $@ $<= no hay fuentes de entrada con gmake porque $ <se evalúa como una cadena vacía. Existen peores combinaciones que pueden resultar en archivos gcc clobbering).
Sean
2
@Sean ¿De qué se trata esto $^? Ciertamente, existe una variable con ese nombre en GNU Make, y por lo que puedo decir, es compatible con el legado Make. ¿La semántica en BSD hace diferente?
tripleee
10

En mi sistema no hay diferencia (gmake es un enlace suave para hacer):

-> 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 significa GNU make. Hay diferentes implementaciones de make. En la máquina Linux, lo más probable es que will will by GNU y para hacer que la vida del usuario sea más fácil, make está vinculado a gmake.

dimba
fuente
2

El "opuesto" habitual gmakees BSD make, que tenderá a estar makeen sistemas BSD, como era de esperar. Si desea ver cómo es BSD, en derivados de Debian está disponible como apt-get install pmake.

caos
fuente
3
¿Por qué pmakesorprendentemente BSD hacer? >. <
stackoverflowuser95
La marca predeterminada es sorprendentemente BSD en sistemas BSD.
Mongus Pong
-3

Aparentemente, GNU make es prácticamente universal ahora , por lo que casi nunca debería haber una diferencia.

Paul Biggar
fuente
2
A menos que se use una versión diferente de make, en cuyo caso debería haber una diferencia.
8
Bueno ... debes decir: GNU make es prácticamente universal ahora en los sistemas LINUX. Digamos que BSD está usando su propia marca que tiene una sintaxis diferente, etc.
Alex