Pregunta

Uso de GNU make, es posible crear un conjunto de objetivos que nunca serán programados al mismo tiempo, cuando se utiliza el "--jobs" opción?

Antecedentes:

Para hacer esto un poco más concreto, considere un makefile de la forma

p1: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p2: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p3: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

e1: ...deps... # cannot run at same time as any other e*
        ...rules...

e2: ...deps... # cannot run at same time as any other e*
        ...rules...

e3: ...deps... # cannot run at same time as any other e*
        ...rules...

Lo más importante que tengo que hacer es asegurarse de que E1, E2, E3 y no están siendo procesadas al mismo tiempo, ya que hacer algún trabajo en un dispositivo embebido con recursos limitados. Se estrellan si varios de los que se ejecutan al mismo tiempo. p1, p2, p3 y se pueden ejecutar en paralelo con cualquier cosa, incluyendo cualquier E * trabajo.

Tenga en cuenta que el makefile actual tiene unos pocos miles de objetivos con un árbol de dependencia que está a unos 10 niveles de profundidad, así que espero que hay una manera de hacer esto que (a) no requiere la ejecución de make en serie y (b) conservas los beneficios de la que codifica el árbol de dependencias en un archivo MAKE.

¿Fue útil?

Solución

Una de las opciones para usted es utilizar "rebaño" para ejecutar las reglas "e" bajo un bloqueo exclusivo. Ver rebaño hombre (1) para más detalles. Por ejemplo, en lugar de

e2: deps
    my_cmd foo bar

Puede tener

e2: deps
    flock .embedded-device-lock -c my_cmd foo bar

Lo que sucede entonces es que todos los objetivos "e" empezar por marca en paralelo (posiblemente), pero los comandos reales serán ejecutadas en serie.

Otros consejos

No es una solución perfecta, pero se puede utilizar un pre-requisito para sólo para imponer un orden específico en el E * objetivos:

e1: ...deps...
    ...commands...
e2: ...deps... | e1
    ...commands...
e3: ...deps... | e2 e1
    ...commands...

Los requisitos previos después de la barra vertical '|' son objeto de sólo: no obligan, por ejemplo, e3 que se actualiza si E1 o E2 ha cambiado, pero que no se requiere que todos los comandos para E1 y E2 terminen de ejecutarse antes de iniciar los comandos para e3

.

La desventaja de esto es que se impone un orden específico para estos requisitos previos que se excluyen mutuamente, en lugar de dejar make recoger el pedido, pero en la práctica es probable que pueda encontrar una orden razonable manualmente.

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