1. para cada función
foreach
La función se define de la siguiente manera:
$(foreach <var>,<list>,<text>)
La función es una función de: el parámetro <list>
se toma uno por uno en las <var>
variables de parámetro de palabra especificadas y luego realiza <text>
una expresión incluida.
Cada uno <text>
devuelve una cadena, un ciclo, <text>
cada cadena volverá a una división de espacio y, finalmente, cuando el final de todo el ciclo, <text>
la composición de cada cadena devuelva la cadena completa (un separador de espacios) será un foreach
valor de retorno de función.
Entonces, <var>
lo mejor es un nombre de variable, <list>
puede ser una expresión y, por <text>
lo general, solo usará <var>
este parámetro para enumerar una <list>
palabra.
Ejemplo:
filename = 11 22 33 44
files = $(foreach n, $(filename), $(n).cpp)
all:
echo $(files)
make
Resultados de ejecución
wohu@ubuntu:~/cpp/func$ make
echo 11.cpp 22.cpp 33.cpp 44.cpp
11.cpp 22.cpp 33.cpp 44.cpp
wohu@ubuntu:~/cpp/func$
foreach
El <var>
parámetro es una variable local temporal, la foreach
función se completa, las <var>
variables del parámetro no actuarán, en su alcance solo foreach
funcionan entre.
2. Si la función de selección de condición
Se define de la siguiente manera:
$(if <condition>,<then-part>)
o
$(if<condition>,<then-part>,<else-part>)
if
La función puede comprender else
parte de, o no comprende, es decir, los if
parámetros de la función pueden ser dos o pueden ser tres.
condition
El argumento es if
una expresión, si devuelve una cadena no vacía, entonces esto es equivalente a la expresión devuelve verdadero, entonces, then-part
se calculará, de lo contrario se else-part
calculará.
El if
valor de retorno de la función es:
si es condition
verdadero (cadena no vacía), then-part
será el valor de retorno de toda la función.
Si es condition
falso (la cadena vacía), else-part
será el valor de retorno de la función. Si este tiempo else-part
no está definido, toda la función devuelve una cadena de caracteres nula. Entonces, then-part
y else-part
solo habrá un cálculo.
Ejemplo 1:
file = aa
OBJ = $(if $(file), $(file), main.c)
all:
echo $(OBJ)
make
Resultados de ejecución
wohu@ubuntu:~/cpp/func$ make
echo aa
aa
wohu@ubuntu:~/cpp/func$
Ejemplo 2:
OBJ = $(if $(name), $(name), main.c)
other:
echo $(OBJ)
make
Resultados de ejecución
wohu@ubuntu:~/cpp/func$ make
echo main.c
main.c
wohu@ubuntu:~/cpp/func$
3. función de llamada
La función se define de la siguiente manera:
$(call <expression>,<parm1>,<parm2>,<parm3>,...)
call
La función es la única función que se puede utilizar para crear nuevas parametrizaciones. Podemos usar para escribir expresiones muy complejas, esta expresión, podemos definir tantos parámetros, luego puede usar call
para pasar parámetros a la función expresión.
Cuando make
el tiempo para realizar esta función, expression
las variables de parámetros $(1)
, $(2)
, $(3)
etc., son parámetros parm1
, parm2
, parm3
a su vez sustituidos. El expression
valor de retorno es el call
valor de retorno de la función.
reverse = $(2) $(1)
foo = $(call reverse, aa, bb)
all:
echo $(foo)
Resultados del:
wohu@ubuntu:~/cpp/func$ make
echo bb aa
bb aa
wohu@ubuntu:~/cpp/func$
4. Función de origen
Se define de la siguiente manera:
$(origin <variable>)
origin
A diferencia de otras funciones, una función no manipula el valor de una variable, solo le dice de dónde proviene la variable.
Nota: variable
es el nombre de la variable, no debe ser una referencia, lo mejor es no variable
usar $
los caracteres.
El siguiente es un origin
valor de retorno de la función:
undefined
: Si<variable>
nunca ha sido definido, la función devuelve este valor.default
: Si es<variable>
una definición predeterminada, comoCC
la variable.environment
: Si es<variable>
una variable de entorno y cuandoMakefile
se ejecuta el tiempo,-e
los parámetros no se han abierto.file
: Si<variable>
esta variable está definidaMakefile
, devolverá este valor.command line
: Si<variable>
esta variable es el comando ejecutado, será devuelto.override
: Si<variable>
estáoverride
redefinido un indicador.automatic
: Si<variable>
está ejecutando un comando de automatización de variables.
Esta información es para nuestra escritura Makefile
es muy útil, por ejemplo, supongamos que tenemos un Makefile
, que contiene un archivo de definición Make.def
, en Make.def
la definición de una variable bletch
, y nuestras variables de entorno también tienen una variable de entorno bletch
, queremos determinar cuál no es la variable Variable de entorno, si lo es, la redefiniremos. Si es una variable que no es de entorno, no la redefiniremos. Entonces, podemos Makefile
escribir:
ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf,gag,etc
endif
endif
Por supuesto, el uso de override
palabras clave no se puede redefinir todavía como variables de entorno, ¿por qué es necesario utilizar este paso?
Sí, podemos override
lograr este efecto, pero override
también se cubrirán las variables definidas en la línea de comandos, y queremos redefinir el entorno viniendo, no viniendo a redefinir la línea de comandos.