MmVisual hat geschrieben:Das Ergebnis warum es bei Lazarus 2.0.4 nicht klappen mag:
Die Zeilen sind unterschiedlich:
V1.8.4:
V2.0.4:
Also die " mag das Make Tool nicht.
Nö, das hat mit make recht wenig zu tun. Make ist sehr einfach gestrickt, das gibt die variablen 1 zu 1 an die Shell für den befehl weiter
Ich hab hier mal ein kleines makefile erstellt
Code: Alles auswählen
A="a\b"
B='a\b'
C=a\b
all:
echo "$A" ;\
echo '$A' ;\
echo $A ;\
echo "$B" ;\
echo '$B' ;\
echo $B ;\
echo "$C" ;\
echo '$C' ;\
echo $C
Ergebnis:
Code: Alles auswählen
echo ""a\b"" ;\
echo '"a\b"' ;\
echo "a\b" ;\
echo "'a\b'" ;\
echo ''a\b'' ;\
echo 'a\b' ;\
echo "a\b" ;\
echo 'a\b' ;\
echo a\b ;
ab
"a\b"
a\b
'a\b'
ab
a\b
a\b
a\b
ab
Wie man einfach sehen kann werden die Anführungszeichen einfach an das echo (bzw die shell die das echo ausführt) übergeben. Die ergebnisse sind exakt die die ich erwarten würde wenn ich die echos so in meine bash eintippen würde.
Das problem ist das folgende. Wenn in dem makefile dann das so steht
dann wird das zu:
Bash macht automatische string concatination, das heißt das was da steht ist LeererString + PFAD + LeererString und das ist exakt PFAD. \ wird von der Shell aber gesondert behandelt als escape character. z.B. $ bezeichnet in bash eine variable. echo a$b würde also a gefolgt vom Inhalt der variable b ausgeben. Wenn man jetzt aber das $ zeichen haben will muss man das escapen also echo a\$b. Soweit so einfach. Zu den anführungszeichen: Die Bash kennt zwei verschiedene arten von String representation, Single Quotes ' und Double quotes ". Was in Single quotes steht wird ohne zu parsen (Siehe hier:
Link). d.H. echo 'a$b' ergibt a$b ohne das man $ escapen muss, da die Bash den string printed wie er da steht. Double quotes sagen der bash das nur noch die "wichtigsten" Special character geparsed werden sollen, das sind $, \ und *. Im gegensatz zu ohne quotes haben doublequotes was Backslashs angeht aber eine einschränkung: "Backslashes preceding characters without a special meaning are left unmodified", bedeutet backslashs werden nur dann als special chars geparsed wenn sie von einem Character benutzt werden (siehe hier:
Link).
Das ist also alles keine magie sondern expected behavior, und vor allem hat es nichts mit make zutun. Make ist eine super einfache Sprache die eigentlich nix kann außer shell commands in einer Abbhängigkeitsbasierten Reihenfolge auszuführen, alles weitere kommt durch die Shell. Mehr dazu findet man in der bash doc:
Link (Dokumentation lesen hilft, ich wusste das meiste auch nicht bevor ich grad mal in die Doc reingeschaut hab)
Zu dem Bug, meine empfohlene Lösung: entweder die anführungszeichen bei der definition von OPT wegnehmen, oder bei der benutzung. Sie an beiden stellen zu haben beudetet lediglich das sie gar nix bringen!. Außerdem würde ich empfehlen die Doppenlten Anführungszeichen durch einfache auszutauschen, damit garantiert ist das der String 1 zu 1 übergeben wird!
PS: das lustige bei make für windows ist, da Windows keine unix shell mitliefert muss die irgendwie in der make.exe drin sein, wie genau, und welche shell, keine ahnung, da es aber gnu make ist würde ich schätzen das es die bash ist