Una breve introducción a los ‘Makefiles’ en el desarrollo de software de código abierto con GNU Make

Una breve introducción a los ‘Makefiles’ en el desarrollo de software de código abierto con GNU Make

GNU Make. es una utilidad de desarrollo que determina las partes de una base de código en particular que se van a recompilar y puede emitir comandos para realizar esas operaciones en la base de código. Esta particular utilidad make. se puede utilizar con cualquier lenguaje de programación siempre que su compilación se pueda realizar desde el shell emitiendo comandos.

 Makefiles en Linux  Makefiles en Linux Makefiles en Linux

Para usar GNU Make. necesitamos tener un conjunto de reglas que defina la relación entre los diferentes archivos de nuestro programa y los comandos de actualización cada archivo. Estos se escriben en un archivo especial llamado “ makefile. . El comando ‘ make. usa la base de datos ‘ makefile. y las últimas horas de modificación de los archivos para decidir qué archivos se deben volver a compilar.

Contenido de un Makefile

Generalmente, los ‘ Makefiles. contienen 5 tipos de cosas, a saber: reglas implícitas. reglas explícitas. definiciones de variables. directivas. y comentarios.

  1. Una regla explícita. especifica cómo hacer/rehacer uno o más archivos (llamados objetivos, se explicará más adelante) y cuándo hacer lo mismo.
  2. Una regla implícita. especifica cómo hacer/rehacer uno o más archivos basados ​​en sus nombres. Describe cómo un nombre de archivo de destino se relaciona con un archivo con un nombre similar al de destino.
  3. Una definición de variable. es una línea que especifica un valor de cadena para que una variable sea sustituido más tarde.
  4. Una directiva. es una instrucción para hacer algo especial mientras lee el archivo MAKE.
  5. Un ‘ #. El símbolo ‘se utiliza para representar el inicio de un comentario. dentro de archivos MAKE. Una línea que comienza con ‘ #. simplemente se ignora.

Estructura de Makefiles

La información que le dice a make. cómo recompilar un sistema viene de leer una base de datos llamada makefile. Un archivo MAKE. simple constará de reglas de la siguiente sintaxis:

objetivo …: requisitos previos … receta … …

Un objetivo se define como el archivo de salida generado por el programa. También pueden ser objetivos falsos. que se explicarán a continuación. Los ejemplos de archivos de destino incluyen ejecutables. archivos de objeto. o destinos falsos. como limpiar. instalar , desinstalar. etc.

freestar.config.enabled_slots.push

Un requisito previo. es un archivo que se utiliza como entrada para crear los archivos de destino.

Una receta. es la acción que make. realiza para crear el archivo de destino basado en los prerrequisitos. Es necesario poner un carácter de tabulación antes de cada receta dentro de los archivos MAKE. a menos que especifiquemos la variable ‘ .RECIPEPREFIX. para definir algún otro carácter como prefijo de la receta.

Un ejemplo de Makefile final: main.o end.o inter.o start.o gcc-o final main.o end.o inter.o start.o main.o: main.c global.h gcc-c main.c end .o: end.c local.h global.h gcc-c end.c inter.o: inter.c global.h gcc-c inter.c start.o: start.c global.h gcc-c start.c clean: rm-f main.o end.o inter.o start.o

En el ejemplo anterior usamos archivos fuente 4 C. y dos archivos de encabezado para crear el ejecutable final . Aquí, cada archivo “ .o. es tanto un objetivo como un requisito previo dentro del archivo MAKE. Ahora eche un vistazo al último nombre de destino limpio. Es solo una acción en lugar de un archivo de destino.

Dado que normalmente no lo necesitamos durante la compilación, no está escrito como un requisito previo en ninguna otra regla. Los objetivos que no hacen referencia a archivos, sino que son solo acciones, se denominan objetivos falsos. No tendrán ningún requisito previo como otros archivos de destino.

Cómo GNU Make procesa un Makefile

Por defecto, make. comienza con el primer objetivo en el ‘ makefile. y se llama como ‘ predeterminado gol. ‘. Teniendo en cuenta nuestro ejemplo, tenemos final. como nuestro primer objetivo. Dado que sus requisitos previos incluyen otros archivos de objeto, estos deben actualizarse antes de crear final. Cada uno de estos requisitos previos se procesa de acuerdo con sus propias reglas.

La recompilación se produce si se realizan modificaciones en los archivos de origen. o en los archivos de encabezado. o si el archivo de objeto. no existe en absoluto. Después de volver a compilar los archivos de objeto necesarios, make. decide si volver a vincular final. o no. Esto debe hacerse si el archivo final. no existe, o si alguno de los archivos objeto es más nuevo que él.

Por lo tanto, si cambiamos el archivo inter.c. luego, al ejecutar make. recompilará el archivo fuente para actualizar el archivo objeto inter.o. y luego vinculará final.

Usando variables dentro de Makefiles

En nuestro ejemplo, tuvimos que listar todos los archivos de objeto. dos veces en la regla para final. como se muestra a continuación.

final: main.o end.o inter.o start.o gcc-o final main.o end.o inter.o start.o

Para evitar este tipo de duplicaciones, podemos introducir variables para almacenar la lista de objetos archivos que se utilizan dentro del archivo MAKE. Usando la variable OBJ. podemos reescribir el archivo make. de muestra a uno similar que se muestra a continuación.

OBJ = main.o end.o inter.o start.o final: $ (OBJ) gcc-o final $ (OBJ) main.o: main.c global.h gcc-c main.c end.o: end.c local.h global.h gcc-c end.c inter .o: inter.c global.h gcc-c inter.c start.o: start.c global.h gcc-c start.c clean: rm-f $ (OBJ) Reglas para limpiar el directorio fuente

Como que vimos en el ejemplo makefile. podemos definir reglas para limpiar. el directorio de origen eliminando los archivos objeto no deseados después de la compilación. Supongamos que tenemos un archivo de destino llamado limpio. ¿Cómo hacer. diferenciar las dos situaciones anteriores? Aquí viene el concepto de objetivos falsos.

Un objetivo falso. es aquel que no es realmente el nombre de un archivo, sino que es solo un nombre para que se ejecute una receta siempre que se realice una solicitud explícita desde el archivo MAKE. Una razón principal para utilizar objetivo falso. es evitar un conflicto con un archivo del mismo nombre. Otra razón es mejorar el rendimiento.

Para explicar esto, revelaré un giro inesperado. La receta para limpiar. no se ejecutará de forma predeterminada al ejecutar make. En su lugar, es necesario invocar el mismo emitiendo el comando make clean.

.PHONY: clean clean: rm-f $ (OBJ)

Ahora intente crear makefiles. para su propia base de código. No dudes en comentar aquí tus dudas.

Leave a comment

Your email address will not be published. Required fields are marked *