OpenEmbedded è un sistema di build che permette di crosscompilare distribuzioni per macchine con risorse limitate, specialmente se di architetture diverse dall'x86.
L'applicazione tipica di OpenEmbedded è la generazione di sistemi Linux per dispositivi embedded in grado di sfruttare la presenza di un sistema completo; tipicamente palmari, cellulari o dispositivi di rete.
Rispetto ad una distribuzione tradizionale pone l'enfasi sull'adattamento dei programmi a dispositivi di capacità ridotte. Contrariamente alla maggior parte dei sistemi di build per sistemi embedded però non crea immagini composte da un kernel e pochi programmi compilati staticamente, ma una vera e propria distribuzione completa e dotata anche di un sistema di gestione dei pacchetti.
I metadati di openembedded sono distribuiti tramite un repository git e sono composti da file di testo che descrivono la configurazione ed il processo di crosscompilazione.
classes contrib files packages removal.txt conf COPYING.MIT MAINTAINERS README site
Con machine si intende un dispositivo supportato da OpenEmbedded; per ogni dispositivo esiste un file in conf/machine che definisce le variabili che descrivono l'architettura e le caratteristiche del dispositivo.
Esempi di macchine supportate:
Tipicamente, per supportare un nuovo modello di hardware si copia la macchina piu` simile, e la si adatta alle proprie esigenze.
Una distribuzione definisce le versioni dei programmi che verranno installati e la configurazione del sistema, tramite la definizione di opportune variabili in un file in conf/distro.
Esistono alcune distribuzioni sviluppate indipendentemente, come OpenMoko o Poky, che però mantengono anche un branch semiindipendente e personalizzato dei metadati. La distribuzione standard è invece Ångström, disponibile in una versione stabile ed una di sviluppo, ciascuna con un suo branch dei metadati sul repository standard.
L'altra componente principale dei metadati sono le ricette, contenute nella directory packages, che contengono le istruzioni per la crosscompilazione di specifici programmi e la creazione di pacchetti ed immagini.
La maggior parte delle ricette corrisponde ad un programma e permette di crosscompilarne i relativi pacchetti.
Ad esempio la ricetta dell'editor nano inizia con le informazioni che andranno nel pacchetto generato, comprese le dipendenze:
DESCRIPTION = "GNU nano (Nano's ANOther editor, or \ Not ANOther editor) is an enhanced clone of the \ Pico text editor." HOMEPAGE = "http://www.nano-editor.org/" LICENSE = "GPLv2" SECTION = "console/utils" DEPENDS = "ncurses"
prosegue con l'indirizzo da cui prendere i sorgenti ed eventuali patch:
SRC_URI = "http://www.nano-editor.org/dist/v2.0/nano-${PV}.tar.gz \ file://glib.m4"
quindi dice che il pacchetto utilizza autotools per la compilazione, specificando delle opzioni aggiuntive per il comando ./configure:
inherit autotools # only 16K more to get everything but the kitchen sink EXTRA_OECONF = "--enable-all"
infine definisce delle azioni aggiuntive da effettuare nel corso della crosscompilazione:
do_configure_prepend () { install -m 0644 ${WORKDIR}/glib.m4 m4/ }
I task sono delle ricette che creano metapacchetti, in modo da semplificare l'installazione di numerosi pacchetti correlati tramite il sistema di gestione delle dipendenze. Sono contenuti in packages/tasks
Alcuni task particolarmente utili sono:
Le ricette per le immagini, contenute in packages/images descrivono come creare un'immagine con un sistema completo che possa essere caricata ed usata sul dispositivo.
Infine, è utile citare il file di configurazione locale, al di fuori del tree dei metadati di openembedded, con il quale si definiscono le directory da usare, la macchina e la distribuzione ed eventuali opzioni di build.
Un esempio viene distribuito in conf/local.conf.sample, come descritto nella documentazione sull'installazione.
Bitbake è il programma, scritto in python, che gestisce scaricamento, compliazione e pacchettizzazione dei programmi, un po' come emerge in gentoo.
Il suo uso comune è semplicemente:
bitbake <ricetta>
dove <ricetta> è il nome di una ricetta di un programma, un task o un'immagine; ad esempio:
bitbake nano bitbake task-proper-tools bitbake x11-image
A quel punto, se tutto funziona correttamente, bitbake provvederà autonomamente a svolgere tutti i passaggi necessari per generare quanto richiesto.
La creazione dei pacchetti è suddivisa in passaggi autonomi, detti task; l'output di openembedded mostra il task in corso ed in caso di interruzione bitbake riparte sempre sfruttando i task già completati.
Alcuni task importanti sono i seguenti.
Un ulteriore task, clean, permette di cancellare tutto quello che è stato fatto per una ricetta, in modo da ricominciare da capo; può ovviamente solo essere lanciato singolarmente con:
bitbake -c clean <ricetta>
Anziché creare un'immagine statica del filesystem da caricare sui dispositivi, come è consueto per i sistemi di crosscompilazione, OpenEmbedded usa un'approcio ibrido e crea dei pacchetti binari come quelli delle comuni distribuzioni, che vengono poi installati in un'immagine flashabile.
Le immagini generate da bitbake si trovano nella directory $TMP/deploy/<librerie c>/images/<architettura>/ e possono essere degli archivi tar eventualmente compressi contenenti i file che compongono il sistema oppure delle vere e proprie immagini di filesystem di dimensioni predefinite per la macchina, che possono essere copiate sulla memoria del dispositivo target; in quest'ultimo caso la scelta è tra jffs2, cramfs squashfs ed ext(2|3)
I pacchetti generati da bitbake per i vari programmi sono nel formato ipk/opk, ispirati ai .deb, ma ridotti per adattarsi alle esigenze dei sistemi embedded; vengono gestiti dal programma opkg ed è possibile creare dei veri e propri repository online, usabili esattamente come un repository tradizionale.
Si trovano nella directory $TMP/deploy/<librerie c>/ipk/<architettura>/.
La distinzione tra ipk e opk è storica: opk ed opkg sono la nuova versione, dove avviene attualmente lo sviluppo di ipk ed ipkg rispettivamente.
Authors: | Elena ``of Valhalla'' Grandi <valhalla@lifolab.org> |
---|---|
Version: | 2009-01-19 |