Рецепт make вызывает make: как не потерять параллелизм
Recursive `make` and `-j`
Автор исследует рекурсивный вызов make в Makefile: если рецепт запускает make без $(MAKE) или префикса +, jobserver не передаётся и параллелизм теряется. На примере GNU Make 3.81–4.3 показано, как разные версии обрабатывают -j, и почему комбинация $(MAKE) с явным -jN приводит к предупреждению о сбросе jobserver. Вывод: приходится выбирать между предсказуемостью и максимальной производительностью.
Мне это решение кажется такой же некомфортной магией, как префикс @ или префикс -.
- stabbles
Флаг `-j` предназначен только для вызова верхнего уровня, и шаблон $(MAKE) — это стандарт.
«Трюки» с `+` или $(MAKE), чтобы гарантировать наследование jobserver в подmake и любом другом подпроцессе, больше не нужны в gmake 4.4 (с 2022 года), потому что по умолчанию используется FIFO вместо каналов. Автору просто стоит обновить gmake :).
- fragmede
Не делайте этого!
https://accu.org/journals/overload/14/71/miller_2004/
Recursive Make Considered Harmful
By Peter Miller