Marca GNU

Tutorial de GNU Make

Tutorial de GNU Make

GNU Make es una herramienta que ayuda a generar programas ejecutables a partir del código fuente y también a procesar otros archivos no fuente del proyecto. Make obtiene la lógica de crear los ejecutables y procesar otros archivos que no son de origen a partir de un archivo llamado makefile o un Makefile.

Por qué hacer?

Instalación de Make

Hacer solo no es suficiente para construir programas. Para crear programas desde la fuente, necesita tener compiladores y otras herramientas instaladas en su sistema. Por lo tanto, necesitamos el conjunto completo de herramientas de desarrollo para nuestro propósito.

Para compilar fuentes en Linux, existe un paquete llamado "build-essential" en sistemas basados ​​en Debian (e.gramo. Ubuntu, Linux Mint, etc.) y "Herramientas de desarrollo" en Red Hat y CentOS.

Para instalar esto en sistemas basados ​​en Debian:

apt-get install build-esencial

Para instalar esto en CentOS y Red Hat, ejecute:

yum groupinstall "Herramientas de desarrollo"

Empezando con Makefile

Comencemos escribiendo un Hola Mundo programa con el lenguaje de programación C.

La función principal de nuestro programa C residirá dentro Hellomain.C. El contenido del archivo debe tener el siguiente aspecto:

#incluir  int main () my_fun (); return 0;  

Este código incluye el archivo de encabezado hellofun.h que contiene la declaración de una función llamada hello_fun (). El contenido de hellofun.su:

anular my_fun ();

La definición de my_fun () vive dentro de hellofun.C:

#incluir  #incluir  void my_fun () printf ("Hola mundo!\ n "); volver;

Este es un programa muy simple y podríamos compilarlo con gcc con solo una línea de comando. Pero, los programas de la vida real no son tan simples y pequeños como este. Las cosas se complican muy pronto.  A continuación, voy a escribir el script makefile necesario para compilar este programa de hola mundo. Explicaré diferentes partes en secciones posteriores.

hellomain: hellomain.c infierno.c gcc -o hola hellomain.c hellomain.c-yo.

Mantenga este código en un archivo llamado makefile (sin ninguna extensión de archivo). Coloque el archivo en el directorio donde están los archivos C. Apunta tu línea de comando en este directorio. En la línea de comando escriba make y presione enter. Se generará un archivo ejecutable llamado hello en el directorio actual. Puede verificar el resultado ejecutando el ejecutable con el siguiente comando.

./Hola

Salidas:

Hola Mundo!

Reglas, objetivos y dependencias

Un script de archivo MAKE es una colección de reglas. Las reglas instruyen a Make sobre cómo construir un destino o una salida desde la fuente u otros archivos. La regla también especifica las dependencias del objetivo. Las reglas de dependencia deben ejecutarse primero dependiendo de si eso ya se procesó mirando las marcas de tiempo. En nuestro ejemplo makefile arriba, tenemos una regla con el objetivo llamado Hellomain y sus dependencias. El nombre de destino está separado por dos puntos de la lista de dependencias. Los comandos de shell que se ejecutarán se enumeran en la siguiente línea. Los comandos de shell deben comenzar con un carácter de tabulación.

Si no especifica ningún parámetro con el comando make, se ejecuta el primer objetivo. En nuestro ejemplo no especificamos ningún parámetro y teníamos Hellomain como primer y único objetivo.

Variables

Las variables son una excelente manera de escribir valor una vez y usarlas varias veces sin repetir el valor una y otra vez. Nos ayuda a mantener nuestro código SECO (no lo repitas). Si alguna vez necesita cambiar algún valor en todo el script, solo necesita cambiarlo en un lugar para reflejar el cambio en todas partes si está utilizando la variable.

En nuestro ejemplo usamos gcc como el compilador, pero es posible que tengamos que cambiar el compilador a otra cosa. Entonces, podemos mantener el nombre del compilador en una variable. Además, podemos mantener las banderas del compilador en otra variable para reutilizar esa. Para establecer un valor en una variable usamos el signo igual (=) y para leer esa variable usamos $ (variable_name).

CC = gcc CFLAGS = -I. hellomain: hellomain.c infierno.c $ (CC) -o hola dominio del infierno.c hellomain.c $ (CFLAGS)

Limpieza del medio ambiente

A menudo, es posible que necesitemos limpiar nuestro medio ambiente. Si queremos que cada pieza de nuestro proyecto se reconstruya desde cero, tenemos que limpiarla. En nuestro ejemplo simple, el único archivo que se genera es el Hola ejecutable. Sin eliminar eso manualmente, podemos eliminarlo con make. Entonces, podemos crear una regla para eso y nombrar el objetivo como limpio.

CC = gcc CFLAGS = -I. hellomain: hellomain.c infierno.c $ (CC) -o hola dominio del infierno.c hellomain.c $ (CFLAGS) limpio: rm hola

El comando de shell en el objetivo limpio es solo el antiguo comando de shell rm. Ahora, desde la línea de comando, ejecute:

hacer limpia

Mire el directorio actual para ver que el Hola el archivo ejecutable se ha ido.

Ampliando nuestro ejemplo para resolver más problemas

En nuestro sencillo ejemplo de compilación de hello world tenemos un problema que aún no hemos resuelto. Hellomain el objetivo mira infernal.C y infierno.C las marcas de tiempo de los archivos la próxima vez que intente volver a compilarlo con fabricar o hacer hellomain. Entonces, si cambia alguno de esos dos archivos, se volverán a compilar. Pero si cambias infierno.h entonces no se recompilará. Eso es inesperado!

Nuevamente, nos hemos saltado un nivel intermedio. No generamos los archivos de objeto y generamos directamente el ejecutable. Pero, detrás de la escena, los archivos de objeto se crean en un directorio temporal y se eliminan. Queremos generar los archivos objeto antes de construir el ejecutable. Esta vez nombramos al objetivo principal como todas

todos: hellomain.Oh diablos.o gcc hellomain.Oh diablos.o -o hola hellomain.o: hellomain.c infierno.h gcc -I. -c hellomain.c infierno.o: infierno.c infierno.h gcc -I. -c infierno.c limpio: rm -rf *.o rm hola

Ejecute el comando make nuevamente para ver si su programa se compila con éxito o no. Ejecute el ejecutable hello para verificar el resultado. Mire el directorio actual y verá que se crean archivos de objetos. Hemos agregado una línea más al objetivo limpio para limpiar archivos de objetos. Este script makefile ayudará a recompilar el programa hello world incluso si el infierno.h el archivo está modificado.

Conclusión

Make es una de las herramientas más esenciales para los usuarios y programadores de Linux. Si eres un usuario final, el conocimiento de make te ayudará a arreglar muchas cosas dañadas en tu mundo de Linux. Si es un programador, no puede dejar de escribir el código y dejar que sus usuarios descubran cómo compilar ese código fuente en ejecutables. Debe crear un script de archivo MAKE para los usuarios finales, de modo que no jueguen un juego de adivinanzas para compilar su fuente en ejecutables.

Referencias

Página de inicio del proyecto GNUMake
Documentación GNU Make

Juegos HD remasterizados para Linux que nunca tuvieron un lanzamiento de Linux antes
Muchos desarrolladores y editores de juegos están creando una remasterización HD de juegos antiguos para extender la vida útil de la franquicia, por f...
Cómo usar AutoKey para automatizar juegos de Linux
AutoKey es una utilidad de automatización de escritorio para Linux y X11, programada en Python 3, GTK y Qt. Usando su funcionalidad de scripting y MAC...
Cómo mostrar el contador de FPS en juegos de Linux
Los juegos de Linux obtuvieron un gran impulso cuando Valve anunció el soporte de Linux para el cliente Steam y sus juegos en 2012. Desde entonces, mu...