2017-05-31 5 views
0

Ich nehme alten Code auf, der außerhalb meiner Norm liegt und in einige Probleme über etwas, das hoffentlich sehr einfach zu erklären ist, läuft.Unerwartetes Token in ifeq Makefile

Ich arbeite an einem Makefile, das eine Reihe von SQL-Dateien ausführt und dann .done-Dateien generiert, um den Fortschritt zu verfolgen. Nach einer bestimmten SQL-Datei muss ich in der Lage sein, ein Shell-Skript auszuführen, um eine zusätzliche Verarbeitung durchzuführen.

# this is the rule the describes how to execute a SQL script 
%.done: %.sql 
    @echo "+==============================================================================+" 
    @echo "building [email protected]" 
    @echo "...from $<" 
    @echo "building $<" 
    @$(PSQL_WRAPPER) -f $< 
    @ifeq ($(@),mysqlfile.done) 
     @echo "Executing Shell Script" 
     @../path/to/script/myscript.sh 
    endif 

Ich fügte den ifeq Teil hinzu, alles andere war dort vorher und funktioniert wie erwartet.

Hier ist die Ausgabe, die ich bekomme. Ich bin wirklich festgefahren und habe verschiedene kleine Syntaxoptimierungen versucht, aber da ist eindeutig etwas anderes, das ich einfach nicht verstehe.

+==============================================================================+ 
building mysqlfile.done 
...from ../..//path/to/file/mysqlfile.sql 
building ../..//path/to/file/mysqlfile.sql 
/bin/bash: -c: line 0: syntax error near unexpected token `mysqlfile.done,mysqlfile.done' 
/bin/bash: -c: line 0: `ifeq (mysqlfile.done,mysqlfile.done)' 
make: *** [mysqlfile.done] Error 1 
Command exited with non-zero status 2 

Von der Fehlermeldung sieht es aus, als ob ich zwei gleiche Werte habe. Ich bin mir wirklich nicht sicher, was das unerwartete Token sein würde. Ich würde wirklich jede Hilfe bei dieser Sache schätzen, die ich bekommen konnte.

Antwort

2

ifeq ist eine GNU-Make-Anweisung, für bedingte einschließlich oder einen Teil eines geparsten Makefile enthalten. Es ist kein Shell-Befehl. Sie verwenden es in einer der Zeilen der %.done: %.sql Rezeptur. Alle Zeilen eines Rezepts müssen Shell-Befehle sein. Nur Shell verwenden:

%.done: %.sql 
    @echo "+==============================================================================+" 
    @echo "building [email protected]" 
    @echo "...from $<" 
    @echo "building $<" 
    @$(PSQL_WRAPPER) -f $< 
    @if [ "[email protected]" = "mysqlfile.done" ]; then \ 
     echo "Executing Shell Script"; \ 
     ../path/to/script/myscript.sh; \ 
    fi 

Sie können nicht bedingt die Sonderfallbearbeitung aus dem Rezept ausschließen selbst, wie:

%.done: %.sql 
    @echo "+==============================================================================+" 
    @echo "building [email protected]" 
    @echo "...from $<" 
    @echo "building $<" 
    @$(PSQL_WRAPPER) -f $< 
ifeq ($(@),mysqlfile.done) 
    @echo "Executing Shell Script" 
    @../path/to/script/myscript.sh 
endif 

, da das Ziel $(@) der Regel nur innerhalb der Rezeptur definiert .

+0

Danke, das ist es. –