143 votes

Systèmes de construction C++ - Que faut-il utiliser ?

J'envisage de lancer un nouveau projet en C++ - à titre personnel dans un premier temps - 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 sont les suivantes :

  1. Support C++11
  2. multiplateforme (Linux comme cible principale, mais capable de construire au moins sur Windows également)
  3. Support décent des tests unitaires
  4. Prise en charge de plusieurs modules pour séparer le code
  5. Support pour la génération de code (en utilisant asn1c ou protobuf - pas encore sûr à 100%)
  6. Facile à entretenir

Maintenant, je sais que je peux faire 1-4 de ces choses en utilisant CMake et Autotools assez facilement. Probablement aussi avec SCons et Waf et quelques 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 sources qui n'existent pas jusqu'à ce que le processus de construction soit lancé, donc des fichiers sources que le système de construction doit être capable de convertir en code exécutable mais qui ne sont pas réellement connus jusqu'à ce que la construction commence... (ASN1C en particulier génère des douzaines d'en-têtes et de fichiers sources qui doivent être capables de travailler ensemble, et le jeu réel de fichiers générés dépend du contenu de votre fichier asn) Il y a aussi le fait qu'aucun d'entre eux n'est particulièrement facile à maintenir - CMake et Autotools ont leur propre jeu énorme de scripts que vous devez gérer pour qu'ils fonctionnent, et Waf et Scons exigent que quiconque travaille avec eux ait une connaissance décente de python (je ne l'ai pas) pour travailler avec eux...

Quels sont les systèmes de construction recommandés pour ce type de projet ? Ou vais-je être coincé avec des fichiers make et des scripts pour le moment ?

11 votes

Il semblerait que la réponse soit "Beaucoup, et ils sont tous affreux". C'est aussi mon impression (avec l'ajout de "affreux de mon point de vue" ; je n'aime pas trop généraliser avec ce genre de termes). En fait, j'ai créé mon propre système pour cette raison précise, et il a mieux fonctionné que prévu puisqu'il fait ce que je veux, et comment j'ai toujours voulu que les choses fonctionnent. Pour quelque chose d'un peu moins chronophage, vous devrez probablement passer en revue les outils existants et en choisir un qui vous donne moins de maux de tête que les autres.

4 votes

Essayez tup .

0 votes

127voto

charley Points 3329

+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 (qui génère également des fichiers MSVC++ natifs). *.proj / *.sln ). Une syntaxe bizarre, mais une fois que vous l'avez apprise, elle peut vous permettre de générer joliment des builds pour différentes plateformes. Si je "recommençais à zéro", 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 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 un API riche pour vos propres extensions, comme Scons (ou Waf ).

Nous utilisons Scons au travail. Il produit des "constructions à toute épreuve", mais il est vraiment lent. Aucun autre système ne sera à l'épreuve des balles comme 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 ne faisons que spécifier les dépendances des modules), et cela fait partie de l'initiative Scons l'intention de conception (ce type d'extension par Python). Pratique, mais les constructions sont lentes. Vous obtenez des constructions à 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 mais 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 une centaine d'années pour en avoir. Et, nous serons alors probablement tous en train de voler dans nos voitures volantes qui sont toujours qui sont construits avec des systèmes de construction merdiques.

Oui, ils sont tous affreux.

[SUR LA GÉNÉRATION DE CODE]

Scons fonctionne par "phases", et celles-ci sont "quelque peu statiques". Il peut construire du code qui est généré dans le cadre de la construction (les gens font cela de plusieurs façons différentes), mais cela a été décrit comme "quelque chose de très différent de Scons".

S'il s'agit simplement de "prétraiter certains fichiers et de générer des fichiers sources", alors pas de problème (vous avez de nombreuses options, et c'est pourquoi qmake a été écrit -- pour le moc prétraitement de *.hpp/*.cpp ).

Cependant, si vous faites cela dans un "heavy-manner", vous allez avoir besoin de script votre propre. Par exemple, nous avions des script qui interrogeaient les bases de données et généraient des classes C++ pour s'interfacer entre les "couches" (dans le développement traditionnel d'applications à 3 niveaux). De même, nous avons généré le code source du serveur/client par le biais d'IDL, et intégré des informations de version 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 la configuration", dont une partie est le "système de construction". Par exemple, ce système devait, dans le cadre de ce processus, "démonter" et "démarrer" des serveurs. De même, les tests de régression ont été exécutés dans le cadre de ce processus, avec des "rapports" importants et des "tests de différence" entre les versions, le tout dans le cadre de nos "build-script".

40 votes

J'aime bien Scons aussi - mais je pense que c'est lent.

1 votes

Vous pouvez faire en sorte que CMake gère la génération du code avec un wrapper Makefile pour faire une seconde phase optionnelle lorsque le code est généré. J'ai pu supporter un suivi complet des dépendances, une sortie précoce après la génération du code pour déclencher un re-cmake, etc. Voir : javaglue.com/javaglue.html#tag:JavaGlue y code.google.com/p/javaglue

0 votes

Les SCons et le code généré automatiquement fonctionnent bien ensemble. Dans notre système, nous générons automatiquement des en-têtes c++, des fichiers obj-c, des fichiers java, et nous pouvons faire plus encore. Mais SCons ne le supporte pas "nécessairement" - ni ne l'entrave. Nous utilisons un constructeur personnalisé. Il dit à SCons "Je prends la liste S comme source et je génère la liste cible T comme sortie". Cela permet à SCons de déterminer l'ordre des dépendances. Il peut donc supporter les constructions parallèles ainsi que le cache de SCons. Contre - Je pense que j'ai entendu parler de vitesse (et ce n'est pas bon) mais le plus gros problème est de faire comprendre SCons aux gens. Python est simple, SCons ne l'est pas.

35voto

Nate Glenn Points 1882

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

Le projet semble avoir bien évolué depuis que j'ai posté ce message. La page indiquant que le projet est "en incubation" a disparu, mais je ne trouve aucune annonce officielle supprimant ce statut.

0 votes

Je serais d'accord avec Gradle. Gradle est conçu pour être évolutif. Cependant, sa rapidité dépend de l'implémentation du plugin. Il y a également des frais généraux pour Gradle lui-même. Sachez également que certains plugins peuvent avoir besoin d'être personnalisés pour vos cas d'utilisation.

0 votes

Il est intéressant de voir l'intérêt de gradle pour le support du C++. J'espère qu'ils produiront un système de construction agréable et solide pour les projets C++ qui nous manque à tous.

0 votes

@squid merci, mise à jour.

11voto

aegor Points 51

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 un projet très puissant, à croissance rapide et motivé par le JIT - implémentation de Python 2.7. La compatibilité de PyPy avec Python 2.7 est tout simplement étonnante. Cependant, Scons a été déclaré comme projet non supporté sur le site de la Wiki de compatibilité PyPy . Waf D'autre part, modélisé comme le successeur d'autotools basés sur python, est entièrement supporté par l'infrastructure PyPy. Dans mes projets, la vitesse de l'assemblage a augmenté de 5 à 7 fois 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.

0 votes

Il est intéressant de noter que scons est maintenant marqué comme "Compatible" sur la page wiki liée, donc apparemment il fonctionne maintenant avec PyPy.

6voto

Torsten Points 2778

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à mises en œuvre dans SCons et Python et sont multiplateformes. Si vous avez de bonnes compétences en programmation, alors votre construction scripts sera parfaite et facile.

Make, CMake et les systèmes de construction similaires semblent être une corbeille de macros. Waf est l'analogue de SCons. J'ai essayé Waf mais SCons sera plus convivial et je suis donc resté avec SCons.

De l'avis général, SCons est trop lent, mais au milieu d'un projet, je n'ai pas vu de différence entre make et SCons en termes de vitesse de construction. Au contraire, SCons a bien fonctionné avec les constructions parallèles, alors que make a de gros problèmes avec ça.

De plus, SCons vous permet d'obtenir - de configurer, de construire, de déployer, de générer une configuration à partir de modèles, d'exécuter des tests et d'effectuer toute autre tâche qui peut être réalisé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.

3 votes

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. Et c'est tout. Les projets multi-modules qui ont de nombreuses dépendances sont également faciles à faire, et pèsent en fait beaucoup moins lourd en termes de configuration que même un simple projet C++...

0 votes

J'ai eu des problèmes pour construire d'autres paquets qui utilisent Scons parce qu'il ne fait pas abstraction des drapeaux de configuration du système comme -I include dirs et -L library dirs. Il ne prend pas les CFLAGS, vous devez souvent modifier chaque scons script pour qu'il regarde au bon endroit.

5voto

user827992 Points 1121

Juste pour ajouter mes cents : premake

http://industriousone.com/premake

il existe également un page web spéciale sur le wiki.

2 votes

Malheureusement Premake ne supporte pas la génération de code selon les exigences de l'OP. Et je n'appellerais pas son support pour les tests unitaires "décent", bien qu'il y ait quelques choses que vous pouvez faire.

0 votes

@ergosys je remarque que ant n'est pas mentionné, ant supporte aussi C/C++, voyez si cela vous convient, c'est le dernier nom que j'ai, j'utilise juste Makefiles et Cmake pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X