Gérer les dépendances C++ avec Clickable

Si une application dépend d’une bibliothèque qui n’est pas pré-installée dans Ubuntu Touch, l’application doit l’inclure dans le paquet clic. Ce guide montre comment cela peut être fait avec Clickable.

Construction

Parfois, les bibliothèques sont disponibles pré-construites, ce qui vous permet de sauter l’étape de la construction. Il est toutefois recommandé de compiler votre dépendance, car cela vous donne plus de contrôle sur l’ensemble du processus et peut conduire à de meilleurs résultats (par exemple, de meilleures performances ou des paquets de taille plus réduite).

Compilation

Déposez le code source de la bibliothèque dans libs/LIBNAME (en remplaçant LIBNAME par le nom de la bibliothèque), car c’est ici que Clickable la cherchera par défaut. Si le code source de la dépendance est disponible dans un dépôt Git, c’est une bonne idée de l’ajouter en tant que sous-module Git. Autrement, ajoutez un script pour télécharger les sources.

Ajoutez une section bibliothèques à votre fichier clickable.json comme ceci :

 {
   "builder": "cmake",
   "libraries": {
     "LIBNAME": {
       "builder": "cmake"
     }
   }
 }

If the library does not contain a CMake configuration, you need to use the qmake or custom builder instead.

Facultativement, configurez la compilation en ajoutant build_args, ce qui pourrait ressembler à cela :

 {
   "builder": "cmake",
   "libraries": {
     "LIBNAME": {
       "builder": "cmake",
       "build_args": [
         "-DBUILD_EXAMPLES=OFF",
         "-DBUILD_DOCS=OFF",
         "-DBUILD_TESTS=OFF",
         "-DBUILD_SHARED_LIBS=OFF"
       ]
     }
   }
 }

La plupart des arguments de compilation sont spécifiques au projet. Aussi, étudiez les instructions de compilation des bibliothèques et cherchez également un paramètre option dans son fichier CMakeLists.txt .

Pour réellement compiler la bibliothèque pour toutes les architectures exécutez clickable build-libs --arch armhf, clickable build-libs --arch arm64 et clickable build-libs --arch amd64. N’oubliez pas de mentionner cette étape dans votre fichier README, afin que d’autres puissent reproduire le processus de compilation.

Voyons comment Teleports clickable.json utilise utilise la fonctionnalité des bibliothèques pour construire sa dépendance avec Tdlib.

Précompilation

Si vous avez compilé votre bibliothèque comme décrit ci-dessus, sautez cette étape.

En général, une bibliothèque pré-compilée est utilisable uniquement comme un objet partagé lié dynamiquement. En plus, elle peut contenir des composants que vous n’utilisez pas et qui risquent d’alourdir votre application. Une bibliothèque peut aussi faire moins bien des choses que vous pourriez compiler vous-même. Parfois, une bibliothèque est disponible dans les dépôts d’Ubuntu mais n’est pas installable pour l’architecture que vous désirez (le plus souvent armhf ou arm64). Dans ce cas, vous devrez compiler la bibliothèque comme décrit ci-dessus.

Si la bibliothèque est disponible dans les dépôts d’Ubuntu, vous pouvez l’ajouter à la liste des dépendances comme ceci :

 {
   "builder": "cmake",
   "dependencies_target": [
     "libsomething-dev"
   ]
 }

Clickable va installer automatiquement le paquet spécifié pour l’architecture cible dans le conteneur servant à la compilation. Un exemple peut être trouvé dans le fichier clickable.json de Guitar Tools.

Si la bibliothèque est incluse dans un PPA, vous pouvez aussi ajouter ce PPA dans le fichier clickable.json. Par exemple :

 {
   "builder": "cmake",
   "dependencies_ppa": [
     "ppa:someone/libsomething"
   ],
   "dependencies_target": [
     "libsomething-dev"
   ]
 }

Sinon, ajoutez un script pour télécharger la bibliothèque pré-compilée.

Utilisation

Tout d’abord, vous devez spécifier le répertoire d’inclusion où se trouvent les en-têtes que vous devez intégrer dans le code source de l’application. Puis, vous devez lier le binaire de la bibliothèque à celui de votre application.

Si la bibliothèque contient un fichier de configuration CMake, vous pouvez utiliser la commande find_package , qui vous donnera la cible pour la liaison ou des variables pointant vers le binaire de la bibliothèque et ses dossiers d’en-têtes. Les lignes supplémentaires dans votre fichier CMakeLists.txt peuvent ressembler à cela :

find_package(SOMELIBRARY REQUIRED)

include_directories(${SOMELIBRARY_INCLUDE_DIRS})
target_link_libraries(mytarget ${SOMELIBRARY_LIBS})

La commande find_package décrit habituellement le chemin du répertoire d’inclusion comme SOMELIBRARY_INCLUDE_DIRS et les binaires de la bibliothèque comme SOMELIBRARY_LIBS (vérifiez dans la documentation de la bibliothèque ce que leur configuration CMake fournit exactement). Utilisez-les avec les commandes include_directories et target_link_libraries. Voir Camera Scanner ImageProcessing CMakeLists.txt pour un exemple concret.

À ce stade, vous devriez déjà pouvoir tester le mode ordinateur de Clickable en lançant clickable desktop.

Déploiement

Si vous avez lié votre bibliothèque de façon statique, vous pouvez passer cette étape. En effet, le binaire de cette bibliothèque est alors déjà inclus à celui de votre application.

Trouvez quels fichiers objets partagés (*.so) sont à intégrer dans le paquet. Pour cela, démarrez l’application sur votre appareil en passant par clickable && clickable logs. Vous devriez voir un message d’erreur vous indiquant quels objets partagés sont manquants.

Trouvez le chemin vers les fichiers des objets partagés. Pour les bibliothèques compilées via clickable, ils sont situés quelque part dans le répertoire d’installation de la bibliothèque, qui se trouve dans le répertoire des sources de la bibliothèque par défaut (par exemple, build/arm-linux-gnueabihf/opencv/install). Pour les bibliothèques précompilées, lancez clickable run "find / -name 'libSomething.so'" (en remplaçant libSomething.so par le fichier que vous recherchez). Cela devrait afficher le chemin d’accès au fichier (ainsi que quelques messages d’erreur que vous pouvez ignorer). En général, /usr/lib est un bon endroit pour chercher les fichiers d’objets partagés.

Pour inclure ces fichiers dans le package click, ajoutez la clé install_lib à votre clickable.json :

 {
   "builder": "cmake",
   "libraries": {
     "LIBNAME": {
       "builder": "cmake",
       "install_lib": [
         "$LIBNAME_LIB_INSTALL_DIR/usr/lib/$ARCHITECTURE_TRIPLET/libqmapboxgl.so*",
         "/usr/lib/$ARCHITECTURE_TRIPLET/libSoundTouch.so.*"
       ]
     }
   }
 }

Les lignes ci-dessus contiennent deux exemples. Le premier est l’installation d’une bibliothèque compilée avec Clickable. L’astérisque dans .so* permet de pouvoir utiliser les liens symboliques qui pointent vers la version courante.

Selon la bibliothèque concernée, vous devrez peut être intégrer des données supplémentaires. Dans ce cas, il faut consulter le fichier lisez-moi ou les instructions d’installation.

Vous devriez maintenant être en mesure de compiler et d’installer votre paquet Click sur un appareil connecté à votre ordinateur en lançant clickable.