¿Qué significan los símbolos del archivo MAKE $@ y $<?

Resuelto Mohit Deshpande asked hace 14 años • 6 respuestas
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

¿Qué hacen $@y $<hacen exactamente?

Mohit Deshpande avatar Jul 11 '10 00:07 Mohit Deshpande
Aceptado

$@es el nombre del destino que se genera y $<el primer requisito previo (normalmente un archivo fuente). Puede encontrar una lista de todas estas variables especiales en el manual GNU Make .

Por ejemplo, considere la siguiente declaración:

all: library.cpp main.cpp

En este caso:

  • $@evalúa aall
  • $<evalúa alibrary.cpp
  • $^evalúa alibrary.cpp main.cpp
bdonlan avatar Jul 10 '2010 17:07 bdonlan

De Gestión de proyectos con GNU Make, tercera edición, p. 16 (está bajo la licencia de documentación libre GNU ):

Las variables automáticas se establecen makedespués de que se coincide con una regla. Proporcionan acceso a elementos de las listas de objetivos y requisitos previos para que no tenga que especificar explícitamente ningún nombre de archivo. Son muy útiles para evitar la duplicación de código, pero son fundamentales a la hora de definir reglas de patrones más generales.

Hay siete variables automáticas "centrales":

  • $@: El nombre de archivo que representa el destino.

  • $%: El elemento de nombre de archivo de una especificación de miembro de archivo.

  • $<: El nombre de archivo del primer requisito previo.

  • $?: Los nombres de todos los requisitos previos que son más recientes que el destino, separados por espacios.

  • $^: Los nombres de archivo de todos los requisitos previos, separados por espacios. Esta lista ha eliminado los nombres de archivos duplicados ya que para la mayoría de los usos, como compilar, copiar, etc., no se desean duplicados.

  • $+: Similar a $^, estos son los nombres de todos los requisitos previos separados por espacios, excepto que $+incluye duplicados. Esta variable se creó para situaciones específicas, como argumentos para enlazadores donde los valores duplicados tienen significado.

  • $*: La raíz del nombre del archivo de destino. Una raíz suele ser un nombre de archivo sin sufijo. Se desaconseja su uso fuera de las reglas del patrón.

Además, cada una de las variables anteriores tiene dos variantes para compatibilidad con otras marcas. Una variante devuelve sólo la parte del valor del directorio. Esto se indica agregando una "D" al símbolo, $(@D), $(<D)etc. La otra variante devuelve solo la parte del valor del archivo. Esto se indica agregando una “F” al símbolo, $(@F), $(<F), etc. Tenga en cuenta que estos nombres de variantes tienen más de un carácter y, por lo tanto, deben estar entre paréntesis. GNU make proporciona una alternativa más legible con las funciones dir y notdir.

alex avatar Jun 08 '2016 11:06 alex

Las $@y $<se llaman variables automáticas . La variable $@representa el nombre del destino y $<representa el primer requisito previo necesario para crear el archivo de salida.
Por ejemplo:

hello.o: hello.c hello.h
         gcc -c $< -o $@

Aquí hello.oestá el archivo de salida. Esto es $@a lo que se expande. La primera dependencia es hello.c. Eso es lo que $<se expande.

La -cbandera genera el .oarchivo; consulte man gccpara obtener una explicación más detallada. Especifica -oel archivo de salida que se creará.

Para obtener más detalles, puede leer este artículo sobre linóxido sobre Linux Makefiles .

Además, puedes consultar los manuales de GNU make . Hará que sea más fácil crear Makefiles y depurarlos.

Si ejecuta este comando, generará la base de datos del archivo MAKE:

make -p 
dexterous avatar Aug 31 '2013 13:08 dexterous