Makefile: почему всегда используйте `$ (MAKE)` вместо `make`? - PullRequest
0 голосов
/ 24 мая 2018

Я обычно использую систему сборки высокого уровня, такую ​​как cmake, для сборки своего кода C / C ++.Но по различным причинам Я использую прямую GNU make.

Я делаю рекурсивную сборку, где в каждом каталоге есть make-файл.

Мне недавно пришлось изменить все своиmakefiles от использования make до $(MAKE), а затем начали работать параллельные сборки.

Литература, которую я прочитал, говорит, что "всегда используй $(MAKE)" (книга О'Рейли, 5+ решений по стекопереработке.com от людей с количеством очков более 10-40K).

Почему в ваших make-файлах всегда используйте $(MAKE) вместо make?

(очевидно, ОДНА причинапотому что $(MAKE) как-то разрешает параллельные сборки.)

Есть ли что-то большее, чем простая замена $(MAKE) на make?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Ответ Матье правильный, но не полный.

Лучше всего прочитать раздел руководства пользователя , касающийся использования переменной MAKE.

В дополнение к использованию правильного make исполняемого файла (что является достаточной причиной), GNU делает попытки понять, какие рецепты вызывают рекурсивные экземпляры make.Любой рецепт, который делает это, обрабатывается особым образом несколькими способами:

Во-первых, этот рецепт вызывается, даже если вы запускаете make -n, make -q или make -t.

Во-вторых,для связи со своими подкомпонентами (например, для обеспечения правильной работы сервера заданий) make поддерживает набор дескрипторов открытых файлов (для каналов).Для «нормальных» (не рекурсивных) рецептов make закроет эти файловые дескрипторы перед тем, как создать рецепт (так, чтобы (a) рецепты не могли случайно испортить эту связь, и (b) потому что некоторые программы / сценарии написаны так, чтобы ожидать определенныхфайловые дескрипторы не используются).Для рецептов, которые определены как рекурсивные вызовы, make не закроет эти файловые дескрипторы.

GNU make использует два разных способа определить, является ли рецепт рекурсивным созданием или нет.Одним из них является то, что вы можете добавить специальный символ + в начало рецепта.Второе - это наличие в рецепте ссылок на переменные $(MAKE) (или ${MAKE}).

0 голосов
/ 24 мая 2018

В некоторых системах исполняемый файл вызова make не называется make.Например, не-GNU системы часто имеют команду make, которая не является GNU Make, и пользователи должны запускать gmake, если они хотят использовать файлы Makefile, разработанные для GNU Make.Если вы выполняете рекурсивные вызовы как make в этих системах, рекурсивные вызовы не будут вызывать тот же исполняемый файл, что и набранный пользователем верхний уровень.Использование $(MAKE) гарантирует, что рекурсивные вызовы будут использовать тот же «make», что и верхний уровень.

...