Buscar..


Haciendo referencia a una variable

Para usar el valor almacenado en una variable, use el signo de dólar seguido del nombre de la variable entre paréntesis o llaves.

x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same

Si el nombre de una variable solo tiene un carácter, los paréntesis / llaves se pueden omitir (por ejemplo, $x ). Esta práctica se usa para las variables automáticas (ver más abajo), pero no se recomienda para las variables de propósito general.

Variables simplemente expandidas

Las variables simplemente expandidas se comportan como variables de los lenguajes de programación tradicionales. Se evalúa la expresión en el lado derecho y el resultado se almacena en la variable. Si el lado derecho contiene una referencia de variable, esa variable se expande antes de que tenga lugar la asignación.

x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"

Una forma alternativa es usar la asignación de dos puntos:

x ::= hello

Asignación de colon simple y doble son equivalentes. POSIX make standard solo menciona la forma ::= , por lo que las implementaciones con estándares estrictos pueden no ser compatibles con la versión de una sola coma.

Variables Recursivamente Expandidas

Cuando se define una variable expandida recursivamente, los contenidos del lado derecho se almacenan tal como están. Si una referencia de variable está presente, la referencia en sí se almacena (no el valor de la variable). Haga esperas para expandir las referencias de variables hasta que la variable se use realmente.

x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"

En este ejemplo, la definición de y es recursiva. La referencia a $(x) no se expande hasta que se expande $(y) . Esto significa que siempre que el valor de x cambie, el valor de y también cambiará.

Las variables expandidas recursivamente son una herramienta poderosa pero fácilmente mal entendida. Se pueden usar para crear construcciones que se asemejan a plantillas o funciones, o incluso para generar automáticamente porciones de un archivo MAKE. También pueden ser la fuente de problemas difíciles de depurar. Tenga cuidado de usar solo las variables expandidas recursivamente cuando sea necesario.

Variables automáticas

En el contexto de una regla individual, Make define automáticamente una serie de variables especiales. Estas variables pueden tener un valor diferente para cada regla en un makefile y están diseñadas para simplificar la escritura de reglas. Estas variables solo se pueden utilizar en la parte de la receta de una regla.

Variable Descripción
$@ Nombre de archivo del objetivo de la regla
$% El nombre del miembro objetivo, si el objetivo de la regla es un archivo
$< Nombre del archivo del primer prerrequisito
$^ Lista de todos los requisitos previos
$? Lista de todos los requisitos previos que son más nuevos que el objetivo
$* El "vástago" de una regla implícita o patrón

El siguiente ejemplo utiliza variables automáticas para generar una regla genérica. Estas instrucciones le indican cómo construir un archivo .o a partir de un archivo .c con el mismo nombre. Como no sabemos el nombre específico de los archivos afectados, usamos $@ como marcador de posición para el nombre del archivo de salida y $^ como marcador de posición para la lista de requisitos previos (en este caso, la lista de archivos de entrada).

%.o: %.c
    cc -Wall $^ -c $@

Asignación variable condicional

El operador ?= Es una extensión que se comporta como = , excepto que la asignación solo ocurre si la variable aún no está establecida.

x = hello
x ?= world
# $(x) will yield "hello"

Agregar texto a una variable existente

El operador += es una extensión común que agrega el contenido especificado al final de la variable, separado por un espacio.

x = hello
x += world

Las referencias de variables en el lado derecho se expandirán solo si la variable original se definió como una variable simplemente expandida.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow