Variable $ {D} im Installationsbefehl

11

Ich habe den folgenden Installationsbefehl gesehen, der in mehreren Yocto-Rezepten verwendet wird

install -d ${D}${libdir}

Ich kenne den Installationsbefehl und seinen Zweck, kann jedoch den Zweck der Variablen $ {D} nicht verstehen, da er im Rezept häufig nirgends definiert ist. Kann jemand den Zweck dieser Shell-Variablen erklären?

shery6405
quelle
Lesen Sie das OpenEmbedded-Benutzerhandbuch D: Das Zielverzeichnis .
Meuh

Antworten:

11

Mit der ${D}Variablen kann die zu erstellende Software in einem anderen Verzeichnis als dem eigentlichen Ziel installiert werden. Beispielsweise können Sie die Software so konfigurieren, dass dies der Fall libdirist /usr/lib, dies gilt jedoch für das Zielgerät. Wenn Sie die Installation auf Ihrem Build-System ausführen, möchten Sie nicht, dass die neu erstellten Dateien tatsächlich installiert /usr/libwerden. Sie möchten, dass die Dateien an einem isolierten Ort abgelegt werden, damit sie leicht identifiziert und auf das Zielsystem kopiert werden können. Sie erstellen also ein temporäres Verzeichnis und installieren es dort:

mkdir /tmp/yocto-target
make install D=/tmp/yocto-target

Auf diese Weise landen die Dateien in /tmp/yocto-target/usr/libund so weiter. Sie können dann alle /tmp/yocto-targetmit einem beliebigen Tool archivieren , das /tmp/yocto-targetPräfix löschen, das Archiv auf das Zielgerät kopieren und dessen Inhalt dort installieren.

In anderen Build-Systemen wird die DESTDIRVariable aus demselben Grund verwendet.

Stephen Kitt
quelle
Kopiert die Installation des Pakets in $ {D} $ {libdir} die Ausgabe in das Paket DESTDIR oder in den Rootfs-Ordner in /tmp/work.../rootfs?
Ransh
Ähm ... ich bin mir nicht sicher, was du fragst; Die Installation in ${D}${libdir}installiert in jedem Verzeichnis, auf das die Variablen Dund libdirverweisen. DESTDIRwird in anderen Build-Systemen verwendet, nicht in Yoctos.
Stephen Kitt
Die Antwort erklärt den "Zweck" von $ {D}, aber wie das OP schrieb "ist es oft nirgends im Rezept definiert". Es bleibt immer noch ein Rätsel, woher sein Wert kommt. ZB habe ich ein Vorlagenrezept, das vom Befehl petalinux-create generiert wurde und auf $ {D} verweist, aber es gibt kein "include" oder einen anderen Hinweis darauf, wo $ {D} definiert ist.
2.718
1
@ 2.718 ist nicht definiert, da es Sache des Benutzers ist, seinen Wert anzugeben, wie in meinem Beispiel angegeben: make install D=/tmp/yocto-targetWird in einer Reihe von Verzeichnissen installiert, in denen verwurzelt ist /tmp/yocto-target. Wenn kein Wert angegeben wird, erfolgt die Installation in /.
Stephen Kitt
@ Stephen Kitt danke für die Klarstellung. Für einen Neuling, der noch keine BB-Rezepte geschrieben hat und sie nur ansieht, ist es nicht offensichtlich, wie alles zusammen hängt.
2.718
4

${D}ist der übliche Anfang des Pfads, der von einem Yocto-Rezept verwendet wird, in dem das Rezept Dateien installiert, die zu Paketen gehören, die von diesem Rezept erstellt wurden. Diese Verzeichnisse unter ${D}werden vom Build-System nach Dateien durchsucht, die in Pakete (wie RPM-Dateien) aufgenommen und in den sogenannten Sysroot-Baum aufgenommen werden sollen, in den Dateien (z. B. Bibliotheken und Header) verschoben werden, die von anderen Paketen verwendet werden. Es gibt einige Standardregeln für diesen Scan und die Regeln können erweitert werden. Es wird empfohlen, diese Yocto-Standardpfade ${D}so weit wie möglich zu verwenden, um von den integrierten Mechanismen von Yocto zu profitieren.

${libdir}ist in bitbake.conf standardmäßig definiert als: Dies ${exec_prefix}/libist /usr/libstandardmäßig in derselben Datei definiert.

install -d ${D}${libdir} 

Am Ende erstellt dieser Shell-Befehl "install" nur ein Verzeichnis, in dem Dateien gespeichert werden sollen (z. B. von do_install), die schließlich unter /usr/libauf dem Ziel installiert werden sollen .

${D}/a/b/cfor-Datei cist nur der Zwischenpfad, der für das Yocto-Packaging verwendet wird, und ${D}wird "weggeschnitten", wenn sich dieselbe Datei cim Zieldateisystem befindet. So zum Beispiel ${D}/a/b/cwird auf seine /a/b/cauf dem Ziel.

${D}ist in poky / meta / conf / bitbake.conf standardmäßig definiert als:

TMPDIR = "${TOPDIR}/tmp"
BASE_WORKDIR ?= "${TMPDIR}/work"
WORKDIR = "${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}-${PR}"
D = "${WORKDIR}/image"
Crayor
quelle
Ich bin nicht mit Yocto vertraut; Kommt diese DVariable angesichts von Stephens Antwort ins Spiel ?
Jeff Schaller