2017-05-07 23 views
0

Ich schreibe Makefiles (GNU make) für eine Anwendung mit mehr als einem Modul. Genauer gesagt habe ich für jedes Modul ein Makefile. Außerdem habe ich ein Master-Makefile, das das Makefile jedes Moduls aufruft. Ich habe versucht, aus diesen Makefiles mehrere Variablen herauszufiltern, die überall benötigt werden. Ich habe eine init.mk Datei zu Beginn der Master-Make-Datei mit folgendem enthalten:Makefile-Bedingung schlägt für definierte Variable fehl

export OS = linux 

ifeq ($(OS),linux) 
    export SHELL := /bin/bash 
else ifeq ($(OS),windows) 
    export SHELL := cmd 
else 
    export SHELL := 
endif 

Wenn ich mit diesem Laufe machen, bekomme ich einen Fehler 127, weil der Vergleichstest fehlschlägt und die SHELL Variable auf nichts festgelegt. Wenn ich im Abschnitt else/bin/bash hinzufüge, schlägt make nicht fehl.

Warum wird die OS Variable nicht richtig verglichen?

Grüße

+0

Make Griffe 'SHELL' in Sonder je nach Betriebssystem, auf Windows zum Beispiel könnte es sogar [alles, was Sie sagen ignorieren (https://www.gnu.org/software/make/manual/make.html#Choosing-the-Shell). – user657267

+2

Haben Sie zusätzliche Leerzeichen am Ende der 'export OS = linux' Zeile? – MadScientist

+0

Ich habe einen Platz und einen Kommentar – BobMorane

Antwort

1

Stellen variable Zuordnungen Streifen führende Leerzeichen, aber die Streifen nicht Leerzeichen: diese werden in den Wert der Variablen enthalten.

So:

export OS = linux  
        ^^^^^ 

wo Leerzeichen sind nachlauf, entweder allein oder mit einem Kommentar danach wird die Variable verursachen Leerzeichen enthalten. Zum Beispiel die obige Zuordnung der Wert OS ist linux gefolgt von 5 Leerzeichen, nicht nur linux.

Sie können entweder sicher sein, von Hand nachfolgende Leerzeichen zu vermeiden (mit einem Editor, der einen Modus für Makefiles Bearbeitung ist sehr hilfreich, hier hat) oder die strip Funktion:

ifeq ($(strip $(OS)),linux) 
    ...