Nous utilisons un système GNU Make non récursif dans l'entreprise pour laquelle je travaille. Il est basé sur l'article de Miller et surtout sur le lien "Implementing non-recursive make" que vous avez donné. Nous avons réussi à affiner le code de Bergen pour en faire un système où il n'y a pas du tout de "boiler plate" dans les makefiles des sous-répertoires. Dans l'ensemble, cela fonctionne bien, et c'est bien mieux que notre système précédent (une chose récursive faite avec GNU Automake).
Nous prenons en charge tous les "principaux" systèmes d'exploitation existants (sur le plan commercial) : AIX, HP-UX, Linux, OS X, Solaris, Windows, et même le mainframe AS/400. Nous compilons le même code pour tous ces systèmes, les parties dépendantes de la plate-forme étant isolées dans des bibliothèques.
Il y a plus de deux millions de lignes de code C dans notre arbre, dans environ 2000 sous-répertoires et 20000 fichiers. Nous avons sérieusement envisagé d'utiliser SCons, mais nous n'avons pas réussi à le faire fonctionner assez rapidement. Sur les systèmes les plus lents, Python utilisait quelques dizaines de secondes pour analyser les fichiers SCons, alors que GNU Make faisait la même chose en une seconde environ. C'était il y a environ trois ans, donc les choses peuvent avoir changé depuis. Notez que nous conservons généralement le code source sur un partage NFS/CIFS et que nous construisons le code source de l'application même sur de multiples plateformes. Cela signifie qu'il est encore plus lent pour l'outil de construction d'analyser l'arbre source pour les changements.
Notre système non récursif GNU Make n'est pas sans problèmes. Voici quelques-uns des plus gros obstacles que vous pouvez vous attendre à rencontrer :
- Le rendre portable, notamment sous Windows, représente un travail considérable.
- Bien que GNU Make soit un langage de programmation fonctionnelle presque utilisable, il n'est pas adapté à la programmation en grand. En particulier, il n'y a pas d'espaces de noms, de modules, ou quoi que ce soit d'autre pour vous aider à isoler les éléments les uns des autres. Cela peut poser des problèmes, mais pas autant qu'on pourrait le penser.
Les principaux avantages par rapport à notre ancien système de makefile récursif sont les suivants :
- C'est rapide . Il faut environ deux secondes pour vérifier toute l'arborescence (2 000 répertoires, 20 000 fichiers) et soit décider qu'elle est à jour, soit lancer la compilation. L'ancien système récursif prendrait plus d'une minute pour ne rien faire.
- Il gère correctement les dépendances. Notre ancien système se basait sur l'ordre de construction des sous-répertoires, etc. Comme on pouvait s'y attendre à la lecture de l'article de Miller, traiter l'ensemble de l'arbre comme une entité unique est vraiment la bonne façon d'aborder ce problème.
- Il est portable sur tous les systèmes que nous prenons en charge, après tout le travail que nous y avons consacré. C'est plutôt cool.
- Le système d'abstraction nous permet d'écrire des makefiles très concis. Un sous-répertoire typique qui définit juste une bibliothèque ne comporte que deux lignes. Une ligne donne le nom de la bibliothèque et l'autre liste les bibliothèques dont celle-ci dépend.
En ce qui concerne le dernier point de la liste ci-dessus. Nous avons fini par implémenter une sorte d'extension de macro dans le système de construction. Les makefiles des sous-répertoires listent les programmes, les sous-répertoires, les bibliothèques et autres choses courantes dans des variables comme PROGRAMS, SUBDIRS, LIBS. Ensuite, chacune de ces variables est développée en "vraies" règles GNU Make. Cela nous permet d'éviter la plupart des problèmes liés aux espaces de noms. Par exemple, dans notre système, il est possible d'avoir plusieurs fichiers sources avec le même nom, il n'y a aucun problème.
En tout cas, cela a fini par représenter beaucoup de travail. Si vous pouvez faire fonctionner SCons ou un système similaire pour votre code, je vous conseille de le faire en premier.
1 votes
Au cas où cela serait utile à quelqu'un : Le lien vers l'article "Implementing non-recursive make" dans la question est maintenant 404s, mais l'article peut être trouvé à ce que je pense être le nouveau site web de l'auteur .
0 votes
Oh, et il semble este est peut-être un meilleur endroit pour trouver "Recursive Make Considered Harmful".
0 votes
@GarethMcCaughan : Merci d'avoir trouvé ces liens ! Je les ai édités dans le message. (Par curiosité, cela aurait-il aidé si la fonction d'édition était plus visible ou êtes-vous réticent à modifier les messages des autres ? J'essaie de me faire une idée de la façon dont nous pourrions améliorer le site. Danger de le travail ;-)
0 votes
Heh. En fait, j'ai oublié que j'avais assez de représentants sur SO pour faire ça ici. Je n'ai aucun problème à éditer les messages des autres, et je suis mod sur un autre site Stack Exchange. Mes excuses pour avoir fait la chose stupide plutôt que la chose raisonnable.
0 votes
@GarethMcCaughan : Pas de problème ! J'ai juste réfléchi à la raison pour laquelle l'édition n'est pas utilisée parfois. (Et je n'avais pas remarqué que vous étiez un mod ! Maintenant je suis embarrassé ;-)
0 votes
J'essaie de faire ceci à nouveau y cette page n'apparaissait pas dans les résultats. En particulier, constructions multi-archs est très utile pour de nombreux projets et doit s'accrocher à la structure non récursive.