2017-03-08 9 views
1

Wenn ich Make-Datei von android build/Kern/definitions.mk Funktion collapse-Paare lesen, fand ich, ich kann nicht die Logik der Raum Prozesse unter verstehen:Makefile, warum Leerzeichen in einer Zeichenfolge zusammengeführt wurden?

define collapse-pairs 
$(eval _cpSEP := $(strip $(if $(2),$(2),=)))\ 
$(subst $(space)$(_cpSEP)$(space),$(_cpSEP),$(strip \ 
    $(subst $(_cpSEP), $(_cpSEP) ,$(1)))) 
endef 

bei $(subst $(_cpSEP), $(_cpSEP) ,$(1)) „a = b "sollte geändert werden in " a = < 2 Leerzeichen> b ", dann unter $(subst $(space)$(_cpSEP)$(space),$(_cpSEP),...), sollte es wieder ersetzt werden. aber tatsächlich, es wird "a = b", sieht zwei Leerzeichen in der Zeichenfolge wurden automatisch zusammengeführt .

Während der Untersuchung fand ich Merkwürdige folgende:

$ cat test-1.mk 
something:="a =b c=  d e = f" 
$(info $(something)) 
all: 
     @echo "something:${something}" 

$ make -f test-1.mk 
"a =b c=  d e = f" 
something:a =b c= d e = f 

Wie machen diese Räume Prozess? Warum wurden sie zusammengelegt?

+1

Wie fast immer scheint der Fall zu sein, wieder einmal jemand kritische Informationen von sich selbst zu verstecken. Das erste, was Sie immer tun sollten, wenn Sie nicht verstehen, wie ein Rezept in make funktioniert, ist _Remove das '@' von der Kommandozeile_. Noch besser wäre es, sie nicht in erster Linie hinzuzufügen, zumindest bis Ihr Makefile ordnungsgemäß funktioniert. Make wird Ihnen _exactly_ zeigen, welchen Befehl es aufrufen wird, wenn Sie es zulassen, und wenn Sie das untersuchen, wird es Ihnen oft zeigen, wo Ihr Problem ist. – MadScientist

+0

Danke! Entfernen Sie "@" kann die Dinge klar machen. aber um oben Skript zu machen, wie subst Verhalten zu erklären? – PhilipW

+0

Sorry, aber ich verstehe die Frage "Subst Behaviour" nicht. Ich werde sagen, dass Leerzeichen _after_ Kommas generell durch make entfernt werden, während Leerzeichen nach einem Argument und vor dem Komma im Argument erhalten bleiben. Vielleicht würde das deine Frage beantworten; wenn nicht, müssen Sie es neu schreiben, um es klarer zu machen (für mich jedenfalls). – MadScientist

Antwort

0

erste, die fix:

something:="a =b c=  d e = f" 
$(info $(something)) 
all: 
    @echo something:${something} 

Es war nicht machen, die die Räume verschmolzen, sondern die Schale. Die Befehlszeile

echo "something:"a =b c=  d e = f"" 

wird als Liste von something:a=bc=de=f interpretiert. Wenn Sie die Anführungszeichen um something:${something} entfernen, empfängt Echo ein Argument mit eingebetteten Leerzeichen.

Wenn Sie wollen ausgeben echo die Anführungszeichen, müssen Sie sie entkommen:

echo \"something:${something}\" 
+0

Danke, dies erklärt das Verhalten des Skripts, für subst, es das gleiche Problem? Wie kann ich es verifizieren? – PhilipW

+0

Ich verstehe nicht, was Sie mit '$ (subst)' erreichen wollen. Wahrscheinlich haben Sie den falschen Hammer gewählt. –

Verwandte Themen