Je vous propose dans cette dépêche de revenir sur la panoplie d'outils de construction qui s'offre à nous (c'est à dire les outils permettant d'automatiser les étapes de préprocessing, compilation, éditions des liens, etc).
Je ne cherche pas à faire un comparatif, mais juste à les décrire pour en faire ressortir les avantages et inconvénients ainsi que les cas d'utilisation. Cette dépêche peut être vue comme un état de l'art allégé des outils de construction libres.
Je tiens à remercier les contributeurs de cette dépêche :
- GeneralZod
- tiennou
- NedFlanders
- claudex
Ce sont eux qui ont écrit la majeure partie de cette dépêche et qui l'ont améliorée et complétée grâce à leurs connaissances et au temps qu'ils y ont consacré.
Cette dépêche a pour objectif de faire découvrir ou redécouvrir des outils de constructions. Si vous en connaissez d'autres n'hésitez pas à en parler en commentaire.
Sommaire
- Un « builder » ?
- Le vénérable Make
- Le peu connu OMake
- Un challenger scons
- Celui de Google : Ninja
- L'univers Java
- Les surcouches
Un « builder » ?
Nous avons dans nos dépôt un grands nombre d'outils qui ont chacun leur philosophie. Le reste de la dépêche s'attelle à en décrire un certains nombre parmi les plus connus.
Un builder est un outil qui permet de construire un logiciel (et plus si affinité) à partir des sources. Il doit être le chef d'orchestre de la chaîne de fabrication du logiciel (le compilateur, l'éditeur de liens, etc).
Les critères importants de ce genre d'outils sont la facilité d'utilisation : pour le développeur et pour l'utilisateur. La performance : lorsqu'un projet est gros, le temps de création du logiciel peu devenir très important et la vitesse du builder peut avoir un impact important. La flexibilité : peut-on en faire ce que l'on veut avant et après chaque étape ? Gère-t-il n'importe quel langage ?
Le vénérable Make
make est l'outil de base pour beaucoup. C'est un outil très vieux, mais encore beaucoup utilisé. Il est le seul outil de la liste de cette dépêche à faire partie de POSIX. Sous nos distributions GNU/Linux, c'est généralement GNU Make qui est utilisé.
Make est une sorte de langage Rule Based Programming quand lequel on spécifie des règles sous la forme :
cible: dépendance
cmd
Avec :
- cible : fichier ou pattern de fichier que l'on cherche construire
- dépendance : liste des fichiers nécessaires pour construire la cible
- cmd : commande pour produire la cible
Les avantages de cette approche sont :
- la souplesse : on utilise
make
pour tout et n'importe quoi aujourd'hui (créer un PDF, latex ou lout, compiler dans tout type de langage, etc.) - la simplicité : si vous savez construire à partir de votre ligne de commande vous saurez le faire avec make
- rapidité : il construit un arbre de dépendance et éxecute une parallèle ce qui peut l'être (aujourd'hui tout les builders le font)
En revanche, il possède aussi un certain nombre d'inconvénients :
- dépendances : on doit gérer à la main les dépendances entre les fichiers, plus le projet devient gros plus ça devient lourd à gérer ;
- manque de portabilité : on utilise des commandes, généralement on ne se gène pas pour utiliser les options GNU de nos outils favoris, il faut aussi que ces outils soient installés sur la machine, etc. ;
- manque de réutilisabilité : quand on se met à beaucoup l'utiliser, on a tendance à recopier des blocs de Makefile car rien n'est mutualisé.
Ce dernier point est tout de même à relativiser, GNU Make intègre beaucoup de règles par défaut qui simplifient son utilisation. Par exemple, si vous avez un simple fichier coucou.c que vous souhaitez compiler, il vous suffit de taper cette commande (sans avoir créé de Makefile au préalable) pour créer l'exécutable :
$ make coucou
cc coucou.c -o coucou
Si vous souhaitez passer des arguments au compilateur :
sh
$ export CFLAGS='-g'
$ make coucou
cc -g coucou.c -o coucou
Le peu connu OMake
Il utilise une syntaxe similaire à Make mais offre quelques fonctionnalités supplémentaire :
- La gestion du projet dans plusieurs répertoires ou dans une hiérarchie de répertoire ;
- Une analyse automatique et rapide des dépendances, basée sur MD5 ;
- Lorsqu'une cible est spécifiée dans la ligne de commande, elle est automatiquement considérée comme obsolète et reconstruite ;
- Il est complètement scriptable et une bibliothèque est fournie pour les langages C, C++, OCaml, et LaTeX. Il est donc possible d'avoir une seule ligne pour le projet :
.DEFAULT: $(CProgram prog, foo bar baz)
Cette ligne suffit pour construire la cible prog à partir des fichier foo.c, bar.c et baz.c. OMake va aussi chercher les dépendances implicites comme les includes des fichiers C.
- Les règles qui construisent plusieurs fichiers en une fois sont complètement prises en charge ;
- Il fonctionne sur Linux, Windows, Cygwin et Mac OS ;
- Des fonctions telles que grep, sed et awk sont directement incluses dans le programme, cela permet d'améliorer la portabilité sous Windows ;
- Il est possible de surveiller le système de fichier en continu pour relancer la construction dès qu'un fichier est modifié ;
- Il dispose d'un interpréteur de commande,
osh
, qui permet l'utilisation interactive.
Un challenger scons
Scons est écrit en python, et les scripts scons (fichiers SConstruct et SConscript) sont eux-même en python. Ceci lui procure une très grande souplesse. La contrepartie de cette souplesse est une certaine complexité, scons fait un peu moins "clef-en-main" que certains autres outils de construction.
Avantages de scons :
- c'est du python : c'est un vrai langage, pas un truc tout bancal, ça roxe
- sait extraire out-of-the-box les dépendances des sources de nombreux langages (C, C++, Java, Fortran, etc.)
- garantie d'avoir toujours des constructions correctes, ce qui est assez confortable. Scons garde trace du hash du contenu de chaque fichier apparaissant dans l'arbre de dépendances.
- lance les compilations en parallèle
- killer feature : scons cache le résultat chaque opération (compilation, liaison, etc.), un peu comme ccache, mais pour toutes les opérations et tous les langages.
- gère de base les chaînes de compilation sur les systèmes d'exploitation majeurs (outils GNU sous Linux, Visual Studio sous Windows, XCode sous Mac OS X), tout ceci étant bien entendu totalement paramétrable.
- range tous les produits de la compilation dans un "build directory", pratique pour séparer les choux et les carottes.
Inconvénients :
- relativement complexe à prendre en main, et plutôt bas niveau
- plutôt lent par rapport à la concurrence, en partie à cause de python, et en partie à cause de la gestion très rigoureuse des dépendances.
Une comparaison avec les autres outils est disponible sur [http://www.scons.org/wiki/SconsVsOtherBuildTools]
Un dérivé de scons qui semble avoir le vent en poupe est waf. Il comble les lacunes de scons (complexité et lenteur) en proposant des améliorations tel qu'une sortie en couleur et un meilleur support de la compilation parallèle.
Celui de Google : Ninja
Ninja est le moteur de production créé par l'équipe de développement de Google Chrome. Ceux-ci utilisaient Make mais trouvaient que la génération de l'arbre des dépendances était bien trop lent (le temps avant de commencer serait d'une minute).
Ils ont choisi de développer leur propre outil (pourquoi donc patcher le logiciel existant ?). Celui-ci est plus simpliste que Make car il ne possède aucune logique interne liée aux langages (contrairement à make qui possède des règles prédéfinies). Néanmoins, il a une syntaxe qui est un peu plus flexible.
L'utilisation de ninja passe par la création d'un fichier build.ninja. En voici un exemple tiré de la documentation officielle :
cflags = -Wall
rule cc
command = gcc $cflags -c $in -o $out
build foo.o: cc foo.c
```cflags = -Wall
rule cc
command = gcc $cflags -c $in -o $out
build foo.o: cc foo.c
```
Cet exemple, bien que simpliste permet de voir l'usage basique du logiciel. Voici une petite explication de la syntaxe :
cflags = -Wall
Déclare une variable cflags.
rule cc
command = gcc $cflags -c $in -o $out
Déclare une règle cc :
- $in corresponde aux fichiers d'entrée
- $out au fichier de sortie
build foo.o: cc foo.c
Ceci va invoquer la règle cc avec foo.c comme variable $in et foo.o comme variable $out.
L'univers Java
L'historique Apache Ant
Le premier moteur de production orienté Java développé par la fondation Apache. Il repose sur la notion de tâches et a la particularité d'utiliser un format XML pour son fichier de configuration. On peut étendre les fonctionnalités d'Ant en écrivant des nouvelles tâches.
Bien qu'écrit en Java, il est utilisable avec d'autres langages.
Avantages :
- une riche collection d'extensions via antcontrib ;
- portable ;
- excellente intégration aux outils Java existants (tests unitaires, qualité de code etc…).
Inconvénients :
- XML ?
- Difficulté d'avoir un environnement standard (compilation, paquetages, etc) rapidement. On doit partir de zéro pour les tâches standards
- Pas d'héritage sur les fichiers build.xml et la composition est fastidieuse.
L'usine à build Apache Maven
Maven est une plateforme moderne de construction de projet, développé également par la fondation Apache.
Attaché à la devise « Convention plutôt que configuration », Maven impose sa manière d'organiser les fichiers et un cycle de construction en plusieurs phases (les principales étant clean, compile, test, package, install, deploy). L'intérêt de maven est qu'il impose de la rigueur dans l'infrastructure du projet, apportant par la suite énormément de confort puisqu'on est à peu près sûr de pouvoir reconstruire le projet sur un nouvel environnement.
La gestion des dépendances est un point fort de maven. Chaque module est identifié par (au minimun) le triplet (groupId, artifactId, version). L'ajout d'une dépendance à un projet se fait donc juste en spécifiant le triplet correspondant. Maven se charge automatiquement de récupérer les dépendances sur les dépôts comme un gestionnaire de paquets le fait sur notre distribution GNU/Linux favorite.
Maven est lui-même extrèmement modulaire et les nombreuses extensions disponibles seront résolues au besoin au moment de leur utilisation.
Un projet maven est décrit dans un fichier pom.xml contenant l'identification du projet, des métadonnées optionnelles mais intéressantes (licence, page web, description…), la liste des dépendances, des dépôts additionnels, la liste des extensions supplémentaires utilisées.
En résumé, les avantages :
- description standardisée d'un projet
- richesse des extensions disponibles
- plateforme modulaire et autonome, garantissant une utilisation rapide dans un nouvel environnement
Les inconvénients :
- la résolution des dépendances peut s'avérer un peu longue
- une connexion au dépôt de bibliothèques est nécessaire au moins pour la première fois, sinon le projet est inutilisable
- une description plus détaillées des inconvénients se trouve sur le blog de Sonatype : We're Used to the Axe Grinding
Les autres (buildr, gradle…)
La communauté Java - et plus particulièrement la communauté Apache - est très productive ces derniers temps en terme de builder. En plus de Ant et Maven, Apache compte plusieurs projets intéressants. Quelques-uns sont à souligner :
- Apache Ivy est un sous-projet d'Ant. Il vise à ajouter la gestion des dépendances (compatibles Maven) dans des projet gérés par Ant. Cela permet de simplifier la gestion des dépendances à un projet qui était déjà géré par Ant.
- Gradle celui-ci gère les projet via un DSL à la place de fichier XML, il vise notamment à être plus indépendant du langage que Maven, ainsi il pourra plus facilement travailler sur des projet Groovy ou Scala. Il utilise, comme Maven, la convention plutôt que la configuration ce qui lui permet de simplifier son utilisation. Voici pour exemple le fichier minimal pour un projet Java :
apply plugin: 'java'
- Apache Buildr est fait pour être le plus simple possible. Il est aussi prévu pour gérer plus facilement Groovy et Scala. Voici un fichier montrant sa simplicité, il permet de compiler un projet my-app et de créer un jar :
define 'my-app' do
project.version = '0.1.0'
package :jar
end
# Du code avec coloration syntaxique
class Ruby
end
apply plugin: 'java'
Les surcouches
CMake
Contrairement aux outils présentés auparavant, CMake est un générateur de "projets". Il génére un ou des fichier(s) recette(s) qui seront manipulés par un moteur de production bas-niveau (make, nmake, …) ou pouvant être ouverts par un environnement de développement (eclipse, XCode, Visual Studio, KDevelop, …). Depuis son adoption par KDE, il connait une grande popularité.
CMake fournit un langage dédié et un jeu de macros permettant de gérer un projet complet. Il est ainsi capable de retrouver seul les bibliothèques ou les utilitaires installés sur le système et ainsi s'abstraire de la platforme de compilation.
Plus généralement, CMake fait partie de la suite de processus logiciel qualité Kitware qui comporte également :
- CTest : un outil de tests qui étend CMake. Il permet de récupérer le code source à partir d'un gestionnaire de version, de compiler ces sources, et d'exécuter les tests unitaires (CMake supporte GoogleTest, CXXTest, SQuish et s'intégre facilement aux autres systèmes). Il permet également de récupérer la couverture de code et d'exécuter les tests sous Valgrind. Il génère des rapports XML qui pourront être traités par un serveur d'intégration continue.
- CDash : serveur web de tests, associé à CTest, il fournit une plateforme d'intégration continue flexible.
- CPack : la boite à outils pour générer des paquets très simplement. Il supporte les formats suivants : dpkg, rpm, tarballs, installeurs Mac (dmg, drag'n'drop, etc.), NSIS, Cygwin.
Avantages :
- multiplateforme
- permet de générer des projets pouvant être ouverts par un IDE
- robuste
- prise en charge de la compilation parallèle
- une collection de modules qui s'enrichit régulièrement
Inconvénients :
- un langage de script relativement pauvre comparé à python ou lua
- documentation éparse
Les autotools
Derrière la dénomination autotools se cache toute une famille d'outils GNU constituant un moteur de production complet mais également complexe :
- autoconf : un générateur de scripts shell à partir de macros m4 permettant de configurer les sources d'un projet (ex: tester la version d'une bibliothèque, la présence ou non d'une fonction etc…). C'est lui qui est responsable de la génération du fameux "configure".
- automake : générateur de makefile portables, il est écrit en perl.
- libtool : abstrait la génération des bibliothèques dynamiques.
- gnu make : bien évidemment le moteur GNU make pour exécuter le makefile résultant.
Avantages :
- facilite l'écriture de programmes multi-plateformes.
- simplifie le processus de compilation par l'utilisateur (le célèbre triptyque : "./configure && make && make install")
- système de construction robuste et extrêmement modulaire.
- la plus large collection d'extensions parmi tout les moteurs de production de haut niveau présentés.
Inconvénients :
- complexe d'utilisation
- dépendance à la présence d'un shell bourne (ou compatible), m4, et perl
- relativement lent (même si il est possible d'améliorer ce point en passant par une construction non récursive, c'est-à-dire en utilisant un unique Makefile.am à la racine du projet)
- les différentes versions d'automake sont incompatibles entre elles
- re-générer le système de construction est une tâche relativement complexe, souvent laissé à la charge d'un script shell (autogen.sh)
Aller plus loin
- OMake (218 clics)
- SCons (106 clics)
- Maven (86 clics)
- Ninja sur github (163 clics)
- Ant chez Apache (50 clics)
- CMake (118 clics)
- buildr chez Apache (56 clics)
- Apache Ivy (61 clics)
- Gradle (80 clics)
- GNU Make sur Wikipédia (96 clics)
# Indispensable
Posté par Nicolas Dumoulin (site web personnel) . Évalué à 9.
Bonjour,
Ça fait maintenant quelques années que j'utilise systématiquement maven pour mes projets java. Auparavant, j'utilisais ant. Maven a vraiment apporte une structure cohérente au projet. Là ou avec ant, chaque développeur a ses petites bidouilles rendant difficile la réutilisation (sauf avec beaucoup de rigueur, cf. le projet netbeans), maven laisse peu de place à l'improvisation et fournit des solutions prêtes à l'emploi pour de nombreux besoins.
D'apparence compliqué à appréhender, le pom (le fichier de configuration) s'avère très simple dès lors qu'on ne cherche pas à le tordre et bougrement efficace. Le démarrage d'un nouveau projet se fait très rapidement, on ajoute les dépendances en 3 clics (ou quelques copier-coller), et on peut alors avec quelques commandes générer le jar du projet, le déployer sur son dépôt, faire de même pour la javadoc. Le couplage avec hudson (serveur d'intégration continue) est aussi un jeu d'enfant et rend des services inestimables.
Non, franchement, j'aurai du mal à me passer de maven sur un projet java, et si je devais changer de langage, j'espère trouver un outil équivalent.
Voilà pour mon expérience :-) (c'est d'ailleurs moi qui ait rédigé en grande partie, et un peu vite-fait, la partie sur maven ;-) )
Merci pour la dépêche, je vais jeter un œuil sur les autres outils.
[^] # Re: Indispensable
Posté par barmic . Évalué à 3.
Je suis aussi très satisfait de maven pour du java (même si j'ai encore peu d'expérience et que je n'ai pas encore touché à des archétypes).
J'aimerais bien avoir l'occasion de toucher à gradle ou buildr qui ont l'air intéressants et qui évite de faire du XML. Je sais que maven 3 permet d'avoir une configuration XML compact. Avec ça :
À la place de :
Mais ce n'est pas très mis en valeur et je n'ai pas eu l'occasion d'essayer.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Indispensable
Posté par CrEv (site web personnel) . Évalué à 5.
hum... je suis plutôt mécontent pour ma part de maven.
Ha c'est sur si on reste dans du java "classique" ça fonctionne plutôt bien.
Par contre, dès qu'on a un truc un peu plus couillu c'est la fête du slip. Les cas tordus se résolvent de deux manières en général : soit on crée un plugin maven (mouai... bof quoi, on est très mais alors très loin du convention over configuration tout d'un coup). Soit on crée du ant et on utilise le plugin ant !
Le problème surtout c'est qu'un build c'est une suite d'étapes. C'est un processus. Et maven masque tellement ça que parfois on ne peut pas s'en sortir (j'ai quelques exemples de cas où je voudrais réaliser des actions sur les fichiers juste avant la mise en war, mais pas moyen sans créer un nouveau plugin. Mon war est faux mais le répertoire sur le disque (donc juste non zippé) est lui ok. Super !
Maven c'est bien sur le principe, dans beaucoup de cas ça fonctionne, les archetypes sont plutôt sympa, les dépendances assez bien foutu.
Mais c'est tout de même limité (et encore je ne parle pas du fait de devoir mixer plusieurs langages à builder dans la même archive, évidemment je parle de langages hors JVM).
Pour ma part je serais plutôt adepte de systèmes de builds mélangeant description (dépendances par exemple, ce que maven fait bien) et étapes de build qui pour moi doit être plutôt de type script, scénario, ce que maven fait mal.
[^] # Re: Indispensable
Posté par barmic . Évalué à 3.
C'est un problème connu de maven, dès qu'on sort des clous c'est très compliqué. Peut être que tu devrais regarder du coté de gradle ?
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Indispensable
Posté par Pierre Tramonson . Évalué à 0.
Je partage le point de vue sur Maven, mais je ne comprends pas les inconvénients reprochés à Ant :
[^] # Re: Indispensable
Posté par djano . Évalué à 2.
A noter que Maven dispose d'un petit frere: ployglot maven (pmaven) http://polyglot.sonatype.org/why.html .
Il permet de spécifier les dépendances dans d'autre langages qu'XML tel que Clojure, Groovy ou Scala pour le moment.
Bien sur je rejoins les autres commentaires: maven est super pour le cote convention: tous les projets maven se compilent en 2 coups de cuillère a pot. Les plus gros projets sont faciles a gérer pour peu que la base de code n'est pas monolithiques et que les dépendances sont bien découpées. J'ai de mauvais souvenirs avec les scripts ant sur de tels projets! Tres flexibles, mais rapidement compliqués a debugguer (pas insurmontable, juste chiant).
J'aime bien la possibilité de pouvoir utiliser les taches ant lorsque l'on vient a bout des possibilités de Maven et avant que l'on n'en vienne a créer son propre plugin maven. C'est pratique. Je crois que l'inverse est aussi possible, mais je ne suis pas sur de comprendre l’intérêt.
Les seuls trucs qui me gonflent dans maven sont de petits bugs ou des petits manques ici ou la qui te compliquent la vie puissance 10 dans certains cas. J'ai fais chauffer mon compilateur, mais j'attends les commentaires sur mon patch et une intégration. On va voir.
[^] # Re: Indispensable
Posté par djano . Évalué à 2.
Et j'oubliais aussi gmaven qui a l'air super intéressant pour éviter de construire son propre plugin maven:
http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code
Dommage: il semble ne plus être développé activement.
# robuste ?
Posté par Anonyme . Évalué à 1.
Ça veut dire quoi ?
[^] # Re: robuste ?
Posté par Troy McClure (site web personnel) . Évalué à 9.
c'est par opposition à un truc tout branlant , fait de bric et et broc et assemblé avec du scotch, les autotools par exemple.
[^] # Re: robuste ?
Posté par Xaapyks . Évalué à 1.
Je ne comprends pas.
Tu dis que les autotools sont un truc tout branlant ou justement qu'ils ne le sont pas ?
[^] # Re: robuste ?
Posté par Troy McClure (site web personnel) . Évalué à 10.
ils le sont bien entendu. Il n'y a rien de robuste dans les autotools c'est un assemblage hétéroclite de bout de scripts shell , de makefile et de macros m4 emballé dans du perl, qui genere plus ou moins automatiquement un milliard de micro-fichiers plus ou moins indispensables. Pour moi il est vraiment temps que le libre se trouve un autre outil de build que l'infernale combinaison autoconf/automake/libtool/make . Quelque chose qui soit vraiment portable (parce que les autotools n'ont rien de portable , ça ne fonctionne relativement fiablement que sous les derives de gnu/linux avec un toolchain gnu), qui soit simple a ecrire quand on sort du GNU/Hello trivial , qui ne genere pas un ./configure de 350Ko pour gnu/hello
[^] # Re: robuste ?
Posté par fearan . Évalué à 3.
En fait tu vas commencer par faire un truc simple.
Puis un jour un gars voudra faire un truc pas prévu et se retrouvera bloqué.
si c'est libre, alors il fera un plugin.
Puis ce gars n'est pas tout seul.
Tu te retrouves avec une usine à gaz avec pleins de modules (dont certains lance la cafetière au début de la compil si la durée estimé est supérieur à cinq minutes )
Et quelqu'un va râler pour dire que c'est trop compliqué, et lancer un nouveau projet de builder simple...
Si on part du principe que les autotools ne sont pas protable, alors aucun builder n'est portable.
aucun ne marche sous windows sans devoir installer des outils tiers. (ici bash & make)
Pour avoir utilisé les autotools, le truc tu dis ce qui te manque, ce qui est nettement plus parlant que 'truc.h not found', ou des erreurs lors de l'édition de lien.
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: robuste ?
Posté par Troy McClure (site web personnel) . Évalué à 10.
Sauf quand tu dois farfouiller dans le config.log pour comprendre qu'est ce qui lui pose vraiment probleme avec la libtruc après qu'il t'ait dit "checking for truc.. no". Et sauf quand tu as installé la libtruc qui manque et que le configure persiste a ne pas la voir et que tu passes des heures à chercher la bonne manière de lui faire ajouter le bon flag qui va bien sur le bon fichier.
Accessoirement, je n'ai pas de probleme avec les usines a gaz quand elles savent faire des trucs puissants et compliqués. Le probleme des autotools c'est que c'est une usine à gaz , mais sans etre puissant ou portable, c'est juste mauvais, lent, et fragile. Ainsi que mal documenté.
[^] # Re: robuste ?
Posté par mota (site web personnel) . Évalué à 8.
Je peux t'en citer un très rapidement, je pense qu'il doit y en avoir plusieurs autres: CMake
[^] # Re: robuste ?
Posté par fearan . Évalué à 4.
j'ai du mal me faire comprendre, quand j'ai dis sans installer d'outils tiers, ou alors il y a un truc que j'ignore sous windows.
à partir du moment où il faut cliquer sur un setup.exe, dezipper une archive, ce n'est pas plus ou moins portable, c'est juste équivalent, avec plus ou moins de galère.
Tu peux très bien avoir un packaging des autotools contenu dans une archive, le fait qu'il y ait 1, 2, 10, 1000000 exécutables dans l'archive ne change rien : il faut installer un système de build sur la machine.
Cela dit, cmake est nettement plus facile à utiliser que les autotools.
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: robuste ?
Posté par GeneralZod . Évalué à 4.
CMake est relativement self-contained: compilateur C++, puis selon les fonctionnalités souhaités: zlib, libarchive, curl, curses, xmlrpc-c. Ensuite, ça te génére un projet qui utilises les outils "natifs" (nmake, jom, borland, mingw, cygwin sous windows)
Pour scons, waf, t'as juste besoin d'un interpréteur python classique, ce qui n'a rien d'extravagant pour des builders écrit en ce langage.
Autotools, ça a besoin: un shell posix (voire bash à cause des bashisms), perl, m4, pkg-config, et pas mal d'emmerdes parce que autotools a été fait pour les vrais systèmes d'exploitations et pas les jouets de micromou.
[^] # Re: robuste ?
Posté par barmic . Évalué à 3.
maven, il te faut Java (pour un projet Java on va dire que c'est le minimum de toute manière) et maven qui s'installe en décompressant un zip.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: robuste ?
Posté par El Titi . Évalué à 3.
Oui en même temps pour un truc qui t'impose ta façon de travailler au lieu de s'adapter à un contexte donné c'est facile.
Note que je ne critique pas le fait de travailler de manière standard, juste que j'imagine les contorsions qu'il faudrait pour implémenter la chaîne de production d'une distrib Linux.
[^] # Re: robuste ?
Posté par Adrien . Évalué à 5.
« Pour moi il est vraiment temps que le libre se trouve un autre outil de build que l'infernale combinaison autoconf/automake/libtool/make »
As-tu essayé cmake ou Rake ? Il me semble que ces deux outils répondent assez au besoin d'avoir un truc simple et relativement portable et assez cohérent.
[^] # Re: robuste ?
Posté par Troy McClure (site web personnel) . Évalué à 3.
perso j'ai adopté scons mais je pense que n'importe quel outil sera meilleur que autoconf/make, que ce soit cmake, waf , rake ... Il faudrait juste arreter d'utiliser par default, pour chaque nouveau projet libre , les autotools.
[^] # Re: robuste ?
Posté par Mathieu Segaud . Évalué à 1.
bah au moins, autotools/autocrotte ne te plombe pas la cross-compilation comme cmake le fait régulièrement
[^] # Re: robuste ?
Posté par oinkoink_daotter . Évalué à 4.
Mwai, enfin, autotruc+pkg-config en cross compil, ça peut faire des choses très très bizarres (et qui gauffrent)
# Exemples non visibles
Posté par sifu . Évalué à 3.
J'ai l'impression que certains exemples sont passés à la trappe (cf. Gradle).
[^] # Re: Exemples non visibles
Posté par barmic . Évalué à 2.
Arg ! J'avais tout relu pourtant !
L'exemple était :
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
# coquilles
Posté par Goffi (site web personnel, Mastodon) . Évalué à 1.
s/tryptique/triptyque/
Et il manque l'exemple pour Gradle.
Sinon c'est intéressant :)
[^] # Re: coquilles
Posté par barmic . Évalué à 3.
En effet, c'est le deuxième point des avantages des autotools.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: coquilles
Posté par fero14041 . Évalué à 5.
Quelques petites coquilles récoltées:
Introduction
Un « builder » ?
Le vénérable Make
Le peu connu OMake
Un challenger scons
Celui de Google : Ninja
L'usine à build Apache Maven
Les autres (buildr, gradle…)
CMake
Les autotools
[^] # Re: coquilles
Posté par Naha (site web personnel) . Évalué à 1.
Une autre (deux en fait) : « éxecute une parallèle » —> « exécute en parallèle ».
# Un oublie de taille...
Posté par GNU_Eths . Évalué à 4.
Même si il a été cité: Waf, qui est un outil qui commence à être connu notamment pour sa gestion quasi-parfaite du langage Vala.
[^] # Re: Un oublie de taille...
Posté par barmic . Évalué à 2.
Qu'entends-tu par là ? Il intègre des règles pour transformer les *.vala en *.c ?
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Un oublie de taille...
Posté par GNU_Eths . Évalué à 1.
Je n'est pas utilisé le bon mot j'aurais dû dire "simple".
Mais oui, ça fait partie de l'une des fonctionnalité simple et sympathique de Waf.
[^] # Re: Un oublie de taille...
Posté par stopspam . Évalué à 3.
Le projet Samba4 y est passé l'année dernière. Il y a 2 ou 3 billets intéressants de l'un des 2 gros contributeurs.
# Inconvénient des autotools
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 9.
D'accord pour la complexité d'utilisation, mais ces dépendances, c'est une blague : les autotools sont faits pour que, côté utilisateur, il n'y ait qu'une dépendance au shell. Côté auteur, il faut un shell, m4 et Perl en effet, mais il semble évident que, pour utiliser un système de construction, il faut l'avoir installé, ou du moins ce qui le constitue, non ?
[^] # Re: Inconvénient des autotools
Posté par barmic . Évalué à 4.
Oui mais face à OMake ou ninja qui ont un nombre de dépendance extrêmement faible même coté développeur surtout qu'un bourne shell et m4 sous Windows c'est pas ce qu'il y a de plus simple.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Inconvénient des autotools
Posté par Guillaume Rousse (site web personnel) . Évalué à 8.
Les autotools ne sont clairement pas fait pour le monde Windows (hormis Cygwin), ils sont plutôt fait le monde Unix (au sens large), qui étaient la cible privilégiée des outils GNUs. Je doute qu'il y aie beaucoup d'alternative qui gère le cas des bibliothèques partagées sous HPUX, par exemple. Le fait qu'aujourd'hui on préfère en général cibler le triptyque macos/linux/windows, et cibler autre chose que des adeptes de la ligne de commande rend certainement l'outil inadapté aux objectifs de beaucoup de monde, mais absolument pas un outil dépassé. Jusqu'à preuve du contraire, la quasi-totalité des constituants de base d'un système linux (glibc, gcc, etc...) l'utilisent encore, par exemple.
Et je rejoins ce que disait le commentaire précédent, il n'y a aucune dépendance pour l'utilisateur final excepté le shell bourne (requis par POSIX) et la commande make. m4, comme perl et consort, c'est sur la machine du développeur que c'est nécessaire.
Parmi les autres approximations de l'article:
- il y a une commande fournie avec les autotools (autoreconf) qui remplace avantageusement les scripts autogen.sh fait maison
- il y a eu effectivement des incompatibilités entre versions, particulièrement la version 1.4 qui date de l'an 2000, et celles qui ont suivi, mais rien d'exceptionnel par rapport à d'autres outils
Le vrai point noir, ca reste la documentation, et le manque d'homogénéité des composants.
[^] # Re: Inconvénient des autotools
Posté par Troy McClure (site web personnel) . Évalué à 3.
Mon experience avec les autotools, qui remonte a quelques années certes mais j'en ai bouffé pas mal, c'est quand même que ça ne marche bien que dans des environnements 100% gnu. Sous hpux , irix ou dec osf il y avait toujours un truc qui foirait, en particulier quand libtool entrait en jeu , et globalement c'était bien plus simple d'écrire du platform-specifique en dur dans les makefiles pour chaque plateforme plutot que d'essayer de rescotcher les bouts d'autotools qui se detachaient.
[^] # Re: Inconvénient des autotools
Posté par Sytoka Modon (site web personnel) . Évalué à 4.
D'un autre coté, si cela peux les forces à mettre les outils GNU, ce serait pas plus mal. J'ai fait un peu de HP-UX et de AIX et c'est vraiment la misère... C'est pas croyable d'avoir payé ces machines aussi chères à l'époque pour avoir un shell aussi pourrit. N'importe quel GNU/Linux est plus agréable.
D'ailleurs, pourquoi ils n'installent pas les outils GNU ?
[^] # Re: Inconvénient des autotools
Posté par Albert_ . Évalué à 3.
Ils ont peur d'attraper une maladie contagieuse.
[^] # Re: Inconvénient des autotools
Posté par El Titi . Évalué à 3.
Non rassure toi, la phobie n'est pas contagieuse. Tu devrais le savoir.
[^] # Re: Inconvénient des autotools
Posté par Albert_ . Évalué à 2.
Je parlais du Cancer :) (Ben oui faut pas demander a des gars de Microsoft de dire des trucs intelligents et corrects).
[^] # Re: Inconvénient des autotools
Posté par Sébastien Wilmet . Évalué à 3.
Solaris, HP-UX, AIX, c'est du UNIX, mais c'est aussi du proprio…
Par exemple Solaris est livré avec le compilateur Sun Studio. Ça peut être intéressant de l'utiliser sur une machine SPARC pcq Sun Studio contient des options de compilations spécifiques à ce processeur qui n'existent pas dans GCC.
Pourquoi ils ne contribuent pas plutôt à GCC ou LLVM/Clang ? Ça je n'en sais rien. Peut-être que si Oracle n'avait pas racheté Sun, ce serait le cas, vu que Sun était plus « libre-friendly » (OpenSolaris, …).
Donc le fait qu'ils n'installent pas les outils GNU est sans doute dû au fait que ces OS sont quand même propriétaire, et qu'ils ont développé depuis de nombreuses années des logiciels maisons qui s'intègrent bien à leur OS.
[^] # Re: Inconvénient des autotools
Posté par Sytoka Modon (site web personnel) . Évalué à 3.
Je dirais plutôt qu'ils se sont endormis sur leur shell ;-) On avait installé bash à l'époque sur ces machines et il marchait très bien et bien mieux que leur shell de base...
[^] # Re: Inconvénient des autotools
Posté par Marotte ⛧ . Évalué à 1.
J'ai ouïe dire que ksh est plus rapide que bash. La rapidité d'exécution n'est pas le seul critère mais il compte.
[^] # Re: Inconvénient des autotools
Posté par Sytoka Modon (site web personnel) . Évalué à 4.
Je parle du shell interactif et non du shell qui sers dans les script. Par exemple, debian utilise maintenant dash dans les script par défaut et non plus bash. Le shell de l'utilisateur root reste bash.
De mémoire, c'était plutôt sh ou csh de base donc sans gestion de l'historique pour revenir aux dernières commandes... Bref, pour être honnête, ils s'étaient pas foulés sur cette question.
[^] # Re: Inconvénient des autotools
Posté par GeneralZod . Évalué à 4.
Pour avoir rédigé cette partie, je ne suis pas d'accord sur ce que tu qualifies d'approximations.
Pouvoir regénérer correctement le système de construction avec autoreconf est malheureusement l'exception et non pas la règle. Et c'est l'empaqueteur qui te parle. Et même quand ça passe, ça ne garantit absolument pas l'absence d'effets de bords au point que certains en déconseillent l'utilisation ou bien de s'en servir comme base pour patcher directement le système de construction.
http://www.redhat.com/archives/rhl-devel-list/2008-October/msg00866.html
Pourquoi la majorité des distributions GNU/Linux fournissent encore autoconf 2.13 (sorti en 1999) ? Pourquoi Debian maintient 4 version d'automake, Fedora 5 ? (non, ce n'est pas par plaisir) Même si le nombre décroit petit à petit, tu as encore des paquets qui ont encore besoin de ces versions (autoreconf et autogen.sh ne peuvent pas grand chose la plupart du temps, patcher reviendrait à remettre à plat le système de construction). Ok, ça s'améliore, mais on est encore loin des autres outils en ce domaine.
Certes, c'est symptomatique d'une mauvaise utilisation d'autotools, mais un développeur qui maitrise autotools (malgré qu'il soit le plus utilisé et le plus avancé parmi ceux discutés), ça ne court pas les rues.
La documentation d'autotools est certes fouillie, mais relativement complète, il y a d'excellents tutoriaux (celui d'Alexandre Duret-Lutz, l'autobook, les tutoriaux d'openismus qui présente les bases et l'utilisation non-récursive). Quant au manque d'homogénéité, c'est defective by design, à moins de réécrire en grande partie autotools, ou de se restreindre à un sous-ensemble, on ne peut faire mieux.
Le vrai problème c'est qu'autotools est trop complexe pour le développeur "moyen" (ou que le développeur "moyen" soit incapable d'appréhender celui-ci par manque de temps ou par incapacité mentale), une meilleure documentation ne changera pas significativement cet état de fait (avec les ressources sus-mentionnées, on doit pouvoir arriver à un niveau de compétences plus que suffisant pour utiliser quotidiennement autotools sans être Fabrice Bellard)
[^] # Re: Inconvénient des autotools
Posté par serge_sans_paille (site web personnel) . Évalué à 3.
Curieux, il me semble que l'empaqueteur se base sur le tar.gz, et donc plus besoin de tout re-générer ? À moins qu'il y ait besoin de patcher le système de build et donc de re-générer ?
[^] # Re: Inconvénient des autotools
Posté par GeneralZod . Évalué à 3.
La plupart du temps, c'est dû au fait que la tarball a été généré avec une version plus ancienne de la chaine autotools (soit parce que c'est qu'utilise le mainteneur upstream, soit parce que cette dernière a été mise à jour depuis la dernière release du projet).
Ça arrive fréquemment lors des cycles de développement, où la chaine autotools est très récente (ça permet de tester celle-ci, et de détecter quelques gruikeries également que l'on remonte en upstream). Même avec des projets très réactifs et avec un très bon niveau d'expertise avec autotools (ie: GNOME), il m'arrive parfois de devoir regénérer la chaine temporairement en attendant la prochaine release.
[^] # Re: Inconvénient des autotools
Posté par GeneralZod . Évalué à 4.
Pour ma part, j'estime que l'article est destiné à un public de développeurs, l'utilisateur s'en branle royalement du système de construction (la plupart du temps, il récupérera un paquet binaire soit fourni par le mainteneur, soit par sa distro). De mon point de vue, la plupart des outils présentés se valent plus ou moins côté utilisateur.
Je remarquerais que parmis les utilitaires non-java, cmake est le seul à proposer nativement la génération de paquets binaires sous différents formats. Et j'en profite pour saluer le fabuleux travail d'Eric Noulard sur CPack, sans qui CPack aurait été déprécié et inutilisable depuis longtemps.
# pour ruby : rake
Posté par Adrien . Évalué à 5.
Un petit oubli : du côté de ruby rake qui est pas mal utilisé il me semble.
Le Rakefile étant en ruby, la syntaxe est appréciable, surtout face aux Makefile…
Peut-être que des gens l'utilisent ? Ça m'intéresserais d'avoir des retours dessus.
# Les autotools n’impliquent pas GNU make
Posté par gouttegd . Évalué à 4.
Non, à ma connaissance automake génère des Makefile n’utilisant aucune extension propre à GNU make, et qui devraient être utilisables avec à peu près n’importe quel make en circulation (sauf sans doute nmake sous Windows).
[^] # Re: Les autotools n’impliquent pas GNU make
Posté par GeneralZod . Évalué à 1.
gnu make fait formellement parti de la suite de construction GNU (d'ailleurs, j'aurais pu rajouter gnulib) [1], même si autotools est capable de générer un Makefile compatible avec bsd make par exemple.
[1] dans certains cas très précis, il est conseillé de recommander l'utilisation de GNU Make
http://www.gnu.org/software/automake/manual/automake.html#Simple-Tests-using-parallel_002dtests
# Sortie de GSRC
Posté par psychoslave__ (site web personnel) . Évalué à 3.
À noter, là sortie de GSRC, un outil qui permet d'installer les dernières versions officiels des outils gnu.
[^] # Re: Sortie de GSRC
Posté par CrEv (site web personnel) . Évalué à 5.
Juste parce que c'est déjà passé, autant placer le bon lien interne qui va bien
https://linuxfr.org/news/le-projet-gnu-senrichit-dun-gestionnaire-de-paquets
(mais en même temps, le but, comme le nom de l'article l'indique, est plutôt de faire un gestionnaire de paquet source, et non un outil de build)
# make
Posté par ymorin . Évalué à 10.
Heu, pas obligatoirement. Pour mon code source, les dépendances sont auto-calculées. C'est même plutôt simple :
Bon, d'accord, c'est un exemple simple. Mais il est possible de créer des dépendances dynamiques avec
make
.Un des très gros avantage de
make
sur tous les autresbuilders
, c'est qu'il fait partie de[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm)
, et que par conséquent il est disponible de base, ce qui n'est pas le cas des autresbuilders
.Aussi,
make
est généraliste. Il n'a aucune connaissance d'un quelconque langage d'entée. On peut tout traiter comme une source (eg. code source, image, video, document texte...) et comme sortie (eg. binaire, image, video, document HTML...).J'ai même le frontal de mon projet qui est un script
make
(unMakefile
exécutable, quoi).Hop,
Moi.
[^] # Re: make
Posté par barmic . Évalué à 1.
Pour le coté POSIX, la souplesse et le fait que c'est un langage nous sommes d'accord.
Je ne connaissais pas
patsubst
, mais le problème c'est que normalement il faut que cette recherche soit récursive.Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: make
Posté par Xaapyks . Évalué à 6.
Je crois que tu as raté le point important :
Et ça, ça te sort une liste dans un fichier de tous les headers ou autre include utilisés dans ton fichier source sous forme de règle make. Si tu l'inclues c'est gagné car si un des headers est plus récent que la source, on recompile les objets basés sur ce fichier source.
(Ca fait longtemps que j'y ai plus touché, mais en gros c'est ça)
[^] # Re: make
Posté par barmic . Évalué à 2.
Je comprends ! C'est intéressant, mais j'aurais alors une question en plus.
Si je comprends bien la Makefile au dessus va créer des fichiers *.deps qui sont au formats Makefile et qui sont inclus dans le Makefile par la directive
-include $(DEP)
. Mais cette dernière prends en compte dynamiquement les fichiers en question ?Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: make
Posté par ymorin . Évalué à 6.
En fait, il y a deux directoves d'inclusion :
Si
file1
est manquant, alorsmake
sort en erreur.Si
file2
est manquant, alorsmake
va chercher une règle de génération qui permet de l'obtenir. Si c'est possible, alorsmake
génèrefile2
, et re-parse leMakefile
. Si il n'y a pas de règle, alorsmake
sort en erreur.Et comme dans l'exemple on a une règle de génération, alors
make
va gérer ça proprement, puisque tous les fichiers à inclure dépendent des fichiers sources. Magique ! :-)Hop,
Moi.
[^] # Re: make
Posté par barmic . Évalué à 3.
Très intéressant. C'est exactement le genre de découvertes que j'espérais faire avec cette dépêche :)
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: make
Posté par Sytoka Modon (site web personnel) . Évalué à 6.
Je vois que tu ne connaissais ni patsubst ni include (avec -include et l'quivalent GNU sinclude), ni gcc -MM... Bref, tu ne connaissais pas make ! Ce n'est pas un critique mais une constatation.
Le problème des dépendances est un problème de compilateur car il faut savoir lire le langage pour le faire correctement. Tout compilateur devrait savoir écrire les règles de dépendances (comme gcc -MM).
Personnellement, j'utilise make car je le trouve souple et indépendant du langage. Tu l'étends avec tes macros, tes scripts... C'est pas un système à greffon qui t'impose son langage (et en plus ne parle que XML pour certain).
Bref, make, c'est quand même du bonheur même si parfois, c'est vrai qu'on s'arrache les cheveux sur un cas particulier. Les joies du deboguage ;-)
[^] # Re: make
Posté par barmic . Évalué à 3.
include si mais pour faire de l'inclusion bête et méchant. gcc -MM j'en avais entendu parlé mais comme je n'avais pas trouvé de vrais moyens de s'en servir, j'ai rapidement oublié. Pour ce qui est de patsubst, j'utilisais
${SRC:.c=.o}
.Je suis d'accord avec toi. J'adapterais cette solution pour convenir à LaTeX à grand coup de sed.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: make
Posté par Maxime (site web personnel) . Évalué à 3.
Pour compléter, il existe la commande makedepend : create dependencies in makefiles.
Par contre, je sais pas si ça apporte quelque chose comparé à gcc -MM...
Et je n'imagine même pas bosser sur un gros projet sans génération auto des dépendances...
# app, (b)jam
Posté par lmg HS (site web personnel) . Évalué à 4.
Il y a aussi moyen de rajouter
- aap (de Bram Moolenaar), assez similaire à scons dans mes souvenirs dans les grands principes de fonctionnement
- jam et bjam ; bjam est ce qui est utilisé par boost (.org)
# Et jam ???
Posté par fearan . Évalué à 3.
Récemment je suis tombé sur jam; mais bon je ne suis pas trop entré dans les détail vu que une fois jam compilé j'ai pu compiler le programme qui le nécessitait...
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: Et jam ???
Posté par GeneralZod . Évalué à 3.
Jam, oui mais lequel ?
Perforce Jam: l'original
Boost jam (bjam): utilisé principalement par Boost qui est en train de passer à CMake, il est à la base de Boost.Build (en gros une collection de règles pour le premier)
et une bonne dizaine de forks plus ou moins confidentiels.
La famille Jam se rapproche plutôt de make et de scons, il orchestre directement la phase de compilation. À partir de maintenant, je limiterais mes propos à Boost.jam (je n'ai jamais utilisé les autres): il est extensible (boost-build utilise python), il a une syntaxe simple inspiré de make, il gére nativement les variantes de compilation (avec CMake, c'est une horreur, autotools un peu moins), il a un support décent de la plupart des chaines de compilations, par contre, très peu de règles pour gérer les outils tiers/bibliothèques tierces (de mémoire: qt, zlib, gettext, doxygen, fop, xsltproc dans la distro, pour le reste, il y a une forte probabilité que tu doives écrire à la main les règles.)
Sinon, c'est plutôt rapide.
# Buildout
Posté par WaterCooled . Évalué à 7.
J'aimerais attirer votre attention sur un outil haut niveau développé en Python par la communauté Zope/Plone : Buildout.
Buildout est une sorte de Maven, mais agnostique de toute technologie ou langage particuliers. Il s'agit d'un outil de déploiement extrêmement puissant et efficace. A tel point que des éditeurs de Cloud Computing l'utilisent depuis quelques temps pour déployer des services : http://www.slapos.org/wiki/slapos.Why.Buildout.
Vous pouvez trouver plus d'informations sur http://buildout.org et sur la traduction française du didacticiel officiel : http://ccomb.free.fr/buildout/tutorial.fr.html
J'ai personnellement découvert cet outil il y a un peu plus d'un an, et j'ai maintenant du mal à m'en passer et/ou à trouver une alternative intéressante.
# Et premake ???
Posté par Ivan Le Lann . Évalué à 3.
Je tiens à citer premake que je trouve d'une grande simplicité.
# Avantages CMake
Posté par moi1392 . Évalué à 5.
Dans les avantages de CMake, il y en a un qui est très important pour mes cas d'utilisation et qui me semble important de préciser, c'est la construction du système de compilation et la compilation elle même hors sources.
Je peux, avec la même arborescence de sources créer 4 dossiers de compilation avec des options différentes (debug/optim/cross toolchain/...) et tout est généré dans ces dossier.
Si bien qu'un "make distclean" (ou un truc du genre) se résume en un "rm -rf build_dir"
[^] # Re: Avantages CMake
Posté par imalip . Évalué à 3.
Euh, ca ce n'est pas specifique a CMake, les autotools le font tres bien aussi.
[^] # Re: Avantages CMake
Posté par moi1392 . Évalué à 2.
j'ai pas dit que c'était spécifique, j'ai dit que c'était un point fort.
d'ailleurs, c'est dans les avantages de scons aussi :
Et pour les autotools, quand je m'en sers, mais c'est peut-être moi qui ne sait pas m'en servir, j'ai des fichiers générés dans les sources moi (des Makefile ou autre fichiers intermédiaires du configure)
[^] # Re: Avantages CMake
Posté par ymorin . Évalué à 3.
Les
auto-tools
savent très bien générer desMakefiles
pour la compilationout-of-tree
. Il suffit de faire :Alors, tous les fichiers générés seront dans le répertoire
build-package
, et le répertoire des sources ne sera pas modifié.Si le
make
disponible connait lesVPATH
(GNU make
), alors lesMakefiles
générés utiliseront cette fonctionnalité ; sinon, lesMakefiles
utiliseront des contournements pour simuler lesVPATH
.Cependant, les
auto-tools
génèrent effectivement des fichiers dans le répertoire sources, mais uniquement dans la phase pré-empaquetage. C'est à ce moment-là que les fichiersconfigure
,Makefile.in
(et autres) sont générés. Mais ces fichiers font partie de la livraison.Enfin, je ne suis pas un très grand fan des
auto-tools
, car ils ne savent pas très bien gérer la compilation croisée la plupart du temps, sauf si le développeur a fait bien attention. La faute en incombe pour partie (~75%) auxauto-tools
, et pour partie au développeur (25%).Hop,
Moi.
[^] # Re: Avantages CMake
Posté par GeneralZod . Évalué à 4.
Autotools sait faire, sauf que peu de développeurs savent s'en servir correctement. Le résultat c'est que la compilation out-of-source est dysfonctionnelle sur la plupart des projets gérer par autotools.
Lorsque je dirige des projets sous autotools, j'interdis formellement aux développeurs (sauf ceux qui ont démontrés leurs compétences à le faire) de modifier le système de construction sinon c'est le bordel assuré (scripts mal branlés, artefacts de compilations oubliés, mal testé, etc ...). Avec CMake, je peux me permettre un peu plus de souplesse à condition de fixer quelques guidelines et quelques explications (principalement, parce que la doc cmake -bouquin compris- est à chier, certes moins que celle d'autotools)
Avec autotools, faut introduire plusieurs langages (perl, shell, m4), expliquer les différences entre chaque version, l'habituer à un environnement de développement parfois non familier (pour les terreux sous windows -l'horreur-). Bref, on perds du temps, le résultat est à chier, au final, soit j'interdis aux bras cassés de toucher au système de construction, soit j'impose un système de construction plus "simple" selon le vécu de l'équipe (CMake, make, scons, etc ...)
[^] # Re: Avantages CMake
Posté par serge_sans_paille (site web personnel) . Évalué à 2.
Alors qu'un joli
make distcheck
va vérifier tout seul que la compilation out-of-the-source fonctionne bien (et pleins d'autres choses très agréables d'ailleurs) :(# templates avec make
Posté par jseb . Évalué à 5.
Quand on commence à utiliser make, on pense qu'il faut écrire toutes les cibles à la main. En particulier quand on doit générer plusieurs exécutables ou librairies (ou autre, qui ne soit pas une simple substitution de patterns du genre .c vers .o ).
Plutôt que d'écrire une rêgle à chaque fois, on peut utiliser la commande eval qui permet d'écrire des templates
Avec ce système, chaque construction peut s'écrire avec une variable, contenant les sources impliquées (il faudra parfois en ajouter d'autres, contenant par exemple les libs pour le link, ou d'éventuelles options spécifiques pour le compilateur).
C'est très bien expliqué ici:
http://www.gnu.org/software/make/manual/html_node/Eval-Function.html#Eval-Function
J'ajoute quand même une remarque à la doc de make, cela m'ayant posé problème au départ:
Dans les templates, les seules variables à déréférencer sont les vars qu'on passe en paramètre depuis le "eval": $(1) et suivants.
Les autres variables doivent être protégées avec un '$' supplémentaire.
Donc on écrit directement $(1) pour les paramètres du template.
Par contre, les variables qui servent à la rêgle vont s'écrire ainsi: $$(CXX)
Discussions en français sur la création de jeux videos : IRC libera / #gamedev-fr
[^] # Re: templates avec make
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 6.
Oh bon sang ! C'est ça que je n'ai jamais aimé avec make, dès qu'on sort des cas simple où on écrit les règles à la main, ou à la rigueur avec des règles génériques : ça devient absolument illisible. Plus abscons, tu meurs.
[^] # Re: templates avec make
Posté par jseb . Évalué à 2.
Je n'ai pas dit que c'était lisible :)
Mais ça ne s'écrit qu'une seule fois, et ça peut servir dans les projets qui construisent plein d'exécutables (dans mon cas, il s'agit de plein de petites libs et des exécutables associés pour les tests unitaires).
Dans le post ci-dessus, j'ai oublié de préciser que peur débugger «eval», c'est à dire avoir une sortie claire des rêgles qui vont être générées, il faut utiliser «info» (en lieu et place de «eval»). C'est la commande siamoise indispensable pour s'y retrouver.
Discussions en français sur la création de jeux videos : IRC libera / #gamedev-fr
[^] # Re: templates avec make
Posté par Mr. Magne . Évalué à 4.
Oui on peut faire plein de bonnes choses avec GNU make, par contre ça devient du GNU make et plus du make... donc la portabilité en prends un coup, non ?
Ceci dit si quelqu'un utilise ou connait des utilisations d'autres implémentations de make, je suis preneur d'infos. De même si quelqu'un connait une bonne doc qui distingue les extensions GNU du standard. (C'est un peu comme pour le bash, difficile de savoir ce qui n'est pas du sh)
[^] # Re: templates avec make
Posté par GeneralZod . Évalué à 3.
C'est ça le standard: http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html (ce qui n'est pas listé dedans, est une extension vendeur)
Le manuel GNU explique quelles sont les innovations propre à GNU Make: http://www.gnu.org/software/make/manual/make.html#Features
Pas trop de documentation à ce sujet pour bsd make (enfin, la famille dérivée de pmake, les utilitaires make ont pas mal divergés selon les *BSD)
Le guide de référence: http://www.freebsd.org/doc/en/books/pmake/index.html (plus lire la page man fourni par ta distro *BSD)
Le shell Posix s'inspire principalement de ksh88 (avec quelques bizarreries comme echo/print, la syntaxe des fonctions etc ...)
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
[^] # Re: templates avec make
Posté par Mr. Magne . Évalué à 1.
Merci de ces liens très instructifs (je suis un peu déçu d'avoir loupé le deuxième lors de mes longues errances sur la page de GNU make...). Ceci dit, %, $^ et define sont quand même assez essentiels pour faire un makefile réutilisable, et sont donc spécifiques à GNU make... donc quitte à ne plus être standard, pourquoi pas un outil un peu moins abscons du genre cmake (parce que le debug de makefile plein de templates, c'est quand même la galère)
Et pour le dernier, ça m'empêchera peut-être d'écrire les bashismes que me suggéraient mes man bash
# Le grand absent: qmake
Posté par devnewton 🍺 (site web personnel) . Évalué à 5.
qmake, outil créé par les développeurs de Qt, qui sert de générateur de makefile et de format de projet pour l'IDE Qt Creator.
Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.
[^] # Re: Le grand absent: qmake
Posté par claudex . Évalué à 3.
Si je me souviens bien, il va être abandonné par Qt (qui va migrer sur cmake).
« Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche
[^] # Re: Le grand absent: qmake
Posté par GeneralZod . Évalué à 2.
Même si qmake est une option de premier choix dans le développement d'une application Qt, il a quelques inconvénients majeurs:
pratiquement inutilisable pour un projet non-Qt
très limité (pas de phase de configuration, pas de support de la compilation distribuée, support limité de la cross-compilation, pas de phase d'installation sauf à hardcoder les chemins)
peu ou pas extensible
très très mal documenté.
n'évolue plus, Nokia songe depuis quelques années à le faire passer à la trappe
http://labs.qt.nokia.com/2009/10/12/to-make-or-not-to-make-qmake-and-beyond/
http://labs.qt.nokia.com/2009/10/14/to-make-or-not-to-make-qmake-and-beyond-redux/
Par ailleurs, QtCreator a un excellent support de CMake et Openismus finance le développement d'un greffon autotools (et a de bonnes chances d'intégrer prochainement la branche principale).
http://psconboard.blogspot.com/2011/09/autotools-project-manager-part-3-merge.html
http://gitorious.org/qtcreator-autotools-plugin
Pour des projets de taille moyenne ou ayant des dépendances non-Qt, il est préférable de passer un système de construction plus avancés comme CMake ou autotools qui offrent tout deux un excellent support du framework.
# Y'a gprbuild aussi
Posté par pini . Évalué à 4.
Puisqu'on en est à rajouter les outils qui ne sont pas dans la dépêche, j'en profite pour citer gprbuild. C'est un outil de build libre de la société AdaCore, qui fournit aussi gnat, un compilateur Ada libre.
gprbuild est une sorte d'extension du système de build de gnat qui permet de gérer des projets écrits dans de multiples langages (y compris des mélanges). Bon ok, c'est fortement orienté sur Ada et C, mais on peut très bien envisager d'autres langages.
Son principal avantage selon moi est sa simplicité enfantine : on donne les fichiers sources (ou les répertoires qui les contiennent), le nom et le type de projet (executable ou bibliothèque) et les flags à utiliser pour les étapes intermédiaires du build. Le reste juste marche tout seul.
Côté "inconvénient", il faut crée un fichier de description pour chaque cible du build (i.e. chaque exécutable et chaque bibliothèque), mais comme ceux-ci sont vraiment petits (typiquement moins de 20 lignes, espacement compris) et qu'on peut crée des fichiers qui servent d'agrégat, ce n'est pas très génant même pour de gros projets.
Bref, un vraiment bon outil.
[^] # Re: Y'a gprbuild aussi
Posté par barmic . Évalué à 3.
Ta description m'a intéressée et j'ai voulu essayé. Je l'ai installé via apt-get sans problème puis j'ai parcouru très vite fait cette doc (j'ai surtout vite fait regardé les exemples) : http://www.adacore.com/wp-content/files/auto_update/gprbuild-docs/html/gprbuild_ug.html
J'ai donc tenté avec un petit programme d'exemple de 3 fichiers, j'ai écris un build.gpr ainsi :
un petit gprbuild et pouf j'ai l'éxécutable !
J'ai du y passé 10 à 20 minutes grand max. Cet outil est vraiment pas mal ! Pas très flexible, mais ce qu'il fait, il le fait bien. Je le garde dans ma besace :D
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
# OMake, c'est bien!
Posté par small_duck (site web personnel) . Évalué à 3.
Pour un projet C++, OMake est mon préféré. J'ai bataillé avec gmake et CMake, et certaines constructions sont bien plus faciles à obtenir avec OMake. Un exemple de dépendances courant est par exemple de devoir d'abord compiler un petit programme, lequel va générer du code, pour ensuite compiler le plus gros programme.
Avec gmake et CMake, c'est un cauchemar et la gestion des dépendances devient très complexe, au point qu'il devient généralement plus aisé d'avoir deux cibles, une pour la génération, et une pour le programme principal. De plus, même si le code généré demeure inchangé, la date du fichier, elle, a changé, et on se retrouve avec des recompilations monstres qu'il faut dompter à coup de copies temporaires crades.
Avec OMake, qui gère explicitement le code généré, et se base sur le contenu du fichier pour détecter les modifications, c'est fait en deux coups de cuiller à pot, et les compilations sont minimales mais correctes. L'on regrettera peut-être la difficulté de faire des compilations "hors sources" (les mount virtuels aident un petit peu), et la relative difficulté à utiliser des commandes un peu plus complexes, la petite taille de la communauté n'aidant pas. Par exemple, le support des en-têtes pré-compilées requiert un bidouillage des règles initiales qui est probablement simple, mais absolument pas évident.
# Phing
Posté par Nicolas (site web personnel) . Évalué à 2.
Il manque Phing dans la liste des outils de constructions. Phing est basé sur Ant mais écrit en PHP au lieu de java. Il est par exemple utilisé dans les tâches symfony (en version 1).
http://phing.info/
# Simple Build Tool
Posté par lendemain . Évalué à 3.
Juste pour être encore plus exhaustif je rajoute Simple build tool.
C'est un outil de gestion et compilation de projet scala.
https://github.com/harrah/xsbt/wiki
# redo : minimaliste, correct et unixien
Posté par judicael . Évalué à 2.
redo (cf article de Bruno Michel du 11/1/2011) est un outil
Le concept se comprend en quelques minutes ou quelques heures, il faut parfois un peu de pratique ensuite pour trouver comment faire bien ce qu'on faisait (mal) avec make, mais globalement, ça marche très bien. Je l'ai adopté depuis quelques mois et j'en suis très content...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.