Domanda Errore in ifeq: errore di sintassi vicino a un token imprevisto


Sto scrivendo un Makefile che fa la corrispondenza delle stringhe in un punto, il codice è come:

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

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

Ecco il primo if è uno script di shell, il secondo ifeq è il condizionale di GNU Make. Tuttavia, il seguente errore genera:

ifeq (notte, notte)

/ bin / sh: -c: riga 0: errore di sintassi vicino a token imprevisti `notte, notte '

/ bin / sh: -c: linea 0: `ifeq (notte, notte) '

Cosa sta succedendo qui? Sembra che Make stia cercando di chiamare la shell.

Grazie.


42
2017-12-19 14:16


origine


risposte:


Ho giocato attorno al codice e ho scoperto che le dichiarazioni condizionali dovevano essere scritte senza indentazione, e questo ha risolto il mio problema.

Se non c'è indentazione, Make lo tratterà come una direttiva per se stesso; in caso contrario, è considerato come uno script di shell.

Codice di esempio

Sbagliato:

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

Corretta:

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

151
2017-12-19 14:50



Inoltre, se le istruzioni condizionali vengono utilizzate nelle funzioni di definizione, ad esempio:

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

In questo caso, Make lo tratterà anche come script di shell.

Questo problema può essere risolto utilizzando invece if-function:

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

4
2017-10-16 04:37