L'utilisation directe de Make est-elle considérée comme obsolète? [fermé]


31

J'ai donc rencontré de nombreux commentaires / articles / etc. concernant la création directe de makefiles, et comment c'est une chose stupide à faire en 2015. Je connais des outils tels que CMake, et j'utilise CMake assez souvent. Le fait est que CMake crée simplement le Makefile pour vous et aide à éliminer l'ennui de le faire vous-même. Bien sûr, il ajoute beaucoup d'autres fonctionnalités intéressantes ... mais c'est toujours un Makefile à la fin.

Ma question est donc la suivante: le discours «obsolète» concernant make fait-il référence à l'ensemble de l'utilitaire Make, ou simplement l'idée d'écrire manuellement vos propres Makefiles? Je n'utilise pas du tout d'IDE pour le développement C / C ++ (juste des emacs), j'ai donc toujours écrit des Makefiles.

Si Make est considéré comme obsolète, que devrait utiliser un développeur C / C ++ pour créer de petits projets personnels?


8
Pour les petits projets personnels, un makesans Makefile suffit. Qu'est-ce que les tracas?
ott--

8
Chaque morceau de logiciel disponible sur mes systèmes FreeBSD, à la fois sur le bureau et sur les serveurs, a un Makefile qui commence par «make». Non. «Make» n'est pas obsolète.
Rob

3
Les gens sont libres d'utiliser des IDE, mais si leurs IDE ne peuvent pas prendre en charge des projets utilisant Makefiles près de 40 ans après leur makepremière écriture, ils ne devraient pas s'attendre à ce que les gens y travaillent.
Miles Rout

1
Le «discours obsolète concernant la marque» n'est qu'un symptôme ou un point douloureux , pas une proclamation de dépréciation. Surtout quand un remplacement total supérieur n'existe pas encore, et que toutes les approches pour réduire la douleur utilisent encore à certains égards, juste cachées aux utilisateurs les plus sujets à la douleur. Bien que de nombreuses bonnes réponses aient été données, la question elle-même est basée sur une opinion limite.
rwong

1
CMakeest une couche d'abstraction. Cette abstraction est nécessaire pour apprivoiser la variété sauvage des produits IDE grand public qui ne seront pas conformes à l'open source Makefile. Encore une fois, ce n'est pas seulement de l'abstraction, mais cela permet des fonctionnalités de configuration (comme autoconf). Comme d'autres abstractions, il permet des alternatives . Mais cela ouvre la voie à une nouvelle idée expérimentale d'alternatives de Makefile facilement accessible aux utilisateurs de CMake.
shuva

Réponses:


30

La grande différence est que CMake est un système de méta-construction multiplateforme . Un seul projet CMake peut produire le makefile Unix / Linux habituel, un projet Visual Studio pour Windows, un projet XCode pour Mac et presque tout autre système de construction non méta que vous voudrez peut-être utiliser ou prendre en charge.

Je ne dirais pas que l'utilisation de make directement ou même l'édition manuelle de makefiles est "obsolète", mais ce sont des choses que vous ne devriez probablement pas faire à moins que vous ne travailliez sur des trucs Unix / Linux qui n'auront pas besoin d'être portés sur Windows, un peu comme la façon dont vous ne doit pas modifier directement les fichiers de projet Visual Studio si vous souhaitez les porter vers un système autre que Windows. Si vous êtes intéressé par la portabilité, cela vaut la peine d'apprendre un système de méta-construction comme Scons ou CMake.


9
POSIX makeest également multiplateforme.
Blrfl

6
@Blrfl cela peut être vrai, mais en général, vous trouverez les lignes de commande que vous devez utiliser pour compiler et / ou lier votre projet sont spécifiques à la plate-forme, même si toutes les plates-formes que vous ciblez sont conformes à POSIX et même si vous utilise le même compilateur sur tous (il y aura toujours des problèmes embêtants avec les emplacements des fichiers d'inclusion, si vous en avez besoin -lm, -lnsletc. ou si ces fonctionnalités sont incluses dans la bibliothèque C, etc.).
Jules

5
@Jules Il y a beaucoup plus (ou moins) à CMake, il est essentiellement adapté à la création de votre application modulaire standard pour les systèmes avec chargeurs ELF, et fournit des abstractions pour tous les outils nécessaires pour cette chaîne d'outils spécifique. Si vous vous écartez de cette chaîne d'outils (par exemple, un script de liaison personnalisé pour le métal nu), CMakene fournit soudainement aucun support ou portabilité, vous finissez par le pirater comme vous le faisiez auparavant pour pirater des scripts de construction entièrement personnalisés.
Ext3h

Il en va de même pour Q make (bien qu'il ne s'agisse pas du comportement mal documenté ** ap CMake), btw;)
mlvljr

11

Est makevraiment dépassé?

Je ne pense pas. En fin de compte, make est toujours assez puissant pour fournir toutes les fonctionnalités souhaitées, comme la compilation conditionnelle de sources modifiées et similaires. Dire makeétait obsolète, reviendrait à dire que l'écriture de scripts de l'éditeur de liens personnalisés était obsolète.

Mais ce que Raw makene fournit pas, ce sont des fonctionnalités étendues et des bibliothèques de stockage pour plus de confort, telles que la génération d'en-tête paramétrique, le cadre de test intégré ou même simplement les bibliothèques conditionnelles en général.

D'autre part, CMakeest directement adapté à la génération de bibliothèques et d'exécutables ELF génériques. Chaque fois que vous vous écartez de ces procédures prédéfinies, vous devez commencer à pirater CMakecomme vous le faisiez auparavant pour pirater vos propres Makefiles.

Étant donné que vous pouvez créer beaucoup plus en C ++ que votre application moyenne pour un système qui connaît les chargeurs ELF, CMaken'est certainement pas adapté à tous les scénarios. Cependant, si vous travaillez dans un tel environnement standardisé, CMakeou tout autre de ces cadres de générateur de script modernes sont certainement vos meilleurs amis.

Cela dépend toujours de la spécialisation de votre application et de l'adéquation de la structure du CMakecadre avec votre flux de travail.


Bien qu'utile, make est un système horrible avec braindead, une syntaxe arcanique et des tonnes de limitations inutiles qui créent de nombreux moments de surprise.
entrée

7

Il était une fois des langues de haut niveau, ce n'était qu'une idée. Les gens ont essayé d'implémenter des compilateurs. À l'époque, il y avait de graves limitations matérielles - il n'y avait pas d'outils graphiques, donc le "texte brut" a fini par être utilisé pour le format de fichier d'entrée; les ordinateurs avaient généralement une très petite quantité de RAM, donc le code source devait être divisé en morceaux et le compilateur était divisé en utilitaires séparés (pré-processeur, compilateur, assembleur, éditeur de liens); Les processeurs étaient lents et coûteux, vous ne pouviez donc pas faire d'optimisations coûteuses, etc.

Bien sûr, avec de nombreux fichiers source et de nombreux utilitaires utilisés pour créer de nombreux fichiers objets, il est difficile de créer quoi que ce soit manuellement. Pour contourner les défauts de conception des outils (causés par un matériel très limité), les gens ont naturellement commencé à écrire des scripts pour éliminer certains tracas.

Malheureusement, les scripts étaient maladroits et désordonnés. Pour contourner les problèmes de scripts (qui consistaient à contourner les défauts de conception des outils causés par un matériel limité), les utilisateurs ont finalement inventé des utilitaires pour faciliter les choses, par exemple make.

Toutefois; les makefiles sont maladroits et désordonnés. Pour contourner les problèmes avec les makefiles (qui étaient une solution de contournement pour les défauts de conception des outils causés par un matériel limité), les gens ont commencé à expérimenter avec les makefiles générés automatiquement; commencer par des choses comme obtenir le compilateur pour générer des dépendances; et menant à des outils comme auto-conf et cmake.

C'est là que nous en sommes maintenant: des solutions de rechange pour des solutions de rechange pour une solution de rechange pour les défauts de conception des outils causés par un matériel limité.

Je m'attends à ce que d'ici la fin du siècle, il y ait quelques couches supplémentaires de «solutions de rechange pour les solutions de rechange» au-dessus de la pile existante. Ironiquement, les limitations matérielles sévères qui ont causé tout cela ont disparu il y a plusieurs décennies et la seule raison pour laquelle nous utilisons toujours un tel désordre archaïque est " c'est comme ça que ça a toujours été fait ".


1
Alors, quelle est l'alternative? L'alternative change-t-elle totalement le concept de build tel que nous le connaissons?
JParrilla

1
@Darkslash: Une fois que vous commencez à envisager des alternatives (hypothétiques), c'est comme ouvrir des vannes - vous finissez par tout remettre en question (et vous vous retrouvez avec des idées comme la séparation de la sémantique et de la syntaxe, et la refonte des IDE et des outils et de la livraison en tant qu'ensemble plutôt que des éléments individuels de la puzzle plus grand). Il est plus pratique de réaliser que des outils comme cmakeceux qui traitent uniquement les symptômes et ne peuvent pas guérir les causes profondes ce qui facilite l'acceptation du fait que vous n'avez pas d'autre choix que d'utiliser des outils qui ne seront probablement jamais proches de "l'idéal".
Brendan

5
Les Makefiles ne sont en aucun cas «maladroits et désordonnés». Ils sont incroyablement élégants: makeest en son cœur un moteur pour parcourir un graphique de dépendance acyclique. Rien sur les «scripts» ou la ligne de commande n'est «archaïque».
Miles Rout

1
@MilesRout: La partie maladroite et désordonnée est la construction du graphique. La traversée est assez élégante. Mais prenez simplement l'exemple le plus courant de la partie désordonnée: les fichiers d'en-tête C. Chacun #includeest un bord, mais makene peut pas analyser les fichiers C. Ce n'est toujours pas un problème, car makepourrait stocker ces bords avec le nœud suivant (le fichier * .o), mais il ne le fait pas non plus.
MSalters

3
Je ne suis pas d'accord pour dire qu'un meilleur design est possible. maken'est pas seulement pour la compilation de C! Vous voulez un programme qui prend .cet .hdépose et donne Makefiles. Mais ce n'est pas le cas makeet ce n'est pas ce qu'il makefaut faire. Encore une fois, ce maken'est pas tout sur C, et une solution spécifique à C intégrée makeest une mauvaise idée (et accessoirement une violation de la philosophie UNIX).
Miles Rout

5

make (l'outil ou son utilisation directe via un Makefile) n'est pas obsolète, en particulier pour les "petits projets personnels" tels que vous l'utilisez.

Bien sûr, vous pouvez également l'utiliser pour des projets plus importants, y compris ceux ciblés pour plusieurs plates-formes. Avec des variables spécifiques à une cible, vous pouvez facilement personnaliser la façon dont vous construisez pour différentes plates-formes. De nos jours, les distributions Linux sont livrées avec des chaînes d'outils de compilation croisée (par exemple mingw-w64 ) afin que vous puissiez créer un package logiciel Windows complet (avec le programme d'installation si vous le souhaitez) à partir de Linux, le tout à partir de votre Makefile.

Des outils comme cmake et qmake peuvent être utiles, mais ils ne sont pas sans problèmes. Ils sont généralement bien pour construire une application elle-même avec toutes les bibliothèques (bien que j'ai toujours eu des problèmes avec qmake pour vérifier correctement les dépendances entre les bibliothèques et les programmes qui les utilisent), mais j'ai toujours du mal avec les contraintes de ces outils lorsque je fais le reste de la (créer des programmes d'installation, générer / installer des fichiers de documentation ou de traduction, faire des choses inhabituelles comme transformer une archive en bibliothèque partagée, etc.). Tout cela peut être fait dans make, bien que des choses comme le suivi des dépendances puissent nécessiter un peu d'effort.

Les IDE comme Qt Creator et Eclipse peuvent également importer des projets basés sur Makefile, vous pouvez donc partager avec les développeurs utilisant IDE. Je pense que l'IDE Qt Creator est excellent en tant qu'IDE C ++, mais après avoir passé un certain temps à devenir plus efficace avec Emacs, et puisque je fais plus de développement Ada, je me retrouve à préférer Emacs pour tout. Pour revenir à la question sur make, en tant qu'étape post-lien dans mon Makefile, je mets à jour mon fichier TAGS (pour la navigation dans Emacs), chargé avec M-x visit-tags-table:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

Ou pour le développement d'Ada:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -

2

Cette réponse complète la réponse @lxrec.

Les Makefiles peuvent être utilisés pour beaucoup de choses, pas seulement pour créer un programme / bibliothèque à partir du code source. Les systèmes de construction tels que CMake ou autotools sont conçus pour prendre du code et le construire de manière à s'adapter à la plate-forme de l'utilisateur (c'est-à-dire trouver des bibliothèques ou spécifier des options de compilation correctes). Vous pouvez par exemple avoir un makefile qui aide à automatiser certaines tâches de publication, telles que: construire un fichier zip contenant du code avec la version dérivée de git; exécuter des tests sur votre code; télécharger ledit fichier zip sur un service d'hébergement. Certains systèmes de construction (comme automake) peuvent fournir un moyen facile de le faire, d'autres non.

Cela ne veut pas dire que vous devez utiliser des makefiles pour cela, vous pouvez utiliser un langage de script (shell, python, etc.) pour de telles tâches.


1

Je ne pense pas que les Makefile-s écrits humains soient obsolètes, surtout quand:

  1. en utilisant POSIX make, qui vous donne un portable Makefile
  2. ou en utilisant GNU make 4, qui vous offre de nombreuses fonctionnalités très intéressantes, en particulier la scriptabilité GUILE, qui permet de coder efficacement les fonctionnalités fantaisistes fournies par les Makefilegénérateurs (je pense que les fonctionnalités des autotools ou de Cmake pourraient être facilement écrites par la personnalisation Guile de GNU make ). Bien sûr, le prix à payer est d'exiger que GNU fasse 4 (ce n'est pas grave, à mon humble avis).

0

Les Makefiles ne sont pas obsolètes, de la même manière que les fichiers texte ne sont pas obsolètes. Stocker toutes les données en texte brut n'est pas toujours la bonne façon de faire les choses, mais si tout ce que vous voulez, c'est une liste Todo, alors un fichier texte brut est très bien. Pour quelque chose de plus compliqué, vous voudrez peut-être un format plus compliqué comme Markdown ou XML ou un format binaire personnalisé ou quoi que ce soit entre les deux, mais pour les cas simples, le texte brut fonctionne très bien.

De même, si tout ce que vous voulez est un moyen d'éviter d'écrire g++ -g src/*.c -o blah -W -Wall -Werror && ./blahtout le temps, un Makefile manuscrit est parfait!

Si vous voulez créer quelque chose de très portable, où vous n'avez pas à gérer vous-même cette portabilité, vous voulez probablement quelque chose comme Autotools pour générer le Makefile qui vous convient. Autotools détectera les fonctionnalités prises en charge par diverses plates-formes. Un programme écrit en standard C89 construit avec Autotools se compilera pratiquement partout.


"compilera pratiquement partout" -> "compilera sur les systèmes de type Unix les plus récents". Je ne pense pas que cela autotoolsfonctionne à un degré pertinent sur un système Windows, par exemple (actualiser Cygwin / MingW, qui est vraiment un système de type Unix au-dessus de Windows).
sleske

Cela n'a rien à voir avec le fait d'être récent. L'avantage des autotools est qu'il fonctionne sur tous les systèmes de type POSIX à distance. Windows est quelque peu conforme à POSIX.
Miles Rout

Oui, je me corrige. En fait, je me souviens qu'une critique des autotools est précisément qu'il contient du code même pour des systèmes très anciens, donc rayez le "récent". Cependant, je reste fidèle à la partie Windows.
sleske

Et la faute en incombe entièrement à Microsoft. S'ils voulaient produire un produit de qualité, Windows aurait un support approprié pour les normes internationales de systèmes d'exploitation (comme POSIX). POSIX n'est pas seulement une «chose Unix», c'est la norme de système d'exploitation portable pour tous les systèmes d'exploitation. Windows n'est qu'un tas d'ordures non conformes.
Miles Rout

@MilesRout toujours le résultat est que "pratiquement partout" exclut 90% des ordinateurs de bureau .
el.pescado

-2

si votre projet est simple et contient très peu de fichiers, aucun fichier make n'est nécessaire.

Cependant, lorsque le projet est complexe, utilise de nombreuses zones de mémoire, contient de nombreux fichiers, il est alors nécessaire de placer chaque zone de mémoire au bon endroit dans la mémoire adressable, il est hautement souhaitable de ne pas recompiler chaque fichier chaque fois qu'un changement trivial est fait dans un fichier,

Si vous voulez effacer les anciens fichiers / compiler / lier / installer avec le minimum de tracas et le risque d'erreurs de frappe, le makefile est une véritable aubaine.

Lorsque vous entrez dans le `` monde réel '', les projets ne sont que rarement 1 ou 2 fichiers, mais plutôt des centaines de fichiers. un makefile effectuera toujours les bonnes actions et aucune action inutile (après avoir été débogué) donc vous ne tapez qu'une seule commande simple et le makefile fait tout le travail


1
Cela n'a pas répondu pourquoi préférer makeplus cmakeou vice versa.
Ext3h

L'utilisation de makefiles ne reconstruit pas tous les fichiers à chaque fois. (sinon CMake ou Auto-tools ne pourraient pas l'utiliser)
ideasman42
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.