C ++ Build Systems – Que faut-il utiliser?

Je cherche à lancer un nouveau projet en C ++ – juste dans mon temps, initialement – et j’étudie les systèmes de construction disponibles. Il semblerait que la réponse soit “Beaucoup, et ils sont tous terribles”.

Les fonctionnalités dont j’ai spécifiquement besoin sont les suivantes:

  1. Prise en charge de C ++ 11
  2. Plate-forme croisée (Linux en tant que cible principale, mais capable de se baser au moins sur Windows)
  3. Prise en charge de tests unitaires décents
  4. Prise en charge de plusieurs modules pour séparer le code
  5. Prise en charge de la génération de code (en utilisant asn1c ou protobuf – pas encore sûr à 100%)
  6. Facile à maintenir

Maintenant, je sais que je peux faire 1-4 de ceux qui utilisent CMake et Autotools assez facilement. Probablement aussi avec SCons et Waf et les autres aussi. Le problème est que je n’ai jamais trouvé comment générer correctement du code en utilisant ces fichiers – ce sont des fichiers source qui n’existent pas avant la première exécution, donc les fichiers sources que le système de génération doit pouvoir convertir en code exécutable mais ne sait pas jusqu’à ce que la construction commence … (ASN1C en particulier génère des dizaines de fichiers en-tête et source qui doivent pouvoir fonctionner ensemble, et le jeu réel de fichiers généré dépend du contenu de votre fichier asn) également le fait qu’aucun d’entre eux n’est particulièrement facile à maintenir – CMake et Autotools ont leur propre ensemble de scripts que vous devez gérer pour fonctionner, et Waf et Scons exigent que quiconque travaille avec eux ait une connaissance correcte de python (I ne pas travailler avec eux …

Alors, quels systèmes de construction sont recommandés pour quelque chose comme ça? Ou serai-je coincé avec make files et shell scripts pour le moment?

+1 pour “Beaucoup et ils sont affreux.”

Mais, le “plus riche” et le “plus évolutif” est probablement CMake , qui est un générateur de Makefile (génère également *.proj ++ natif *.proj / *.sln ). Une syntaxe étrange, mais une fois que vous l’avez apprise, elle peut vous permettre de générer des versions pour différentes plates-formes. Si je “commençais-frais”, j’utiliserais probablement CMake . Il devrait gérer votre liste, bien que votre “génération de code” puisse prendre la forme d’une “vie propre” au-delà du système de construction en fonction de ce que vous voulez faire. (Voir ci-dessous.)

Pour les projets simples, le générateur QMake est correct (vous n’avez pas besoin d’utiliser les bibliothèques Qt pour utiliser QMake). Mais, vous ne décrivez pas “simple” – la génération de code et “extra-phases” signifie que vous voulez probablement CMake ou quelque chose avec une API riche pour vos propres extensions, comme Scons (ou Waf ).

Nous utilisons Scons au travail. Il produit des “builds à l’épreuve des balles”, mais c’est vraiment lent. Aucun autre système ne sera aussi Scons que Scons . Mais c’est lent. Il est écrit en Python et nous avons étendu l’interface de notre “workspace-organization” (où nous Scons simplement les dépendances des modules), et cela fait partie de l’intention de conception Scons (ce type d’extension via Python). Pratique, mais les builds sont lents. Vous obtenez des versions à l’épreuve des balles (toute boîte de développement peut produire la version finale), mais elle est lente. Et c’est lent. N’oubliez pas que si vous utilisez Scons , c’est lent. Et c’est lent.

Cela me rend malade de penser qu’une décennie après l’an 2000, nous n’avons toujours pas de voiture volante. Nous devrons probablement attendre encore cent ans ou quelque chose pour les obtenir. Et nous allons probablement tous voler dans nos voitures volantes qui sont encore construites avec des systèmes de construction minables.

Oui, ils sont tous affreux.

[SUR LA GÉNÉRATION DE CODE]

Scons travaille sur les “phases”, et elles sont “quelque peu statiques”. Il peut créer du code généré dans le cadre de la construction (les gens le font de plusieurs manières différentes), mais cela a été décrit comme “quelque chose de très non-Scons-like”.

Si c’est simple “prétraiter des fichiers et générer des fichiers sources”, alors pas de biggie (vous avez beaucoup d’options, et c’est pourquoi qmake été écrit – pour le prétraitement *.hpp/*.cpp fichiers *.hpp/*.cpp ).

Cependant, si vous le faites de manière “lourde”, vous devrez créer vos propres scripts. Par exemple, nous avions des scripts en tant que partie de la génération qui interrogeaient les bases de données et généraient des classes C ++ pour assurer l’interface entre les “couches” (dans le développement d’applications traditionnelles à trois niveaux). De même, nous avons généré du code source serveur / client via des IDL et des informations de version intégrées pour permettre à plusieurs clients / serveurs de s’exécuter simultanément avec différentes versions (pour le même “client” ou “serveur”). Beaucoup de code source généré. Nous pourrions “prétendre” que c’est “le système de construction”, mais en réalité, c’est une infrastructure non sortingviale pour la “gestion de la configuration”, dont une partie est le “système de construction”. Par exemple, ce système devait utiliser des serveurs de «décollage» et de «démarrage» dans le cadre de ce processus. De même, les tests de régression ont été exécutés dans le cadre de ce processus, avec un “reporting” important et des “tests de différence” entre les versions – tout cela dans le cadre de nos “scripts de génération”.

Vous pouvez utiliser Gradle maintenant: https://docs.gradle.org/current/userguide/native_software.html

Cela semble avoir mûri un peu au fil des ans depuis que j’ai posté ceci. La page disant que le projet est en train d’incuber a disparu, mais je ne trouve aucune annonce officielle supprimant ce statut.

J’ai récemment découvert ces informations, je ne les ai pas encore utilisées personnellement:

Ninja , un petit système de construction axé sur la vitesse. Google utilise désormais Ninja pour construire Android au lieu de Make: link .

Shake , un système de construction puissant et rapide.

Tup , un système de construction haute performance. Conception algorithmique . Analyse de Tup .

Tous sont maintenant multi-plateforme et supportent Windows. Je ne suis pas encore sûr du rest de vos exigences car, encore une fois, je ne les ai pas encore testés moi-même. Ils sont utilisés dans le développement commercial, CIG a choisi Ninja. Les deux premiers sont apparentés à Scons, Ant, etc.

Scons est un système très amical et flexible, mais vous avez raison, Lothar, c’est vraiment lent.

Mais il existe un moyen d’augmenter les performances des programmes écrits en Python. Cette utilisation du JIT. De tous les projets connus, PyPy est une implémentation JIT-backed très puissante, à croissance rapide et motivée – Python 2.7. La compatibilité PyPy avec Python 2.7 est tout simplement incroyable. Cependant, Scons a déclaré comme projet non pris en charge sur le wiki de compatibilité PyPy . Waf , quant à lui, modélisé sous le nom de suceur d’autotools basé sur python, est entièrement supporté par l’infrastructure PyPy. Dans mes projets, la vitesse de l’assemblage a été multipliée par 5 à 7 lors de la transition vers PyPy. Vous pouvez voir les rapports de performance de PyPy .

Pour un système de construction moderne et relativement rapide, Waf est un bon choix.

Le système de compilation de Google est une bonne alternative: http://bazel.io/

J’ai utilisé des SCons et je suis impressionné par ce système de construction. SCons est extensible par python et python lui-même – c’est génial, car Python a tout ce dont vous avez besoin, il suffit de coder la logique, toutes les fonctionnalités de bas niveau sont déjà implémentées dans SCons et Python et sont multiplates-formes. Si vous avez de bonnes compétences en programmation, vos scripts de construction seront parfaits et faciles.

Make, CMake et les systèmes de construction similaires semblent être des déchets de macroses. Waf est un SCons analogique. J’essaie Waf mais SCons sera plus amical et je suis resté avec SCons.

De l’avis de la foule, SCons est trop lent, mais au milieu d’un projet, je ne voyais aucune différence entre make et SCons en fonction de la vitesse de construction. Au lieu de cela, SCons a bien travaillé avec des builds parallèles, alors que make a de gros problèmes avec lui.

En outre, SCons vous permet de configurer, de créer, de déployer, de générer la configuration à partir de modèles, d’exécuter des tests et d’effectuer toute autre tâche pouvant être réalisée avec python et SCons, le tout en un. C’est un très gros avantage.

Pour un simple projet, CMake est également un bon choix.

juste pour append mes cents: premake

http://indussortingousone.com/premake

il y a aussi une page Web dédiée sur le wiki.

Vous pouvez utiliser Ceedling . Notez, cependant, il ne supporte que C pour le moment et il est étroitement lié aux frameworks de test Unity et CMock de l’auteur.

Il peut être bifurqué et modifié pour fonctionner avec un compilateur C ++ et un environnement de test / moquage assez facilement.

Tup est également une mention digne. Il est extrêmement rapide, mais il ne sait rien des tests sur les frameworks, etc., ce qui signifie que vous devrez écrire votre propre système de build en utilisant Tup. Si vous prévoyez de faire du TDD, Tup est probablement la solution.