Donc, en se basant uniquement sur les critères énoncés dans la question, le système de construction qui semble le mieux convenir est probablement le suivant waf - pur Python, fournit un support pour C++ et d'autres langages, général, puissant, pas un DSL.
Cependant, d'après mon expérience personnelle, je préfère CMake pour les projets C++. (J'ai essayé CMake, SCons, et waf, et je les ai aimés dans cet ordre). CMake est une solution générale, mais il a un support intégré pour C++ qui le rend plus agréable qu'une solution plus générique lorsque vous faites réellement du C++.
Le modèle de construction de CMake pour C++ est plus déclaratif et moins impératif, et donc, pour moi, plus facile à utiliser. La syntaxe du langage de CMake n'est pas géniale, mais une construction déclarative avec une syntaxe étrange bat une construction impérative en Python. Des trois, CMake semble aussi avoir le meilleur support pour les choses "avancées" comme les en-têtes précompilés. La mise en place d'en-têtes précompilés a réduit mon temps de reconstruction d'environ 70%.
Les autres avantages de CMake sont une documentation décente et une communauté importante. De nombreuses bibliothèques open source ont des fichiers de construction CMake, soit dans l'arbre, soit fournis par la communauté CMake. Il y a des projets majeurs qui utilisent déjà CMake (OGRE vient à l'esprit), et d'autres projets majeurs, comme Boost et LLVM, sont en train de passer à CMake.
Une partie du problème que j'ai trouvé en expérimentant avec les systèmes de construction est que j'essayais de construire un plugin NPAPI sur OS X, et il s'avère que très peu de systèmes de construction sont configurés pour donner à XCode la combinaison exacte de drapeaux nécessaires pour le faire. CMake, reconnaissant que XCode est une cible complexe et mouvante, fournit un crochet pour définir manuellement les commandes dans les projets XCode générés (et Visual Studio, je pense). C'est très intelligent en ce qui me concerne.
Le fait que vous construisiez une bibliothèque ou une application peut également déterminer le meilleur système de construction. Boost utilise toujours un système basé sur les confitures, en partie parce qu'il fournit le support le plus complet pour gérer les types de construction plus complexes que "Debug" et "Release". La plupart des bibliothèques Boost ont cinq ou six versions différentes, en particulier sous Windows, anticipant les personnes ayant besoin de bibliothèques compatibles qui se lient à différentes versions du CRT.
Je n'ai pas eu de problèmes avec CMake sous Windows, mais bien sûr votre kilométrage peut varier. Il y a une interface graphique décente pour configurer les dépendances de construction, bien qu'elle soit difficile à utiliser pour les reconstructions. Heureusement, il y a aussi un client en ligne de commande. Ce que j'ai décidé jusqu'à présent est d'avoir un Makefile enveloppant fin qui invoque CMake à partir d'un objdir ; CMake génère alors des Makefiles dans l'objdir, et le Makefile original les utilise pour faire la compilation. Cela permet de s'assurer que les gens n'invoquent pas accidentellement CMake depuis le répertoire source et n'encombrent pas leur dépôt. Combiné avec MinGW, ce "sandwich CMake" fournit une expérience de construction multiplateforme remarquablement cohérente !
0 votes
Je suis confus. Vous dites "il n'a pas besoin de supporter la suite complète d'autotools". Est-ce que cela signifie que votre question devrait être reformulée : "Quel est le meilleur système de construction après autoconf/automake ?"
0 votes
@William Pursell : Non. Je laisse explicitement de côté l'obligation de prendre en charge autoconf et automake, car ils sont si étroitement liés à Makefiles.
1 votes
Je ne vois rien de mal à la question initiale ou à la discussion qui en résulte. Étant donné que cette question est maintenant le premier résultat du moteur de recherche pour "best build system", cette question devrait être rouverte. Je pourrais comprendre la fermeture de cette question si la discussion était en fait une question d'opinion, ou si elle avait attiré du spam, mais ce n'est pas le cas.