web-dev-qa-db-fra.com

C ++ Build Systems - Quoi utiliser?

Je cherche à démarrer un nouveau projet en C++ - juste à mon époque - et j'étudie les systèmes de construction disponibles. Il semblerait que la réponse soit "Beaucoup, et ils sont tous affreux".

Les fonctionnalités dont j'ai spécifiquement besoin pour cela sont:

  1. Prise en charge de C++ 11
  2. Multiplate-forme (Linux en tant que cible principale, mais capable de développer au moins Windows également)
  3. Support de test unitaire décent
  4. Prise en charge de plusieurs modules pour la séparation de code
  5. Prise en charge de la génération de code (avec 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 le couple d'autres aussi. Le problème est que je n’ai jamais trouvé comment utiliser correctement la génération de code - c’est-à-dire que les fichiers source n’existent pas jusqu’à ce que le processus de construction soit exécuté pour la première fois. Par conséquent, les fichiers source que le système de construction doit pouvoir convertir en code exécutable mais ne sait pas vraiment jusqu'à ce que la construction commence ... (ASN1C en particulier génère des dizaines de fichiers d'en-tête et de fichiers source qui doivent pouvoir fonctionner ensemble, et l'ensemble 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 à gérer - CMake et Autotools ont leur propre ensemble de scripts à gérer pour qu’ils fonctionnent, et Waf and Scons exige que toute personne travaillant avec eux possède une bonne connaissance de python (je ne le fais pas) pour travailler avec eux ...

Alors, quels systèmes de construction sont recommandés pour quelque chose comme ça? Ou serai-je coincé avec les fichiers de création et les scripts Shell pour l'instant?

132
Graham

+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 MSVC++ *.proj/*.sln). La syntaxe est étrange, mais une fois que vous l’apprenez, elle peut vous permettre de générer de bonnes versions pour différentes plates-formes. Si je "commence-frais", j'utiliserais probablement CMake. Il devrait gérer votre liste, bien que votre "génération de code" puisse prendre "une vie autonome" au-delà du système de construction, en fonction de ce que vous souhaitez 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 les "extra-phases" signifient 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 "constructions pare-balles", mais c'est vraiment lent. Aucun autre système ne sera aussi efficace que Scons. Mais c'est lent. Il est écrit en Python et nous avons étendu l'interface pour notre "organisation d'espace de travail" (où nous spécifions simplement des dépendances de modules), et cela fait partie de la conception Scons l'intention (ce type d'extension via Python). Pratique, mais les builds sont lents. Vous obtenez des builds à l'épreuve des balles (toute boîte de développement peut créer la version finale), mais c'est lent. Et c'est lent. N'oubliez pas que si vous utilisez Scons, cependant, c'est lent.

Cela me rend malade de penser qu'une décennie après l'an 2000, nous n'avons toujours pas de voitures volantes. 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 toujours en construction avec des systèmes de construction de mauvaise qualité.

Oui, ils sont tous affreux.

[À PROPOS DE LA GÉNÉRATION DE CODE]

Scons fonctionne sur les "phases", et elles sont "quelque peu statiques". Il peut générer du code généré dans le cadre de la construction (les utilisateurs le font de différentes manières), mais cela a été décrit comme "quelque chose de très peu semblable à Scons".

Si c’est simple, "prétraitez certains fichiers et générez des fichiers sources", pas de problème (vous avez beaucoup d’options, et c’est pourquoi qmake a été écrit - pour le prétraitement moc de *.hpp/*.cpp des dossiers).

Cependant, si vous le faites de manière "lourde", vous devrez écrire votre propre script. Par exemple, nous avions des scripts faisant partie de la construction 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 à trois niveaux traditionnel). De même, nous avons généré le 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 des versions différentes (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 triviale pour la "gestion de la configuration", dont une partie est le "système de construction". Par exemple, ce système devait "arrêter" et "démarrer" les serveurs dans le cadre de ce processus. De la même manière, les tests de régression ont été exécutés dans le cadre de ce processus, avec de nombreux "rapports" et "tests de différence" entre les versions, le tout dans le cadre de nos "scripts de génération".

112
charley

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

Cela semble avoir mûri un peu dans les années 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.

31
Nate Glenn

J'ai récemment découvert cela, je ne les ai pas encore utilisés personnellement:

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

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

Tup , un système de compilation hautes performances. Algorithmique conception basée. Analyse de Tup .

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

14
leetNightshade

Scons est un système très convivial et flexible, mais vous avez raison, Lothar, il est vraiment lent.

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

Pour les systèmes de construction modernes et relativement rapides, Waf est un bon choix.

11
aegor

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

8
Mike B

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

Make, CMake et des systèmes de construction similaires apparaissent comme une corbeille de macroses. Waf est analogique SCons. J'essaie de Waf mais SCons sera plus amical et je suis resté chez SCons.

Selon l'opinion du public, SCons est trop lent, mais au milieu d'un projet, je ne voyais aucune différence entre make et SCons en termes de rapidité de construction. Au lieu de cela, SCons a bien travaillé avec des versions parallèles, alors que make a de gros problèmes avec cela.

En outre, SCons vous permet d’obtenir - configurer, construire, déployer, générer une configuration à partir de modèles, exécuter des tests et effectuer toute autre tâche pouvant être exécutée en codant avec python et SCons - tout en un. C'est un très gros avantage.

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

6
Torsten

juste pour ajouter mes centimes: premake

http://industriousone.com/premake

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

5
user827992

Vous pouvez utiliser Ceedling . Notez, cependant, qu’il prend uniquement en charge C pour le moment et qu’il est étroitement associé aux frameworks de test Unity et CMock de l’auteur.

Il peut être créé et modifié pour fonctionner assez facilement avec un compilateur C++ et une infrastructure de test/mocking unitaire.

Aussi Tup est une mention digne. Il est extrêmement rapide, mais il ne connaît rien aux tests de frameworks, ce qui signifie que vous devrez écrire votre propre système de construction à l’aide de Tup. Si vous envisagez de faire du TDD, Tup est probablement la voie à suivre.

2
thegreendroid