«Make» ha estado allí desde hace algunos años. Hoy en día, existen muchos sistemas modernos de construcción, como Maven / ant para Java, cmake para el nuevo c / c + +, que, mientras que la comparación de «hacer», son más «moderna» a la nueva generación de desarrolladores. Una IDE también impulsar la productividad del desarrollador, ya que especifica un proyecto de plantilla / patrón / norma por adelantado y el desarrollador no tiene que molestarse con los detalles ingeniosos cómo se construye la dependencia bajo nivel de la cadena de generación. Personalmente estoy de acuerdo en que la arquitectura del proyecto de construcción debe dejar de construir el equipo, y dejar que el enfoque desarrollador de la aplicación, y el software como «hacer» debe ser rediseñado siguiendo la metodología de software más reciente, para que sea más fácil de usar para el desarrollador y atrae a más posibles mantenedores de la comunidad.
Después de todo, «hacer» todavía va a vivir en el futuro previsible, debido a que muchos softwares existentes se construyen sobre la base de ella, sobre todo el software GNU, gcc con uno de los ejemplos. Hemos tocado base con autotools en los últimos puestos. Como podemos ver, autotools es sólo un montón de macros m4, además de los scripts de shell, que generan variable de entorno y archivo de configuración (# define archivo de cabecera), y emiten definitiva hacer que los archivos. Autotools es en realidad un «frontend» para «hacer».
La gramática esotérica de «hacer», que es una secuela de la antigua «make» analizador gramatical, a menudo parece formidable para nuevo encuentro. Personalmente, me tomé hace algunos años para finalmente sentirse cómodo con «make». Antes de eso, me gustaría utilizar lo menos posible los rasgos de la marca, sólo lo suficiente para tener un archivo make viable. Para los proyectos que no sean c / c + +, me gustaría utilizar Maven y otros sistemas de generación. Sólo después me convierto en un pensador más «sofisticados» del software, puedo analizar cómodamente cómo «hacer» el trabajo bajo el capó, siguiendo las pautas de los mismos diseños, algoritmos como cualquier otra aplicación de software serio. En este momento, la gramática esotérica y torpe no es un obstáculo más, y el entendimiento más sólido y su uso sigue. Debo admitir, esta curva de aprendizaje es demasiado empinada y demasiado largo para mí. />
Puede que no tenga ningún aficionado a «hacer». Pero si usted necesita para hacer frente en su trabajo, y no se siente cómodo con él ahora, me gustaría compartir con ustedes mis ideas sobre cómo «hacer» el trabajo. Espero que estas ideas te puede ahorrar un poco de tiempo y frustración durante la batalla con «make».
1. Dependencia Tree />
objetivos: requisitos previos
receta span>
Hay un borde relación de dependencia dirigida entre el nodo «objetivos» nodo «Requisitos previos», con «receta» como propiedad del borde:
Si bien» objetivo «o» condición «no existe, o si la marca de tiempo de» target «es más antiguo que la marca de tiempo de» requisito previo «(Tt
C: prerrequisito no existe
D: destino no existe
E: tanto el objetivo como requisito previo no existen
Si la dependencia no se cumple, el » receta «se programará en ejecución para generar / target actualización para cumplir con el requisito de la dependencia. Si el «requisito previo» no existe o no está actualizado, a continuación, hacer tratará el requisito como un nuevo objetivo, y buscará recursivamente dependencia árbol para de este nuevo objetivo.
A la receta se compone de «comandos». Estos comandos son generalmente sólo shell comandos. Por ejemplo:
Objetivo: Requisitos previos
mando A; comando B
comando C; comandar D
«mando A; comando B» se ejecutará en un sub-shell, mientras que el «comando C; comando D» se ejecutará en otro sub-shell. Si especifica «. ONESHELL» directiva, entonces todas las líneas de comandos se ejecutan en un único sub-shell.
2. árbol de dependencias (DAG) de recorrido y la planificación de tareas del árbol de dependencias />
Las colas de comandos final se ha visto como el resultado serializado de una «profundidad primero , orden post «recorrido DAG. Cada paso del recorrido podría generar diferentes cola de comandos, o incluso cola vacía cuando se dianas están listos. Los comandos en cola de comandos podrían ser despedidos por marca en paralelo. Es el mecanismo fundamental para el «make paralelo» (make-j N). En principio, si la programación de trabajo más pequeña es «receta», hacer que sólo tiene que asegurarse de que todas las recetas de ejecución no tienen. «Padres -> children» de relaciones entre cada par de ellos
Hay módulos perl que podría dibujar un DAG para un archivo make. Se pueden instalar como:
CPAN App :: cpanminus
cpanm Makefile :: GraphViz
apanm Makefile :: Parser
Elijamos un ejemplo del capítulo del libro «Gestión de proyectos con GNU Make tercera edición»
luke luke @ debian: ~ / t/examples/ch01-cw1 $ cat Makefile
count_words: count_words.o lexer.o
gcc count_words.o lexer.o-lfl-o count_words
count_words.o: count_words.c
gcc-c count_words.c
lexer.o: lexer.c
gcc-c lexer.c
lexer.c: lexer.l
flex-t lexer.l> lexer.c
PHONY: limpia
limpia:
rm-rf *. o lexer.c count_words
luke luke @ debian: ~ / t/examples/ch01-cw1 $ gvmake-todos
analizar Makefile …
luke luke @ debian: ~ / t/examples/ch01-cw1 $ ls
count_words.c lexer.l Makefile Makefile.png me corro-run
luke luke @ debian: ~ / t/examples/ch01-cw1 $ shotwell Makefile.png
Lleguémonos este diagrama en nuestro Formato:
El orden de recorrido de nodo es» 1 -> 2 -> 3 -> 4 -> 5 -> 6 «. Cuando se atraviesa un nodo, haga determinará si necesita este nodo para ser actualizado como un objetivo. Si es así, la receta correspondiente (implícita o explícita) será en horario de cola de comandos.
Para verificar nuestro análisis, voy a utilizar la herramienta «nueva versión» de generar la salida de depuración más sensible.
http://bashdb.sourceforge.net/remake/
luke luke @ debian: ~ / t/examples/ch01-cw1 $ rehace – trace
GNU Make + depurador 3.81 + dbg-0.2
Copyright (C) 2002, 2003, 2004, 2006, 2008 Free Software Foundation, Inc.
Este es software libre, vea el código para las condiciones de copia
No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN
PROPÓSITO PARTICULAR .
Este programa construido para x86_64-pc-linux-gnu
Lectura makefiles …
Objetivos de actualización ….
/ home / luke / t/examples/ch01-cw1/Makefile:. 1 archivo `’does not exist count_words
/ home/luke/t/examples/ch01-cw1/Makefile: 4 no existe archivo `count_words.o ‘.
/ home/luke/t/examples/ch01-cw1/Makefile: 4 Deben rehacer objetivo `count_words.o ‘
gcc-c count_words.c
/ home/luke/t/examples/ch01-cw1/Makefile: 4 de archivo de destino con éxito rehecho `count_words . o ‘. (A)
/ home/luke/t/examples/ch01-cw1/Makefile: 7 archivo `lexer.o ‘no existe .
/ home / luke / t / examples / ch01-cw1/Makefile:. 10 archivo `lexer.c ‘no existe
/ home/luke/t/examples/ch01-cw1/Makefile: 10 Deben rehacer objetivo `lexer.c ‘
flex-t lexer.l> lexer.c
/ home/luke/t/examples/ch01-cw1/Makefile: 10 archivo de destino con éxito rehecho` lexer.c ‘. (B)
/ home / luke / t / examples/ch01-cw1/Makefile: 7 Deben rehacer objetivo `lexer.o ‘
/ home/luke/t/examples/ch01-cw1/Makefile: 7 Éxito rehecho archivo de destino `lexer.o ‘(C)
/ home/luke/t/examples/ch01-cw1/Makefile: 1 Deben rehacer objetivo` count_words ‘
gcc count_words.o lexer.o-lfl-o count_words
/ home/luke/t/examples/ch01-cw1/Makefile: 1 Éxito rehecho archivo de destino `count_words. (D)
Copyright (C) 2002, 2003, 2004, 2006, 2008 Free Software Foundation, Inc.
Courier New, Courier, monospace; font-size: x-small;»> NO hay ninguna garantía, ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN