Ограничить параллелизм в суб-марке
Для проекта, распределенного по нескольким подкаталогам, мы используем 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 $@