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
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
Réponses:
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 ne reconstruit que les parties qui en dépendent. Bien que vous puissiez le faire 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 alternative évidente avec un script shell est de tout reconstruire à chaque fois. Pour les petits projets, c'est une approche parfaitement raisonnable, mais pour un grand 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 ...
Je devrais probablement aussi ajouter qu'il y a pas mal d'alternatives à faire qui ont au moins des capacités largement similaires. Surtout dans les cas où seuls quelques fichiers d'un grand projet sont en cours de reconstruction, certains d'entre eux (par exemple, Ninja ) sont souvent considérablement plus rapides que make.
Il y a diverses choses qui sont difficiles à faire avec les 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 et que make
je l'exécute, il exécute toutes les 3 commandes, dans l'ordre inverse.
Si je change le fichier 1.c
uniquement et que je l' exécute make
, il n'exécute que les 2 premières commandes dans l'ordre inverse.
Essayer d'accomplir cela avec votre propre script shell impliquera de nombreuses if/else
vérifications.
rsync -r -c -I $SOURCE $DEST_DIR
dans shell.
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 processeurs. 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 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 ... lorsque make est exécuté, 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à.