Hacer

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 11 de enero de 2016; las comprobaciones requieren 35 ediciones .

Hacer
clase de idioma herramienta de automatización de compilación [d] , utilidad UNIX [d] ,comandos, lenguajedeprogramacióny lenguaje sangrado [d]
Apareció en abril de 1976  ( 1976-04 )
Autor Estuardo Feldman
Dialectos Marca BSD, marca GNU, marca Microsoft
influenciado Hormiga , rastrillo , MSBuild y otros
sistema operativo similar a Unix

make  ( IPA [ me ɪ k ] ; del  inglés  -  "make", "make") es una utilidad que automatiza el proceso de conversión de archivos de un formato a otro. La mayoría de las veces, esto consiste en compilar el código fuente en archivos de objetos y luego vincularlos en archivos ejecutables o bibliotecas .

La utilidad utiliza archivos MAKE especiales que especifican las dependencias de los archivos entre sí y las reglas para satisfacerlas. Basándose en la información sobre la hora de la última modificación de cada archivo, make determina y ejecuta los programas necesarios.

Origen

Antes de la creación del sistema make build (compilación) , el software de Unix generalmente consistía en scripts de construcción de shell que acompañaban al código fuente de los programas.

make fue creado por Stuart Feldman en abril de 1976 en Bell Labs .

Actualmente existen muchas utilidades para el seguimiento de dependencias, pero make  es una de las más utilizadas, principalmente debido a que se encuentra incluido en Unix , comenzando con la versión PWB/UNIX (Eng. Programmer's Workbench ), que contenía herramientas para desarrollar seguridad del software .

Versiones modernas

Hay varias versiones de make , basadas en el make original o escritas desde cero, que utilizan los mismos formatos de archivo y principios y algoritmos básicos, así como algunas mejoras y extensiones. Por ejemplo:

POSIX incluye un estándar para las características básicas de make , implementado con diversos grados de compatibilidad en varias versiones de make . En general, los archivos MAKE simples pueden procesarse con éxito mediante diferentes versiones de make .

Uso

hacer [ -f makefile ] [ objetivo ] ...

El archivo se busca en el directorio actual. Si no se especifica el modificador -f , se usa el nombre de archivo MAKE predeterminado, Makefile (sin embargo, diferentes implementaciones de MAKE pueden verificar otros archivos además de este, como GNUmakefile ).

make abre el archivo MAKE, lee las reglas y ejecuta los comandos necesarios para construir el objetivo especificado .

Objetivos estándar para crear distribuciones GNU :

  • all - construye el paquete;
  • instalar: instala un paquete de la distribución (copia archivos ejecutables, bibliotecas y documentación a los directorios del sistema);
  • desinstalar: eliminar el paquete (elimina los archivos ejecutables y las bibliotecas de los directorios del sistema);
  • clean: limpia la distribución (elimina de la distribución el objeto y los archivos ejecutables creados durante el proceso de compilación);
  • distclean: limpia todos los archivos creados durante la compilación y todos los archivos auxiliares creados por la utilidad ./configure durante el proceso de configuración de las opciones de compilación de la distribución.

De forma predeterminada, make utiliza el primer destino del archivo MAKE.

El proceso de creación de aplicaciones BSD a menudo utiliza:

  • depend - compilar/construir dependencias.

Makefile

El programa make ejecuta comandos de acuerdo con las reglas especificadas en un archivo especial. Este archivo se llama makefile. Por lo general, un archivo MAKE describe cómo compilar y vincular un programa.

makefile consta de reglas y variables. Las reglas tienen la siguiente sintaxis:

objetivo1 objetivo2 ... : prop1 prop2 ... equipo1 equipo2 ...

La regla es un conjunto de comandos, cuya ejecución conducirá al ensamblaje de archivos de destino a partir de archivos de atributos .

La regla le dice a make que los archivos producidos por los comandos ( objetivos ) dependen de los archivos prop correspondientes. make no verifica ni usa el contenido de los archivos prop de ninguna manera, pero solo se requiere especificar la lista de archivos prop para asegurarse de que los archivos estén presentes antes de comenzar a ejecutar comandos y para realizar un seguimiento de las dependencias de los archivos.

Normalmente, el destino es el nombre del archivo que se genera como resultado de los comandos especificados. El destino también puede ser el nombre de alguna acción que se realizará como resultado de la ejecución de comandos (por ejemplo, el destino limpio en los archivos MAKE para compilar programas generalmente elimina todos los archivos creados durante el proceso de compilación ).

Las líneas de comando deben comenzar con un carácter de tabulación .

Considere un programa simple en C. Deje que el programa consista en un par de archivos de código, main.c y lib.c, así como un archivo de encabezado  , defines.h, que se incluye en ambos archivos de código . Por lo tanto, para crear un programa, es necesario crear archivos de objeto main.o y lib.o a partir de pares (main.c defines.h) y (lib.c defines.h), y luego vincularlos al programa. Al construir manualmente, debe ejecutar los siguientes comandos:

cc -c main.c cc -c lib.c cc -o programa main.o lib.o

Si se realizan cambios en el archivo defines.h durante el desarrollo del programa, se requerirá la recompilación de ambos archivos y la vinculación , y si cambiamos lib.c, se puede omitir la recompilación de main.c.

Por lo tanto, para cada archivo que necesitamos obtener durante el proceso de compilación , debemos especificar en base a qué archivos y con qué comando se crea. El programa make hace lo siguiente basándose en esta información:

  • recopila de esta información la secuencia correcta de comandos para obtener los archivos resultantes requeridos;
  • e inicia la creación del archivo requerido solo si dicho archivo no existe o es más antiguo que los archivos de los que depende.

Si no especifica explícitamente un destino cuando ejecuta make , se procesará el primer destino en el archivo MAKE que no comience con '.'.

Para el programa del programa, es suficiente escribir el siguiente archivo MAKE:

programa : principal . sobre lib . o cc -o programa main.o lib.o main.o lib.o : define . h

Vale la pena señalar una serie de características. El nombre del segundo destino especifica dos archivos y no se especifica ningún comando de compilación para el mismo destino. Además, la dependencia de los archivos objeto de los archivos "*.c" no se especifica explícitamente en ninguna parte. Esto se debe a que el programa make tiene reglas predefinidas para obtener archivos con ciertos . Entonces, para el archivo objeto de destino (extensión “.o”), cuando se encuentre un archivo correspondiente con la extensión “.c”, se llamará al compilador “cc -c”, especificando este archivo “.c” y todos archivos de dependencia en los parámetros.

Sintaxis para definir variables :

variable = valor

El valor puede ser cualquier secuencia de caracteres , incluidos espacios y referencias a los valores de otras variables . Dicho esto, podemos modificar nuestro archivo MAKE de la siguiente manera:

OBJ = main.o lib.o programa : $( OBJ ) cc -o programa $( OBJ ) $(OBJ) : define . h

Cabe señalar que el cálculo de los valores de las variables ocurre solo en el momento del uso ( se utiliza la llamada evaluación perezosa ). Por ejemplo, la creación de todos los objetivos a partir del siguiente archivo MAKE imprimirá la cadena "¿Eh?".

foo = $( bar ) bar = $( ugh ) ugh = ¿Eh? todos : echo $( foo )

Supongamos que se agrega un segundo archivo de encabezado, lib.h, al proyecto y solo se incluye en lib.c. Luego, el archivo MAKE aumentará en una línea más:

lib.o : lib . h

Por lo tanto, un archivo de destino se puede especificar para varios propósitos. En este caso, la lista completa de dependencias para el archivo se compilará a partir de las listas de dependencias de todos los objetivos en los que participa, el archivo se creará una sola vez.

Ejecución multiproceso

Para acelerar las tareas de ejecución prolongada, se utiliza la paralelización de los cálculos dentro del programa make. La paralelización la realiza automáticamente el intérprete de make. Para ejecutar el archivo MAKE en modo de subprocesos múltiples, debe pasar la opción -j <número de subprocesos>.

hacer [ -j <número de subprocesos> ] [ objetivo ]

Véase también

Literatura

Enlaces