¿Qué es un archivo Makefile y cómo funciona dentro de Linux?

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.



Soy Estudiante de Ingeniería en Computación en la Universidad Autónoma Metropolitana (México), me considero aun un usuario medio en Linux , tengo pasión por las nuevas tecnologías , gamer y linuxero de corazón dispuesto a apoyar en lo que pueda.

6 comentarios

  1.   Arg0s dijo

    Muy interesante el artículo. Una pregunta.. lo que denominas “variables” no serían funciones o métodos?

    1.    David Naranjo dijo

      De hecho, si amigo, gracias por la corrección.
      Saludos! 🙂

  2.   Pedro dijo

    Excelente.ojalá sigas profundizando.

  3.   ManuelALcocer dijo

    pues ni una cosa ni la otra, https://www.gnu.org/software/make/manual/make.html, son “targets”

  4.   ManuelALcocer dijo

    reglas

  5.   Sebas dijo

    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”.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.