Perché usare make over a shell script?


129

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


per la domanda inversa: perché usare lo script di shell su make (a causa dell'apparente più facile gestione degli argomenti della riga di comando), specialmente per le attività dell'amministratore di sistema, leggi qui: unix.stackexchange.com/a/497601/1170
lesmana

Risposte:


126

L'idea generale è che makesupporti (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.


67

Make è un sistema esperto

Ci sono varie cose da fare che sono difficili da fare con gli script di shell ...

  • Naturalmente, controlla per vedere cosa non è aggiornato, in modo da costruire solo ciò di cui ha bisogno per costruire
  • Esegue un ordinamento topologico o un altro tipo di analisi ad albero che determina cosa dipende da cosa e da quale ordine costruire le cose obsolete in modo tale che ogni prerequisito sia costruito prima di ogni dipendenza e costruito solo una volta.
  • È un linguaggio per la programmazione dichiarativa . Nuovi elementi possono essere aggiunti senza bisogno di unirli in un flusso di controllo imperativo.
  • Contiene un motore di inferenza per elaborare regole, modelli e date, e questo, se combinato con le regole nel tuo particolare Makefile, è ciò che trasforma make in un sistema esperto .
  • Ha un processore macro.
  • Vedi anche: un sommario precedente di make .

2
Tuttavia, è piuttosto limitato come sistema esperto. Ad esempio, ogni inferenza può utilizzare la stessa regola solo una volta.
reinierpost

1
Giusto per elaborare il punto 2) in termini ingegneristici più profani, uno script di shell impone un ordinamento lineare, mentre un makefile è simile ad un albero. Rimuove le dipendenze cronologiche non necessarie (sebbene in pratica il processo di creazione sarebbe eseguito linearmente).
Sridhar Sarnobat

2
... Penso che il problema con i Makefile sugli script della shell sia analogo al problema con i CSS su JavaScript. Non è così ovvio in quale ordine cronologico viene eseguito ogni nodo. Anche se almeno con Makefile puoi ancora vedere l'effettivo comando della shell. Con i CSS anche questo viene astratto.
Sridhar Sarnobat

Ho alcuni commenti che apprezzo se qualcuno li chiarisce. 1 / il tuo primo e due punti non sono correlati, nel senso che quell'ordinamento topologico è il modo in cui viene implementata la build incrementale? 2 / non puoi indicare il numero 3 implementato usando anche la composizione delle funzioni. 3 / Vorrei capire di più sui vantaggi di 4 e 5 per l'utente finale MakeFile e perché questi vantaggi non possono essere implementati componendo i comandi della shell insieme
Amine Hajyoussef

Questa è la prima volta che mi imbatto in Make descritto come un sistema esperto. Essendo qualcuno che ha costruito sistemi esperti, non è qualcosa che avrei considerato. Make ha ovviamente un motore di inferenza per dedurre come costruire il tuo programma attraverso le regole dichiarative specificate nel makefile, ma è meno ovvio che sia un sistema basato sulla conoscenza poiché le regole (foglia) sono comandi di shell da eseguire piuttosto che fatti. E il termine "sistema esperto" viene utilizzato per riferirsi a un sistema che ha acquisito con successo l'esperienza di un esperto di livello mondiale, il che non è il caso. La giuria è ancora fuori per me.
Dennis

9

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.hsolo il file ed eseguo make, esegue tutti e 3 i comandi, in ordine inverso.

Se cambio 1.csolo 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/elsecontrolli.


o usa qualcosa di simile rsync -r -c -I $SOURCE $DEST_DIRnella shell.
Spartacus9

9

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.


1
Sì, stai allentando l'ordinamento lineare totale in un ordine più simile ad un albero.
Sridhar Sarnobat

4

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à.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.