Ограничить параллелизм в суб-марке

Для проекта, распределенного по нескольким подкаталогам, мы используем GNU make для сборок. Разработчики могут использовать -j <number> Установите флажок, чтобы распараллелить задачи сборки и выбрать число, соответствующее оборудованию их компьютеров.

Однако файлы Makefile сторонней библиотеки, которые мы используем, небезопасны для распараллеливания - они явно полагаются на неявный порядок целей вместо явных правил зависимости между всеми зависимыми целями.

Поскольку у меня нет желания исправлять сторонние файлы Makefile, в настоящее время мы вызываем их файлы Makefile с явным -j 1 параметр для ограничения количества заданий до 1 для построения этой библиотеки. Правило выглядит так:

third_party_lib:
    $(MAKE) -j 1 -C $@

Это работает как нужно, однако make выдает предупреждение об этом:

make[1]: warning: -jN forced in submake: disabling jobserver mode.

что заставляет меня спросить здесь, есть ли лучший способ ограничить количество параллельных заданий в одной подгруппе.

1 ответ

Вы можете добавить .NOTPARALLEL: специальная цель для make-файлов, которые не должны быть распараллелены.

Если вы не хотите изменять эти make-файлы, вы можете использовать --eval опция в командной строке (примечание --eval был добавлен в GNU make 3.82):

third_party_lib:
        $(MAKE) --eval .NOTPARALLEL: -C $@
Другие вопросы по тегам