Systèmes de construction C ++ - Que utiliser? [fermé]

136

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

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

  1. Prise en charge de C ++ 11
  2. Multi-plateforme (Linux comme cible principale, mais capable de s'appuyer sur au moins Windows également)
  3. Support de test unitaire décent
  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 100% sûr)
  6. Facile à maintenir

Maintenant, je sais que je peux faire 1 à 4 de ceux en utilisant 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 faire correctement la génération de code en les utilisant - c'est-à-dire des fichiers source qui n'existent pas avant la première exécution du processus de construction, donc les fichiers sources 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 source qui doivent pouvoir fonctionner ensemble, et l'ensemble réel de fichiers généré dépend du contenu de votre fichier asn) Il y a ainsi que le fait qu'aucun de ceux-ci n'est particulièrement facile à maintenir - CMake et Autotools ont leur propre vaste ensemble de scripts que vous devez gérer pour qu'ils fonctionnent,

Alors, quels systèmes de construction sont recommandés pour quelque chose comme ça? Ou vais-je être coincé avec des fichiers de création et des scripts shell pour le moment?

Graham
la source
11
"Il semblerait que la réponse soit" Beaucoup, et ils sont tous horribles "" est aussi mon impression (avec l'ajout de "horrible de mon point de vue"; je n'aime pas trop généraliser avec des termes comme ceux-ci ). En fait, j'ai créé le mien pour cette raison, et cela a mieux fonctionné que prévu car il fait ce que je veux et comment j'ai toujours voulu que les choses fonctionnent. Pour quelque chose d'un peu moins de temps, vous devrez probablement passer par les outils existants et en choisir un qui vous donne moins de maux de tête que les autres.
Christian Stieber
4
Essayez tup .
Kerrek SB
voir aussi: stackoverflow.com/q/3349956
ergosys
8
Quel type de support C ++ 11 attendez-vous d'un système de construction? C'est quelque chose que vous obtenez du compilateur, le système de construction n'analyse ni ne lit les fichiers source réels, il les transmet simplement à quiconque en a besoin, non?
Baruch
5
C'est vrai, mais il serait bon d'indiquer au compilateur qu'il utilise le support C ++ 11. g ++ a besoin d'un indicateur, clang un ensemble différent, msvc n'en a apparemment pas besoin et ainsi de suite. En outre, la prise en charge de la détection des fonctionnalités c ++ 11 disponibles serait utile car cela diffère également entre les compilateurs ...
Graham

Réponses:

117

+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/ natif *.sln). Syntaxe étrange, mais une fois que vous l'avez apprise, elle peut vous permettre de bien générer des builds pour différentes plates-formes. Si je «repartais à neuf», j'utiliserais probablement CMake. Il devrait gérer votre liste, bien que votre "génération de code" puisse prendre "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 CMakeou 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 à l'épreuve des balles Scons. Mais c'est lent. Il est écrit en Python et nous avons étendu l'interface pour notre "organisation de l'espace de travail" (où nous spécifions simplement les dépendances de module), et cela fait partie de l' Sconsintention de conception (ce type d'extension via Python). Pratique, mais les builds sont lents. Vous obtenez des versions à l'épreuve des balles (n'importe quelle boîte de développeur peut faire la version finale), mais c'est lent. Et c'est lent. N'oubliez pas que si vous utilisez Scons, cependant, que 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 voitures volantes. Nous devrons probablement attendre encore cent ans ou quelque chose du genre pour les obtenir. Et nous allons probablement tous voler dans nos voitures volantes qui sont encore en construction avec des systèmes de construction merdiques.

Oui, ils sont tous horribles.

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

Sconsfonctionne sur des "phases", et elles sont "quelque peu statiques". Il peut construire du code généré dans le cadre de la construction (les gens le font de différentes manières), mais cela a été décrit comme «quelque chose de très différent de Scons».

Si c'est simple "prétraiter certains fichiers et générer des fichiers source", alors pas de problème (vous avez beaucoup d'options, et c'est pourquoi il a qmakeété écrit - pour le mocprétraitement des *.hpp/*.cppfichiers).

Cependant, si vous faites cela de manière "lourde", vous devrez créer votre propre script. Par exemple, nous avions des scripts en tant que partie de la construction qui interrogeaient les bases de données et généraient des classes C ++ pour s'interfacer entre les «couches» (dans le développement d'applications traditionnel à 3 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 fonctionner 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 triviale pour la "gestion de configuration", dont une partie est le "système de construction". Par exemple, ce système devait, "démonter" et "

Charley
la source
37
J'aime aussi Scons - mais je pense que c'est lent.
Lothar
1
Vous pouvez demander à CMake de gérer la génération de code avec un wrapper Makefile pour effectuer une deuxième phase facultative lorsque le code est généré. J'ai pu prendre en charge le suivi complet des dépendances, la sortie anticipée après la génération de code pour déclencher un re-cmake, etc. Voir: javaglue.com/javaglue.html#tag:JavaGlue et code.google.com/p/javaglue
sdw
3
Près de 2 ans plus tard, considérez-vous toujours que les SCons sont lents? Lorsque j'ai choisi un système de construction, je suis tombé sur cela et cela a contribué à ma décision d'aller avec SCons.
JBentley
2
@Ben, c'est vrai, mais c'est aussi lent.
charley
2
Quiconque regarde cela devrait considérer Meson (qui utilise ninja).
Matthew D.Scholefield
33

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

Cela semble avoir mûri un peu au cours des années depuis que j'ai initialement publié ceci. La page indiquant que le projet est en "incubation" a disparu, mais je ne trouve aucune annonce officielle supprimant ce statut.

Nate Glenn
la source
Je serais d'accord avec Gradle. Gradle est conçu pour être évolutif. Cependant, cela dépend de la vitesse de mise en œuvre du plugin. Il y a aussi des frais généraux pour gradle lui-même. Sachez également que certains plugins devront peut-être être personnalisés pour vos cas d'utilisation.
JE42
Intéressant de voir l'intérêt de gradle à supporter le C ++. J'espère qu'ils produiront un système de construction agréable et solide pour les projets c ++ qui nous manquent tous.
hbobenicio
@squid merci, mis à jour.
Nate Glenn
1
Gradle est puissant mais simple. Aucune syntaxe étrange, un seul fichier gradle.build suffit souvent pour construire un projet entier avec plusieurs sorties exécutables (main, tests, etc.). Pas de vidage de fichier dans tous les répertoires source. Super convivial pour le versionnage.
Overdrivr
1
J'ai passé les deux derniers jours à me battre avec Gradle, en essayant simplement de créer une bibliothèque, une application et des gtests "hello world", et je ne peux pas dire que je peux le recommander pour un nouveau projet. Les outils peuvent tous être là, mais la documentation ne l'est pas (donnant le bénéfice du doute). Peut-être que ceux d'entre vous qui le trouvent viable pourraient indiquer vos ressources préférées?
jwm
16

J'ai trouvé ceux-ci, je ne les ai pas encore tous utilisés personnellement:

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

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

Tup , un système de construction haute performance. Conception basée sur l' algorithmique . Analyse de Tup .

Tous sont désormais multiplateformes et prennent en charge Windows. Je ne suis pas encore sûr du reste de vos exigences car, encore une fois, je ne les ai pas encore testées moi-même. Ils sont utilisés dans le développement commercial, CIG a choisi Ninja. J'ai utilisé et j'adore la facilité et la vitesse de Ninja avec un générateur de projet. Les deux premiers s'apparentent à Scons, Ant, etc.

leetNightshade
la source
1
Tup va gâcher les recherches de symboles, ne joue pas bien avec aucun autre système de construction (du tout, vraiment), ne joue pas bien avec les sorties aléatoires (telles que les classes générées par des javacclasses internes, qui sont séparées en class$1.classfichiers), est mal écrit et utilise des hacks système pour réaliser ce qu'il fait. C'est parfait pour les petits systèmes; impossible à maintenir pour les grands projets.
Qix - MONICA A ÉTÉ BRUYÉ le
@Qix: Vous ne pouvez pas séparer la sortie de votre référentiel?
Kerrek SB
1
@KerrekSB Vous pouvez, mais ce n'est pas le problème avec la recherche de symboles. Tup utilise FUSE et monte son propre middleware dans .tup/mnt. Il exécute ensuite tous les programmes de construction dans un dossier (c'est-à-dire .tup/mnt/@tupjob-XXXXX) en tant que répertoire de travail afin de surveiller les lectures / écritures, en imposant la configuration de construction. Cela fonctionne bien, sauf si le chemin est stocké de manière absolue (c'est-à-dire avec des symboles). Lorsque vous compilez un binaire, le chemin du symbole est stocké dans le binaire lui-même. Cela signifie que lorsque GDB essaie de charger les symboles, il recherche ce tupjobchemin, qui n'existe pas, provoquant des erreurs.
Qix - MONICA A ÉTÉ BRUYÉ le
Tup et Ninja sont des outils de très bas niveau, aussi bas ou jamais inférieurs à Make. Ils ne sont pas adaptés au C ++. Je n'appellerais même pas ces outils de construction de systèmes par eux-mêmes, car il leur manque beaucoup de fonctionnalités importantes de niveau supérieur que les vrais systèmes de construction offrent pour faire face à des projets complexes du monde réel. Certains de ces systèmes peuvent utiliser Ninja comme back-end.
Johan Boulé
11

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. De tous les projets connus, PyPy est une implémentation Python 2.7 très puissante, à croissance rapide et motivée soutenue par JIT. La compatibilité de PyPy avec Python 2.7 est tout simplement incroyable. Cependant, Scons a été déclaré comme projet non pris en charge sur le wiki de compatibilité PyPy . Waf , d'autre part, modélisé comme un successeur d'autotools basé sur python, est entièrement pris en charge par l'infrastructure PyPy. Dans mes projets, la vitesse d'assemblage a été multipliée par 5 à 7 lors de la transition vers PyPy. Vous pouvez voir les rapports de performances de PyPy .

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

aegor
la source
Il est intéressant de noter que scons est maintenant marqué comme "Compatible" sur la page wiki liée, donc apparemment cela fonctionne maintenant avec PyPy.
Faux nom
8

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

Mike B
la source
3
"Multiplateforme (Linux comme cible principale, mais capable de construire au moins sur Windows également)". La FAQ de Bazel indique: "Nous travaillons actuellement activement à l'amélioration de la prise en charge de Windows, mais il est encore loin d'être utilisable."
Michael Mrozek
3
Je ne sais pas si c'est le système lui-même ou le gars qui a mis en place le projet, mais j'ai eu beaucoup de mal dans le dos en l'utilisant @ work. Il est très peu flexible (dans le sens où il ne prend en charge qu'une seule façon de faire les choses, souvent sous-optimale, voire effrayante), pas assez puissant, mal documenté (à part les cas de base), a peu de communauté alors ne vous attendez pas à ce que stackoverflow vienne vous sauver , une dépendance en soi, ne fonctionne pas bien avec la plupart des IDE sur la plupart des systèmes, etc., etc., etc. pour les fans facebook)
Slava
Hé, je l'ai trouvé vraiment facile à utiliser après avoir passé 6 semaines à essayer de faire fonctionner CMake. Je voulais qu'il télécharge des dépendances tierces et les compile (car j'étais habitué à de jolis outils de construction à partir de python et de JavaScript). Cela a rendu les choses faciles mais présente l'inconvénient que vous pourriez avoir à écrire vos propres fichiers bazel pour des tiers qui ne le prennent pas en charge. Ils ont besoin d'un repo central pour les stocker à mon compte.
CpILL
6

J'ai utilisé 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 multiplateformes. 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 macros. Waf est analogique SCons. J'essaye Waf mais SCons sera plus sympathique et donc je suis resté avec SCons.

Selon l'opinion de la foule, SCons est trop lent, mais au milieu d'un projet, je n'ai vu aucune différence entre make et SCons en termes de vitesse de construction. Au lieu de cela, SCons a bien travaillé avec des constructions parallèles, tandis 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 effectuée avec le codage avec python et SCons - tout en un. C'est un très gros avantage.

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

Torsten
la source
3
Mon problème ici est que je suis gâté. Je suis un développeur Java de profession, et des outils comme Gradle dans le monde Java sont le genre d'outils que j'aimerais vraiment avoir pour le développement C ++. Je peux configurer un projet gradle, sans dépendances externes, en utilisant un fichier de construction d'une seule ligne. C'est tout. Les projets multi-modules qui ont de nombreuses dépendances sont toujours faciles à faire, et pèsent en fait avec beaucoup moins de configuration que même un simple projet C ++ ...
Graham
J'ai eu des problèmes pour construire d'autres paquets qui utilisent Scons car il n'abstrait pas les indicateurs de configuration système tels que -I include dirs et -L library dirs. Cela ne prendra pas CFLAGS, vous devez souvent modifier chaque script scons pour qu'il apparaisse au bon endroit.
ACyclique du
5

juste pour ajouter mes centimes: premake

http://industriousone.com/premake

il existe également une page Web dédiée sur le wiki.

user827992
la source
2
Malheureusement Premake ne prend pas en charge la génération de code selon les exigences de l'OP. Et je n'appellerais pas sa prise en charge des tests unitaires "décente", même si vous pouvez faire certaines choses.
ergosys
@ergosys je remarque que ant n'est pas mentionné, antprend également en charge C / C ++, voyez si c'est bon pour vous, c'est le nom de famille que j'ai, j'utilise juste Makefiles et Cmake pour cela.
user827992
2

Vous pouvez utiliser Ceedling . Notez, cependant, il ne prend en charge que C pour le moment et il est étroitement couplé aux frameworks de test Unity et CMock de l'auteur.

Il peut être forké et modifié pour fonctionner assez facilement avec un compilateur C ++ et un framework de tests unitaires / mocking.

Tup mérite également d' être mentionné. C'est extrêmement rapide mais il ne sait rien sur les frameworks de test, etc., ce qui signifie que vous devrez écrire votre propre système de construction en utilisant Tup. Si vous prévoyez de faire du TDD, Tup est probablement la voie à suivre.

thegreendroid
la source