2016-08-04 4 views
1

Nach dem Rat an Abort makefile if variable not set Ich versuche ifndef zu verwenden, aber es funktioniert nicht.Makefile - Fehler, wenn die Variable nicht gesetzt ist

Makefile:

foo: 
     ifndef BAR 
     $(error "Must set BAR") 
     endif 

Aber make foo BAR=quux funktioniert nicht:

Makfile:2: *** "Must set BAR". Stop. 

Was soll das? Ist es ein Leerzeichen? Oder bin ich komplett falsch verstanden?

(Ich verwende GNU Make)

Ich habe auch versucht:

foo: 
ifndef BAR 
$(error "Must set BAR") 
endif 
     echo $(BAR) 

Welche Arbeit zu sortieren scheint aber immer noch bewirkt, dass die ifndef wenn ein Ziel weiter im Makefile unten aufgerufen werden (die nicht erfordert, dass die Variable gesetzt wird) wird aufgerufen.

Antwort

3

Technisch, ja, es ist ein Leerzeichen Problem, aber im Grunde ist es ein Problem Bereich.

Die ifndef... endif ist eine Marke bedingt. Make wird es vor dem Ausführen einer Regel bewerten. Und da der ifndef nicht Teil eines Rezepts ist, sollte ihm kein TAB vorangehen. Dies funktioniert:

ifndef BAR 
$(error "Must set BAR") # this is a Make error 
endif 

foo: 
ifndef BAR 
    echo "Must set BAR" # this is a shell command 
    exit 1    # this is another shell command 
endif 

Aber was Sie getan haben, war dies:

foo: 
    ifndef BAR 
    $(error "Must set BAR") 
    endif 

Sie stellen eine TAB vor den drei Linien (ifndef..., $(error... und endif), so angenommen, machen, dass das waren Befehle, an die Shell übergeben werden, wenn und wenn das foo Rezept ausgeführt wurde. Und wenn Make die Regel ausgeführt hat, hat es die Make-Syntax-Anweisung $(error...) erweitert - und mit einem Fehler beendet -, bevor irgendetwas an die Shell übergeben wurde.

0

Sie können die Funktion "if" verwenden. foo : $(if $(BAR),,$(error Must set BAR))

Verwandte Themen