Linux From Scratch para Cubietruck – C10: GNU make consejos

«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

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 = Tp; />
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 ‘ gcc-c lexer.c
/ 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)

Podemos ver los comandos se programan y se ejecutan en A – B – Secuencia D – C .
También podemos depurar este paso Makefile a paso:
luke luke @ debian: ~ / t/examples/ch01-cw1 $ nueva versión – depurador

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


Este programa construido para x86_64-pc-linux-gnu
Lectura makefiles …
Actualización de makefiles ….

Courier New, Courier, monospace; font-size: x-small;»>

Courier New, Courier, monospace; font-size: x-small;»> count_words: count_words.o lexer.o

Comando Corto Nombre Alias

Salto de TARGET (b) L

Comentario TEXTO (#)

continuar [DESTINO] (c)

Courier New, Courier, monospace; font-size: x-small;»> presionado [MONTO] (D)

STRING eval (e)
examinar STRING (x)

trama N (f)

ayuda [CONTROL] (h) ?,??

lista [DESTINO] (l)

siguiente [MONTO] (n)

font-size: x-small;»> directorio Courier New, Courier, monospace; Imprimir trabajo (P)

run (R) de reinicio

Courier New, Courier, monospace; font-size: x-small;»> setq * La variable * VALOR , («)

programa [lo] (S)

saltar (k)

target [target-name] [info1 [info2 …]] (t)

a [CANTIDAD] (u)

escribe [META [FILENAME]] (w)


la edición de línea de comandos Readline (emacs / vi modo) está disponible
Para obtener ayuda más detallada, escriba h o consultar en línea la documentación

. Se trata de un «gdb-como» interfaz de depuración. Debo decir que es una herramienta indispensable para cualquier grave «hacer» usuario / usuario remoto.
Usted puede pedir «hacer» a la salida de pantalla muy ampliada resultado de la depuración con «-d» opción:
luke luke @ debian: ~ / t/examples/ch01-cw1 $ make clean
rm-rf * o lexer.c count_words
luke luke @ debian: ~ / t/examples/ch01-cw1 $ maquillaje d

Copyright (C) 2006 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
FIN DETERMINADO

Este programa construido para x86_64-pc-linux-gnu
makefiles Leyendo …

Courier New, Courier, monospace; font-size: x-small;»> makefiles Actualizando ….

Buscando una regla implícita para `Makefile ‘.

Tratando regla de patrón con el vástago `Makefile ‘.
Tratando prerrequisito implícito `Makefile.o ‘
Tratando regla de patrón con el vástago `Makefile ‘
Tratando prerrequisito implícito` Makefile.c ‘
Tratar regla de patrón con el vástago` Makefile ‘
Tratar prerrequisito implícito` Makefile.cc ‘
Tratar regla de patrón con el vástago` Makefile ‘
……………..
requisitos previos hechas de archivo de destino` lexer.l ‘
No hay necesidad de rehacer objetivo `lexer.l ‘
prerrequisitos hechas de archivo de destino `lexer.c ‘.

Courier New, Courier, monospace; font-size: x-small;»> flex-t lexer.l> lexer.c

Poner niño 0x01b640d0 (lexer.c) PID 4444 en la cadena.
Cosecha del niño que gana 0x01b640d0 PID 4444
Extracción niño 0x01b640d0 PID 4444 de la cadena
Éxito rehecho archivo de destino` lexer.c ‘
prerrequisitos hechas de archivo de destino` lexer.o ‘
Deben rehacer objetivo` lexer.o ‘
gcc-c lexer.c
Poner niño 0x01b67470 (lexer.o) PID 4449 en la cadena
niño vivo 0x01b67470 (lexer.o) PID 4449
Cosecha del niño que gana 0x01b67470 PID 4449
Extracción niño 0x01b67470 PID 4449 de la cadena

Courier New, Courier, monospace; font-size: x-small;»> x-small;»>XDG_SESSION_COOKIE=8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133

XDG_SESSION_COOKIE=’8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133′
XDG_SESSION_COOKIE=’8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133′
XDG_SESSION_COOKIE=’8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133′
XDG_SESSION_COOKIE=’8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133′

XDG_SESSION_COOKIE=8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133
XDG_SESSION_COOKIE=’8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133′

XDG_SESSION_COOKIE=’8db16af89b6fae68ece3d56152d014d7-1391165757.112441-896395133′
 /home/gcc/x86_64-luke-linux-gnu/usr/lib/gcc/x86_64-luke-linux-gnu/4.8.2/include/stddef.h x-small;»> /home/gcc/x86_64-luke-linux-gnu/usr/lib/gcc/x86_64-luke-linux-gnu/4.8.2/include/stdarg.h

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *