En el desarrollo de software , Make es una herramienta de interfaz de línea de comandos que ejecuta acciones ordenadas según las dependencias configuradas , tal como se define en un archivo de configuración llamado makefile . Se usa comúnmente para automatizar la compilación y generar código ejecutable (como un programa o una biblioteca ) a partir del código fuente . Make no se limita a la compilación y puede realizar cualquier operación disponible a través del intérprete de comandos del sistema operativo .
Make es ampliamente utilizado, especialmente en sistemas operativos Unix y similares a Unix , aunque existen muchas tecnologías y herramientas competidoras, incluidas herramientas similares que realizan acciones basadas en dependencias, algunos compiladores y de forma interactiva a través de un entorno de desarrollo integrado .
Además de hacer referencia a la herramienta original de Unix , Make también es una tecnología, ya que se han implementado múltiples herramientas con prácticamente la misma funcionalidad , incluyendo una sintaxis y semántica de makefile similares .
Origen
Stuart Feldman creó Make mientras trabajaba en Bell Labs . Una versión inicial se completó en abril de 1976. [ 1 ] [ 2 ] [ 3 ] Feldman recibió el premio ACM Software System Award de 2003 por ser el autor de Make. [ 4 ]
Feldman describe la inspiración para escribir Make como resultado de la frustración de un compañero de trabajo con las herramientas disponibles en ese momento:
Make surgió a raíz de la visita de Steve Johnson (autor de yacc, etc.), quien irrumpió en mi oficina maldiciendo al destino por haberle hecho perder una mañana depurando un programa que funcionaba correctamente (el error ya se había corregido, el archivo no se había compilado y,
cc *.opor lo tanto, no se vio afectado). Como yo había pasado parte de la noche anterior lidiando con el mismo problema en un proyecto en el que estaba trabajando, surgió la idea de una herramienta para solucionarlo. Empezó con una elaborada idea de un analizador de dependencias, que se simplificó considerablemente y se convirtió en Make ese mismo fin de semana. El uso de herramientas aún en desarrollo era parte de la cultura. Los Makefiles eran archivos de texto, no binarios codificados mágicamente, porque esa era la filosofía de Unix : cosas imprimibles, depurables y comprensibles.
— Stuart Feldman, El arte de la programación Unix , Eric S. Raymond , 2003
Antes de Make, la compilación en Unix consistía principalmente en scripts de shell escritos para el código fuente de cada programa. El ordenamiento de dependencias y la comprobación de versiones obsoletas de Make hacen que el proceso de compilación sea más robusto y eficiente. El archivo makefile permitió una mejor organización de la lógica de compilación y, a menudo, un menor número de archivos de compilación.
Make es ampliamente utilizado en parte debido a su temprana inclusión en Unix , comenzando con PWB/UNIX 1.0, que presentaba una variedad de herramientas de desarrollo de software. [ 3 ]
Variantes
Make se ha implementado numerosas veces, generalmente utilizando el mismo formato de archivo makefile y proporcionando las mismas características, pero algunas incorporan mejoras respecto al original. Ejemplos:
- Sun DevPro Make apareció en 1986 con SunOS-3.2. Con SunOS-3.2, se distribuyó como un programa opcional; con SunOS-4.0, SunPro Make se convirtió en el programa Make predeterminado. [ 5 ] En diciembre de 2006, Sun DevPro Make se convirtió en código abierto como parte de los esfuerzos para liberar el código fuente de Solaris . [ 6 ] [ 7 ]
- dmake o Distributed Make venía con Sun Solaris Studio como su Make predeterminado, pero no el predeterminado en el sistema operativo Solaris (SunOS). Originalmente era necesario para compilar OpenOffice, pero en 2009 [ 8 ] el sistema de compilación se reescribió para usar GNU Make. Si bien Apache OpenOffice todavía contiene una mezcla de ambos sistemas de compilación, [ 9 ] LibreOffice, mucho más desarrollado, ahora solo usa el modernizado "gbuild". [ 8 ]
- BSD Make ( pmake , [ 10 ] bmake [ 11 ] o fmake [ 12 ] ), que se deriva del trabajo de Adam de Boor en una versión de Make capaz de construir objetivos en paralelo , y sobrevive con distintos grados de modificación en FreeBSD , [ 11 ] NetBSD [ 13 ] y OpenBSD . [ 14 ] De manera distintiva, tiene condicionales y bucles iterativos que se aplican en la etapa de análisis y pueden usarse para construir condicional y programáticamente el makefile, [ 15 ] incluyendo la generación de objetivos en tiempo de ejecución.
- GNU Make (abreviado gmake ) es la implementación estándar de Make para Linux y macOS. [ 16 ] Proporciona varias extensiones sobre el Make original, como condicionales. También proporciona muchas funciones integradas que se pueden usar para eliminar la necesidad de usar scripts de shell en las reglas del makefile, así como para manipular las variables establecidas y utilizadas en el makefile. [ 17 ] Por ejemplo, la función foreach se puede usar para iterar sobre una lista de valores, como los nombres de los archivos en un directorio dado. [ 18 ] GNU Make es necesario para compilar muchos sistemas de software, incluyendo GNU Compiler Collection (GCC) (desde la versión 3.4 [ 19 ] ), el kernel de Linux, [ 20 ] [ 21 ] Apache OpenOffice, [ 9 ] LibreOffice, [ 8 ] y Mozilla Firefox . [ 22 ]
- Rocky Bernstein's Remake [ 23 ] es una bifurcación de GNU Make y proporciona varias extensiones sobre GNU Make, como una mejor información de ubicación y ubicación de errores, seguimiento de ejecución, perfilado de ejecución y contiene un depurador.
- nmake de Glenn Fowler [ 24 ] (sin relación con la variante de Microsoft del mismo nombre) es incompatible con la variante UNIX, pero proporciona características que, según algunos, reducen el tamaño de los makefiles en un factor de 10.
- Microsoft nmake normalmente se instala con Visual Studio . [ 25 ] Admite directivas de preprocesador como inclusiones y expresiones condicionales que utilizan variables definidas en la línea de comandos o dentro de los makefiles. [ 26 ] [ 27 ] Las reglas de inferencia difieren de Make; por ejemplo, pueden incluir rutas de búsqueda. [ 28 ]
- Embarcadero make tiene una opción de línea de comandos que "Hace que MAKE imite a NMAKE de Microsoft". [ 29 ]
- La herramienta Jom del proyecto Qt es un clon de nmake. [ 30 ]
- Mk reemplazó a Make en Research Unix , a partir de la versión 9. [ 31 ] Un rediseño de la herramienta original por el programador de Bell Labs, Andrew G. Hume, presenta una sintaxis diferente. Mk se convirtió en la herramienta de compilación estándar en Plan 9 , el sucesor previsto de Unix por Bell Labs. [ 32 ]
- Kati es el reemplazo de GNU Make por parte de Google, utilizado desde 2020 en las compilaciones del sistema operativo Android . Traduce el archivo makefile a ninja para compilaciones incrementales más rápidas (similar a la metaherramienta cmake). [ 33 ]
- Snakemake es una implementación basada en Python para compilar y ejecutar flujos de trabajo bioinformáticos . [ 34 ]
POSIX incluye la estandarización de las características básicas y el funcionamiento de la utilidad Make, y se implementa con distintos grados de compatibilidad con las versiones de Make basadas en Unix. En general, los makefiles simples se pueden usar entre varias versiones de Make con un éxito razonable. GNU Make, Makepp y algunas versiones de BSD Make buscan por defecto primero los archivos llamados "GNUmakefile", [ 35 ] "Makeppfile" [ 36 ] y "BSDmakefile" [ 37 ] respectivamente, lo que permite colocar makefiles que usan un comportamiento definido por la implementación en ubicaciones separadas.
Usar
En general, basándose en un archivo makefile, Make actualiza los archivos de destino a partir de los archivos fuente si alguno de ellos tiene una marca de tiempo más reciente que el archivo de destino o si este último no existe. Por ejemplo, esto podría incluir compilar archivos C*.c en archivos objeto y luego enlazarlos para crear un programa ejecutable. También podría incluir compilar archivos TypeScript*.ts a JavaScript para su uso en un navegador. Otros ejemplos incluyen: convertir un archivo de imagen fuente a otro formato, copiar un archivo a un sistema de gestión de contenido y enviar un correo electrónico sobre el estado de la compilación.
Un archivo makefile define objetivos, cada uno de los cuales es un archivo a generar o un concepto definido por el usuario, denominado objetivo ficticio .
Realizar actualizaciones en los objetivos pasados como argumentos:
make [ -f makefile ] [ opciones ] [ objetivos ]Si no se especifica ningún objetivo, Make actualiza el primer objetivo del archivo makefile, que suele ser un objetivo ficticio para realizar la acción más utilizada.
Make omite acciones de compilación si la marca de tiempo del archivo de destino es posterior a la de los archivos fuente. [ 38 ] Esto optimiza el proceso de compilación al omitir acciones cuando el archivo de destino está actualizado, pero a veces las actualizaciones se omiten erróneamente debido a problemas con la marca de tiempo del archivo, como la restauración de una versión anterior de un archivo fuente, o cuando un sistema de archivos de red es la fuente de archivos y su reloj o zona horaria no está sincronizado con la máquina que ejecuta Make. Además, si la marca de tiempo de un archivo fuente es futura, Make activa repetidamente acciones innecesarias, lo que provoca un tiempo de compilación más prolongado.
Cuando Make se inicia, utiliza el archivo makefile especificado en la línea de comandos o, si no se especifica, utiliza el que encuentra mediante reglas de búsqueda específicas. Generalmente, Make utiliza por defecto el archivo en el directorio de trabajo llamado Makefile . GNU Make busca el primer archivo que coincida con: GNUmakefile , makefile o Makefile .
Realizar procesos según las opciones de la línea de comandos en función del archivo makefile cargado.
Makefile
El lenguaje makefile es programación parcialmente declarativa donde se describen las condiciones finales, pero no el orden en que se deben realizar las acciones. [ 40 ] [ 41 ] [ 42 ] [ 43 ]
Los archivos Makefile pueden contener las siguientes construcciones: [ 44 ]
- Regla explícita : define cuándo y cómo actualizar un objetivo, enumerando los requisitos previos (objetivos dependientes) y los comandos que definen la acción de actualización, denominada receta.
- Regla implícita : define cuándo y cómo recrear una clase de archivos en función de sus nombres, incluyendo cómo un objetivo depende de un archivo con un nombre similar al del objetivo y una receta de actualización.
- Definición de variable : asocia un valor de texto con un nombre que puede sustituirse en texto posterior.
- Directiva : instrucción para realizar alguna acción especial, como incluir otro archivo makefile.
- Comentario : línea que comienza con
#
Normas
Cada regla comienza con una línea de dependencia que consta del nombre del objetivo de la regla seguido de dos puntos (:), y opcionalmente una lista de objetivos (también conocidos como prerrequisitos) de los que depende el objetivo de la regla. [ 45 ]
objetivo [objetivo ...]: [componente ...] Tab ↹[comando 1] . . . Tab ↹[comando n]
Normalmente, una regla tiene un único objetivo, en lugar de varios.
Una línea de dependencia puede ir seguida de una receta: una serie de líneas de comando con sangría de tabulación que definen cómo generar el objetivo a partir de los componentes (es decir, los archivos fuente). Si algún requisito previo tiene una marca de tiempo más reciente que el archivo de destino o si el destino no existe como archivo, se ejecuta la receta.
El primer comando puede aparecer en la misma línea después de los prerrequisitos, separados por un punto y coma,
objetivos : prerrequisitos ; comandoPor ejemplo,
hola : ; @ echo " hola " Cada línea de comandos debe comenzar con un carácter de tabulación. Aunque un espacio también es un espacio en blanco , Make requiere tabulación. Dado que esto suele generar confusión y errores, este aspecto de la sintaxis de makefile es objeto de críticas. Eric S. Raymond lo describe como "uno de los peores fallos de diseño en la historia de Unix" [ 46 ] y The Unix-Haters Handbook dijo que "usar tabulaciones como parte de la sintaxis es como una de esas trampas pungee [sic] de The Green Berets ". Feldman explica que la elección se debió a una solución alternativa para una dificultad de implementación temprana y se mantuvo por el deseo de compatibilidad con versiones anteriores para los primeros usuarios:
¿Por qué la tabulación en la columna 1? Yacc era nuevo, Lex era completamente nuevo. No había probado ninguno de los dos, así que pensé que sería una buena excusa para aprender. Después de enredarme con mi primer intento de Lex, simplemente hice algo sencillo con el patrón newline-tab. Funcionó y se mantuvo. Y luego, unas semanas después, tenía una docena de usuarios, la mayoría amigos, y no quería estropear mi base de usuarios integrada. El resto, lamentablemente, es historia.
— Stuart Feldman [ 46 ]
GNU Make, desde la versión 3.82, permite elegir cualquier símbolo (un carácter) como prefijo de receta utilizando la variable especial .RECIPEPREFIX:
.RECIPEPREFIX := : all : :@echo "El símbolo de prefijo de receta está establecido en '$(.RECIPEPREFIX)'"Cada comando se ejecuta en un intérprete de comandos independiente . Dado que los sistemas operativos utilizan intérpretes de comandos distintos, esto puede generar archivos makefile que no se pueden transferir. Por ejemplo, GNU Make (y todas las versiones de Make compatibles con POSIX) ejecutan los comandos con /bin/sh por defecto, donde normalmente se utilizan comandos de Unix como cp . En cambio, nmake de Microsoft ejecuta los comandos con cmd.exe, donde están disponibles comandos por lotes como copy , pero no necesariamente cp.
Dado que una receta es opcional, la línea de dependencia puede consistir únicamente en componentes que hagan referencia a otros objetivos:
realclean : limpiar destcleanLa siguiente regla de ejemplo se evalúa cuando Make actualiza el archivo de destino file.txt mediante make file.txt. Si file.html es más reciente que file.txt o file.txt no existe, entonces se ejecuta el comando para generar file.txt a partir de file.html.
archivo.txt : archivo.html lynx -dump archivo.html > archivo.txt Un comando puede tener uno o más de los siguientes prefijos (después de la tabulación):
- El signo menos (-) especifica que se ignore un error del comando.
- El operador `at (@)` especifica que no se muestre el comando antes de que se ejecute.
- El signo más (+) especifica que se ejecute el comando incluso si Make se invoca en modo "no ejecutar".
Alternativamente, se puede obtener ignorar errores y silenciar el eco mediante los objetivos especiales .IGNOREy .SILENT. [ 47 ]
NMAKE de Microsoft tiene reglas predefinidas que se pueden omitir de estos makefiles, por ejemplo .c.obj$(CC)$(CFLAGS)
Macros
Un archivo makefile puede definir y usar macros. Las macros suelen denominarse variables cuando contienen definiciones de cadena simples, como . Las macros en los archivos makefile pueden ser sobrescritas en los argumentos de la línea de comandos que se pasan a la utilidad Make. Las variables de entorno también están disponibles como macros.CC=clang
Por ejemplo, la macro CCse usa frecuentemente en los makefiles para referirse a la ubicación de un compilador de C. Si se usa de forma consistente en todo el makefile, el compilador utilizado se puede cambiar modificando el valor de la macro en lugar de modificar cada comando de regla que invoca al compilador.
Las macros suelen escribirse en mayúsculas :
MACRO = definición Un valor macro puede constar de otros valores macro. El valor de la macro se expande de forma diferida en cada uso .
Una macro se usa expandiéndola ya sea a través de $ NOMBRE o $( NOMBRE ). Esta última es más segura ya que omitir los paréntesis lleva a que Make interprete la siguiente letra después de $como el nombre completo de la variable. Una forma equivalente usa llaves en lugar de paréntesis, es decir ${}, que es el estilo usado en BSD .
NUEVA_MACRO = $( MACRO ) - $( MACRO2 )Las macros pueden estar compuestas de comandos de shell mediante el uso del operador de sustitución de comandos!= . [ 48 ]
AAAAMMDD != fecha La sintaxis de línea de comandos para sobrescribir una macro es:
hacer MACRO = "valor" [ MACRO = "valor" ... ] OBJETIVO [ OBJETIVO ... ]Los Makefiles pueden acceder a macros internas predefinidas , ?siendo @comunes las siguientes.
objetivo : componente 1 componente 2 # echo componentes MÁS JÚNIROS que OBJETIVO echo $? # echo nombre de OBJETIVO echo $@Una sintaxis común al definir macros, que funciona en BSD y GNU Make, es usar += , ?= , y != en lugar del signo igual ( = ). [ 49 ]
Reglas de sufijos
Las reglas de sufijo tienen "objetivos" con nombres en el formato .FROM.TOy se utilizan para ejecutar acciones basadas en la extensión del archivo. En las líneas de comando de las reglas de sufijo, POSIX especifica [ 50 ] que la macro interna $<se refiere al primer prerrequisito y $@se refiere al objetivo. En este ejemplo, que convierte cualquier archivo HTML en texto, el token de redirección del shell >forma parte de la línea de comando, mientras que $<es una macro que se refiere al archivo HTML:
.SUFIJOS : .txt .html# De .html a .txt .html.txt : lynx -dump $< > $@Cuando se llama desde la línea de comandos, el ejemplo anterior se expande:
$ make -n file.txt lynx -dump file.html > file.txtReglas de patrones
Las reglas de sufijo no pueden tener prerrequisitos propios. [ 51 ] Si los tienen, se tratan como archivos normales con nombres inusuales, no como reglas de sufijo. GNU Make admite reglas de sufijo para compatibilidad con makefiles antiguos, pero por lo demás fomenta el uso de reglas de patrón . [ 52 ]
Una regla de patrón se parece a una regla ordinaria, excepto que su objetivo contiene exactamente un %carácter dentro de la cadena. El objetivo se considera un patrón para la coincidencia de nombres de archivo: %puede coincidir con cualquier subcadena de cero o más caracteres, [ 53 ] mientras que otros caracteres coinciden solo consigo mismos. Los prerrequisitos también se utilizan %para mostrar cómo sus nombres se relacionan con el nombre del objetivo.
El ejemplo anterior de una regla de sufijo se vería como la siguiente regla de patrón:
# De %.html a %.txt %.txt : %. html lynx -dump $< > $@Comentario
Los comentarios de una sola línea comienzan con el símbolo de almohadilla (#).
Directiva
Una directiva especifica un comportamiento especial, como por ejemplo incluir otro archivo makefile.
continuación de línea
La continuación de una línea se indica con una \barra invertida al final de la misma.
objetivo: componente \ componente Tab ↹dominio ; \ otro-comando | \ comando canalizado
Ejemplos
Los siguientes comandos se encuentran en el contexto del archivo makefile que se muestra a continuación.
make # actualiza el primer objetivo, 'all' make help # actualiza el objetivo 'help' para listar objetivos make dist # actualiza el objetivo 'dist' para compilar para distribuciónPAQUETE = paquete VERSIÓN = ` fecha "+%Y.%m%d%" ` DIRECTORIO_DE_LANZAMIENTO = .. ARCHIVO_DE_LANZAMIENTO = $( PAQUETE ) - $( VERSIÓN )# Objetivo predeterminado # nota: la variable LOGNAME proviene del entorno all : echo "Hola $( LOGNAME ) , no hay nada que hacer por defecto" echo "Prueba 'make help'"# Mostrar objetivos buscando en este archivo help : egrep "^# target:" [ Mm ] akefile# Crea una distribución de lanzamiento : tar -cf $( RELEASE_DIR ) / $( RELEASE_FILE ) && \ gzip -9 $( RELEASE_DIR ) / $( RELEASE_FILE ) .tar A continuación se muestra un archivo makefile simple que, por defecto (la regla "all" aparece primero), compila un archivo fuente llamado "helloworld.c" utilizando el compilador C del sistema y también proporciona un objetivo "clean" para eliminar los archivos generados si el usuario desea comenzar de nuevo. y $@son $<dos de las llamadas macros internas (también conocidas como variables automáticas) y representan el nombre del objetivo y la fuente "implícita", respectivamente. En el ejemplo siguiente, $^se expande a una lista de prerrequisitos delimitada por espacios. Hay varias otras macros internas. [ 50 ] [ 54 ]
CFLAGS ?= -g LDLIBS += -lmtodo : Salida.txtOut.txt : helloworld ./$< > $@helloworld : helloworld . o $( CC ) $( LDFLAGS ) -o $@ $^ $( LDLIBS )holamundo.o : holamundo . c $( CC ) $( CFLAGS ) -c -o $@ $<limpiar : $( RM ) Out.txt helloworld helloworld.o Muchos sistemas incluyen reglas y macros de Make predefinidas para especificar tareas comunes, como la compilación basada en el sufijo del archivo. Esto permite a los usuarios omitir las instrucciones reales (a menudo no portables) sobre cómo generar el destino a partir del código fuente. En un sistema de este tipo, el archivo makefile anterior podría modificarse de la siguiente manera:
todos : hola mundohelloworld : helloworld . o $( CC ) $( CFLAGS ) $( LDFLAGS ) -o $@ $^limpio : $( RM ) helloworld helloworld.o# regla de sufijo .co : $( CC ) $( CFLAGS ) -c $<.SUFIJOS : . cLa dependencia de "helloworld.o" con "helloworld.c" ahora se gestiona automáticamente con Make. En un ejemplo tan sencillo como el que se muestra aquí, esto apenas importa, pero el verdadero potencial de las reglas de sufijo se hace evidente cuando aumenta el número de archivos fuente en un proyecto de software. Basta con escribir una regla para el paso de enlace y declarar los archivos objeto como prerrequisitos. Make determinará entonces implícitamente cómo compilar todos los archivos objeto y buscará cambios en todos los archivos fuente.
Las reglas de sufijo simples funcionan bien siempre que los archivos fuente no dependan entre sí ni de otros archivos, como los archivos de cabecera. Otra forma de simplificar el proceso de compilación es usar las llamadas reglas de coincidencia de patrones, que se pueden combinar con la generación de dependencias asistida por el compilador. Como ejemplo final que requiere el compilador gcc y GNU Make, aquí hay un makefile genérico que compila todos los archivos C de una carpeta a los archivos objeto correspondientes y luego los enlaza al ejecutable final. Antes de la compilación, las dependencias se recopilan en un formato compatible con makefile en un archivo oculto ".depend", que luego se incluye en el makefile. Los programas portátiles deben evitar las construcciones que se utilizan a continuación.
# Archivo GNUMakefile genérico# Fragmento que fallará si no se cumple la condición de GNU ifneq (,) Este archivo makefile requiere GNU Make. endifPROGRAMA = foo C_FILES := $( comodín *.c ) OBJS := $( patsubst %.c, %.o, $( C_FILES )) CC = cc CFLAGS = -Wall -pedantic LDFLAGS = LDLIBS = -lmtodos : $( PROGRAMA )$(PROGRAM) : . depende $( OBJS ) $( CC ) $( CFLAGS ) $( OBJS ) $( LDFLAGS ) -o $( PROGRAM ) $( LDLIBS )depender : . depender.depend : cmd = gcc - MM - MF depend $( var ) ; cat depend >> . depend ; .depend : @echo "Generando dependencias..." @ $( foreach var, $( C_FILES ) , $( cmd )) @rm -f depend-incluir .depend# Estas son las reglas de coincidencia de patrones. Además de las variables automáticas # utilizadas aquí, la variable $* que coincide con lo que representa % # puede ser útil en casos especiales. %.o : %. c $( CC ) $( CFLAGS ) -c $< -o $@% : %. o $( CC ) $( CFLAGS ) -o $@ $<limpiar : rm -f .depend $( OBJS ).FALSO : limpio dependeSeguimiento de dependencias
Los archivos Makefile incluyen dependencias, y una dependencia olvidada o adicional puede no ser evidente para el usuario y provocar errores sutiles en el software generado, difíciles de detectar. Existen diversos enfoques para evitar este problema y mantener sincronizadas las dependencias entre el código fuente y los archivos Makefile. Un enfoque consiste en utilizar el compilador para controlar los cambios en las dependencias. GCC puede analizar estáticamente el código fuente y generar reglas para el archivo especificado automáticamente mediante un -MMinterruptor. Otro enfoque sería utilizar archivos Makefile o herramientas de terceros que generen archivos Makefile con dependencias (por ejemplo, la cadena de herramientas Automake del Proyecto GNU puede hacerlo automáticamente).
Otro enfoque consiste en utilizar herramientas de meta-compilación como CMake , Meson , etc.
Véase también
- Grafo de dependencias : grafo dirigido que representa dependencias.
- Lista de software de automatización de compilación
Referencias
- ↑ "V7/usr/src/cmd/make/ident.c" . tuhs.org . 1 de septiembre de 2013 . Consultado el 18 de marzo de 2018 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Feldman, SI (abril de 1979). "Make --- Un programa para el mantenimiento de programas informáticos". Software: Practice and Experience . 9 (4): 255– 265. CiteSeerX 10.1.1.39.7058 . doi : 10.1002/spe.4380090402 . S2CID 33059412 .
- 1 2 Thompson, TJ (noviembre de 1980). "Entorno de trabajo del diseñador: proporcionando un entorno de producción". Bell System Technical Journal . 59 (9): 1811– 1825. Bibcode : 1980BSTJ...59.1811T . doi : 10.1002/j.1538-7305.1980.tb03063.x . S2CID 27213583 .
En el mantenimiento general de DWB, hemos utilizado el Sistema de control de código fuente y la utilidad make proporcionada por el sistema operativo interactivo PWB/UNIX*.
- ↑ Matthew Doar (2005). Entornos de desarrollo prácticos . O'Reilly Media . pág. 94. ISBN 978-0-596-00796-6.
- ↑ "Grupos de Google" . archivo.pt . Archivado del original el 22 de enero de 2011. Consultado el 18 de marzo de 2018 .
{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace ) - ↑ "OpenSolaris a los dos años (Jim Grisanzio)" . 12 de diciembre de 2013. Archivado del original el 12 de diciembre de 2013. Consultado el 18 de marzo de 2018 .
- ↑ Grisanzio, Jim. La historia de OpenSolaris .
- 1 2 3 "Desarrollo/Gbuild - La Wiki de la Fundación Documental" . wiki.documentfoundation.org . Archivado del original el 19 de marzo de 2018. Recuperado el 18 de marzo de 2018 .
- 1 2 "Guía de compilación de Apache OpenOffice - Wiki de Apache OpenOffice" . wiki.openoffice.org . Archivado del original el 17 de marzo de 2018. Consultado el 18 de marzo de 2018 .
- ↑ Código fuente de FreeBSD 2.0.5 Make , 1993, archivado del original el 6 de marzo de 2023 , recuperado el 6 de mayo de 2016.
- 1 2 "Bmake(1)" . Archivado del original el 3 de agosto de 2020. Recuperado el 1 de abril de 2020 .
- ↑ "fmake(1) Manual de comandos generales" . Archivado del original el 20 de abril de 2021. Consultado el 30 de noviembre de 2020 .
- ↑ "make" . Páginas del manual de NetBSD . Archivado del original el 9 de julio de 2020. Consultado el 9 de julio de 2020 .
- ↑ "make(1) - Páginas del manual de OpenBSD" . man.openbsd.org . Archivado del original el 5 de febrero de 2018. Consultado el 18 de marzo de 2018 .
- ↑ "make" . FreeBSD . Archivado del original el 11 de julio de 2020. Recuperado el 9 de julio de 2020.
En make se proporcionan la inclusión de Makefile, estructuras condicionales y bucles for que recuerdan al lenguaje de programación C.
- ↑ Arnold Robbins (2005), Unix en pocas palabras, cuarta edición , O'Reilly, archivado del original el 21/11/2014 , consultado el 28/05/2014.
- ↑ "8. Funciones para transformar texto" , GNU make , Free Software Foundation, 2013, archivado del original el 23/05/2014 , recuperado el 28/05/2014.
- ↑ "8.5 La función foreach" , GNU make , Free Software Foundation, 2013, archivado del original el 22/05/2014 , recuperado el 28/05/2014.
- ↑ "Cambios, nuevas características y correcciones de la serie de lanzamientos de GCC 3.4" . Free Software Foundation. 2006. Archivado del original el 24 de octubre de 2016. Consultado el 22 de julio de 2016 .
- ↑ Javier Martínez Canillas (26 de diciembre de 2012). "Kbuild: el sistema de compilación del kernel de Linux" . Linux Journal . Archivado del original el 21 de noviembre de 2014. Consultado el 28 de mayo de 2014 .
- ↑ Greg Kroah-Hartman (2006), Linux Kernel in a Nutshell , O'Reilly, archivado del original el 11 de agosto de 2014 , consultado el 28 de mayo de 2014.
- ↑ "Instrucciones de montaje" . Archivado del original el 25/04/2017 . Consultado el 12/05/2017 .
- ↑ Rocky Bernstein. "Remake – GNU Make con rastreo comprensible y un depurador" . Archivado del original el 21/01/2018 . Consultado el 20/01/2018 .
- ↑ Glenn Fowler (4 de enero de 2012). "Descripción general de nmake" . Investigación de sistemas de información y software, AT&T Labs Research. Archivado del original el 2 de septiembre de 2015. Recuperado el 26 de mayo de 2014 .
- ↑ "NMAKE Reference Visual Studio 2015" . Microsoft. 2015. Archivado del original el 8 de diciembre de 2009. Consultado el 27 de noviembre de 2009 .
- ↑ "Directivas de preprocesamiento de Makefile" . 2014. Archivado del original el 26 de agosto de 2014. Consultado el 27 de mayo de 2014 .
- ↑ "Operadores de preprocesamiento de Makefile" . Microsoft. 2014. Archivado del original el 26 de agosto de 2014. Consultado el 27 de mayo de 2014 .
- ↑ "Rutas de búsqueda en reglas" . Microsoft. 2014. Archivado del original el 26 de agosto de 2014. Consultado el 27 de mayo de 2014 .
- ↑ "MAKE" . CodeGear(TM). 2008. Archivado del original el 2 de marzo de 2017. Consultado el 24 de agosto de 2014 .
- ↑ "Jom - Qt Wiki" . Proyecto Qt. 2021. Archivado del original el 2 de febrero de 2021. Consultado el 26 de enero de 2021 .
- ↑ McIlroy, MD (1987). Un lector de Research Unix: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). Bell Labs. CSTR 139.
- ↑ Hume, Andrew G.; Flandrena, Bob (2002). "Mantenimiento de archivos en Plan 9 con Mk" . Manual del programador de Plan 9. AT&T Bell Laboratories. Archivado del original el 11 de julio de 2015.
- ↑ "google/kati: Un clon experimental de GNU make" . GitHub . 30 de noviembre de 2020. Archivado del original el 28 de noviembre de 2020. Consultado el 30 de noviembre de 2020 .
- ↑ Mölder, Felix; Jablonski, Kim Philipp; Letcher, Brice; Hall, Michael B.; Tomkins-Tinch, Christopher H.; Sochat, Vanessa; Forster, Jan; Lee, Soohyun; Twardziok, Sven O.; Kanitz, Alexander; Wilm, Andreas (2021-04-19). " Análisis de datos sostenible con Snakemake" . F1000Research . 10:33 . Bibcode : 2021JSPS...10...33M . doi : 10.12688/f1000research.29032.2 . ISSN 2046-1402 . PMC 8114187. PMID 34035898 .
- ↑ "GNU 'make'" . Free Software Foundation. Archivado del original el 05-06-2018 . Consultado el 16-04-2014 .
- ↑ "Makepp" . Archivado del original el 15 de agosto de 2025. Consultado el 9 de agosto de 2025 .
- ↑ "Free BSD make" . Archivado del original el 8 de mayo de 2018. Consultado el 7 de mayo de 2018 .
- ↑ Cómo ordenar la salida de un archivo del comando ls de Linux. Archivado el 13 de septiembre de 2016 en Wayback Machine .
- ↑ "makefile" . Documentación para desarrolladores de Apple: Identificadores de tipo uniforme . Apple Inc. Archivado del original el 22 de mayo de 2023. Consultado el 22 de mayo de 2023 .
- ↑ Adams, P. y Solomon, M., 1993, Una visión general del entorno de desarrollo de software CAPITL. En Taller internacional sobre gestión de configuración de software (págs. 1-34). Berlín, Heidelberg: Springer Berlin Heidelberg.
- ↑ una descripción general de los DSLS Archivado el 23 de octubre de 2007 en Wayback Machine , 27/02/2007, wiki de Phoenix
- ↑ Re: Coreografía y DESCANSO Archivado el 12 de septiembre de 2016 en Wayback Machine , de Christopher B Ferris el 9 de agosto de 2002
- ↑ Archivos Makefile de Target Junior archivados el 7 de enero de 2010 en Wayback Machine , Andrew W. Fitzgibbon y William A. Hoffman
- ↑ 3.1 Contenido de los Makefiles Archivado el 5 de mayo de 2021 en Wayback Machine , GNU make , Free Software Foundation
- ↑ "Tipos de prerrequisitos (GNU make)" . GNU.org . Proyecto GNU . Archivado del original el 2 de diciembre de 2020. Consultado el 15 de diciembre de 2020 .
- 1 2 "Capítulo 15. Herramientas: make: Automatizando tus recetas", El arte de la programación Unix , Eric S. Raymond 2003
- ↑ – Shell and Utilities Reference, The Single UNIX Specification , Versión 5 de The Open Group
- ↑ "Make" . Archivado del original el 5 de octubre de 2024. Consultado el 29 de octubre de 2024 .
- ↑ – Manual de comandos generales de FreeBSD
- 1 2 "make" . www.opengroup.org . Archivado del original el 31 de octubre de 2010. Recuperado el 18 de marzo de 2018 .
- ↑ "Manual de GNU make: reglas de sufijos" . Free Software Foundation. Archivado del original el 22 de mayo de 2014. Consultado el 24 de mayo de 2014 .
- ↑ "Manual de GNU make: reglas de patrones" . Free Software Foundation. Archivado del original el 28 de mayo de 2014. Consultado el 24 de mayo de 2014 .
- ↑ Véase la sección Reglas de coincidencia de patrones en la página man de SunPro. Archivado el 29 de mayo de 2014 en Wayback Machine .
- ↑ Variables automáticas Archivadas el 25 de abril de 2016 en la Wayback Machine GNU `make'
Enlaces externos
- Página principal de GNU Make
- Make : un programa para el mantenimiento de programas informáticos. Artículo de Stuart Feldman de 1978 que describe make.
- Automatización de compilaciones
- Herramientas de compilación
- Software del Proyecto GNU
- Herramientas de programación Unix
- Utilidades Unix SUS2008