Make

De Taquiones

Enlaces y referencias

  • Ref: GNU make manual
  • Ref: Managing Projects with GNU make
  • Ref: These are not static pattern rules ...

Conceptos básicos

Reglas

Una regla indica cuándo y cómo construir ciertos archivos.

OBJETIVOS : PRERREQUISITOS
    PROGRAMA
    ...

Los OBJETIVOS son los archivos que se deben construir si no existen o si los archivos listados en los PRERREQUISITOS a su vez tampoco existen o han sido modificados con fecha posterior a la de los OBJETIVOS. La construcción se lleva a cabo ejecutando cada uno de los programas mencionados en líneas independientes.

Variables automáticas

  • Sus valores se calculan de nuevo en cada regla ejecutada.
  • Estos valores sólo pueden emplearse en la ejecución de programas (command script).
  • No pueden usarse en la lista de objetivos de una regla.
  • Tampoco pueden emplearse en la lista de prerrequisitos de una regla.
Variable Descripción Comentarios
$@ Nombre de archivo del objetivo de la regla
  • Si el objetivo es un miembro de un archivo esta variable contendrá el nombre de dicho archivo.
  • Si la regla tiene objetivos múltiples la variable contendrá el nombre de cualquier objetivo que motivó que se ejecutasen los programas de la regla.
$% Nombre del miembro objetivo cuando el objetivo es un miembro de un archivo
$< Nombre del primer prerrequisito.
$? Nombres de todos los prerrequisitos que son más nuevos que el objetivo (separados por espacios en blanco).
$^ Nombre de todos los prerrequisitos (separados por espacios en blanco).
  • La lista de nombres no incluye duplicados.
$+ Igual que el anterior ($^) pero se incluyen todos los nombres en el orden en el que aparecen en el archivo Makefile.
$| Nombre de todos los prerrequisitos
$* Raíz con la que una regla implícita coincide.

Ejemplo:

#  Objetivo de la regla     Prerequisito
#      ------v-------        ----v----
$(HOME)/.myarchivo.conf:   myarchivo.conf
    install $? $@

Funciones

  • Ref: Builting functions

A menos que se diga lo contrario toda lista está formada por textos separados por espacios en blanco.

Análisis y substitución en textos
Función Descripción
$(subst BUS,REEM,DONDE) Busca BUS en DONDE y lo reemplaza por REEM.
$(filter PATRONES, TEXTO) Encuentra todas las palabras (separadas por espacios en blanco) en TEXTO que emparejan con alguno de los PATRONES y eliminando aquellas palabras que no lo hacen.

Los patrones se escriben empleando el carácter porcentaje (%).

$(filter-out PATRONES, TEXTO) Devuelve todas las palabras encontradas en TEXTO que no emparejan con algún PATRON, eliminando de TEXTO aquellas que lo hacen con uno o más de ellos.

Es la función opuesta a la función $(filter ... ).

Nombres de archivos
Función Descripción
$(dir RUTAS) Extrae la parte correspondiente al directorio de cada una de las RUTAS de archivo recibidas.
$(notdir RUTAS) Extrae la parte correspondiente al nombre de cada una de las RUTAS de archivo recibidas.
$(basename RUTAS) Extrae el nombre y la ruta de cada una de las RUTAS de archivos recibidas dejando fuera la extensión de los mismos.
$(addsuffix SUFIJO,NOMBRES) Añade el texto SUFIJO al final de cada uno de los nombres recibidos.
$(addprefix PREFIJO,NOMBRES) Añade el texto PREFIJO al comienzo de cada uno de los nombres recibidos.
$(wildcard PATRON) Crea una lista de nombres de archivos empleando PATRON como expresión de

búsqueda.

Ejecutando programas
Función Descripción
$(shell TEXTO) Esta función toma un TEXTO como una línea de órdenes, la pasa a un shell externo y recupera su salida para utilizarla como producto de su llamada.

Ejemplos

Estos son algunos ejemplos de las funciones arriba citadas:

# Queremos encontrar todos los archivos de un directorio
TODOS_LOS_ARCHIVOS=$(wildcard mydir/*)

# y ahora queremos excluir algunos 
ARCHIVOS_FINALES=$(filter-out %.bak %.orig %.ptkdb, $(TODOS_LOS_ARCHIVOS))