Un material despre BitBake: Diferență între versiuni

De la YO3ITI
Sari la navigare Sari la căutare
Pagină nouă: = 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 transfor...
 
Linia 1: Linia 1:


= BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux =
= BitBake – Sistemul de automatizare a compilării în Yocto și PetaLinux =
Linia 4: Linia 5:
'''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.
'''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 într-un sistem Linux funcțional pentru procesorul ARM Cortex-A9 din familia Zynq-7000.
Î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 ==
== Arhitectura BitBake în PetaLinux ==
Linia 31: Linia 32:


* '''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ă rețetele, layerele, configurațiile și infrastructura necesare construirii distribuției.
* '''Yocto Project / OpenEmbedded''' – furnizează ''recipes''le, layerele, configurațiile și infrastructura necesare construirii distribuției.
* '''BitBake''' – analizează rețetele, rezolvă dependențele și execută task-urile de build.
* '''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.
* '''Instrumentele de compilare''' – GCC, linkerul, Make, CMake și alte utilitare realizează efectiv compilarea și asamblarea componentelor.


Linia 49: Linia 50:
Principalele responsabilități sunt:
Principalele responsabilități sunt:


* '''Analiza rețetelor''' – identifică pachetele și componentele care trebuie construite.
* '''Analiza ''recipes''lor''' – identifică pachetele și componentele care trebuie construite.
* '''Rezolvarea dependențelor''' – stabilește ordinea corectă a operațiilor de compilare.
* '''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.
* '''Descărcarea surselor''' – obține codul sursă din depozite Git, arhive și alte surse configurate.
* '''Aplicarea patch-urilor''' – modifică sursele conform instrucțiunilor din rețete.
* '''Aplicarea patch-urilor''' – modifică sursele conform instrucțiunilor din ''recipes''.
* '''Configurarea și compilarea''' – invocă instrumente precum GCC, Make, CMake sau Meson.
* '''Configurarea și compilarea''' – invocă instrumente precum GCC, Make, CMake sau Meson.
* '''Instalarea și împachetarea''' – generează pachete software și componentele sistemului de fișiere.
* '''Instalarea și împachetarea''' – generează pachete software și componentele sistemului de fișiere.
Linia 62: Linia 63:
În schimb, analizează dependențele și semnăturile task-urilor pentru a determina ce operații trebuie executate din nou.
În schimb, analizează dependențele și semnăturile task-urilor pentru a determina ce operații trebuie executate din nou.


== Rețetele BitBake ==
== ''recipes''le BitBake ==


Rețetele BitBake sunt fișiere cu extensia <code>.bb</code>, denumite ''BitBake recipes''.
''recipes''le BitBake sunt fișiere cu extensia <code>.bb</code>, denumite ''BitBake recipes''.


O rețetă 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.


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.
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 rețetă simplificată poate avea următorul conținut:
O ''recipe'' simplificată poate avea următorul conținut:


<syntaxhighlight code="bitbake">
<syntaxhighlight code="bitbake">
Linia 92: Linia 93:
</syntaxhighlight>
</syntaxhighlight>


'''Notă:''' Exemplul este simplificat pentru a ilustra structura unei rețete. În versiunile moderne Yocto, directorul în care se despachetează sursele este definit de variabila <code>UNPACKDIR</code>. Pentru o rețetă reală trebuie verificată structura directoarelor folosită de versiunea Yocto/PetaLinux instalată.
'''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ă.


=== Explicația variabilelor ===
=== Explicația variabilelor ===
Linia 110: Linia 111:
|-
|-
| <code>WORKDIR</code>
| <code>WORKDIR</code>
| Directorul de lucru al rețetei, utilizat pentru fișiere intermediare și operații de build.
| Directorul de lucru al ''recipes''i, utilizat pentru fișiere intermediare și operații de build.
|-
|-
| <code>S</code>
| <code>S</code>
Linia 131: Linia 132:
|}
|}


=== Funcțiile din rețetă ===
=== Funcțiile din ''recipe'' ===


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:
Linia 161: Linia 162:
<code>/usr/bin/iq-processor</code>
<code>/usr/bin/iq-processor</code>


Prezența executabilului în imagine presupune ca pachetul rezultat din rețetă să fie inclus în configurația imaginii, de exemplu prin mecanismul <code>IMAGE_INSTALL</code> sau prin configurarea PetaLinux.
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 ==
== Task-urile BitBake ==


Fiecare rețetă este descompusă în operații numite '''task-uri'''.
Fiecare ''recipe'' este descompusă în operații numite '''task-uri'''.


Acestea pot include descărcarea surselor, configurarea, compilarea, instalarea și împachetarea.
Acestea pot include descărcarea surselor, configurarea, compilarea, instalarea și împachetarea.
Linia 193: Linia 194:
</pre>
</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 rețete diferite.
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"
{| class="wikitable"
Linia 200: Linia 201:
|-
|-
| <code>do_fetch</code>
| <code>do_fetch</code>
| Descarcă sau localizează sursele specificate în rețetă.
| Descarcă sau localizează sursele specificate în ''recipe''.
|-
|-
| <code>do_unpack</code>
| <code>do_unpack</code>
Linia 248: Linia 249:
| Între ținte (''targets'').
| Între ținte (''targets'').
| Între ținte și componente ale proiectului.
| Între ținte și componente ale proiectului.
| Între rețete, pachete și task-uri.
| Între ''recipes'', pachete și task-uri.
|-
|-
| Cross-compilare
| Cross-compilare
Linia 271: Linia 272:
|}
|}


BitBake poate utiliza Make sau CMake în interiorul unei rețete. Aceste instrumente nu se exclud reciproc.
BitBake poate utiliza Make sau CMake în interiorul unei ''recipes''. Aceste instrumente nu se exclud reciproc.


De exemplu, o rețetă poate utiliza clasa <code>cmake</code>:
De exemplu, o ''recipe'' poate utiliza clasa <code>cmake</code>:


<syntaxhighlight code="bitbake">
<syntaxhighlight code="bitbake">
Linia 321: Linia 322:
Într-un mediu Yocto/BitBake inițializat corespunzător, pot fi utilizate comenzi directe.
Într-un mediu Yocto/BitBake inițializat corespunzător, pot fi utilizate comenzi directe.


Afișarea task-urilor unei rețete:
Afișarea task-urilor unei ''recipes'':


<syntaxhighlight code="bash">
<syntaxhighlight code="bash">
Linia 327: Linia 328:
</syntaxhighlight>
</syntaxhighlight>


Afișarea variabilelor de mediu calculate pentru o rețetă:
Afișarea variabilelor de mediu calculate pentru o ''recipe'':


<syntaxhighlight code="bash">
<syntaxhighlight code="bash">
Linia 333: Linia 334:
</syntaxhighlight>
</syntaxhighlight>


Construirea unei rețete:
Construirea unei ''recipes'':


<syntaxhighlight code="bash">
<syntaxhighlight code="bash">
Linia 339: Linia 340:
</syntaxhighlight>
</syntaxhighlight>


În aceste exemple, <code>virtual/kernel</code> reprezintă un furnizor virtual pentru kernelul Linux, iar <code>my-recipe</code> reprezintă numele unei rețete disponibile în configurația curentă.
Î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.
'''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.
Linia 375: Linia 376:
* Fișiere de configurare pentru parametrii de recepție și procesare.
* Fișiere de configurare pentru parametrii de recepție și procesare.


Aceste componente pot fi integrate în distribuția PetaLinux prin rețete BitBake, fișiere de configurare și layere OpenEmbedded.
Aceste componente pot fi integrate în distribuția PetaLinux prin ''recipes'' BitBake, fișiere de configurare și layere OpenEmbedded.


=== Avantajele integrării în imagine ===
=== Avantajele integrării în imagine ===
Linia 388: Linia 389:
* Configurarea pornirii automate.
* Configurarea pornirii automate.


Prin utilizarea rețetelor BitBake, aceste operații pot fi incluse în procesul automat de construire a imaginii.
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.
În acest fel, configurația sistemului devine reproductibilă, iar imaginea PetaLinux rezultată poate fi distribuită și instalată pe alte plăci compatibile.
Linia 418: Linia 419:
|-
|-
| <code>WORKDIR</code>
| <code>WORKDIR</code>
| Directorul de lucru al unei rețete.
| Directorul de lucru al unei ''recipes''.
|-
|-
| <code>DEPLOY_DIR</code>
| <code>DEPLOY_DIR</code>
Linia 436: Linia 437:
Un obiectiv important al Yocto și PetaLinux este construirea reproductibilă a unui sistem Linux personalizat.
Un obiectiv important al Yocto și PetaLinux este construirea reproductibilă a unui sistem Linux personalizat.


Prin păstrarea sub controlul versiunilor a rețetelor, configurațiilor, patch-urilor și codului sursă, se poate reconstrui o imagine Linux cu aceleași componente și parametri.
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.
Totuși, o configurație reproductibilă nu garantează automat un rezultat identic la nivel de octet.
Linia 452: Linia 453:
== Alte concepte importante din BitBake și OpenEmbedded ==
== Alte concepte importante din BitBake și OpenEmbedded ==


Pe lângă rețetele <code>.bb</code>, infrastructura BitBake utilizează mai multe tipuri de fișiere și mecanisme.
Pe lângă ''recipes''le <code>.bb</code>, infrastructura BitBake utilizează mai multe tipuri de fișiere și mecanisme.


{| class="wikitable"
{| class="wikitable"
Linia 459: Linia 460:
|-
|-
| <code>.bb</code>
| <code>.bb</code>
| Rețetă BitBake, care definește modul de construire a unui pachet.
| ''recipe'' BitBake, care definește modul de construire a unui pachet.
|-
|-
| <code>.bbappend</code>
| <code>.bbappend</code>
| Fișier care extinde sau modifică metadatele unei rețete existente.
| Fișier care extinde sau modifică metadatele unei ''recipes'' existente.
|-
|-
| <code>.bbclass</code>
| <code>.bbclass</code>
| Clasă reutilizabilă care furnizează funcționalități comune mai multor rețete.
| Clasă reutilizabilă care furnizează funcționalități comune mai multor ''recipes''.
|-
|-
| <code>.conf</code>
| <code>.conf</code>
Linia 474: Linia 475:
|-
|-
| <code>DEPENDS</code>
| <code>DEPENDS</code>
| Declară dependențele necesare în timpul construirii unei rețete.
| Declară dependențele necesare în timpul construirii unei ''recipes''.
|-
|-
| <code>RDEPENDS</code>
| <code>RDEPENDS</code>
Linia 483: Linia 484:
|-
|-
| <code>inherit</code>
| <code>inherit</code>
| Permite unei rețete să reutilizeze funcționalitățile unei clase BitBake.
| Permite unei ''recipes'' să reutilizeze funcționalitățile unei clase BitBake.
|}
|}


În special, fișierele <code>.bbappend</code> și layerele personalizate sunt importante pentru modificarea distribuției PetaLinux fără editarea directă a rețetelor 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 ==
== Concluzii ==
Linia 495: Linia 496:


* '''PetaLinux''' – oferă interfața AMD pentru configurarea și construirea sistemelor Linux destinate platformelor sale embedded.
* '''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.
* '''Yocto Project / OpenEmbedded''' – furnizează infrastructura, ''recipes''le, layerele și mecanismele de configurare a distribuției.
* '''BitBake''' – interpretează metadatele, rezolvă dependențele și coordonează task-urile de build.
* '''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.
* '''GCC, Make, CMake și alte instrumente''' – realizează operațiile concrete de compilare, link-editare și construire.
Linia 509: Linia 510:
<li>Yocto Project, ''Reference Manual – Variables Glossary''. [https://docs.yoctoproject.org/ref-manual/variables.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>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 rețetelor].</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 de la data 7 noiembrie 2026 17:28


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.

recipesle BitBake

recipesle 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
}

Notă: Exemplul este simplificat pentru a ilustra structura unei recipes. Î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 recipe

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ă recipesle .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, 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.