Использование GNU Make 3.81, функция .ONESHELL
явно не поддерживается - вы показали это, и я показал это. Я тестировал на Mac OS X 10.11.5, с прилагаемым /usr/bin/make
как GNU Make 3,81. Я продемонстрировал свое удовлетворение, добавив стратегически размещенные строки echo PID=$$$$
до set -e
, после него и т. Д., И наблюдал различные значения PID. GNU Сделать версию 3.81 с 2006 года (была также версия 3.82 с 2010 года, до версии 4.x была выпущена, начиная с 4.0 в 2013 году).
Текущая версия GNU Make - 4.2.1 (июнь 2016 года). Эта версия поддерживает эту функцию; ваш скрипт работает как ожидается при использовании достаточно последней версии GNU Make. Это функция, которая существует уже давно - вам, вероятно, не нужно обновляться до последней версии, чтобы получить поддержку, но почему бы вам пойти с понижающей версией, если вы все равно собираетесь обновлять.
Если вы хотите использовать функцию .ONSHELL:
, вам необходимо убедиться, что используете новую версию GNU Make (новее, чем версия 3.81). Если это невозможно, не используйте эту функцию.
Чтение файла NEWS от 4.2.1, то ясно, что ONESHELL
был добавлен в GNU Make версии 3.82:
Version 3.82 (28 Jul 2010)
…
* New special target: .ONESHELL instructs make to invoke a single instance
of the shell and provide it with the entire recipe, regardless of how many
lines it contains. As a special feature to allow more straightforward
conversion of makefiles to use .ONESHELL, any recipe line control
characters ('@', '+', or '-') will be removed from the second and
subsequent recipe lines. This happens _only_ if the SHELL value is deemed
to be a standard POSIX-style shell. If not, then no interior line control
characters are removed (as they may be part of the scripting language used
with the alternate SHELL).
Джонатан 3,81 имеет ONESHELL как раз не 'если' условие и я думаю. потому что эхо и другие команды bash, похоже, работают. – Victor
@ Victor: Я не уверен, что вы имеете в виду. Использование ONESHELL означает, что все действия для рецепта выполняются в одной оболочке независимо от того, сколько строк используется. В этом примере «set» и три строки 'if' /' then'/'else выполняются в одной оболочке. В примечаниях к выпуску (файл NEWS) ясно, что ONESHELL был добавлен в 3,82 и не был в 3,81. Если у вас есть вариант GNU Make утверждают, что он равен 3,81, но с поддержкой ONESHELL, это не версия, выпущенная GNU, AFAICT. Может быть, дистрибутив по какой-то причине портировал эту функцию, а не выпустил 3,82. –
Обратите внимание, что 'if', который терпит неудачу, является чистым кодом оболочки; это не GNU Make условный. –