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:
- Prise en charge de C ++ 11
- Multi-plateforme (Linux comme cible principale, mais capable de s'appuyer sur au moins Windows également)
- Support de test unitaire décent
- Prise en charge de plusieurs modules pour séparer le code
- Prise en charge de la génération de code (en utilisant asn1c ou protobuf - pas encore 100% sûr)
- 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?
Réponses:
+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 probablementCMake
. 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
CMake
ou quelque chose avec une API riche pour vos propres extensions, commeScons
(ouWaf
).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'Scons
intention 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 utilisezScons
, 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]
Scons
fonctionne 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 lemoc
prétraitement des*.hpp/*.cpp
fichiers).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 "
la source
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.
la source
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.
la source
javac
classes internes, qui sont séparées enclass$1.class
fichiers), 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..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 cetupjob
chemin, qui n'existe pas, provoquant des erreurs.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.
la source
Le système de construction Google est une bonne alternative: http://bazel.io/
la source
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.
la source
juste pour ajouter mes centimes: premake
http://industriousone.com/premake
il existe également une page Web dédiée sur le wiki.
la source
ant
prend é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.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.
la source