Pregunta

"make" no sólo 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 ocupados todos los núcleos de la CPU, con las dependencias declaradas explícitamente 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 trabajos económico?

¿Fue útil?

Solución

paralelismo a hacer es particularmente útil para secuencias de comandos shell. Digamos que quiere obtener el 'tiempo de actividad' de todo un conjunto de hosts (o básicamente realiza ninguna operación lenta). Usted podría hacerlo en un bucle:

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

Esto funciona, pero es lento. Puede paralelizar esto mediante el desove subniveles:

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

Pero ahora usted no tiene ningún control sobre el número de hilos de desovar, y Ctrl-C no interrumpirá limpiamente en todos los temas.

Aquí está la solución Marca: guardar a un archivo y marcar como ejecutable (por ejemplo showuptimes.):

#!/usr/bin/make -f

hosts:=$(shell cat)
all: ${hosts}

${hosts} %:
        @echo "$@: `ssh $@ uptime`"

.PHONY: ${hosts} all

Ahora cat hosts | ./showuptimes corriendo imprimirá los tiempos de actividad de uno en uno. cat hosts | ./showuptimes -j todos ellos se ejecutará en paralelo. La persona que llama tiene un control directo sobre el grado de paralelización (-j), o puede especificar de forma indirecta por la carga del sistema (-l).

Otros consejos

Aparte de los usos obvios en programación, he visto Makefiles utilizados para realizar tareas repetitivas en servidores para administrar la configuración del sistema, como la creación de usuarios/grupos, actualizaciones de paquetes y copiar 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 oído hablar es ISConf, una herramienta de gestión de configuración.Me enteré por Luke Kanies, el autor de Marioneta, en su blog.

En función de la variedad de 'hacer', se puede navegar a través de las dependencias de tareas mediante el uso de archivos make ejecutables vs scripts de shell .. es decir, en un escenario en el que uno script de inicio tiene que empezar a 10 servicios ... uno tras otro (es decir, servicio dos necesidades de servicio que uno sea y viva antes de la partida), su facilidad realiza a través de un makefile.

Una gran cantidad de los empaquetadores de GNU / Linux hacen uso de esto, es decir, debian / rules y otros. Así que sí, si se hace correctamente, que es igual de bueno en iniciar programas, ya que es como la construcción de ellos.

El problema es que no todo el mundo tiene una cadena de herramientas de compilación instalado .. scripts para shell o archivos por lotes siguen siendo el enfoque portátiles (de ahí 'correcta').

Probablemente significa mi imaginación es deficiente, pero es difícil conseguir la suficiente flexibilidad en un makefile para tal uso. La forma 'obvio' para lograrlo consiste en especificar los valores de macro en la línea de comandos 'make'.

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

Esto es más detallado que un simple script de shell - y se pierde la capacidad de expansión fácil de usar nombre de archivo cáscara. La solución para esto es:

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

Me ofrezco este SO pregunta sobre por qué no utilizar #! / Bin / make en la parte superior de los archivos make como una extraño uso de archivos make (ejecutables), pero el objetivo no era hacer cosas inusuales (solo software antiguo aburrido construye); acaba de utilizar un mecanismo de invocación inusual para make.

El uso de la técnica, se puede simplificar la invocación a:

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

Eso es aún más detallado que:

script *[io]*

supongo script se podría escribir para hacer la invocación de make. Todo depende. No estoy convencido de que no es suficiente el kilometraje que se pueden obtener de ella; Tu caso es distinto.

Mi trabajo utiliza una curiosa: no existen las dependencias por lo que siempre reconstruye todo

.

También podría haber utilizado un archivo por lotes.

marca también se utilizan para conducir el proceso ........ llegué a saber de esto recientemente, no sólo la instalación individual o de gestión de construcción, pero todo el proceso. Anteriormente pensé que marca iba a ser utilizado para la compilación de proyectos sólo, sino que cada vez hay una posibilidad de una dependencia o una cadena de actividad que necesita ser realizada, haga puede ser utilizado allí ... hace poco vi un código que gestiona todo para un proceso hasta la entrega / despliegue, incluyendo los datos de procesamiento-updation (24 horas +) .... buena cosa:)

Hacer también puede ser utilizado como una herramienta de sincronización. Por ejemplo:

#!/usr/bin/make -f

FILES = *.html *.js *.css images/*.jpg subpage/*.html
LAST_SYNC = .last_sync
SCP = scp webserver.com:/home/john/public_html

.PHONY: sync

sync : $(LAST_SYNC)

$(LAST_SYNC) : $(FILES)
    $(SCP) $?
    touch $(LAST_SYNC)

Esto crea un Makefile .last_sync archivo vacío que se utiliza para grabar la última vez que sincronizan el repositorio local con el mismo mando a distancia. Cada vez que se ejecuta este script, Haz comprobará si alguno de los archivos que aparecen en FILES se han modificado desde la última vez que nos encontramos con la sincronización, los copiará al servidor y entonces actualizar la marca de tiempo en .last_sync. La clave es la $? variable automática, que contiene la lista de todos los requisitos previos que son más recientes que el objetivo de la regla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top