Make mi sembra semplicemente uno script di shell con una gestione leggermente più semplice degli argomenti della riga di comando.
Perché è standard eseguire make invece di ./make.sh
Make mi sembra semplicemente uno script di shell con una gestione leggermente più semplice degli argomenti della riga di comando.
Perché è standard eseguire make invece di ./make.sh
Risposte:
L'idea generale è che make
supporti (ragionevolmente) ricostruzioni minime - cioè, gli dici quali parti del tuo programma dipendono da quali altre parti. Quando aggiorni una parte del programma, ricostruisce solo le parti che dipendono da quella. Anche se potresti farlo con uno script di shell, sarebbe molto più lavoro (controllare esplicitamente le date dell'ultima modifica su tutti i file, ecc.) L'unica ovvia alternativa con uno script di shell è ricostruire tutto ogni volta. Per piccoli progetti questo è un approccio perfettamente ragionevole, ma per un grande progetto una ricostruzione completa potrebbe facilmente richiedere un'ora o più - usando make
, potresti facilmente realizzare la stessa cosa in un minuto o due ...
Probabilmente dovrei anche aggiungere che ci sono alcune alternative da fare che abbiano capacità almeno sostanzialmente simili. Soprattutto nei casi in cui vengono ricostruiti solo pochi file in un progetto di grandi dimensioni, alcuni di essi (ad esempio Ninja ) sono spesso notevolmente più veloci di make.
Ci sono varie cose da fare che sono difficili da fare con gli script di shell ...
Make garantisce che solo i file richiesti vengano ricompilati quando si apportano modifiche ai file di origine.
Per esempio:
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
Se cambio 2.h
solo il file ed eseguo make
, esegue tutti e 3 i comandi, in ordine inverso.
Se cambio 1.c
solo il file ed eseguo make
, esegue solo i primi 2 comandi in ordine inverso.
Cercare di ottenere questo risultato con il proprio script di shell richiederà molti if/else
controlli.
rsync -r -c -I $SOURCE $DEST_DIR
nella shell.
Oltre a quanto sopra, Make è un linguaggio di programmazione parallelo dichiarativo (-ish).
Supponiamo che tu abbia 4.000 file grafici da convertire e 4 CPU. Prova a scrivere uno script di shell di 10 righe (sono generoso qui) che lo farà in modo affidabile saturando le tue CPU.
Forse la vera domanda è perché le persone si preoccupano di scrivere script di shell.
make gestisce le dipendenze: il makefile le descrive: il binario dipende dai file oggetto, ogni file oggetto dipende da un file sorgente e dalle intestazioni ... quando viene eseguito make, la data dei file viene confrontata per determinare cosa deve essere ricompilato .
Si può invocare direttamente un obiettivo per non costruire tutto ciò che è descritto nel Makefile.
Inoltre la sintassi make fornisce la sostituzione, vpath
Tutto questo può essere scritto in script di shell, in modo da averlo già.