2016-11-17 7 views
0

Ich habe ein Makefile von Bakefile generiert, die gut funktioniert. Um die ausführbare Datei auszuführen, benötigt sie Bibliotheken aus einem anderen Ordner. Ich habe den Befehl rpath gefunden, der den Pfad zu dieser Bibliothek angibt. Aber ich muss es als Argument an das Makefile senden, wenn ich den Befehl benutze. Ich kann es nicht direkt aus dem Bakefile angeben.Escape eine Systemvariable zu übergeben als ein Argument zu machen

Ich kann die LDFLAGS Argumente verwenden, die in Ordnung ist. Und ich habe here gefunden, wie man die $ ORIGIN-Variable benutzt.

Meine Frage ist, wie funktioniert dieses Entweichen?

make LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

Ist das Apostroph machen, um zu verhindern, dass die Variable zu interpretieren? Und warum ist das \ $ hier zweimal?

Antwort

1

Yeesh. Was für ein Chaos.

So wird der erste Satz von Anführungszeichen von der Shell entfernt, bevor er den make-Befehl startet. Da die äußere Menge von Anführungszeichen doppelte Anführungszeichen ist, müssen Sie die $ umgehen, andernfalls behandelt die Shell sie als Shell-Variable (vergleichen Sie mit einem Befehl wie echo "my path is $PWD" und wie die PWD Variable erweitert wird). Die Shell verwendet Backslashes, um Dinge wie $ zu zitieren.

Also, durch die Zeit, die Schale Hände der Kommandozeile zu machen, sieht es die Einstellung LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'

nächstes in Ihrem Make-Datei ein Rezept mit einem Befehl wie folgt sein:

$(LD) $(LDFLAGS) ... 

machen Erweitern Sie die LDFLAGS Variable wie oben. Für make wird jeder Name, dem eine $ vorangestellt ist, als make-Variable betrachtet und Sie können die Erweiterung durch make umgehen, indem Sie die $ (ohne umgekehrte Schrägstriche wie die Shell) zu verwenden und $$ schreiben. Make wird eine $ während der Erweiterung entfernen.

Also, make wird LDFLAGS auf die Zeichenfolge -Wl,-rpath '-Wl,$ORIGIN' reduzieren und diese an die Shell übergeben.

Die Shell wird die nächste Quotierungsebene entfernen, in diesem Fall die einfachen Anführungszeichen. Variablen werden nicht innerhalb einfacher Anführungszeichen erweitert, sodass der Linker tatsächlich Argumente erhält, nämlich -Wl,-rpath und -Wl,$ORIGIN, was Sie wollen.

+0

Wow danke, drei Ebenen der Flucht machen mein Gehirn weh ... –

Verwandte Themen