Ответ Матье правильный, но не полный.
Лучше всего прочитать раздел руководства пользователя , касающийся использования переменной MAKE
.
В дополнение к использованию правильного make
исполняемого файла (что является достаточной причиной), GNU делает попытки понять, какие рецепты вызывают рекурсивные экземпляры make.Любой рецепт, который делает это, обрабатывается особым образом несколькими способами:
Во-первых, этот рецепт вызывается, даже если вы запускаете make -n
, make -q
или make -t
.
Во-вторых,для связи со своими подкомпонентами (например, для обеспечения правильной работы сервера заданий) make
поддерживает набор дескрипторов открытых файлов (для каналов).Для «нормальных» (не рекурсивных) рецептов make закроет эти файловые дескрипторы перед тем, как создать рецепт (так, чтобы (a) рецепты не могли случайно испортить эту связь, и (b) потому что некоторые программы / сценарии написаны так, чтобы ожидать определенныхфайловые дескрипторы не используются).Для рецептов, которые определены как рекурсивные вызовы, make
не закроет эти файловые дескрипторы.
GNU make использует два разных способа определить, является ли рецепт рекурсивным созданием или нет.Одним из них является то, что вы можете добавить специальный символ +
в начало рецепта.Второе - это наличие в рецепте ссылок на переменные $(MAKE)
(или ${MAKE}
).