Machen Sie einen Fehler für ifeq: Syntaxfehler in der Nähe eines unerwarteten Tokens

77

Ich schreibe ein Makefile, das an einer Stelle einen String-Abgleich durchführt. Der Code lautet wie folgt:

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

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

Hier ist das erste ifShell-Skript, das zweite ifeqist die Bedingung von GNU Make. Der folgende Fehler wird jedoch generiert:

ifeq (jede Nacht, jede Nacht)

/ bin / sh: -c: Zeile 0: Syntaxfehler in der Nähe eines unerwarteten Tokens `nightly, nightly '

/ bin / sh: -c: Zeile 0: `ifeq (jede Nacht, jede Nacht) '

Was passiert hier? Es scheint, dass Make versucht, die Shell aufzurufen.

Vielen Dank.

Ryan Li
quelle
Sie verwechseln bedingte Anweisungen in sh(wie die erste) mit bedingten Anweisungen in make(wie die zweite).
Reinierpost

Antworten:

269

Ich spielte um den Code herum und stellte fest, dass die bedingten Anweisungen ohne Einrückung geschrieben werden sollten, und dies löste mein Problem.

Wenn es keine Einrückung gibt, wird Make sie als Richtlinie für sich selbst behandeln. Andernfalls wird es als Shell-Skript angesehen.

Beispielcode

Falsch:

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

Richtig:

target:
ifeq (foo, bar)
    ...
endif
Ryan Li
quelle
28
Ich wollte mich nur für diese Antwort bedanken und Sie begrüßen. Ich habe auch ein Beispiel hinzugefügt. :)
Bis zum
8
Das ist so nicht offensichtlich, danke für diese Antwort, ersparte mir Stunden der Frustration
Wow habe eine Weile gesucht, wie ich es schaffen kann, wenn ich in meinem Makefile arbeite. Das ist sooo einfach, aber ich habe es nirgendwo gesehen! Vielen Dank!
Eisi Sig
1
Es ist lustig, wie dies das einzige Beispiel im Internet ist. Danke vielmals.
Jlegler
2
Und die Auszeichnung für "bisher am wenigsten logische Syntax in der Geschichte" geht an Makefile ...; D Vielen Dank für diese Antwort!
Ole Henrik Skogstrøm
9

Wenn die bedingten Anweisungen zum Definieren von Funktionen verwendet werden, wie z.

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

In diesem Fall behandelt Make es auch als Shell-Skript.

Dieses Problem kann gelöst werden, indem stattdessen die if-Funktion verwendet wird:

define myFunc
    $(if condition,then-part[,else-part])
endef
SenZhang
quelle
hat mir viel Zeit gespart :)
anoop