example ejemplos bash function makefile gnu-make

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:

  1. función de call
  2. Varias variables de línea
  3. conditionals

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 .