Introducción a Makefile simple y fácil de entender (07) -otras funciones (foreach, if, call, origin)

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 foreachvalor 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)

makeResultados 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$ 

foreachEl <var>parámetro es una variable local temporal, la foreachfunción se completa, las <var>variables del parámetro no actuarán, en su alcance solo foreachfuncionan 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>)

ifLa función puede comprender elseparte de, o no comprende, es decir, los ifparámetros de la función pueden ser dos o pueden ser tres.
conditionEl argumento es ifuna expresión, si devuelve una cadena no vacía, entonces esto es equivalente a la expresión devuelve verdadero, entonces, then-partse calculará, de lo contrario se else-partcalculará.

El ifvalor de retorno de la función es:
si es conditionverdadero (cadena no vacía), then-partserá el valor de retorno de toda la función.
Si es conditionfalso (la cadena vacía), else-partserá el valor de retorno de la función. Si este tiempo else-partno está definido, toda la función devuelve una cadena de caracteres nula. Entonces, then-party else-partsolo habrá un cálculo.

Ejemplo 1:

file = aa
OBJ = $(if $(file), $(file), main.c)
all:
	echo $(OBJ)

makeResultados 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)

makeResultados 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>,...)

callLa 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 callpara pasar parámetros a la función expresión.

Cuando makeel tiempo para realizar esta función, expressionlas variables de parámetros $(1), $(2), $(3)etc., son parámetros parm1, parm2, parm3a su vez sustituidos. El expressionvalor de retorno es el callvalor 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>)

originA diferencia de otras funciones, una función no manipula el valor de una variable, solo le dice de dónde proviene la variable.
Nota: variablees el nombre de la variable, no debe ser una referencia, lo mejor es no variableusar $los caracteres.

El siguiente es un originvalor 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, como CCla variable.
  • environment: Si es <variable>una variable de entorno y cuando Makefilese ejecuta el tiempo, -elos parámetros no se han abierto.
  • file: Si <variable>esta variable está definida Makefile, devolverá este valor.
  • command line: Si <variable>esta variable es el comando ejecutado, será devuelto.
  • override: Si <variable>está overrideredefinido un indicador.
  • automatic: Si <variable>está ejecutando un comando de automatización de variables.

Esta información es para nuestra escritura Makefilees muy útil, por ejemplo, supongamos que tenemos un Makefile, que contiene un archivo de definición Make.def, en Make.defla 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 Makefileescribir:

ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf,gag,etc
endif
endif

Por supuesto, el uso de overridepalabras clave no se puede redefinir todavía como variables de entorno, ¿por qué es necesario utilizar este paso?
Sí, podemos overridelograr este efecto, pero overridetambié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.

Supongo que te gusta

Origin blog.csdn.net/wohu1104/article/details/111054525
Recomendado
Clasificación