with tutorial para framework español djangoproject con applications bash scripting makefile gnu-make

bash - para - tutorial django



¿Algún uso interesante de Makefiles para compartir? (6)

Además de los usos obvios en la programación, he visto que Makefiles solía realizar tareas repetitivas en servidores para administrar la configuración del sistema, como la creación de usuarios / grupos, actualizaciones / actualizaciones de paquetes y copia de archivos de configuración en su lugar. También he visto (y usado) rastrillo para hacer esto en entornos basados ​​en Ruby.

El ejemplo más complejo de esto que he escuchado es ISConf , una herramienta de administración de configuración. Me enteré por Luke Kanies, el autor de Puppet , en su blog .

"hacer" no solo es útil para construir su proyecto de programación, sino que parece estar infrautilizado en otras áreas.

Por ejemplo, muchos scripts de shell se pueden reescribir como Makefiles para permitir que partes independientes se ejecuten en paralelo (con "make -jXX") para mantener todos los núcleos de CPU ocupados, con las dependencias explícitamente declaradas como un beneficio adicional en caso de que alguna vez Considere reordenar algunas tareas con efectos secundarios en su script de shell.

¿Tiene alguna historia interesante con usos inusuales de make / Makefiles para compartir? ¿Utiliza alguna otra utilidad como programador de trabajo barato?


Dependiendo de la variedad de ''make'', puede navegar a través de dependencias de tareas usando makefiles ejecutables vs scripts de shell. Es decir, en un escenario donde un script de inicio necesita iniciar 10 servicios ... uno después del otro (es decir, servicio dos necesidades el servicio uno está activo y activo antes de comenzar), se hace fácilmente a través de un archivo MAKE.

Una gran cantidad de empaquetadores de GNU / Linux hacen uso de esto, es decir, debian / rules y otros. Así que sí, si se hace correctamente, make es tan bueno para comenzar programas como para construirlos.

El problema es que no todos tienen una cadena de herramientas de compilación instalada ... por lo que las secuencias de comandos de shell o los archivos por lotes siguen siendo el enfoque portátil (y por lo tanto "correcto").


El paralelismo de Make es particularmente útil para scripts de shell. Digamos que quiere obtener el ''tiempo de actividad'' de un conjunto completo de hosts (o básicamente realizar cualquier operación lenta). Podrías hacerlo en un bucle:

cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done

Esto funciona, pero es lento. Puedes paralelizar esto al generar subcapas:

cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done

Pero ahora no tiene control sobre la cantidad de hilos que engendra, y CTRL-C no interrumpe limpiamente todos los hilos.

Aquí está la solución Make: guarde esto en un archivo (por ejemplo, showuptimes ) y marque como ejecutable:

#!/usr/bin/make -f hosts:=$(shell cat) all: ${hosts} ${hosts} %: @echo "$@: `ssh $@ uptime`" .PHONY: ${hosts} all

Ahora ejecutando cat hosts | ./showuptimes cat hosts | ./showuptimes imprimirá las actualizaciones una a una. cat hosts | ./showuptimes -j cat hosts | ./showuptimes -j los ejecutará todos en paralelo. El que llama tiene control directo sobre el grado de paralelización ( -j ), o puede especificarlo indirectamente mediante la carga del sistema ( -l ).


Mi trabajo utiliza uno curioso: las dependencias no existen por lo que siempre reconstruye todo.

Bien podría haber usado un archivo por lotes.


Probablemente significa que mi imaginación es deficiente, pero es difícil obtener suficiente flexibilidad en un archivo MAKE para dicho uso. La forma ''obvia'' de lograrlo es especificar valores de macro en la línea de comando '' make ''.

make -f script.mk MACRO="list of files on which to operate"

Eso es más detallado que un simple script de shell y usted pierde la facilidad de usar la expansión de nombre de archivo de shell. La solución para eso es:

make -f script.mk MACRO="$(echo *[io]*)"

Ofrecería esta pregunta ASÍ sobre ¿Por qué no utilizar #! / Bin / make en la parte superior de los archivos MAKE como un uso extraño de makefiles (ejecutables), pero el objetivo no era hacer cosas inusuales (solo aburrir las compilaciones de software antiguas); solo para usar un mecanismo de invocación inusual para make .

Usando la técnica, puede simplificar la invocación a:

script.mk MACRO="$(echo *[io]*)"

Eso es aún más detallado que:

script *[io]*

Supongo que el script podría escribirse para hacer la invocación de make . Todo depende. No estoy convencido de que haya suficiente kilometraje para obtenerlo; YMMV.


make también se utilizan para impulsar el proceso ........ me enteré de esto recientemente, no solo de la instalación individual o de la administración de compilación, sino de todo el proceso. Anteriormente, pensé que make debía ser utilizado solo para la compilación de proyectos, pero donde existe la posibilidad de una dependencia o una cadena de actividad que deba realizarse, make se puede usar allí ... recientemente vi un código que maneja todo para un proceso hasta la entrega / implementación, incluido el procesamiento de datos-actualización (24 horas +) .... buena cosa :)