Рецепт make вызывает make: как не потерять параллелизм

Recursive `make` and `-j`

Автор исследует рекурсивный вызов make в Makefile: если рецепт запускает make без $(MAKE) или префикса +, jobserver не передаётся и параллелизм теряется. На примере GNU Make 3.81–4.3 показано, как разные версии обрабатывают -j, и почему комбинация $(MAKE) с явным -jN приводит к предупреждению о сбросе jobserver. Вывод: приходится выбирать между предсказуемостью и максимальной производительностью.

Мне это решение кажется такой же некомфортной магией, как префикс @ или префикс -.
  1. stabbles

    Флаг `-j` предназначен только для вызова верхнего уровня, и шаблон $(MAKE) — это стандарт.

    «Трюки» с `+` или $(MAKE), чтобы гарантировать наследование jobserver в подmake и любом другом подпроцессе, больше не нужны в gmake 4.4 (с 2022 года), потому что по умолчанию используется FIFO вместо каналов. Автору просто стоит обновить gmake :).

  2. fragmede

    Не делайте этого!

    https://accu.org/journals/overload/14/71/miller_2004/

    Recursive Make Considered Harmful

    By Peter Miller

Ещё за этот день

2026-09-30