2016-06-28 4 views
1

Я получаю /bin/sh: -c: line 1: syntax error: unexpected end of file для инструкции if в файле makefile ниже - что не так? (Моя подсказка является /tmp >.)если инструкция в ONESHELL Makefile не работает

/tmp > make test 
set -e 
if [[ -f /tmp/device ]] ; then 
/bin/sh: -c: line 1: syntax error: unexpected end of file 
make: *** [test] Error 2 
/tmp > cat Makefile 
.ONESHELL: 
test: 
    set -e 
    if [[ -f /tmp/device ]] ; then 
    echo 'Do something' 
    fi 

Я использую GNU Make 3.81.

ответ

2

Использование 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). 
+0

Джонатан 3,81 имеет ONESHELL как раз не 'если' условие и я думаю. потому что эхо и другие команды bash, похоже, работают. – Victor

+0

@ Victor: Я не уверен, что вы имеете в виду. Использование ONESHELL означает, что все действия для рецепта выполняются в одной оболочке независимо от того, сколько строк используется. В этом примере «set» и три строки 'if' /' then'/'else выполняются в одной оболочке. В примечаниях к выпуску (файл NEWS) ясно, что ONESHELL был добавлен в 3,82 и не был в 3,81. Если у вас есть вариант GNU Make утверждают, что он равен 3,81, но с поддержкой ONESHELL, это не версия, выпущенная GNU, AFAICT. Может быть, дистрибутив по какой-то причине портировал эту функцию, а не выпустил 3,82. –

+0

Обратите внимание, что 'if', который терпит неудачу, является чистым кодом оболочки; это не GNU Make условный. –

Смежные вопросы