Помилка для ifeq: синтаксична помилка біля несподіваного маркера


79

Я пишу файл Makefile, який виконує збіг рядків в одному місці, код такий:

if test ...; \
    then \
    shell scripts... \
fi

ifeq ($(DIST_TYPE),nightly)
    shell scripts ...
endif

Тут перший if- скрипт оболонки, другий ifeq- умовний GNU Make. Однак генерується така помилка:

ifeq (щоночі, щоночі)

/ bin / sh: -c: рядок 0: синтаксична помилка біля несподіваного маркера `nightly, nightly '

/ bin / sh: -c: рядок 0: `ifeq (щоночі, щоночі) '

Що тут відбувається? Здається, що Маке намагається викликати оболонку.

Дякую.


Ви плутаєте умовні оператори в sh(наприклад, перший) із умовними операторами в make(наприклад, другий).
reinierpost

Відповіді:


274

Я погрався навколо коду і виявив, що умовні оператори слід писати без відступу, і це вирішило мою проблему.

Якщо відступу немає, Make розгляне це як директиву для себе; в іншому випадку це розглядається як сценарій оболонки.

Приклад коду

Неправильно:

target:
    ifeq (foo, bar)
        ...
    endif

Правильно:

target:
ifeq (foo, bar)
    ...
endif

28
Я просто хотів подякувати та привітати вас за цю відповідь. Я також додав до нього приклад. :)
До

8
Це так неочевидно, дякую за цю відповідь, врятувало години розчарувань

Вау якийсь час шукав, як отримати, якщо / ще працює в моєму файлі make. Це настільки просто, але я цього ніде не бачив! Дякую!
Eisi Sig

1
Забавно, як це єдиний приклад цього в Інтернеті. Дуже дякую.
smashedtoatoms

2
І нагороду за "найменш логічний синтаксис в історії поки що" отримує Makefile ...; D Дякую за цю відповідь!
Оле Хенрік Скогстрем

9

Крім того, якщо умовні оператори використовуються у функціях визначення, наприклад:

define myFunc
ifeq (foo, bar)
    ...
endif
endef

У цьому випадку Make також буде розглядати це як сценарій оболонки.

Цю проблему можна вирішити, використовуючи замість цього if-function:

define myFunc
    $(if condition,then-part[,else-part])
endef

заощадило мені багато часу :)
anoop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.