Альтернативой разветвлению является запуск каждой марки в отдельном потоке.
use threads;
my $max_threads = 5;
my @targets = qw(obj1.o obj2.o obj3.o ...);
while(@targets) {
my $num_threads = threads->list(threads::running);
if( $num_threads < $max_threads ) {
my $target = shift @targets;
threads->create(sub { return system "make $target" });
}
}
Я, к сожалению, размахиваю руками двумя кусочками. Во-первых, это заставляет цикл бездействовать, пока поток не завершится. Я считаю, что это достигается с помощью thread :: shared cond_wait () и переменной семафора.
Второй - получить возвращаемое значение из make, чтобы вы знали, что-то не получилось, и остановить сборку. Для этого вам нужно присоединиться () к каждому потоку, чтобы получить результат system (), код завершения процесса.
Извините за поспешный ответ. Надеюсь, сообщество заполнит остальные.