Pergunta

Usando GNU make, é possível criar um conjunto de metas que nunca serão programadas ao mesmo tempo quando se utiliza o "--jobs" opção?

Fundo:

Para fazer isso um pouco mais concreto, considere um makefile do formulário

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...

A principal coisa que precisa fazer é se certificar de que E1, E2 e E3 não estão sendo processados ??ao mesmo tempo, porque eles fazem algum trabalho em um dispositivo incorporado com recursos limitados. Eles falhar se os múltiplos deles estão executando ao mesmo tempo. p1, p2 e p3 podem ser executadas em paralelo com qualquer coisa, incluindo qualquer e * emprego.

Note que o makefile real tem alguns milhares de alvos com uma árvore de dependência que é cerca de 10 níveis de profundidade, por isso estou esperando há uma maneira de fazer isso que (a) não necessita de executar o make em série e (b) conservas os benefícios de que codifica a árvore de dependência em um makefile.

Foi útil?

Solução

Uma opção para você é usar o "rebanho" para executar as regras "e" sob um bloqueio exclusivo. Veja homem rebanho (1) para mais detalhes. Por exemplo, em vez de

e2: deps
    my_cmd foo bar

Você pode ter

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

O que acontece então é que todos os "e" alvos começar por marca em paralelo (possivelmente), mas os comandos reais serão executadas em série.

Outras dicas

Não é uma solução perfeita, mas você poderia usar um fim-único pré-requisito para impor uma ordenação específica sobre o E * alvos:

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

Os pré-requisitos após o símbolo pipe '|' são fim-only: eles não forçar, digamos, e3 a ser atualizado se e1 ou e2 mudou, mas eles exigem que todos os comandos para e1 e acabamento e2 execução antes os comandos para e3 são iniciados

.

A desvantagem desta situação é que ele impõe uma ordenação específica para esses pré-requisitos mutuamente exclusivos, em vez de deixar make escolher a ordem, mas na prática, provavelmente você pode descobrir uma ordem razoável manualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top