¿Puedes refactorizar una receta de Makefile?



Para refactorizar tu Makefile y evitar la repetición de código, puedes usar una función con patrones (pattern rules) combinada con variables automáticas. Aquí te muestro cómo hacerlo:

🔄 Makefile refactorizado (versión DRY)

makefile
Copy
Download
# Lista de municipios a procesar
MUNICIPIOS := santa_ana nacozari_de_garcia

# Regla para generar todos los reportes
all: $(addprefix reports/municipio_,$(addsuffix .tex,$(MUNICIPIOS)))

# Regla patrón para cualquier municipio
reports/municipio_%.tex: data/non-tabular/time_and_distance_%.json reports/templates/municipio.tex
	jinja-render \
		--report-name "municipio" \
		--summary-path "$<"
	mv reports/municipio.tex $@

🔍 Explicación:

  1. Variables:

    • MUNICIPIOS: Lista de sufijos de municipios.

    • addprefix/addsuffix: Generan los nombres de archivos objetivo (ej: reports/municipio_santa_ana.tex).

  2. Regla patrón (%):

    • El símbolo % actúa como comodín para cualquier municipio.

    • $<: Variable automática que representa la primera dependencia (el archivo JSON correspondiente).

  3. Ventajas:

    • Para añadir un nuevo municipio, solo agrégalo a la lista MUNICIPIOS.

    • No necesitas repetir la receta para cada caso.

📌 Uso:

bash
Copy
Download
make  # Genera todos los reportes
make reports/municipio_santa_ana.tex  # Genera solo uno

🛠️ Si necesitas personalización adicional:

makefile
Copy
Download
# Versión con parámetros adicionales
define render_municipio
	jinja-render \
		--report-name "municipio" \
		--summary-path "data/non-tabular/time_and_distance_$(1).json" \
		--extra-param "valor"
	mv reports/municipio.tex reports/municipio_$(1).tex
endef

reports/municipio_%.tex: data/non-tabular/time_and_distance_%.json reports/templates/municipio.tex
	$(call render_municipio,$*)

¡Esta estructura hace tu Makefile escalable y mantenible! 

No todo es miel sobre hojuelas. El problema que surge es que si falta un ingrediente no te dice cuál ingrediente falta. En lugar de eso te dice que no exite la receta. 

Comentarios

Entradas más populares de este blog

¿Cómo comparar nombres de equipos de distintas fuentes?

¿Cómo hacemos filtrado y extracción de listas anidadas utilizando `purrr`?