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
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 ...
Il y a différentes choses qui font que les scripts Shell sont difficiles à faire ...
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.
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.
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à.