Si desean ejecutar o actualizar una tarea cuando se actualizan determinados archivos, la utilidad make puede venir muy bien. La utilidad make requiere de un archivo, makefile, que define un conjunto de tareas a ejecutar.
A muchos de ustedes les sonara este nombre pues puede que hayan utilizado make para compilar un programa desde código fuente. La mayoría de los proyectos de código abierto utilizan make para compilar un binario ejecutable final, que puede ser instalado usando make install.
En esta ocasión vamos a entender cómo es que funciona este tipo de archivos dentro de Linux.
Un archivo makefile básicamente se distingue en cuatro tipos básicos de declaraciones:
- Comentarios
- Variables.
- Reglas explicitas.
- Reglas implícitas.
Las Reglas explicitas le indican a make que archivos dependen de otros archivos, así como los comandos requeridos para compilar un archivo en particular.
Mientras que las implícitas son similares que las explicitas, pero con la diferencia indican los comandos a ejecutar, sino que make utiliza las extensiones de los archivos para determinar que comandos ejecutar.
En este ejemplo no vamos a utilizar estas últimas dos, solamente vamos a empezar por la impresión del clásico «Hola Mundo» en el terminal.
Para ello vamos a crear un directorio vacío con el nombre que deseen.
En este caso vamos a llamarlo “ejemplo-make” y dentro de este vamos a crear un un archivo makefile con el siguiente contenido:
#este es un comentario, todo lo que este dentro de esta línea simplemente es ignorado
esta_es_una_variable:
echo "Hola Mundo"
Ahora ejecuta el archivo escribiendo make dentro del directorio, la salida será:
make
echo "Hola Mundo"
Hola Mundo
Como podrán ver cuando el archivo make fue ejecutado, el comando echo «Hola Mundo» se muestra, seguido de la salida del comando real. A menudo no queremos eso. Para suprimir esta salida al ejecutar make, basta con añadir un “@” antes de echo:
El ejemplo práctico de esto es:
#este es un comentario, todo lo que este dentro de esta línea simplemente es ignorado
esta_es_una_variable:
@echo "Hola Mundo"
Ahora podemos proceder a ejecutar el archivo make de nuevo. La salida sólo esto debería mostrar:
make
Hola Mundo
Esta es algo bastante básico. Pero como sabrán los archivos makefile contienen muchas cosas, de las cuales indican las secuencias que debe de seguir.
Podremos añadir unas secuencias simples a este archivo.
Lo que vamos a hacer es editar el archivo de la siguiente manera:
#este es un comentario, todo lo que este dentro de esta línea simplemente es ignorado
esta_es_una_variable:
@echo "Hola Mundo"
crear_un_archivo_nuevo:
@ echo "Estoy creando un archivo.txt ..."
touch archivo.txt
Al volver a ejecutar el makefile, este solo ejecutara el primer objetivo. Eso es porque sólo el primer objetivo en el makefile es el destino predeterminado.
Para que la ejecución se realice en secuencia es necesario indicarlo dentro del archivo con “all”. Es responsabilidad de “all” llamar a otros objetivos.
all: esta_es_una_variable crear_un_archivo_nuevo
#este es un comentario, todo lo que este dentro de esta línea simplemente es ignorado
esta_es_una_variable:
@echo "Hola Mundo"
crear_un_archivo_nuevo:
@ echo "Estoy creando un archivo.txt ..."
touch archivo.txt
Pueden proceder a ejecutar de nuevo make y verán que dentro del directorio se creo un archivo llamado “archivo.txt”.
De igual manera es posible poder ejecutar un objetivo dentro del archivo makefile, esto generalmente es muy utilizado.
Vamos a modificar nuestro archivo y vamos a añadir lo siguiente al final:
clean:
@ echo "Voy a eliminar el archivo txt creado”
rm archivo*.txt
Pueden volver a ejecutar make y este volverá a crear el archivo txt. Como verán volverá hacer lo mismo que la vez anterior. Pero ahora vamos a ejecutar el objetivo que esta dentro del archivo makefile.
Esto lo hacemos con:
make clean
Con ello podremos conocer algo bastante básico sobre los archivos make y como pueden ser bastante útiles si queremos automatizar algunas cosas.
Obviamente puede construir un archivo mas grande y complejo, pero este es un mero ejemplo para novatos (me incluyo) que vamos conociendo el funcionamiento de esto.
Muy interesante el artículo. Una pregunta.. lo que denominas «variables» no serían funciones o métodos?
De hecho, si amigo, gracias por la corrección.
Saludos! 🙂
Excelente.ojalá sigas profundizando.
pues ni una cosa ni la otra, https://www.gnu.org/software/make/manual/make.html, son «targets»
reglas
Ojalá sigan explicando cosas así, «omnipresentes y elementales», del día a día del funcionamiento de Linux, que nunca nadie explica con la misma pasión que como se predican esas «ventajas y funcionamiento».