¿Qué significan los símbolos del archivo MAKE $@ y $<?
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?
$@
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
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
make
despué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.
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.o
está el archivo de salida. Esto es $@
a lo que se expande. La primera dependencia es hello.c
. Eso es lo que $<
se expande.
La -c
bandera genera el .o
archivo; consulte man gcc
para obtener una explicación más detallada. Especifica -o
el 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