Eterogeneità degli ambienti di calcolo mediante cross-compilazione

Con l’avvento del software open-source e dell’accettazione di queste soluzioni nella creazione di sistemi complessi, diventa essenziale la capacità di sviluppare applicazioni in grado di funzionare senza problemi su diverse piattaforme hardware. C’è sempre la necessità di sviluppare il software su un’architettura ma avere la possibilità di eseguirlo su altre architetture di destinazione. Una tecnica comune per raggiungere questo obiettivo è la compilazione incrociata dell’applicazione per l’architettura di destinazione.

Cross-compilazioneè significativa nei sistemi embedded dove l’obiettivo è eseguire applicazioni su hardware specializzato come schede ARM e PowerPC. Questi sistemi sono limitati in risorse e quindi la compilazione diretta non è un’opzione. Pertanto, gli sviluppatori sfrutteranno l’architettura comune x86 come host e utilizzeranno toolchain specifiche per l’hardware di destinazione, generando binari compatibili con l’hardware di destinazione. 

Questo articolo copre uno studio di caso similedove è stata eseguita la cross-compilazione di un pacchetto open-source per PowerPC. L’articolo coprirà i dettagli degli strumenti e delle toolchain utilizzate e un tutorial passo dopo passo su come è stata raggiunta la cross-compilazione per questa architettura. 

The Dichiarazione del Problema  

Dato un board di destinazione con architettura PowerPC, l’obiettivo era aggiungere capacità di routing L3 a questo board. A questo scopo, è stato preso in considerazione un popolare suite di protocolli di routing open-source, FRRouting (FRR). 

FRR è una suite di protocolli che consente a qualsiasi macchina Linux di comportarsi come un router a pieno titolo. È confezionato per amd64, arm64, armhf, e i386 ma non per PowerPC. Questo ha reso necessaria la cross-compilazione di FRR.

Build host target host

Architettura CPU

x86_64

Powerpc(32-bit)

Sistema operativo

Ubuntu 18.4

QorIQ SDK 

CPU 

12 

2 (e5500) 

RAM 

12GB 

1GB 

Tabile 1Differenza nella Build e nella piattaforma target

The Viaggio di Cross-Compilazione

Ci sono due fasi principali nella cross-compilazione:

Configurazione dell’Ambiente di Compilazione e Toolchain Pre-compilata

1. Installare gli strumenti di compilazione richiesti nell’ambiente. Gli strumenti di compilazione comuni includono autoconf, make, cmake, build-essentials, pkg-config, libtool, ecc.

2. Configurare la toolchain pre-compilata specifica per l’ambiente host di destinazione. I fornitori di CPU/Schede forniscono le proprie toolchain specifiche per l’architettura. La toolchain specifica per la scheda di destinazione è stata ottenuta dal sito web del produttore.

3. La toolchain viene fornita con un file di ambiente, che viene utilizzato per impostare le variabili di ambiente come CC, GCC, PKG_CONFIG_PATH, ecc., che sono necessarie per la cross-compilazione. Modificare il file di ambiente /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux e aggiornare il percorso delle variabili rispetto al percorso della directory della toolchain.

Shell

 

Risoluzione delle dipendenze in Toolchain pre-compilato

Ogni software ha il proprio set di dipendenze (strumenti/librerie), che devono essere risolte prima della cross-compilazione.

In base alla disponibilità dei pacchetti di questi strumenti/librerie nell’architettura di destinazione, ci sono due opzioni per risolverli. Installarli direttamente dai pacchetti disponibili o cross-compilarli anche dal sorgente.

Specifico per la compilazione di FRR, le librerie libpcre2, libyang, clippy, libelf e json-c devono essere costruite dal sorgente. Oltre a queste, i pacchetti delle librerie protobuf e libcap erano disponibili per l’architettura PPC (PowerPC), che possono essere installati direttamente nel toolchain.

1. Installazione di librerie dai pacchetti

I pacchetti delle librerie disponibili per l’architettura di destinazione possono essere installati nel sysroot del toolchain in due modi:

  1. Il primo modo utilizza lo strumento dpkg-deb basato su Ubuntu/Debian per installare direttamente i pacchetti Debian come indicato di seguito: 
    Shell

     

    Nota:

    • Scarica tutti i pacchetti di dipendenza e installali in ordine.
    • I pacchetti di libreria possono essere installati in una struttura di directory diversa. Copia quei file di libreria nelle directory corrette secondo la toolchain.
  2. Nel secondo modo i pacchetti debian/rpm vengono estratti e posizionati manualmente nel percorso della directory del toolchain come indicato di seguito:
    1. Per estrarre il pacchetto debian, utilizzare gli strumenti ar e tar come indicato di seguito:
      Testo normale

       

      Nota: Questo metodo è utile per i sistemi senza supporto dpkg-deb.

    2. Per l’estrazione del pacchetto rpm, utilizzare lo strumento rpm2cpio con il comando seguente:
      Testo normale

       

    3. Esempio di estrazione del pacchetto e posizionamento dei file con libcap:

      Shell

       

    4. Per verificare se i pacchetti/librerie sono stati installati con successo, eseguire il comando seguente:

      Shell

       

      Nota: Installare pkg-config se non è già installato.

2. Compilazione incrociata delle librerie

I pacchetti delle librerie non sono disponibili per l’architettura di destinazione e vengono compilati dalla sorgente. Prima di iniziare la compilazione, caricare il file di ambiente fornito con il toolchain per impostare tutti i parametri necessari richiesti per la compilazione incrociata.

Shell

 

Seguire i passaggi di compilazione indicati nel file README della libreria. Inoltre, impostare i seguenti parametri nei passaggi della procedura di build:

  1. Imposta il parametro --host quando esegui lo script ./configure.
    Shell

    Nota:

    • <target_host_parameter> è il sistema per cui viene compilata la libreria/strumento. Può essere trovato nel file di ambiente della catena di strumenti. È un prefisso comune trovato in $CC, $LD, ecc.
    • Ci saranno due tipi di librerie dipendenti. Una è richiesta solo per il processo di compilazione, e l’altra è un requisito di dipendenza per l’esecuzione sull’host di destinazione. Imposta il parametro --host di conseguenza.
  2. Quando si utilizza “make install” per costruire librerie dipendenti, impostare DESTDIR sulla directory sysroot della toolchain.
    Shell

     

Conclusione

Le differenze nelle architetture di sistema, nelle librerie, nelle dipendenze e nei toolchain rendono la cross-compilation una tecnica complessa da eseguire. Per semplificare le complessità, questo articolo svela le fasi della cross-compilation. FRR e PowerPC sono stati presi come esempi per il software desiderato e l’hardware di destinazione, rispettivamente. Tuttavia, i passaggi trattati in questo articolo forniscono una strategia ragionevole per la cross-compilation di qualsiasi software su un hardware specifico. Le impostazioni ambientali, il toolchain e le dipendenze varieranno in base ai requisiti.

Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation