/ / O que é o algoritmo "make -jX" - algoritmo, makefile

O que é o algoritmo "make -jX" - algoritmo, makefile

Digamos que você tenha um gráfico representando as dependênciasdefinido em um arquivo make. Qual é o algoritmo (an?) Usado para determinar em quais dependências de ordem devem ser construídas e o que é paralelizável (ao usar o sinalizador -jX).

Por exemplo. se você tivesse os seguintes departamentos:

A: B C
B: D
C: D
D:

"D" claramente precisa ser construído primeiro, mas uma vez construído, B e C podem ser construídos em paralelo, e quando ambos são concluídos, A pode ser construído.

Respostas:

2 para resposta № 1

Você pode ver precisamente o algoritmo que faz usos usando make -d para imprimir informações de depuração. Para o seu exemplo (eu adicionei echo comandos para realmente fazer com que algo aconteça):

$ make -r -d -j
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0
Reading makefiles...
Reading makefile `Makefile"...
Updating makefiles....
Considering target file `Makefile".
Looking for an implicit rule for `Makefile".
No implicit rule found for `Makefile".
Finished prerequisites of target file `Makefile".
No need to remake target `Makefile".
Updating goal targets....
Considering target file `A".
File `A" does not exist.
Considering target file `B".
File `B" does not exist.
Considering target file `D".
File `D" does not exist.
Finished prerequisites of target file `D".
Must remake target `D".
Putting child 0x7fdae2c08110 (D) PID 71724 on the chain.
Commands of `D" are being run.
Finished prerequisites of target file `B".
The prerequisites of `B" are being made.
Considering target file `C".
File `C" does not exist.
Pruning file `D".
Finished prerequisites of target file `C".
The prerequisites of `C" are being made.
Finished prerequisites of target file `A".
The prerequisites of `A" are being made.
Live child 0x7fdae2c08110 (D) PID 71724
D
Reaping winning child 0x7fdae2c08110 PID 71724
Removing child 0x7fdae2c08110 PID 71724 from chain.
Considering target file `A".
File `A" does not exist.
Considering target file `B".
File `B" does not exist.
Considering target file `D".
File `D" was considered already.
Finished prerequisites of target file `B".
Must remake target `B".
Putting child 0x7fdae2c083c0 (B) PID 71729 on the chain.
Commands of `B" are being run.
Considering target file `C".
File `C" does not exist.
Pruning file `D".
Finished prerequisites of target file `C".
Must remake target `C".
Live child 0x7fdae2c083c0 (B) PID 71729
Putting child 0x7fdae2c09020 (C) PID 71734 on the chain.
Commands of `C" are being run.
Finished prerequisites of target file `A".
The prerequisites of `A" are being made.
Live child 0x7fdae2c09020 (C) PID 71734
Live child 0x7fdae2c083c0 (B) PID 71729
B
Reaping winning child 0x7fdae2c083c0 PID 71729
Removing child 0x7fdae2c083c0 PID 71729 from chain.
Live child 0x7fdae2c09020 (C) PID 71734
Considering target file `A".
File `A" does not exist.
Considering target file `B".
File `B" was considered already.
Considering target file `C".
Still updating file `C".
Finished prerequisites of target file `A".
The prerequisites of `A" are being made.
Live child 0x7fdae2c09020 (C) PID 71734
C
Reaping winning child 0x7fdae2c09020 PID 71734
Removing child 0x7fdae2c09020 PID 71734 from chain.
Considering target file `A".
File `A" does not exist.
Considering target file `B".
File `B" was considered already.
Considering target file `C".
File `C" was considered already.
Finished prerequisites of target file `A".
Must remake target `A".
Putting child 0x7fdae2c090c0 (A) PID 71739 on the chain.
Commands of `A" are being run.
Live child 0x7fdae2c090c0 (A) PID 71739
A
Reaping winning child 0x7fdae2c090c0 PID 71739
Removing child 0x7fdae2c090c0 PID 71739 from chain.
Considering target file `A".
File `A" was considered already.

Observe essas duas linhas juntas:

Live child 0x7fdae2c09020 (C) PID 71734
Live child 0x7fdae2c083c0 (B) PID 71729

Mostrando ambos B e C receitas que funcionam ao mesmo tempo.