web-dev-qa-db-fra.com

Pourquoi utiliser make sur un script Shell?

Make me semble simplement un script Shell avec une gestion un peu plus facile des arguments de ligne de commande.

Pourquoi est-il standard d'exécuter make au lieu de ./make.sh

98
HoboBen

L'idée générale est que make prend en charge les reconstructions (raisonnablement) minimales - c'est-à-dire que vous lui dites quelles parties de votre programme dépendent de quelles autres parties. Lorsque vous mettez à jour une partie du programme, il niquement reconstruit les parties qui en dépendent. Alors que vous pourriez faire cela avec un script Shell, ce serait beaucoup plus de travail (vérifier explicitement les dates de dernière modification sur tous les fichiers, etc.) La seule évidence alternative avec un script Shell est de tout reconstruire à chaque fois. Pour les petits projets, c'est une approche parfaitement raisonnable, mais pour un gros projet, une reconstruction complète pourrait facilement prendre une heure ou plus - en utilisant make, vous pourriez facilement accomplir la même chose en une minute ou deux ...

107
Jerry Coffin

Make est un système expert

Il y a différentes choses qui font que les scripts Shell sont difficiles à faire ...

  • Bien sûr, il vérifie ce qui est obsolète, afin de ne construire que ce dont il a besoin pour construire
  • Il effectue une tri topologique ou une autre sorte d'analyse d'arbre qui détermine ce qui dépend sur quoi et dans quel ordre construire les choses obsolètes de telle sorte que chaque prérequis soit construit avant chaque dépendance, et seulement une fois.
  • C'est un langage pour programmation déclarative. De nouveaux éléments peuvent être ajoutés sans avoir besoin de les fusionner en un flux de contrôle impératif.
  • Il contient n moteur d'inférence pour traiter les règles, les modèles et les dates, et ce , lorsqu'il est combiné avec les règles de votre Makefile particulier, est ce qui se transforme en système expert.
  • Il a un processeur macro.
  • Voir aussi: n résumé antérieur de make.
57
DigitalRoss

En plus de ce qui précède, Make est un langage de programmation parallèle déclaratif (-ish).

Disons que vous avez 4 000 fichiers graphiques à convertir et 4 CPU. Essayez d'écrire un script Shell de 10 lignes (je suis généreux ici) qui le fera de manière fiable tout en saturant vos processeurs.

Peut-être que la vraie question est de savoir pourquoi les gens prennent la peine d'écrire des scripts Shell.

7
bobbogo

Make garantit que seuls les fichiers requis sont recompilés lorsque vous apportez des modifications à vos fichiers source.

Par exemple:

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

Si je change le fichier 2.h uniquement & exécutez make, il exécute les 3 commandes, dans l'ordre inverse.

Si je change le fichier 1.c uniquement & exécutez make, il exécute uniquement les 2 premières commandes dans l'ordre inverse.

Essayer d'accomplir cela avec votre propre script Shell impliquera beaucoup de if/else vérification.

7
user191776

make gère les dépendances: le makefile les décrit: le binaire dépend des fichiers objets, chaque fichier objet dépend d'un fichier source et des en-têtes ... quand make est lancé, la date des fichiers est comparée pour déterminer ce qui doit être recompilé .

On peut invoquer directement une cible pour ne pas construire tout ce qui est décrit dans le Makefile.

De plus, la syntaxe make fournit une substitution, vpath

Tout cela peut être écrit dans des scripts Shell, avec make vous l'avez déjà.

3
philant