Hétérogénéité des environnements informatiques en utilisant la compilation croisée

Avec l’avènement des logiciels open source et l’acceptation de ces solutions pour créer des systèmes complexes, la capacité de développer des applications pouvant fonctionner de manière transparente sur plusieurs plateformes matérielles devient intrinsèquement importante. Il y a un besoin constant de développer le software sur une architecture mais d’avoir la capacité de les exécuter sur d’autres architectures cibles. Une technique courante pour y parvenir est la compilation croisée de l’application pour l’architecture cible. 

Cross-compilation est significatif dans les systèmes embarqués où l’intention est d’exécuter des applications sur du matériel spécialisé comme les cartes ARM et PowerPC. Ces systèmes sont contraints en ressources et donc une compilation directe n’est pas une option. Ainsi, les développeurs tireront parti de l’architecture x86 commune comme hôte et utiliseront des chaînes d’outils spécifiques au matériel cible, générant des binaires compatibles avec le matériel cible.

Cet article couvre une telle étude de cas où la cross-compilation d’un paquet open-source a été réalisée pour PowerPC. L’article couvrira les détails des outils et des chaînes d’outils utilisés et un tutoriel étape par étape sur la manière dont la cross-compilation a été réalisée pour cette architecture.

Le problème  

Étant donné une carte cible avec une architecture PowerPC, l’objectif était d’ajouter des capacités de routage L3 à cette carte. Dans ce but, un ensemble de protocoles de routage open-source populaire, FRRouting (FRR), a été envisagé. 

FRR est un ensemble de protocoles qui permet à toute machine Linux de se comporter comme un routeur complet. Il est disponible pour amd64, arm64, armhf, et i386 mais pas pour PowerPC. Cela a nécessité la compilation croisée de FRR.

Build host target host

Architecture CPU

x86_64

Powerpc(32 bits) 

Système d’exploitation 

Ubuntu 18.4 

QorIQ SDK 

CPU 

12 

2 (e5500) 

RAM 

12 Go

1 Go

Table 1. Différence entre la construction et la plateforme cible

The Voyage de la Cross-Compilation

Il y a deux étapes majeures dans la compilation croisée : 

Configurer l’environnement de construction et la chaîne d’outils précompilée

1. Installez les outils de construction requis dans l’environnement. Les outils de construction courants incluent autoconf, make, cmake, build-essentials, pkg-config, libtool, etc. 

2. Configurez la chaîne d’outils précompilée spécifique à l’environnement hôte cible. Les fournisseurs de CPU/Carte fournissent leurs propres chaînes d’outils spécifiques à l’architecture. La chaîne d’outils spécifique à la carte cible a été obtenue à partir du site Web du produit du fournisseur. 

3. La chaîne d’outils est fournie avec un fichier d’environnement, qui est utilisé pour définir les variables d’environnement comme CC, GCC, PKG_CONFIG_PATH, etc., nécessaires à la compilation croisée. Modifiez le fichier d’environnement /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux et mettez à jour le chemin des variables par rapport au chemin du répertoire de la chaîne d’outils. 

Shell

 

Résolution des Dépendances dans la Chaîne d’Outils Précompilée

Chaque logiciel a son propre ensemble de dépendances (outils/bibliothèques), qui doivent être résolues avant la cross-compilation.

Selon la disponibilité des paquets de ces outils/bibliothèques dans l’architecture cible, il y a deux options pour les résoudre. Soit les installer directement à partir des paquets disponibles, soit les cross-compiler également à partir de la source.

Spécifiquement pour la compilation de FRR, les bibliothèques libpcre2, libyang, clippy, libelf et json-c doivent être construites à partir de la source. En dehors de cela, les paquets de bibliothèques protobuf et libcap étaient disponibles pour l’architecture PPC (PowerPC), qui peuvent être installés directement dans la chaîne d’outils.

1. Installation des Bibliothèques à Partir des Paquets

Les paquets de bibliothèques disponibles pour l’architecture cible peuvent être installés dans le sysroot de la chaîne d’outils de deux manières :

  1. La première méthode utilise l’outil dpkg-deb basé sur Ubuntu/Debian pour installer directement les packages Debian comme mentionné ci-dessous :
    Shell

    Remarque:

    • Téléchargez tous les packages de dépendances et installez-les dans l’ordre.
    • Les packages de bibliothèques peuvent être installés dans une structure de répertoire différente. Copiez ces fichiers de bibliothèques vers les répertoires corrects selon l’ensemble d’outils.
  2. Deuxièmement, les paquets Debian/RPM sont extraits et placés manuellement dans le chemin du répertoire de la chaîne d’outils comme mentionné ci-dessous:
    Pour extraire le paquet Debian, utilisez les outils ar et tar comme mentionné ci-dessous:

     

    Note: Cette méthode est utile pour les systèmes sans support dpkg-deb.

     

    Exemple d’extraction de package et de placement de fichier avec libcap:

     

    Pour vérifier si les paquets/bibliothèques ont été installés avec succès, exécutez la commande ci-dessous:

     

    Note: Installez pkg-config si ce n’est pas déjà fait.

2. Compilation croisée des bibliothèques

Les packages des bibliothèques ne sont pas disponibles pour l’architecture cible et sont compilés à partir de la source. Avant de commencer la compilation, chargez le fichier d’environnement fourni avec le kit d’outils pour définir tous les paramètres nécessaires à la compilation croisée.

Shell

 

Suivez les étapes de compilation indiquées dans le fichier README de la bibliothèque. De plus, définissez les paramètres ci-dessous dans les étapes de la procédure de construction :

  1. Définissez le paramètre --host lors de l’exécution du script ./configure
    Shell

     

    Remarque :

    • <paramètre_hôte_cible> est le système pour lequel la bibliothèque/l’outil est en cours de construction. Il peut être trouvé dans le fichier d’environnement de la chaîne d’outils. C’est un préfixe commun trouvé dans $CC, $LD, etc.
    • Il y aura deux types de bibliothèques dépendantes. L’une est uniquement requise pour le processus de compilation, et l’autre est une exigence de dépendance pour l’exécution sur l’hôte cible. Définissez le paramètre --host en conséquence.
  2. Lors de l’utilisation de « make install » pour construire des bibliothèques dépendantes, définissez DESTDIR sur le répertoire sysroot de l’outil de chaîne.
    Shell

     

Conclusion

Les différences dans les architectures système, les bibliothèques, les dépendances et les chaînes d’outils rendent la cross-compilation une technique complexe à exécuter. Pour simplifier ces complexités, cet article dévoile les phases de la cross-compilation. FRR et PowerPC ont été pris comme exemples pour le logiciel souhaité et le matériel cible, respectivement. Cependant, les étapes couvertes dans cet article fournissent une stratégie raisonnable pour la cross-compilation de tout logiciel sur un matériel spécifique. Les paramètres de l’environnement, la chaîne d’outils et les dépendances varieront en fonction des exigences.

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