Un material despre BitBake: Diferență între versiuni

De la YO3ITI
Sari la navigare Sari la căutare
 
(Nu s-au afișat 6 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ă ''recipes''le, layerele, configurațiile și infrastructura necesare construirii distribuției.
* '''Yocto Project / OpenEmbedded''' – furnizează rețetele, layerele, configurațiile și infrastructura necesare construirii distribuției.
* '''BitBake''' – analizează ''recipes''le, rezolvă dependențele și execută task-urile de build.
* '''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 code="bash">
<syntaxhighlight lang="bash">
petalinux-build
petalinux-build
</syntaxhighlight>
</syntaxhighlight>
Linia 65: Linia 515:
== Rețetele BitBake ==
== Rețetele BitBake ==


''recipes''le BitBake sunt fișiere cu extensia <code>.bb</code>, denumite ''BitBake recipes''.
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.
O ''recipe'' descrie modul în care trebuie obținut, configurat, compilat, instalat și împachetat un anumit pachet software.
Linia 73: Linia 523:
O ''recipe'' simplificată poate avea următorul conținut:
O ''recipe'' simplificată poate avea următorul conținut:


<syntaxhighlight code="bitbake">
<syntaxhighlight lang="bash">
SUMMARY = "Simple I/Q processing application"
SUMMARY = "Simple I/Q processing application"
LICENSE = "CLOSED"
LICENSE = "CLOSED"
Linia 93: Linia 543:
</syntaxhighlight>
</syntaxhighlight>


'''Notă:''' Exemplul este simplificat pentru a ilustra structura unei ''recipes''. Î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ă.
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 ===
=== Explicația variabilelor ===
Linia 132: Linia 584:
|}
|}


=== Funcțiile din ''recipe'' ===
=== 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 code="bitbake">
<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 code="bitbake">
<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 code="bitbake">
<syntaxhighlight lang="bash">
inherit cmake
inherit cmake
</syntaxhighlight>
</syntaxhighlight>
Linia 288: Linia 740:
=== Construirea întregului proiect ===
=== Construirea întregului proiect ===


<syntaxhighlight code="bash">
<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 code="bash">
<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 code="bash">
<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 code="bash">
<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 code="bash">
<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 code="bash">
<syntaxhighlight lang="bash">
bitbake -e virtual/kernel
bitbake -e virtual/kernel
</syntaxhighlight>
</syntaxhighlight>
Linia 336: Linia 788:
Construirea unei ''recipes'':
Construirea unei ''recipes'':


<syntaxhighlight code="bash">
<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ă ''recipes''le <code>.bb</code>, infrastructura BitBake utilizează mai multe tipuri de fișiere și mecanisme.
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

  1. Yocto Project, BitBake User Manual. Documentație oficială.
  2. Yocto Project, Reference Manual – Tasks. Documentație oficială.
  3. Yocto Project, Overview and Concepts Manual. Documentație oficială.
  4. Yocto Project, Reference Manual – Variables Glossary. Documentație oficială.
  5. AMD, PetaLinux Tools Documentation: Reference Guide (UG1144). Documentație oficială.
  6. 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

  1. Yocto Project, BitBake User Manual. Documentație oficială.
  2. Yocto Project, Reference Manual – Tasks. Documentație oficială.
  3. Yocto Project, Overview and Concepts Manual. Documentație oficială.
  4. Yocto Project, Reference Manual – Variables Glossary. Documentație oficială.
  5. AMD, PetaLinux Tools Documentation: Reference Guide (UG1144). Documentație oficială.
  6. OpenEmbedded, OpenEmbedded Layer Index. Indexul layerelor și recipeslor.