2013-02-21 8 views
6

Gibt es eine Möglichkeit, Leerzeichen innerhalb von Zielnamen zu erhalten, wenn Sie make.exe verwenden? Es scheint unmöglich zu sein, wenn dies wirklich alte Bug-Report ist korrekt: http://savannah.gnu.org/bugs/?712Speicherplatz im Ziel des GCC-Makefiles zulassen

Als Referenz das große Problem ist, dass Stücke von Make-Datei Befehle wie:

"foo bar baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

... scheinen als drei zu erhalten behandelt separate Kommandos: eins, um "foo (notiere das Eingeschlossene)" zu bauen, eins, um bar zu bauen, und schließlich ein, um baz zu bauen "(wieder einschließlich"). Das liegt daran, dass make.exe anscheinend Leerzeichen als Trennzeichen verwendet.

Es ist jedoch vernünftig anzunehmen, dass man zum Beispiel "Hello World.exe" erstellen möchte. Dies scheint nicht möglich zu sein. Doppelte Anführungszeichen funktionieren nicht, und weder die einzelne Worte nicht entkommen (ich habe gelesen, dass irgendwo, den Link nicht erinnern):

"foo\\ bar\\ baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

Gibt es eine andere Möglichkeit, dies zu beheben? Das offizielle Handbuch bestätigt nur die tokenize-by-Räume Sachen, aber bietet keine Möglichkeit, Raum für andere Zwecke zu verwenden: http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

Edit: wie vorgeschlagen, ich habe auch einzelne Schrägstriche versucht, aber Diese haben die gleiche Wirkung wie Doppelschlitze. Machen Sie beklagt es keine Regeln für das erste Wort finden:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop. 

Die ausführbare Datei „foo bar baz.exe“, obwohl korrekt erzeugt wird, aber Verknüpfung wird jedes Mal pro Wort getan.

Antwort

1

Anstelle von doppeltem Backslash einzelne verwenden. Das folgende Makefile funktioniert (zumindest für Gnu make):

goal: foo\ bar 

foo\ bar: 
    gcc -o "foo bar" "foo bar.c" 
+0

Das scheint nicht zu funktionieren, siehe die Bearbeitung. – Orwell

+0

@ Orwell: Dann scheint es eine Frage des Betriebssystems zu sein. Wie spezifiziert man eine Datei mit Leerzeichen im Namen in der Shell? – Matthias

1

wie Matthias sagte, es ist eine Frage von „\“, aber die doppelten Anführungszeichen zu. Hier ist, wie ich in diese succeded:

EXECUTABLE=foo\ bar\ baz 
all: $(SOURCES) $(EXECUTABLE) 
$(EXECUTABLE): $(OBJECTS) 
       $(CC) $(OBJECTS) -o "[email protected]" $(LDFLAGS) 

Beachten Sie die doppelten Anführungszeichen um die $ @ Es scheint mir, dass, wenn make das Ziel erreichen „$ (EXECUTABLE)“ es erweitert die „\“, so der Befehl Zeile wird

gcc file.o -o foo bar baz -LFlags 

was ist nicht das, was Sie wollen, möchten Sie doppelte Anführungszeichen um den Namen der Datei.

Jetzt sind Sie auf Windows und ich erinnere mich nicht, wie es mit Leerzeichen in Namen beschäftigt, so wie Matthias sagte, zuerst überprüfen, wie "cmd.exe" mit Leerzeichen behandelt (außer durch den umgebenden Namen mit doppelten Anführungszeichen ...))

0

Vielleicht ist es einfacher, ein einfacheres Makefile zu betrachten, das die Abhängigkeiten im Standardaufruf targetRule: dependencies ignoriert. Das OP ist für Windows, und das unten ist unter Linux in der Shell bash getan; aber es sollte wahrscheinlich auf Windows mit der bash Shell über cygwin anwendbar sein, denke ich.Ich habe folgendes in meinem Makefile (beachten Sie, sollte es eine TAB vor den echo Befehle, die SO in Leerzeichen umwandelt):

testA: 
    echo "testA" 

unrelated: 
    echo "unrelated" 

testA\ clean: 
    echo "testA clean" 

clean: 
    echo "clean" 

Wenn ich rufe make mit Zielen clean oder testA im bash Shell-Terminal , erhalte ich die erwarteten Ergebnisse:

$ make testA 
echo "testA" 
testA 
$ make clean 
echo "clean" 
clean 

Nun, wenn ich make testA clean gerade geschrieben nennen wie die bash Shell die Argumente an Räume aufgeteilt werden, so make werden zwei Argumente erhalten, und werden sie separat laufen:

$ make testA clean 
echo "testA" 
testA 
echo "clean" 
clean 

... aber wenn ich das Ziel make in Anführungszeichen geliefert wickeln - oder wenn ich den Raum entweichen - die Schale wird verstehen, dass es soll sein ein einziges Argument mit einem Raum im Inneren und wird es als solches zu make propagieren, was wird fortgesetzt auszuführen, was als die testA\ clean Zielregel geschrieben:

$ make "testA clean" 
echo "testA clean" 
testA clean 
$ make testA\ clean 
echo "testA clean" 
testA clean 

eine Folge davon ist, dass leider kann man nicht " TAB "an der Befehlszeile für die Autovervollständigung von testA\ clean; Wenn Sie in der Befehlszeile make teTAB eingeben, wird nur testA automatisch automatisch vervollständigt (und testA\ clean wird nicht als Autocomplete-Option angezeigt).

Verwandte Themen