Un material despre BitBake: Diferență între versiuni
| (Nu s-au afișat 5 versiuni intermediare efectuate de același utilizator) | |||
| Linia 1: | Linia 1: | ||
= BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux = | |||
'''BitBake''' este un sistem de automatizare a procesului de compilare (''build automation engine''), utilizat în principal de '''Yocto Project''', '''OpenEmbedded''' și '''AMD PetaLinux''' pentru construirea distribuțiilor Linux destinate sistemelor embedded. | |||
În cazul unui proiect bazat pe '''Arty Z7-20 și PetaLinux 2025.2''', BitBake este una dintre componentele fundamentale care transformă configurația proiectului, codul sursă și rețetele software (''software recipe / recipes'') într-un sistem Linux funcțional pentru procesorul ARM Cortex-A9 din familia Zynq-7000. Voi folosi termenul de ''recipe / recipes'' în loc de ''rețetă'' sau ''rețete'' pentru a fi mai fidel documentației originale. | |||
== Arhitectura BitBake în PetaLinux == | |||
PetaLinux nu este un compilator propriu-zis. Este un ansamblu de instrumente AMD construit deasupra infrastructurii Yocto/OpenEmbedded. | |||
Arhitectura poate fi reprezentată astfel: | |||
<pre> | |||
AMD PetaLinux | |||
| | |||
v | |||
Yocto Project / OpenEmbedded | |||
| | |||
v | |||
BitBake | |||
| | |||
+---------+---------+ | |||
| | | | |||
v v v | |||
Linux RootFS Boot | |||
Kernel Components | |||
</pre> | |||
Fiecare nivel îndeplinește un rol specific: | |||
* '''PetaLinux''' – oferă comenzile și interfața de configurare specifice platformelor AMD. | |||
* '''Yocto Project / OpenEmbedded''' – furnizează ''recipes''le, layerele, configurațiile și infrastructura necesare construirii distribuției. | |||
* '''BitBake''' – analizează ''recipes''le, rezolvă dependențele și execută task-urile de build. | |||
* '''Instrumentele de compilare''' – GCC, linkerul, Make, CMake și alte utilitare realizează efectiv compilarea și asamblarea componentelor. | |||
Când se execută comanda: | |||
<syntaxhighlight lang="bash"> | |||
petalinux-build | |||
</syntaxhighlight> | |||
PetaLinux pregătește mediul de build și invocă infrastructura Yocto/BitBake, care coordonează compilarea componentelor necesare. | |||
== Funcționalitățile BitBake == | |||
BitBake nu compilează el însuși cod C sau C++. În schimb, coordonează instrumentele necesare construirii aplicațiilor, bibliotecilor și imaginilor Linux. | |||
Principalele responsabilități sunt: | |||
* '''Analiza ''recipes''lor''' – identifică pachetele și componentele care trebuie construite. | |||
* '''Rezolvarea dependențelor''' – stabilește ordinea corectă a operațiilor de compilare. | |||
* '''Descărcarea surselor''' – obține codul sursă din depozite Git, arhive și alte surse configurate. | |||
* '''Aplicarea patch-urilor''' – modifică sursele conform instrucțiunilor din ''recipes''. | |||
* '''Configurarea și compilarea''' – invocă instrumente precum GCC, Make, CMake sau Meson. | |||
* '''Instalarea și împachetarea''' – generează pachete software și componentele sistemului de fișiere. | |||
* '''Gestionarea cache-ului''' – reutilizează rezultatele operațiilor deja executate atunci când configurația și dependențele permit acest lucru. | |||
* '''Execuția paralelă''' – permite executarea simultană a task-urilor independente, reducând durata procesului de build. | |||
Un avantaj esențial este faptul că BitBake nu reconstruiește în mod obligatoriu întreaga distribuție Linux după fiecare modificare. | |||
În schimb, analizează dependențele și semnăturile task-urilor pentru a determina ce operații trebuie executate din nou. | |||
== Rețetele BitBake == | |||
Rețetele BitBake sunt fișiere cu extensia <code>.bb</code>, denumite ''BitBake recipes''. | |||
O ''recipe'' descrie modul în care trebuie obținut, configurat, compilat, instalat și împachetat un anumit pachet software. | |||
De exemplu, presupunem că dorim să includem în PetaLinux o aplicație C care procesează eșantioane I/Q provenite de la un receptor SDR. | |||
O ''recipe'' simplificată poate avea următorul conținut: | |||
<syntaxhighlight lang="bash"> | |||
SUMMARY = "Simple I/Q processing application" | |||
LICENSE = "CLOSED" | |||
SRC_URI = "file://iq-processor.c" | |||
S = "${WORKDIR}" | |||
do_compile() { | |||
${CC} ${CFLAGS} ${LDFLAGS} \ | |||
iq-processor.c -o iq-processor | |||
} | |||
do_install() { | |||
install -d ${D}${bindir} | |||
install -m 0755 iq-processor \ | |||
${D}${bindir}/iq-processor | |||
} | |||
</syntaxhighlight> | |||
Se observă asemănarea sintactică cu fișierele ''Makefile''. | |||
'''Notă:''' Exemplul este simplificat pentru a ilustra structura unei ''recipe''. În versiunile moderne Yocto, directorul în care se despachetează sursele este definit de variabila <code>UNPACKDIR</code>. Pentru o ''recipe'' reală trebuie verificată structura directoarelor folosită de versiunea Yocto/PetaLinux instalată. | |||
=== Explicația variabilelor === | |||
{| class="wikitable" | |||
! Variabilă | |||
! Semnificație | |||
|- | |||
| <code>SUMMARY</code> | |||
| Descriere scurtă a pachetului software. | |||
|- | |||
| <code>LICENSE</code> | |||
| Specifică licența asociată pachetului. Valoarea <code>CLOSED</code> este utilizată pentru software proprietar, fără un fișier de licență declarat prin mecanismul obișnuit. | |||
|- | |||
| <code>SRC_URI</code> | |||
| Identifică sursele necesare construirii pachetului. | |||
|- | |||
| <code>WORKDIR</code> | |||
| Directorul de lucru al ''recipes''i, utilizat pentru fișiere intermediare și operații de build. | |||
|- | |||
| <code>S</code> | |||
| Directorul care conține sursele utilizate pentru compilare. | |||
|- | |||
| <code>CC</code> | |||
| Compilatorul C configurat de sistemul de cross-compilare. | |||
|- | |||
| <code>CFLAGS</code> | |||
| Opțiunile de compilare C. | |||
|- | |||
| <code>LDFLAGS</code> | |||
| Opțiunile transmise la etapa de link-editare. | |||
|- | |||
| <code>D</code> | |||
| Directorul temporar în care se instalează fișierele pachetului înainte de împachetare. | |||
|- | |||
| <code>bindir</code> | |||
| Directorul standard destinat executabilelor utilizatorilor, de regulă <code>/usr/bin</code>. | |||
|} | |||
=== Funcțiile din rețete (''recipes'') === | |||
Funcția <code>do_compile()</code> stabilește modul în care se compilează aplicația: | |||
<syntaxhighlight lang="bash"> | |||
do_compile() { | |||
${CC} ${CFLAGS} ${LDFLAGS} \ | |||
iq-processor.c -o iq-processor | |||
} | |||
</syntaxhighlight> | |||
Variabila <code>${CC}</code> identifică compilatorul configurat pentru arhitectura țintă. | |||
În cazul Arty Z7-20, acesta este un compilator pentru arhitectura ARM corespunzătoare procesorului Zynq-7000, nu compilatorul nativ x86-64 utilizat de Ubuntu pe calculatorul gazdă. | |||
Funcția <code>do_install()</code> stabilește unde va fi instalat executabilul: | |||
<syntaxhighlight lang="bash"> | |||
do_install() { | |||
install -d ${D}${bindir} | |||
install -m 0755 iq-processor \ | |||
${D}${bindir}/iq-processor | |||
} | |||
</syntaxhighlight> | |||
După includerea pachetului în imaginea Linux, executabilul va fi disponibil în mod normal la: | |||
<code>/usr/bin/iq-processor</code> | |||
Prezența executabilului în imagine presupune ca pachetul rezultat din ''recipe'' să fie inclus în configurația imaginii, de exemplu prin mecanismul <code>IMAGE_INSTALL</code> sau prin configurarea PetaLinux. | |||
== Task-urile BitBake == | |||
Fiecare ''recipe'' este descompusă în operații numite '''task-uri'''. | |||
Acestea pot include descărcarea surselor, configurarea, compilarea, instalarea și împachetarea. | |||
Un flux tipic este: | |||
<pre> | |||
do_fetch | |||
| | |||
v | |||
do_unpack | |||
| | |||
v | |||
do_patch | |||
| | |||
v | |||
do_configure | |||
| | |||
v | |||
do_compile | |||
| | |||
v | |||
do_install | |||
| | |||
v | |||
do_package | |||
</pre> | |||
Acest flux reprezintă o simplificare conceptuală. În practică, BitBake construiește un graf de dependențe între task-uri, inclusiv task-uri provenite din ''recipes'' diferite. | |||
{| class="wikitable" | |||
! Task | |||
! Funcționalitate | |||
|- | |||
| <code>do_fetch</code> | |||
| Descarcă sau localizează sursele specificate în ''recipe''. | |||
|- | |||
| <code>do_unpack</code> | |||
| Despachetează arhivele și pregătește sursele. | |||
|- | |||
| <code>do_patch</code> | |||
| Aplică patch-urile necesare. | |||
|- | |||
| <code>do_configure</code> | |||
| Configurează mediul și parametrii de compilare. | |||
|- | |||
| <code>do_compile</code> | |||
| Compilează codul sursă. | |||
|- | |||
| <code>do_install</code> | |||
| Instalează fișierele rezultate într-un director temporar de destinație. | |||
|- | |||
| <code>do_package</code> | |||
| Pregătește împărțirea și metadatele pachetelor software. | |||
|} | |||
Dacă se modifică doar fișierul sursă <code>iq-processor.c</code>, BitBake poate recompila aplicația respectivă și operațiile dependente, reutilizând rezultatele nemodificate ale celorlalte componente. | |||
Acest mecanism este important deoarece o distribuție embedded Linux poate conține sute sau mii de pachete și task-uri. | |||
== Compararea BitBake cu Make și CMake == | |||
BitBake, Make și CMake sunt instrumente cu responsabilități diferite. | |||
{| class="wikitable" | |||
! Caracteristică | |||
! Make | |||
! CMake | |||
! BitBake | |||
|- | |||
| Compilarea aplicațiilor | |||
| Execută reguli de build. | |||
| Generează și configurează sistemul de build. | |||
| Coordonează task-urile care invocă instrumentele de compilare. | |||
|- | |||
| Construirea unei distribuții Linux | |||
| Necesită infrastructură suplimentară. | |||
| Nu este scopul principal. | |||
| Da, împreună cu OpenEmbedded. | |||
|- | |||
| Gestionarea dependențelor | |||
| Între ținte (''targets''). | |||
| Între ținte și componente ale proiectului. | |||
| Între ''recipes'', pachete și task-uri. | |||
|- | |||
| Cross-compilare | |||
| Posibilă prin configurarea instrumentelor. | |||
| Posibilă folosind un ''toolchain file''. | |||
| Integrată în configurația distribuției și a mașinii țintă. | |||
|- | |||
| Descărcarea surselor | |||
| Necesită reguli sau instrumente suplimentare. | |||
| Posibilă prin mecanisme dedicate. | |||
| Integrată prin task-uri și fetchere. | |||
|- | |||
| Gestionarea cache-ului | |||
| Bazată în principal pe dependențe și timpi de modificare. | |||
| Depinde de generator și de instrumentele folosite. | |||
| Include mecanismul Shared State Cache. | |||
|- | |||
| Utilizare obișnuită | |||
| Compilarea proiectelor software. | |||
| Configurarea proiectelor software portabile. | |||
| Construirea distribuțiilor Linux embedded. | |||
|} | |||
BitBake poate utiliza Make sau CMake în interiorul unei ''recipes''. Aceste instrumente nu se exclud reciproc. | |||
De exemplu, o ''recipe'' poate utiliza clasa <code>cmake</code>: | |||
<syntaxhighlight lang="bash"> | |||
inherit cmake | |||
</syntaxhighlight> | |||
În acest caz, BitBake coordonează procesul, iar infrastructura CMake configurează și generează regulile de construire a aplicației. | |||
== Utilizarea BitBake în PetaLinux == | |||
În PetaLinux, operațiile de build sunt executate în mod obișnuit prin comenzile AMD. | |||
=== Construirea întregului proiect === | |||
<syntaxhighlight lang="bash"> | |||
# Construiește proiectul PetaLinux. | |||
petalinux-build | |||
</syntaxhighlight> | |||
Această comandă construiește componentele necesare proiectului, în funcție de configurația curentă. | |||
=== Construirea kernelului Linux === | |||
<syntaxhighlight lang="bash"> | |||
# Construiește componenta kernel. | |||
petalinux-build -c kernel | |||
</syntaxhighlight> | |||
=== Curățarea rezultatelor de compilare === | |||
<syntaxhighlight lang="bash"> | |||
# Elimină rezultatele de build ale componentei kernel. | |||
petalinux-build -c kernel -x clean | |||
</syntaxhighlight> | |||
Operația <code>clean</code> elimină rezultatele locale ale task-urilor componentei selectate, dar nu reprezintă neapărat eliminarea tuturor artefactelor reutilizabile din Shared State Cache. | |||
=== Afișarea informațiilor suplimentare === | |||
<syntaxhighlight lang="bash"> | |||
# Activează afișarea detaliată. | |||
petalinux-build -v | |||
</syntaxhighlight> | |||
=== Invocarea directă a BitBake === | |||
Într-un mediu Yocto/BitBake inițializat corespunzător, pot fi utilizate comenzi directe. | |||
Afișarea task-urilor unei ''recipes'': | |||
<syntaxhighlight lang="bash"> | |||
bitbake -c listtasks virtual/kernel | |||
</syntaxhighlight> | |||
Afișarea variabilelor de mediu calculate pentru o ''recipe'': | |||
<syntaxhighlight lang="bash"> | |||
bitbake -e virtual/kernel | |||
</syntaxhighlight> | |||
Construirea unei ''recipes'': | |||
<syntaxhighlight lang="bash"> | |||
bitbake my-recipe | |||
</syntaxhighlight> | |||
În aceste exemple, <code>virtual/kernel</code> reprezintă un furnizor virtual pentru kernelul Linux, iar <code>my-recipe</code> reprezintă numele unei ''recipes'' disponibile în configurația curentă. | |||
'''Important:''' Comenzile BitBake directe presupun inițializarea mediului de build. În PetaLinux este recomandată utilizarea comenzilor <code>petalinux-build</code>, deoarece acestea gestionează integrarea specifică platformei AMD. | |||
== Utilizarea BitBake în proiectele FPGA și SDR == | |||
Un exemplu practic este dezvoltarea unui sistem SDR bazat pe placa '''Digilent Arty Z7-20'''. | |||
Arhitectura sistemului poate fi: | |||
<pre> | |||
Raspberry Pi 5 | |||
| | |||
| Ethernet / UDP | |||
v | |||
PetaLinux | |||
| | |||
| AXI DMA | |||
v | |||
FPGA DSP | |||
| | |||
+-- Frequency shifting | |||
| | |||
+-- Digital filtering | |||
| | |||
+-- Doppler correction | |||
</pre> | |||
Pentru o asemenea aplicație, sistemul PetaLinux poate necesita: | |||
* O aplicație C/C++ care recepționează eșantioane I/Q prin Ethernet. | |||
* Un driver Linux pentru un periferic AXI personalizat. | |||
* Un serviciu care inițializează automat aplicația SDR. | |||
* Biblioteci pentru procesare digitală de semnal. | |||
* Fișiere de configurare pentru parametrii de recepție și procesare. | |||
Aceste componente pot fi integrate în distribuția PetaLinux prin ''recipes'' BitBake, fișiere de configurare și layere OpenEmbedded. | |||
=== Avantajele integrării în imagine === | |||
Fără integrarea în sistemul de build, după fiecare instalare a unei imagini Linux ar putea fi necesare operații manuale: | |||
* Copierea aplicațiilor compilate. | |||
* Instalarea bibliotecilor. | |||
* Configurarea serviciilor. | |||
* Modificarea fișierelor de configurare. | |||
* Stabilirea drepturilor de acces. | |||
* Configurarea pornirii automate. | |||
Prin utilizarea ''recipes''lor BitBake, aceste operații pot fi incluse în procesul automat de construire a imaginii. | |||
În acest fel, configurația sistemului devine reproductibilă, iar imaginea PetaLinux rezultată poate fi distribuită și instalată pe alte plăci compatibile. | |||
== Cache-ul BitBake și compilarea incrementală == | |||
Unul dintre mecanismele importante ale infrastructurii Yocto este '''Shared State Cache''', cunoscut și sub denumirea <code>sstate-cache</code>. | |||
Acesta păstrează rezultatele reutilizabile ale anumitor task-uri. | |||
În loc să execute din nou fiecare operație de compilare, BitBake poate recupera rezultatele din cache atunci când semnăturile task-urilor și dependențele sunt compatibile. | |||
De exemplu, dacă s-a construit deja kernelul Linux și se modifică numai o aplicație SDR, nu este necesară în mod normal recompilarea completă a kernelului. | |||
=== Directoare importante === | |||
{| class="wikitable" | |||
! Director sau variabilă | |||
! Rol | |||
|- | |||
| <code>DL_DIR</code> | |||
| Directorul în care sunt păstrate sursele descărcate. | |||
|- | |||
| <code>SSTATE_DIR</code> | |||
| Directorul utilizat pentru Shared State Cache. | |||
|- | |||
| <code>TMPDIR</code> | |||
| Directorul principal pentru fișierele temporare și rezultatele intermediare ale build-ului. | |||
|- | |||
| <code>WORKDIR</code> | |||
| Directorul de lucru al unei ''recipes''. | |||
|- | |||
| <code>DEPLOY_DIR</code> | |||
| Directorul principal pentru artefactele rezultate și destinate distribuției. | |||
|} | |||
Într-un mediu cu mai multe instalații Yocto/PetaLinux, directoarele de descărcări și cache pot fi configurate astfel încât să reutilizeze rezultate între proiecte compatibile. | |||
Acest aspect este util atunci când PetaLinux este instalat atât pe o mașină Ubuntu dedicată, cât și într-un mediu Ubuntu 22.04 rulând în WSL2. | |||
Totuși, reutilizarea cache-ului nu este garantată între versiuni diferite de Yocto, PetaLinux sau configurații incompatibile. | |||
De asemenea, cache-ul nu înlocuiește instalarea corectă a instrumentelor și a dependențelor necesare pe sistemul gazdă. | |||
== Reproductibilitatea sistemului embedded Linux == | |||
Un obiectiv important al Yocto și PetaLinux este construirea reproductibilă a unui sistem Linux personalizat. | |||
Prin păstrarea sub controlul versiunilor a ''recipes''lor, configurațiilor, patch-urilor și codului sursă, se poate reconstrui o imagine Linux cu aceleași componente și parametri. | |||
Totuși, o configurație reproductibilă nu garantează automat un rezultat identic la nivel de octet. | |||
Pentru reproductibilitate completă trebuie controlate și versiunile surselor, instrumentele de compilare, metadatele, timestamp-urile și alți factori care pot influența artefactele generate. | |||
Într-un proiect FPGA/SDR, această abordare oferă avantaje importante: | |||
* Urmărirea modificărilor efectuate în sistem. | |||
* Reconstituirea unei versiuni funcționale anterioare. | |||
* Integrarea automată a aplicațiilor și driverelor. | |||
* Reducerea intervențiilor manuale după instalarea imaginii. | |||
* Posibilitatea automatizării procesului de construire și testare. | |||
= BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux = | = BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux = | ||
| Linia 32: | Linia 482: | ||
* '''PetaLinux''' – oferă comenzile și interfața de configurare specifice platformelor AMD. | * '''PetaLinux''' – oferă comenzile și interfața de configurare specifice platformelor AMD. | ||
* '''Yocto Project / OpenEmbedded''' – furnizează | * '''Yocto Project / OpenEmbedded''' – furnizează rețetele, layerele, configurațiile și infrastructura necesare construirii distribuției. | ||
* '''BitBake''' – analizează | * '''BitBake''' – analizează rețetele, rezolvă dependențele și execută task-urile de build. | ||
* '''Instrumentele de compilare''' – GCC, linkerul, Make, CMake și alte utilitare realizează efectiv compilarea și asamblarea componentelor. | * '''Instrumentele de compilare''' – GCC, linkerul, Make, CMake și alte utilitare realizează efectiv compilarea și asamblarea componentelor. | ||
Când se execută comanda: | Când se execută comanda: | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
petalinux-build | petalinux-build | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Linia 73: | Linia 523: | ||
O ''recipe'' simplificată poate avea următorul conținut: | O ''recipe'' simplificată poate avea următorul conținut: | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
SUMMARY = "Simple I/Q processing application" | SUMMARY = "Simple I/Q processing application" | ||
LICENSE = "CLOSED" | LICENSE = "CLOSED" | ||
| Linia 92: | Linia 542: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Se observă asemănarea sintactică cu fișierele ''Makefile''. | |||
'''Notă:''' Exemplul este simplificat pentru a ilustra structura unei ''recipe''. În versiunile moderne Yocto, directorul în care se despachetează sursele este definit de variabila <code>UNPACKDIR</code>. Pentru o ''recipe'' reală trebuie verificată structura directoarelor folosită de versiunea Yocto/PetaLinux instalată. | '''Notă:''' Exemplul este simplificat pentru a ilustra structura unei ''recipe''. În versiunile moderne Yocto, directorul în care se despachetează sursele este definit de variabila <code>UNPACKDIR</code>. Pentru o ''recipe'' reală trebuie verificată structura directoarelor folosită de versiunea Yocto/PetaLinux instalată. | ||
| Linia 132: | Linia 584: | ||
|} | |} | ||
=== Funcțiile din '' | === Funcțiile din rețete (''recipes'') === | ||
Funcția <code>do_compile()</code> stabilește modul în care se compilează aplicația: | Funcția <code>do_compile()</code> stabilește modul în care se compilează aplicația: | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
do_compile() { | do_compile() { | ||
${CC} ${CFLAGS} ${LDFLAGS} \ | ${CC} ${CFLAGS} ${LDFLAGS} \ | ||
| Linia 149: | Linia 601: | ||
Funcția <code>do_install()</code> stabilește unde va fi instalat executabilul: | Funcția <code>do_install()</code> stabilește unde va fi instalat executabilul: | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
do_install() { | do_install() { | ||
install -d ${D}${bindir} | install -d ${D}${bindir} | ||
| Linia 276: | Linia 728: | ||
De exemplu, o ''recipe'' poate utiliza clasa <code>cmake</code>: | De exemplu, o ''recipe'' poate utiliza clasa <code>cmake</code>: | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
inherit cmake | inherit cmake | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Linia 288: | Linia 740: | ||
=== Construirea întregului proiect === | === Construirea întregului proiect === | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
# Construiește proiectul PetaLinux. | # Construiește proiectul PetaLinux. | ||
petalinux-build | petalinux-build | ||
| Linia 297: | Linia 749: | ||
=== Construirea kernelului Linux === | === Construirea kernelului Linux === | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
# Construiește componenta kernel. | # Construiește componenta kernel. | ||
petalinux-build -c kernel | petalinux-build -c kernel | ||
| Linia 304: | Linia 756: | ||
=== Curățarea rezultatelor de compilare === | === Curățarea rezultatelor de compilare === | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
# Elimină rezultatele de build ale componentei kernel. | # Elimină rezultatele de build ale componentei kernel. | ||
petalinux-build -c kernel -x clean | petalinux-build -c kernel -x clean | ||
| Linia 313: | Linia 765: | ||
=== Afișarea informațiilor suplimentare === | === Afișarea informațiilor suplimentare === | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
# Activează afișarea detaliată. | # Activează afișarea detaliată. | ||
petalinux-build -v | petalinux-build -v | ||
| Linia 324: | Linia 776: | ||
Afișarea task-urilor unei ''recipes'': | Afișarea task-urilor unei ''recipes'': | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
bitbake -c listtasks virtual/kernel | bitbake -c listtasks virtual/kernel | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Linia 330: | Linia 782: | ||
Afișarea variabilelor de mediu calculate pentru o ''recipe'': | Afișarea variabilelor de mediu calculate pentru o ''recipe'': | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
bitbake -e virtual/kernel | bitbake -e virtual/kernel | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Linia 336: | Linia 788: | ||
Construirea unei ''recipes'': | Construirea unei ''recipes'': | ||
<syntaxhighlight | <syntaxhighlight lang="bash"> | ||
bitbake my-recipe | bitbake my-recipe | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Linia 453: | Linia 905: | ||
== Alte concepte importante din BitBake și OpenEmbedded == | == Alte concepte importante din BitBake și OpenEmbedded == | ||
Pe lângă | Pe lângă rețetele <code>.bb</code>, infrastructura BitBake utilizează mai multe tipuri de fișiere și mecanisme. | ||
{| class="wikitable" | {| class="wikitable" | ||
| Linia 488: | Linia 940: | ||
În special, fișierele <code>.bbappend</code> și layerele personalizate sunt importante pentru modificarea distribuției PetaLinux fără editarea directă a ''recipes''lor furnizate de AMD. | În special, fișierele <code>.bbappend</code> și layerele personalizate sunt importante pentru modificarea distribuției PetaLinux fără editarea directă a ''recipes''lor furnizate de AMD. | ||
== Concluzii == | |||
'''BitBake este motorul de automatizare care coordonează construirea componentelor unei distribuții Linux embedded.''' | |||
Relația dintre principalele instrumente poate fi sintetizată astfel: | |||
* '''PetaLinux''' – oferă interfața AMD pentru configurarea și construirea sistemelor Linux destinate platformelor sale embedded. | |||
* '''Yocto Project / OpenEmbedded''' – furnizează infrastructura, rețetele, layerele și mecanismele de configurare a distribuției. | |||
* '''BitBake''' – interpretează metadatele, rezolvă dependențele și coordonează task-urile de build. | |||
* '''GCC, Make, CMake și alte instrumente''' – realizează operațiile concrete de compilare, link-editare și construire. | |||
Înțelegerea BitBake permite personalizarea avansată a imaginilor PetaLinux, integrarea aplicațiilor și driverelor proprii și automatizarea construirii unor sisteme embedded complexe. | |||
== Referințe == | |||
<ol> | |||
<li>Yocto Project, ''BitBake User Manual''. [https://docs.yoctoproject.org/bitbake/singleindex.html Documentație oficială].</li> | |||
<li>Yocto Project, ''Reference Manual – Tasks''. [https://docs.yoctoproject.org/ref-manual/tasks.html Documentație oficială].</li> | |||
<li>Yocto Project, ''Overview and Concepts Manual''. [https://docs.yoctoproject.org/overview-manual/concepts.html Documentație oficială].</li> | |||
<li>Yocto Project, ''Reference Manual – Variables Glossary''. [https://docs.yoctoproject.org/ref-manual/variables.html Documentație oficială].</li> | |||
<li>AMD, ''PetaLinux Tools Documentation: Reference Guide (UG1144)''. [https://docs.amd.com/r/en-US/ug1144-petalinux-tools-reference-guide Documentație oficială].</li> | |||
<li>OpenEmbedded, ''OpenEmbedded Layer Index''. [https://layers.openembedded.org/ Indexul layerelor și ''recipes''lor].</li> | |||
</ol> | |||
[[category:FPGA]] | |||
[[category:petalinux]] | |||
[[category:bitbake]] | |||
== Concluzii == | == Concluzii == | ||
| Linia 512: | Linia 992: | ||
<li>OpenEmbedded, ''OpenEmbedded Layer Index''. [https://layers.openembedded.org/ Indexul layerelor și ''recipes''lor].</li> | <li>OpenEmbedded, ''OpenEmbedded Layer Index''. [https://layers.openembedded.org/ Indexul layerelor și ''recipes''lor].</li> | ||
</ol> | </ol> | ||
[[category:FPGA]] | |||
[[category:petalinux]] | |||
[[category:bitbake]] | |||
Versiunea curentă din 7 noiembrie 2026 17:47
BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux
BitBake este un sistem de automatizare a procesului de compilare (build automation engine), utilizat în principal de Yocto Project, OpenEmbedded și AMD PetaLinux pentru construirea distribuțiilor Linux destinate sistemelor embedded.
În cazul unui proiect bazat pe Arty Z7-20 și PetaLinux 2025.2, BitBake este una dintre componentele fundamentale care transformă configurația proiectului, codul sursă și rețetele software (software recipe / recipes) într-un sistem Linux funcțional pentru procesorul ARM Cortex-A9 din familia Zynq-7000. Voi folosi termenul de recipe / recipes în loc de rețetă sau rețete pentru a fi mai fidel documentației originale.
Arhitectura BitBake în PetaLinux
PetaLinux nu este un compilator propriu-zis. Este un ansamblu de instrumente AMD construit deasupra infrastructurii Yocto/OpenEmbedded.
Arhitectura poate fi reprezentată astfel:
AMD PetaLinux
|
v
Yocto Project / OpenEmbedded
|
v
BitBake
|
+---------+---------+
| | |
v v v
Linux RootFS Boot
Kernel Components
Fiecare nivel îndeplinește un rol specific:
- PetaLinux – oferă comenzile și interfața de configurare specifice platformelor AMD.
- Yocto Project / OpenEmbedded – furnizează recipesle, layerele, configurațiile și infrastructura necesare construirii distribuției.
- BitBake – analizează recipesle, rezolvă dependențele și execută task-urile de build.
- Instrumentele de compilare – GCC, linkerul, Make, CMake și alte utilitare realizează efectiv compilarea și asamblarea componentelor.
Când se execută comanda:
petalinux-build
PetaLinux pregătește mediul de build și invocă infrastructura Yocto/BitBake, care coordonează compilarea componentelor necesare.
Funcționalitățile BitBake
BitBake nu compilează el însuși cod C sau C++. În schimb, coordonează instrumentele necesare construirii aplicațiilor, bibliotecilor și imaginilor Linux.
Principalele responsabilități sunt:
- Analiza recipeslor – identifică pachetele și componentele care trebuie construite.
- Rezolvarea dependențelor – stabilește ordinea corectă a operațiilor de compilare.
- Descărcarea surselor – obține codul sursă din depozite Git, arhive și alte surse configurate.
- Aplicarea patch-urilor – modifică sursele conform instrucțiunilor din recipes.
- Configurarea și compilarea – invocă instrumente precum GCC, Make, CMake sau Meson.
- Instalarea și împachetarea – generează pachete software și componentele sistemului de fișiere.
- Gestionarea cache-ului – reutilizează rezultatele operațiilor deja executate atunci când configurația și dependențele permit acest lucru.
- Execuția paralelă – permite executarea simultană a task-urilor independente, reducând durata procesului de build.
Un avantaj esențial este faptul că BitBake nu reconstruiește în mod obligatoriu întreaga distribuție Linux după fiecare modificare.
În schimb, analizează dependențele și semnăturile task-urilor pentru a determina ce operații trebuie executate din nou.
Rețetele BitBake
Rețetele BitBake sunt fișiere cu extensia .bb, denumite BitBake recipes.
O recipe descrie modul în care trebuie obținut, configurat, compilat, instalat și împachetat un anumit pachet software.
De exemplu, presupunem că dorim să includem în PetaLinux o aplicație C care procesează eșantioane I/Q provenite de la un receptor SDR.
O recipe simplificată poate avea următorul conținut:
SUMMARY = "Simple I/Q processing application"
LICENSE = "CLOSED"
SRC_URI = "file://iq-processor.c"
S = "${WORKDIR}"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} \
iq-processor.c -o iq-processor
}
do_install() {
install -d ${D}${bindir}
install -m 0755 iq-processor \
${D}${bindir}/iq-processor
}
Se observă asemănarea sintactică cu fișierele Makefile.
Notă: Exemplul este simplificat pentru a ilustra structura unei recipe. În versiunile moderne Yocto, directorul în care se despachetează sursele este definit de variabila UNPACKDIR. Pentru o recipe reală trebuie verificată structura directoarelor folosită de versiunea Yocto/PetaLinux instalată.
Explicația variabilelor
| Variabilă | Semnificație |
|---|---|
SUMMARY
|
Descriere scurtă a pachetului software. |
LICENSE
|
Specifică licența asociată pachetului. Valoarea CLOSED este utilizată pentru software proprietar, fără un fișier de licență declarat prin mecanismul obișnuit.
|
SRC_URI
|
Identifică sursele necesare construirii pachetului. |
WORKDIR
|
Directorul de lucru al recipesi, utilizat pentru fișiere intermediare și operații de build. |
S
|
Directorul care conține sursele utilizate pentru compilare. |
CC
|
Compilatorul C configurat de sistemul de cross-compilare. |
CFLAGS
|
Opțiunile de compilare C. |
LDFLAGS
|
Opțiunile transmise la etapa de link-editare. |
D
|
Directorul temporar în care se instalează fișierele pachetului înainte de împachetare. |
bindir
|
Directorul standard destinat executabilelor utilizatorilor, de regulă /usr/bin.
|
Funcțiile din rețete (recipes)
Funcția do_compile() stabilește modul în care se compilează aplicația:
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} \
iq-processor.c -o iq-processor
}
Variabila ${CC} identifică compilatorul configurat pentru arhitectura țintă.
În cazul Arty Z7-20, acesta este un compilator pentru arhitectura ARM corespunzătoare procesorului Zynq-7000, nu compilatorul nativ x86-64 utilizat de Ubuntu pe calculatorul gazdă.
Funcția do_install() stabilește unde va fi instalat executabilul:
do_install() {
install -d ${D}${bindir}
install -m 0755 iq-processor \
${D}${bindir}/iq-processor
}
După includerea pachetului în imaginea Linux, executabilul va fi disponibil în mod normal la:
/usr/bin/iq-processor
Prezența executabilului în imagine presupune ca pachetul rezultat din recipe să fie inclus în configurația imaginii, de exemplu prin mecanismul IMAGE_INSTALL sau prin configurarea PetaLinux.
Task-urile BitBake
Fiecare recipe este descompusă în operații numite task-uri.
Acestea pot include descărcarea surselor, configurarea, compilarea, instalarea și împachetarea.
Un flux tipic este:
do_fetch | v do_unpack | v do_patch | v do_configure | v do_compile | v do_install | v do_package
Acest flux reprezintă o simplificare conceptuală. În practică, BitBake construiește un graf de dependențe între task-uri, inclusiv task-uri provenite din recipes diferite.
| Task | Funcționalitate |
|---|---|
do_fetch
|
Descarcă sau localizează sursele specificate în recipe. |
do_unpack
|
Despachetează arhivele și pregătește sursele. |
do_patch
|
Aplică patch-urile necesare. |
do_configure
|
Configurează mediul și parametrii de compilare. |
do_compile
|
Compilează codul sursă. |
do_install
|
Instalează fișierele rezultate într-un director temporar de destinație. |
do_package
|
Pregătește împărțirea și metadatele pachetelor software. |
Dacă se modifică doar fișierul sursă iq-processor.c, BitBake poate recompila aplicația respectivă și operațiile dependente, reutilizând rezultatele nemodificate ale celorlalte componente.
Acest mecanism este important deoarece o distribuție embedded Linux poate conține sute sau mii de pachete și task-uri.
Compararea BitBake cu Make și CMake
BitBake, Make și CMake sunt instrumente cu responsabilități diferite.
| Caracteristică | Make | CMake | BitBake |
|---|---|---|---|
| Compilarea aplicațiilor | Execută reguli de build. | Generează și configurează sistemul de build. | Coordonează task-urile care invocă instrumentele de compilare. |
| Construirea unei distribuții Linux | Necesită infrastructură suplimentară. | Nu este scopul principal. | Da, împreună cu OpenEmbedded. |
| Gestionarea dependențelor | Între ținte (targets). | Între ținte și componente ale proiectului. | Între recipes, pachete și task-uri. |
| Cross-compilare | Posibilă prin configurarea instrumentelor. | Posibilă folosind un toolchain file. | Integrată în configurația distribuției și a mașinii țintă. |
| Descărcarea surselor | Necesită reguli sau instrumente suplimentare. | Posibilă prin mecanisme dedicate. | Integrată prin task-uri și fetchere. |
| Gestionarea cache-ului | Bazată în principal pe dependențe și timpi de modificare. | Depinde de generator și de instrumentele folosite. | Include mecanismul Shared State Cache. |
| Utilizare obișnuită | Compilarea proiectelor software. | Configurarea proiectelor software portabile. | Construirea distribuțiilor Linux embedded. |
BitBake poate utiliza Make sau CMake în interiorul unei recipes. Aceste instrumente nu se exclud reciproc.
De exemplu, o recipe poate utiliza clasa cmake:
inherit cmake
În acest caz, BitBake coordonează procesul, iar infrastructura CMake configurează și generează regulile de construire a aplicației.
Utilizarea BitBake în PetaLinux
În PetaLinux, operațiile de build sunt executate în mod obișnuit prin comenzile AMD.
Construirea întregului proiect
# Construiește proiectul PetaLinux.
petalinux-build
Această comandă construiește componentele necesare proiectului, în funcție de configurația curentă.
Construirea kernelului Linux
# Construiește componenta kernel.
petalinux-build -c kernel
Curățarea rezultatelor de compilare
# Elimină rezultatele de build ale componentei kernel.
petalinux-build -c kernel -x clean
Operația clean elimină rezultatele locale ale task-urilor componentei selectate, dar nu reprezintă neapărat eliminarea tuturor artefactelor reutilizabile din Shared State Cache.
Afișarea informațiilor suplimentare
# Activează afișarea detaliată.
petalinux-build -v
Invocarea directă a BitBake
Într-un mediu Yocto/BitBake inițializat corespunzător, pot fi utilizate comenzi directe.
Afișarea task-urilor unei recipes:
bitbake -c listtasks virtual/kernel
Afișarea variabilelor de mediu calculate pentru o recipe:
bitbake -e virtual/kernel
Construirea unei recipes:
bitbake my-recipe
În aceste exemple, virtual/kernel reprezintă un furnizor virtual pentru kernelul Linux, iar my-recipe reprezintă numele unei recipes disponibile în configurația curentă.
Important: Comenzile BitBake directe presupun inițializarea mediului de build. În PetaLinux este recomandată utilizarea comenzilor petalinux-build, deoarece acestea gestionează integrarea specifică platformei AMD.
Utilizarea BitBake în proiectele FPGA și SDR
Un exemplu practic este dezvoltarea unui sistem SDR bazat pe placa Digilent Arty Z7-20.
Arhitectura sistemului poate fi:
Raspberry Pi 5
|
| Ethernet / UDP
v
PetaLinux
|
| AXI DMA
v
FPGA DSP
|
+-- Frequency shifting
|
+-- Digital filtering
|
+-- Doppler correction
Pentru o asemenea aplicație, sistemul PetaLinux poate necesita:
- O aplicație C/C++ care recepționează eșantioane I/Q prin Ethernet.
- Un driver Linux pentru un periferic AXI personalizat.
- Un serviciu care inițializează automat aplicația SDR.
- Biblioteci pentru procesare digitală de semnal.
- Fișiere de configurare pentru parametrii de recepție și procesare.
Aceste componente pot fi integrate în distribuția PetaLinux prin recipes BitBake, fișiere de configurare și layere OpenEmbedded.
Avantajele integrării în imagine
Fără integrarea în sistemul de build, după fiecare instalare a unei imagini Linux ar putea fi necesare operații manuale:
- Copierea aplicațiilor compilate.
- Instalarea bibliotecilor.
- Configurarea serviciilor.
- Modificarea fișierelor de configurare.
- Stabilirea drepturilor de acces.
- Configurarea pornirii automate.
Prin utilizarea recipeslor BitBake, aceste operații pot fi incluse în procesul automat de construire a imaginii.
În acest fel, configurația sistemului devine reproductibilă, iar imaginea PetaLinux rezultată poate fi distribuită și instalată pe alte plăci compatibile.
Cache-ul BitBake și compilarea incrementală
Unul dintre mecanismele importante ale infrastructurii Yocto este Shared State Cache, cunoscut și sub denumirea sstate-cache.
Acesta păstrează rezultatele reutilizabile ale anumitor task-uri.
În loc să execute din nou fiecare operație de compilare, BitBake poate recupera rezultatele din cache atunci când semnăturile task-urilor și dependențele sunt compatibile.
De exemplu, dacă s-a construit deja kernelul Linux și se modifică numai o aplicație SDR, nu este necesară în mod normal recompilarea completă a kernelului.
Directoare importante
| Director sau variabilă | Rol |
|---|---|
DL_DIR
|
Directorul în care sunt păstrate sursele descărcate. |
SSTATE_DIR
|
Directorul utilizat pentru Shared State Cache. |
TMPDIR
|
Directorul principal pentru fișierele temporare și rezultatele intermediare ale build-ului. |
WORKDIR
|
Directorul de lucru al unei recipes. |
DEPLOY_DIR
|
Directorul principal pentru artefactele rezultate și destinate distribuției. |
Într-un mediu cu mai multe instalații Yocto/PetaLinux, directoarele de descărcări și cache pot fi configurate astfel încât să reutilizeze rezultate între proiecte compatibile.
Acest aspect este util atunci când PetaLinux este instalat atât pe o mașină Ubuntu dedicată, cât și într-un mediu Ubuntu 22.04 rulând în WSL2.
Totuși, reutilizarea cache-ului nu este garantată între versiuni diferite de Yocto, PetaLinux sau configurații incompatibile.
De asemenea, cache-ul nu înlocuiește instalarea corectă a instrumentelor și a dependențelor necesare pe sistemul gazdă.
Reproductibilitatea sistemului embedded Linux
Un obiectiv important al Yocto și PetaLinux este construirea reproductibilă a unui sistem Linux personalizat.
Prin păstrarea sub controlul versiunilor a recipeslor, configurațiilor, patch-urilor și codului sursă, se poate reconstrui o imagine Linux cu aceleași componente și parametri.
Totuși, o configurație reproductibilă nu garantează automat un rezultat identic la nivel de octet.
Pentru reproductibilitate completă trebuie controlate și versiunile surselor, instrumentele de compilare, metadatele, timestamp-urile și alți factori care pot influența artefactele generate.
Într-un proiect FPGA/SDR, această abordare oferă avantaje importante:
- Urmărirea modificărilor efectuate în sistem.
- Reconstituirea unei versiuni funcționale anterioare.
- Integrarea automată a aplicațiilor și driverelor.
- Reducerea intervențiilor manuale după instalarea imaginii.
- Posibilitatea automatizării procesului de construire și testare.
BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux
BitBake este un sistem de automatizare a procesului de compilare (build automation engine), utilizat în principal de Yocto Project, OpenEmbedded și AMD PetaLinux pentru construirea distribuțiilor Linux destinate sistemelor embedded.
În cazul unui proiect bazat pe Arty Z7-20 și PetaLinux 2025.2, BitBake este una dintre componentele fundamentale care transformă configurația proiectului, codul sursă și rețetele software (software recipe / recipes) într-un sistem Linux funcțional pentru procesorul ARM Cortex-A9 din familia Zynq-7000. Voi folosi termenul de recipe / recipes în loc de rețetă sau rețete pentru a fi mai fidel documentației originale.
Arhitectura BitBake în PetaLinux
PetaLinux nu este un compilator propriu-zis. Este un ansamblu de instrumente AMD construit deasupra infrastructurii Yocto/OpenEmbedded.
Arhitectura poate fi reprezentată astfel:
AMD PetaLinux
|
v
Yocto Project / OpenEmbedded
|
v
BitBake
|
+---------+---------+
| | |
v v v
Linux RootFS Boot
Kernel Components
Fiecare nivel îndeplinește un rol specific:
- PetaLinux – oferă comenzile și interfața de configurare specifice platformelor AMD.
- Yocto Project / OpenEmbedded – furnizează rețetele, layerele, configurațiile și infrastructura necesare construirii distribuției.
- BitBake – analizează rețetele, rezolvă dependențele și execută task-urile de build.
- Instrumentele de compilare – GCC, linkerul, Make, CMake și alte utilitare realizează efectiv compilarea și asamblarea componentelor.
Când se execută comanda:
petalinux-build
PetaLinux pregătește mediul de build și invocă infrastructura Yocto/BitBake, care coordonează compilarea componentelor necesare.
Funcționalitățile BitBake
BitBake nu compilează el însuși cod C sau C++. În schimb, coordonează instrumentele necesare construirii aplicațiilor, bibliotecilor și imaginilor Linux.
Principalele responsabilități sunt:
- Analiza recipeslor – identifică pachetele și componentele care trebuie construite.
- Rezolvarea dependențelor – stabilește ordinea corectă a operațiilor de compilare.
- Descărcarea surselor – obține codul sursă din depozite Git, arhive și alte surse configurate.
- Aplicarea patch-urilor – modifică sursele conform instrucțiunilor din recipes.
- Configurarea și compilarea – invocă instrumente precum GCC, Make, CMake sau Meson.
- Instalarea și împachetarea – generează pachete software și componentele sistemului de fișiere.
- Gestionarea cache-ului – reutilizează rezultatele operațiilor deja executate atunci când configurația și dependențele permit acest lucru.
- Execuția paralelă – permite executarea simultană a task-urilor independente, reducând durata procesului de build.
Un avantaj esențial este faptul că BitBake nu reconstruiește în mod obligatoriu întreaga distribuție Linux după fiecare modificare.
În schimb, analizează dependențele și semnăturile task-urilor pentru a determina ce operații trebuie executate din nou.
Rețetele BitBake
Rețetele BitBake sunt fișiere cu extensia .bb, denumite BitBake recipes.
O recipe descrie modul în care trebuie obținut, configurat, compilat, instalat și împachetat un anumit pachet software.
De exemplu, presupunem că dorim să includem în PetaLinux o aplicație C care procesează eșantioane I/Q provenite de la un receptor SDR.
O recipe simplificată poate avea următorul conținut:
SUMMARY = "Simple I/Q processing application"
LICENSE = "CLOSED"
SRC_URI = "file://iq-processor.c"
S = "${WORKDIR}"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} \
iq-processor.c -o iq-processor
}
do_install() {
install -d ${D}${bindir}
install -m 0755 iq-processor \
${D}${bindir}/iq-processor
}
Se observă asemănarea sintactică cu fișierele Makefile.
Notă: Exemplul este simplificat pentru a ilustra structura unei recipe. În versiunile moderne Yocto, directorul în care se despachetează sursele este definit de variabila UNPACKDIR. Pentru o recipe reală trebuie verificată structura directoarelor folosită de versiunea Yocto/PetaLinux instalată.
Explicația variabilelor
| Variabilă | Semnificație |
|---|---|
SUMMARY
|
Descriere scurtă a pachetului software. |
LICENSE
|
Specifică licența asociată pachetului. Valoarea CLOSED este utilizată pentru software proprietar, fără un fișier de licență declarat prin mecanismul obișnuit.
|
SRC_URI
|
Identifică sursele necesare construirii pachetului. |
WORKDIR
|
Directorul de lucru al recipesi, utilizat pentru fișiere intermediare și operații de build. |
S
|
Directorul care conține sursele utilizate pentru compilare. |
CC
|
Compilatorul C configurat de sistemul de cross-compilare. |
CFLAGS
|
Opțiunile de compilare C. |
LDFLAGS
|
Opțiunile transmise la etapa de link-editare. |
D
|
Directorul temporar în care se instalează fișierele pachetului înainte de împachetare. |
bindir
|
Directorul standard destinat executabilelor utilizatorilor, de regulă /usr/bin.
|
Funcțiile din rețete (recipes)
Funcția do_compile() stabilește modul în care se compilează aplicația:
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} \
iq-processor.c -o iq-processor
}
Variabila ${CC} identifică compilatorul configurat pentru arhitectura țintă.
În cazul Arty Z7-20, acesta este un compilator pentru arhitectura ARM corespunzătoare procesorului Zynq-7000, nu compilatorul nativ x86-64 utilizat de Ubuntu pe calculatorul gazdă.
Funcția do_install() stabilește unde va fi instalat executabilul:
do_install() {
install -d ${D}${bindir}
install -m 0755 iq-processor \
${D}${bindir}/iq-processor
}
După includerea pachetului în imaginea Linux, executabilul va fi disponibil în mod normal la:
/usr/bin/iq-processor
Prezența executabilului în imagine presupune ca pachetul rezultat din recipe să fie inclus în configurația imaginii, de exemplu prin mecanismul IMAGE_INSTALL sau prin configurarea PetaLinux.
Task-urile BitBake
Fiecare recipe este descompusă în operații numite task-uri.
Acestea pot include descărcarea surselor, configurarea, compilarea, instalarea și împachetarea.
Un flux tipic este:
do_fetch | v do_unpack | v do_patch | v do_configure | v do_compile | v do_install | v do_package
Acest flux reprezintă o simplificare conceptuală. În practică, BitBake construiește un graf de dependențe între task-uri, inclusiv task-uri provenite din recipes diferite.
| Task | Funcționalitate |
|---|---|
do_fetch
|
Descarcă sau localizează sursele specificate în recipe. |
do_unpack
|
Despachetează arhivele și pregătește sursele. |
do_patch
|
Aplică patch-urile necesare. |
do_configure
|
Configurează mediul și parametrii de compilare. |
do_compile
|
Compilează codul sursă. |
do_install
|
Instalează fișierele rezultate într-un director temporar de destinație. |
do_package
|
Pregătește împărțirea și metadatele pachetelor software. |
Dacă se modifică doar fișierul sursă iq-processor.c, BitBake poate recompila aplicația respectivă și operațiile dependente, reutilizând rezultatele nemodificate ale celorlalte componente.
Acest mecanism este important deoarece o distribuție embedded Linux poate conține sute sau mii de pachete și task-uri.
Compararea BitBake cu Make și CMake
BitBake, Make și CMake sunt instrumente cu responsabilități diferite.
| Caracteristică | Make | CMake | BitBake |
|---|---|---|---|
| Compilarea aplicațiilor | Execută reguli de build. | Generează și configurează sistemul de build. | Coordonează task-urile care invocă instrumentele de compilare. |
| Construirea unei distribuții Linux | Necesită infrastructură suplimentară. | Nu este scopul principal. | Da, împreună cu OpenEmbedded. |
| Gestionarea dependențelor | Între ținte (targets). | Între ținte și componente ale proiectului. | Între recipes, pachete și task-uri. |
| Cross-compilare | Posibilă prin configurarea instrumentelor. | Posibilă folosind un toolchain file. | Integrată în configurația distribuției și a mașinii țintă. |
| Descărcarea surselor | Necesită reguli sau instrumente suplimentare. | Posibilă prin mecanisme dedicate. | Integrată prin task-uri și fetchere. |
| Gestionarea cache-ului | Bazată în principal pe dependențe și timpi de modificare. | Depinde de generator și de instrumentele folosite. | Include mecanismul Shared State Cache. |
| Utilizare obișnuită | Compilarea proiectelor software. | Configurarea proiectelor software portabile. | Construirea distribuțiilor Linux embedded. |
BitBake poate utiliza Make sau CMake în interiorul unei recipes. Aceste instrumente nu se exclud reciproc.
De exemplu, o recipe poate utiliza clasa cmake:
inherit cmake
În acest caz, BitBake coordonează procesul, iar infrastructura CMake configurează și generează regulile de construire a aplicației.
Utilizarea BitBake în PetaLinux
În PetaLinux, operațiile de build sunt executate în mod obișnuit prin comenzile AMD.
Construirea întregului proiect
# Construiește proiectul PetaLinux.
petalinux-build
Această comandă construiește componentele necesare proiectului, în funcție de configurația curentă.
Construirea kernelului Linux
# Construiește componenta kernel.
petalinux-build -c kernel
Curățarea rezultatelor de compilare
# Elimină rezultatele de build ale componentei kernel.
petalinux-build -c kernel -x clean
Operația clean elimină rezultatele locale ale task-urilor componentei selectate, dar nu reprezintă neapărat eliminarea tuturor artefactelor reutilizabile din Shared State Cache.
Afișarea informațiilor suplimentare
# Activează afișarea detaliată.
petalinux-build -v
Invocarea directă a BitBake
Într-un mediu Yocto/BitBake inițializat corespunzător, pot fi utilizate comenzi directe.
Afișarea task-urilor unei recipes:
bitbake -c listtasks virtual/kernel
Afișarea variabilelor de mediu calculate pentru o recipe:
bitbake -e virtual/kernel
Construirea unei recipes:
bitbake my-recipe
În aceste exemple, virtual/kernel reprezintă un furnizor virtual pentru kernelul Linux, iar my-recipe reprezintă numele unei recipes disponibile în configurația curentă.
Important: Comenzile BitBake directe presupun inițializarea mediului de build. În PetaLinux este recomandată utilizarea comenzilor petalinux-build, deoarece acestea gestionează integrarea specifică platformei AMD.
Utilizarea BitBake în proiectele FPGA și SDR
Un exemplu practic este dezvoltarea unui sistem SDR bazat pe placa Digilent Arty Z7-20.
Arhitectura sistemului poate fi:
Raspberry Pi 5
|
| Ethernet / UDP
v
PetaLinux
|
| AXI DMA
v
FPGA DSP
|
+-- Frequency shifting
|
+-- Digital filtering
|
+-- Doppler correction
Pentru o asemenea aplicație, sistemul PetaLinux poate necesita:
- O aplicație C/C++ care recepționează eșantioane I/Q prin Ethernet.
- Un driver Linux pentru un periferic AXI personalizat.
- Un serviciu care inițializează automat aplicația SDR.
- Biblioteci pentru procesare digitală de semnal.
- Fișiere de configurare pentru parametrii de recepție și procesare.
Aceste componente pot fi integrate în distribuția PetaLinux prin recipes BitBake, fișiere de configurare și layere OpenEmbedded.
Avantajele integrării în imagine
Fără integrarea în sistemul de build, după fiecare instalare a unei imagini Linux ar putea fi necesare operații manuale:
- Copierea aplicațiilor compilate.
- Instalarea bibliotecilor.
- Configurarea serviciilor.
- Modificarea fișierelor de configurare.
- Stabilirea drepturilor de acces.
- Configurarea pornirii automate.
Prin utilizarea recipeslor BitBake, aceste operații pot fi incluse în procesul automat de construire a imaginii.
În acest fel, configurația sistemului devine reproductibilă, iar imaginea PetaLinux rezultată poate fi distribuită și instalată pe alte plăci compatibile.
Cache-ul BitBake și compilarea incrementală
Unul dintre mecanismele importante ale infrastructurii Yocto este Shared State Cache, cunoscut și sub denumirea sstate-cache.
Acesta păstrează rezultatele reutilizabile ale anumitor task-uri.
În loc să execute din nou fiecare operație de compilare, BitBake poate recupera rezultatele din cache atunci când semnăturile task-urilor și dependențele sunt compatibile.
De exemplu, dacă s-a construit deja kernelul Linux și se modifică numai o aplicație SDR, nu este necesară în mod normal recompilarea completă a kernelului.
Directoare importante
| Director sau variabilă | Rol |
|---|---|
DL_DIR
|
Directorul în care sunt păstrate sursele descărcate. |
SSTATE_DIR
|
Directorul utilizat pentru Shared State Cache. |
TMPDIR
|
Directorul principal pentru fișierele temporare și rezultatele intermediare ale build-ului. |
WORKDIR
|
Directorul de lucru al unei recipes. |
DEPLOY_DIR
|
Directorul principal pentru artefactele rezultate și destinate distribuției. |
Într-un mediu cu mai multe instalații Yocto/PetaLinux, directoarele de descărcări și cache pot fi configurate astfel încât să reutilizeze rezultate între proiecte compatibile.
Acest aspect este util atunci când PetaLinux este instalat atât pe o mașină Ubuntu dedicată, cât și într-un mediu Ubuntu 22.04 rulând în WSL2.
Totuși, reutilizarea cache-ului nu este garantată între versiuni diferite de Yocto, PetaLinux sau configurații incompatibile.
De asemenea, cache-ul nu înlocuiește instalarea corectă a instrumentelor și a dependențelor necesare pe sistemul gazdă.
Reproductibilitatea sistemului embedded Linux
Un obiectiv important al Yocto și PetaLinux este construirea reproductibilă a unui sistem Linux personalizat.
Prin păstrarea sub controlul versiunilor a recipeslor, configurațiilor, patch-urilor și codului sursă, se poate reconstrui o imagine Linux cu aceleași componente și parametri.
Totuși, o configurație reproductibilă nu garantează automat un rezultat identic la nivel de octet.
Pentru reproductibilitate completă trebuie controlate și versiunile surselor, instrumentele de compilare, metadatele, timestamp-urile și alți factori care pot influența artefactele generate.
Într-un proiect FPGA/SDR, această abordare oferă avantaje importante:
- Urmărirea modificărilor efectuate în sistem.
- Reconstituirea unei versiuni funcționale anterioare.
- Integrarea automată a aplicațiilor și driverelor.
- Reducerea intervențiilor manuale după instalarea imaginii.
- Posibilitatea automatizării procesului de construire și testare.
Alte concepte importante din BitBake și OpenEmbedded
Pe lângă rețetele .bb, infrastructura BitBake utilizează mai multe tipuri de fișiere și mecanisme.
| Element | Descriere |
|---|---|
.bb
|
recipe BitBake, care definește modul de construire a unui pachet. |
.bbappend
|
Fișier care extinde sau modifică metadatele unei recipes existente. |
.bbclass
|
Clasă reutilizabilă care furnizează funcționalități comune mai multor recipes. |
.conf
|
Fișier de configurare pentru distribuție, mașină, layer sau mediu de build. |
meta-*
|
Denumire convențională folosită frecvent pentru layere OpenEmbedded. |
DEPENDS
|
Declară dependențele necesare în timpul construirii unei recipes. |
RDEPENDS
|
Declară dependențele necesare la rularea unui pachet. |
IMAGE_INSTALL
|
Specifică pachetele care trebuie incluse într-o imagine Linux. |
inherit
|
Permite unei recipes să reutilizeze funcționalitățile unei clase BitBake. |
În special, fișierele .bbappend și layerele personalizate sunt importante pentru modificarea distribuției PetaLinux fără editarea directă a recipeslor furnizate de AMD.
Concluzii
BitBake este motorul de automatizare care coordonează construirea componentelor unei distribuții Linux embedded.
Relația dintre principalele instrumente poate fi sintetizată astfel:
- PetaLinux – oferă interfața AMD pentru configurarea și construirea sistemelor Linux destinate platformelor sale embedded.
- Yocto Project / OpenEmbedded – furnizează infrastructura, rețetele, layerele și mecanismele de configurare a distribuției.
- BitBake – interpretează metadatele, rezolvă dependențele și coordonează task-urile de build.
- GCC, Make, CMake și alte instrumente – realizează operațiile concrete de compilare, link-editare și construire.
Înțelegerea BitBake permite personalizarea avansată a imaginilor PetaLinux, integrarea aplicațiilor și driverelor proprii și automatizarea construirii unor sisteme embedded complexe.
Referințe
- Yocto Project, BitBake User Manual. Documentație oficială.
- Yocto Project, Reference Manual – Tasks. Documentație oficială.
- Yocto Project, Overview and Concepts Manual. Documentație oficială.
- Yocto Project, Reference Manual – Variables Glossary. Documentație oficială.
- AMD, PetaLinux Tools Documentation: Reference Guide (UG1144). Documentație oficială.
- OpenEmbedded, OpenEmbedded Layer Index. Indexul layerelor și recipeslor.
Concluzii
BitBake este motorul de automatizare care coordonează construirea componentelor unei distribuții Linux embedded.
Relația dintre principalele instrumente poate fi sintetizată astfel:
- PetaLinux – oferă interfața AMD pentru configurarea și construirea sistemelor Linux destinate platformelor sale embedded.
- Yocto Project / OpenEmbedded – furnizează infrastructura, recipesle, layerele și mecanismele de configurare a distribuției.
- BitBake – interpretează metadatele, rezolvă dependențele și coordonează task-urile de build.
- GCC, Make, CMake și alte instrumente – realizează operațiile concrete de compilare, link-editare și construire.
Înțelegerea BitBake permite personalizarea avansată a imaginilor PetaLinux, integrarea aplicațiilor și driverelor proprii și automatizarea construirii unor sisteme embedded complexe.
Referințe
- Yocto Project, BitBake User Manual. Documentație oficială.
- Yocto Project, Reference Manual – Tasks. Documentație oficială.
- Yocto Project, Overview and Concepts Manual. Documentație oficială.
- Yocto Project, Reference Manual – Variables Glossary. Documentație oficială.
- AMD, PetaLinux Tools Documentation: Reference Guide (UG1144). Documentație oficială.
- OpenEmbedded, OpenEmbedded Layer Index. Indexul layerelor și recipeslor.