bash - ejemplos - Funciones en Makefile
awk file example (2)
Estás buscando la función de call
.
compile = /
if [ $(UNAME) = $(1) ]; then /
$(MAKE) FC=$(2) FFLAGS=$(3) PETSC_FFLAGS="..." /
TARGET=$@ LEXT="$(4)_$(UNAME)" -e syst; /
else /
echo $(err_arch); /
exit 1; /
fi
debug_ifort_Linux:
$(call compile,Linux,ifort,$(difort),ifort)
Sin embargo, si puede reestructurar un poco su Makefile
, debería ver si puede usar los conditionals make
lugar de los de sh
.
Estoy escribiendo un Makefile con muchas cosas repetitivas, por ejemplo
debug_ifort_Linux:
if [ $(UNAME) = Linux ]; then /
$(MAKE) FC=ifort FFLAGS=$(difort) PETSC_FFLAGS="..." /
TARGET=$@ LEXT="ifort_$(UNAME)" -e syst; /
else /
echo $(err_arch); /
exit 1; /
fi
donde se define el ''syst'' objetivo, se define la variable ''UNAME'' (y suele ser Linux, pero también puede hacerlo Cygwin u OSF1) y las variables ''difort'' y ''err_arch'' también se definen. Este bloque de código se usa muchas veces para diferentes objetivos de compilación (usando un convenio de nombre de '' ''). Como se trata de una gran cantidad de código redundante, me gustaría poder escribirlo de una manera más simple. Por ejemplo, me gustaría hacer algo como esto:
debug_ifort_Linux:
compile(uname,compiler,flags,petsc_flags,target,lext)
donde compilar podría ser una función haciendo el código anterior basado en los argumentos. ¿Alguien tiene alguna idea de cómo podría lograr esto?
Hay 3 conceptos relacionados:
El resultado refactorizado podría verse así:
ifeq ($(UNAME),Linux)
compile = $(MAKE) FC=$(1) FFLAGS=$(2) PETSC_FFLAGS=$(3) /
TARGET=$@ LEXT="$(1)_$(UNAME)" -e syst
else
define compile =
echo $(err_arch)
exit 1
endef
endif
debug_ifort:
$(call compile,ifort,$(difort),"...")
Ese /
que queda es continuar la línea $(MAKE)
para el shell. No es necesaria ninguna variable multilínea aquí, porque es solo una línea de código de shell. Las variables de línea múltiple solo se usan en el bloque else.
Si no necesita parámetros, puede usar: = asignación y simplemente expandir el método con $(compile)
(ver recetas enlatadas )
[Editar] Nota: Al usar make antes de la versión 3.82, el = no fue reconocido al final de la declaración define para mí. Lo arreglé usando el uso de la define compile
.