2016-06-10 20 views
4

Einer meiner Rezepte in Yocto brauchen eine Datei, die eine ganz bestimmte Linie, so etwas wie zu erstellen:

${libdir}/something 

Um dies zu tun, habe ich die Aufgabe Rezept:

do_install() { 
    echo '${libdir}/something' >/path/to/my/file 
} 

Unter Berücksichtigung der Tatsache, dass Ich will diese Zeichenfolge genau wie gezeigt, ich kann nicht herausfinden, wie man es zu vermeiden bitbake von Ersatz in seinem eigenen Wert von libdir zu entkommen.

Ich dachte ursprünglich den echo Befehl mit einfachen Anführungszeichen würde den Trick tun (wie es funktioniert in der bash Shell), aber bitbake muss die Linie vor Gabe an die Schale werden zu interpretieren. Ich habe auch versucht, es beide mit $$ und \$ ohne Erfolg zu entkommen.

Ich kann nichts in der bitbake doco über die Verhinderung der variablen Expansion finden, nur Sachen mit sofortigen, verzögerten und Python-Erweiterungen zu tun.

Was muss ich tun, um diese Zeichenfolge in die Datei zu bekommen, wie es ist?

Antwort

3

Bitbake bestimmte Themen zu haben scheint in verhindern, dass die Expansion stattfindet. Unabhängig davon, ob Sie einfache oder doppelte Anführungszeichen verwenden, scheint es, dass die Variablen vor der Übergabe an die Shell erweitert werden.

Daher, wenn Sie sie wollen nicht erweitert werden, müssen Sie effektiv verstecken sie von BitBake, und dies kann mit so etwas wie getan werden:

echo -e '\x24{libdir}/something' >/path/to/my/file 

Dies verwendet die hexadezimale Version $, so dass BitBake es nicht als zu erweiternde Variable erkennt.

Sie tun müssen Sie sicherstellen, dass Sie den richtigen Befehl echo jedoch ausführen. Unter einigen Distributionen (wie Ubuntu) könnte es die sh -interne echo ausführen, die die -e Option nicht erkennt.Um um das zu erhalten, können Sie die Variante von echo haben auszuführen, die auf dem Dateisystem lebt (und das tut diese Option erkennen):

/bin/echo -e '\x24{libdir}/something' >/path/to/my/file 
+0

Eine Alternative nur Bourne Shell Utilities können mit Hilfe von echo, awk und printf realisiert werden: echo $ (awk 'BEGIN {printf "% c {libdir}/etwas"}, 0x24}') ">/pfad/zu/mein/Datei " – PeterErnsthaft

2

Standardmäßig wird diese Aufgabe als Shell-Funktion über /bin/sh ausgeführt werden, aber es hängt von Ihrem System, was es sein wird, wie Sie einen Symlink namens haben /bin/sh bash zeigen. Das Handbuch von BitBake verhindert jedoch die Verwendung der Syntax bashism.

können Sie betrachten gerade diese Aufgabe in Ihrem Rezept Hinzufügen als Python-Funktion:

python do_install() { 
    with open('/path/to/your/file', 'a') as file: 
     file.write('${libdir}/something') 
} 

'a' steht für append.

Dies sollte das Problem mit variabler Erweiterung beseitigen.

+0

Also gibt es * keine * Möglichkeit, es mit der Shell-Variante zu tun? Ich habe ziemlich viel anderen Code, der lästig sein wird, um in Python zu konvertieren. – paxdiablo

2

Es gibt keine Standardmethode ist diese Art von Ausdrücken zu entkommen, die ich bin mir dessen bewusst, andere als den Ausdruck zu brechen, um zu versuchen - dementsprechend sollte diese Arbeit:

do_install() { 
    echo '$''{libdir}/something' >/path/to/my/file 
} 
+0

Ziemlich nah. Unglücklicherweise scheint dies bei jedem verwendeten Parser Probleme zu verursachen - es fügt * $ {Präfix} 'in die Datei ein, aber es fügt auch die Umleitung und den Rest der Funktion wortwörtlich oder möglicherweise nur bis zur zweiten ein (von zwei) Linien, die diesen Trick benötigen. Dennoch, es ist ein guter Zeiger, um damit zu beginnen, dass die Lösung wahrscheinlich mich braucht, um das '$' in einer Weise zu setzen, die es nicht erkannt wird (wie ein oktal Code. Ich werde dieser Linie für jetzt folgen. – paxdiablo

0

Wenn Sie $ in variable Zuordnung verwenden müssen, Denken Sie daran, dass bitbake $ nicht bewerten wird, also müssen Sie es für die zugrunde liegende Shell entkommen.

Zum Beispiel ich gcc/ld rpath Option auf diese Weise $ ORIGIN Schlüsselwort zu verwenden:

TARGET_LDFLAGS_append = " -Wl,-rpath-link=\\$$ORIGIN" 

https://lists.yoctoproject.org/pipermail/yocto/2017-September/037820.html

0

Die beste Lösung ist einfach:

bitbake_function() { 
    command $libdir/whatever 
} 

Bitbake wird nur Erweitern ${libdir}; $libdir wird wörtlich durchgegeben.

Wir müssen uns nicht um Dollarzeichen kümmern, die nicht von { gefolgt werden, und in diesem Fall ist es nicht erforderlich, libdir in Klammern zu wickeln.

Das einzige Mal, dass wir mit nur $foo auf ein Problem stoßen, wenn wir so etwas wie ${foo}bar haben, wo die Klammern als Trennzeichen erforderlich sind, so dass bar nicht in die Variablennamen enthalten ist. In diesem Fall gibt es andere Lösungen, wie zum Beispiel die Erzeugung der Shell-Syntax "$foo"bar. Dies ist weniger kryptisch als der Rückgriff auf \x24.