URL: https://linuxfr.org/users/julien_jorge/journaux/publication-de-bibliotheques-c-sous-licence-libre Title: Publication de bibliothèques c++ sous licence libre Authors: Julien Jorge Date: 2018年02月15日T13:34:19+01:00 License: CC By-SA Tags: Score: 41 Je travaille chez IsCool Entertainement en tant que développeur C++ sur des jeux pour téléphones portables. Aujourd'hui nous publions [une partie de notre code en open source sur GitHub](https://github.com/IsCoolEntertainment/iscool-core), ce qui est une bien bonne chose à mes yeux. La licence utilisée est Apache 2. Au risque d'apparaître banal, nous essayons de partager autant de code que possible entre nos jeux sous la forme de divers modules plus ou moins indépendants et plus ou moins spécifiques au domaine. Ceux libérés sont les modules les plus généraux, les utilitaires. Parmi ces 35 modules vous trouverez des choses relatives aux plates-formes mobiles telles que l'émission de notifications, de quoi partager des fichiers nativement ou encore des facilités pour appeler du code Java depuis le C++ et inversement. Dans les modules destinés à toutes les plates-formes vous trouverez de quoi émettre et gérer des erreurs, construire des factories, un itérateur qui boucle, de quoi écrire des logs, faciliter l'usage de pimpl et bien d'autres choses encore. Certains modules se présentent comment des interfaces pour un sous-système qui doit être défini avant utilisation. Par exemple le module audio contient des fonctions permettant d'émettre des sons ou de jouer des musiques en relayant l'appel à un sous-système à définir. De même pour le module http qui gère les requêtes mais laisse la gestion de la connexion à un tiers. Ainsi nous gardons une interface unique cohérente sans trop lier nos applications à un outil spécifique. Certains modules dépendent de bibliothèques tierces. [Boost](http://www.boost.org/) est notamment beaucoup utilisé. Le module Json s'appuie sur [JsonCpp](https://github.com/open-source-parsers/jsoncpp) et offre de nombreuses fonctions pour manipuler des instances de `Json::Value`, notamment un `json_cast< T>` pour transtyper vers des types du C++. Le module i18n, en particulier la fonction `ic_gettext`, s'appuie sur [moFileReader](https://github.com/IsCoolEntertainment/mofilereader), qui était l'outil le plus simple pour charger des fichiers .mo sur mobile. Certains modules vous apparaîtront comme des redites d'autres bibliothèques, notamment `any`, `optional` et `signals` qui ressemblent à Boost.Any, Boost.Optional / `std::optional` et Boost.Signals respectivement. Nous avions initialement utilisé les versions de Boost pour cela, pendant un long moment, jusqu'à ce que nous nous penchions sur les problèmes de temps de compilation de nos jeux. Il s'est avéré que l'inclusion d'entêtes de Boost jouait beaucoup sur le temps de compilation et lors de l'édition des liens. À titre d'exemple, la compilation d'un fichier ne contenant que l'inclusion de `boost/optional.hpp` prend 300 ms. sur ma machine contre 30 ms. pour `iscool/optional.hpp`. Le même exercice avec `boost/signals2/signal.hpp` prend 1500 ms. contre 600 ms. pour `iscool/signals/signal.h`. Quand les entêtes sont inclus dans plusieurs centaines de fichiers l'impact est flagrant. En réécrivant une version épurée de ces bibliothèques nous avons gagné plusieurs minutes sur le temps de build. Il n'y a volontairement pas de fichiers de système de build pour l'instant, ce qui implique que celui qui souhaite utiliser un module devra gérer le build lui-même. La raison à cela est que nos fichiers de builds (en premake) sont trop liés à nos jeux pour pouvoir être simplement extraits et je ne souhaite pas attendre d'avoir écrit tous les nouveaux scripts CMake avant de diffuser le code. En navigant dans le dépôt vous remarquerez que le code est exempt de documentation. C'est aussi volontaire. Après avoir remarqué que nous lisions le code même quand une documentation était disponible, juste pour être sûr au cas où la doc serait erronée ou devenue obsolète, nous avons choisi de tout supprimer. Ainsi nous ne perdons plus de temps à lire la doc avant de lire le code, les fichiers sont épurés et clairs, et nous n'avons plus à maintenir maladroitement la doc en même temps que le code. Je suis bien conscient que cela n'aide pas à comprendre les modules pour un nouveau venu, c'est pourquoi je cherche une solution pour faciliter la compréhension du dépôt sans pour autant rédiger deux cent pages de doc. En attendant, les tests unitaires présents dans le dépôt sont vos amis. Pour finir je vous invite à regarder nos jeux sortis (non libres) desquels est extrait ce code : [Bazoo](http://bazoo-game.com/) et Jardin des Mots ([iOS](https://itunes.apple.com/us/app/apple-store/id1291854522?mt=8), [Android](https://play.google.com/store/apps/details?id=com.iscoolentertainment.snc)). Si vous vous intéressez à la création de jeu vidéo vous pouvez aussi lire les détails du développement de Bazoo dans [un billet](https://medium.com/@julienjorge/from-zero-to-bazoo-on-the-developers-side-81b91acc7c88) que j'avais rédigé lors de sa sortie.