Que faites-vous pendant la compilation de votre code? Tirez sur Hackaday? Vérifiez la valeur nette d’Elon Musk? Recherchez le prix d’un PC plus rapide? Ou vous demandez-vous ce qui prend si longtemps et décidez de changer votre système de construction?

Montez à bord pour quelques réflexions sur les Makefiles, les monopoles et la magie de Ninja. Je veux savoir ce que vous utilisez pour créer votre logiciel. Devrions-nous continuer à utiliser make en 2021? Sautez dans la mêlée dans les commentaires.

Qu’est-ce qu’un outil de construction?

Disons que vous avez écrit votre programme C ++, compilé avec g ++ ou clang ++ ou votre version de compilateur de la semaine, et vous vous êtes délecté de la magie des logiciels. La vie est belle. Une fois que vous avez développé un peu plus votre programme, en ajoutant du code à partir d’autres fichiers et bibliothèques, ces commandes g ++ commencent à devenir un peu longues, car vous devez relier beaucoup de choses différentes. De plus, vous devez recompiler chaque fichier à chaque fois, même si vous n’avez peut-être apporté qu’une petite modification à l’un d’entre eux.

Les gens ont réalisé assez tôt que c’était nul et que nous pouvions faire mieux. Ils ont commencé à créer des logiciels automatisés capables de suivre les dépendances de compilation, de suivre les bits de code modifiés depuis la dernière version et de combiner ces connaissances pour optimiser automatiquement ce qui est compilé – en garantissant que votre ordinateur effectue le minimum de travail possible.

Entrez: GNU Make

Encore un autre produit des célèbres Bell Labs, make a été écrit par [Stuart Feldman] en réponse à la frustration d’un collègue qui a perdu une matinée à déboguer un exécutable qui n’a pas été accidentellement mis à jour avec des modifications. Make résout les problèmes que j’ai mentionnés ci-dessus – il suit les dépendances entre les sources et les sorties, et exécute des commandes de compilation complexes pour vous. Depuis de nombreuses décennies, make est resté totalement omniprésent, et pour une bonne raison: les Makefiles sont incroyablement polyvalents et peuvent être utilisés pour tout, du développement Web aux systèmes embarqués de bas niveau. En fait, nous avons déjà écrit en détail sur la façon d’utiliser make pour le développement sur des micros AVR ou ARM. Make n’est pas limité au code non plus, vous pouvez l’utiliser pour suivre les dépendances et les modifications de tous les fichiers – pipelines de traitement d’image / audio automatisés, n’importe qui?

Mais, eh bien, il s’avère qu’écrire Makefiles n’est pas vraiment amusant. Vous n’ajoutez pas de fonctionnalités à votre projet, vous forcez simplement votre ordinateur à exécuter du code déjà écrit. Beaucoup de gens (l’auteur inclus) essaient de passer le moins de temps possible sur cette planète avec un Makefile ouvert dans leur éditeur, préférant souvent «emprunter» les modèles de travail des autres et en finir avec.

Le problème est que, une fois que les projets prennent de l’ampleur, les Makefiles se développent également. Pendant un certain temps, nous nous sommes entendus avec cela – après tout, écrire un Makefile super complexe que personne d’autre ne comprend vous fait vous sentir puissant et intelligent. Mais finalement, les gens ont eu une idée: et si nous pouvions avoir un logiciel pour générer des Makefiles pour nous?

CMake, Meson, Autotools et al

Oui, il existe un nombre important de projets concernés uniquement par la génération de fichiers de configuration destinés uniquement à être introduits dans d’autres logiciels. Cela semble stupide, non? Mais quand vous vous souvenez que les gens ont des ordinateurs différents, cela a en fait beaucoup de sens. Des outils comme CMake vous permet d’écrire une description de projet de haut niveau, puis générera automatiquement des fichiers de configuration pour les plates-formes de construction que vous souhaitez utiliser sur toute la ligne, telles que les solutions Makefiles ou Visual Studio. Pour cette raison, un très grand nombre de projets open source utilisent CMake ou des outils similaires, puisque vous pouvez insérer un système de construction de votre choix pour la dernière étape – tout le monde est heureux.

Sauf que c’est vraiment assez difficile de dire si tout le monde est content ou pas. Comme nous le savons, lorsque les gens passent du temps de manière désintéressée à écrire et à maintenir des logiciels open source de bonne qualité, d’autres sont très gentils avec eux en ligne, ne se plaignent pas et n’écrivent pas d’articles de blog passifs-agressifs sur 27 raisons pour lesquelles ils ne les utilisent plus . Je rigole!

Ce que je veux dire ici, c’est qu’il est difficile de juger de l’opinion populaire sur des logiciels omniprésents, car quelle que soit la qualité, au-delà d’une masse critique, il y aura toujours des foules et des alternatives. Make est apparu pour la première fois en 1976 et se taille encore aujourd’hui la part du lion de nombreux projets. La question ultime: est-il toujours là parce que c’est un bon logiciel, ou simplement à cause de l’inertie?

Quoi qu’il en soit, aujourd’hui, son plus grand concurrent – un remplaçant direct – est Ninja.

Ninja

Exemples d’outils de construction populaires à différents niveaux d’abstraction

Ninja a été créé par [Evan Martin] chez Google, quand il travaillait sur Chrome. Il est maintenant également utilisé pour construire Android et par la plupart des développeurs travaillant sur LLVM. Ninja vise à être plus rapide que make aux builds incrémentiels: recompilation après avoir modifié seulement une petite partie de la base de code. Comme Evan l’a écrit, réduire le temps d’itération de quelques secondes seulement peut faire une énorme différence non seulement pour l’efficacité du programmeur, mais aussi pour son humeur. La motivation initiale du projet était que la reconstruction de Chrome alors que toutes les cibles étaient déjà à jour (une version sans opération) prenait environ dix secondes. En utilisant Ninja, cela prend moins d’une seconde.

Ninja fait un usage intensif de la parallélisation et vise à être léger et rapide. Mais il en va de même pour tous les autres outils de construction – pourquoi Ninja est-il différent? Selon Evan, c’est parce qu’il n’a pas succombé à la tentation d’écrire un nouvel outil de construction qui a tout fait – par exemple en remplaçant les deux CMake et Make – mais remplace uniquement Make.

Source: Le système de construction Meson – Une comparaison simple. Apache 2.0

Cela signifie qu’il est conçu pour que ses fichiers d’entrée soient générés par un système de construction de niveau supérieur (non écrit manuellement), donc s’intègre facilement avec le backend de CMake et d’autres.

En fait, bien qu’il soit possible d’écrire le vôtre à la main .ninja fichiers, il est déconseillé. La propre documentation de Ninja indique que « En revanche [to Make], Ninja n’a presque pas de fonctionnalités; juste ceux qui sont nécessaires pour que les builds soient corrects. […] Ninja en lui-même est peu susceptible d’être utile pour la plupart des projets. »

Ci-dessus, vous pouvez voir les différences de temps de construction incrémentielle dans un projet de taille moyenne. Les deux systèmes basés sur Ninja sont des gagnants incontestables. Notez que pour créer l’intégralité de la base de code à partir de zéro, Ninja ne sera pas plus rapide que les autres outils – il n’y a pas de raccourcis pour croquer les 1 et les 0.

Dans ses réflexions sur le succès et l’échec de Ninja, Evan écrit que:

«L’ironie de cet aspect de la conception de Ninja est que rien n’empêche quiconque de faire cela. Les systèmes de construction de Xcode ou de Visual Studio (par exemple) pourraient tout aussi bien faire la même chose: faire un tas de travail à l’avance, puis instantanément le résultat pour une réexécution rapide. Je pense que la raison pour laquelle si peu de gens réussissent dans ce domaine est qu’il est trop tentant de mélanger les couches. »

Il est indéniable que cette approche a réussi, avec de plus en plus de projets utilisant Ninja au fil du temps. En termes simples, si vous utilisez déjà CMake, Je ne vois pas beaucoup de raisons pour lesquelles vous n’utiliseriez pas Ninja au lieu de make en 2021. Mais je veux savoir ce que vous en pensez.

À toi

Il est impossible d’écrire sur tous les outils de construction d’aujourd’hui. Je veux donc vous entendre. Avez-vous changé de make à Ninja? Vous ne jurez que par Autotools, Buck ou autre chose? Volonté make jamais partir? Y aura-t-il jamais un outil capable de tous les éclipser? Faites-moi savoir ci-dessous.