excluyen mutuamente planificación de tareas en el make GNU?
-
06-09-2019 - |
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.
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.