2013-05-19 20 views
7

So che il processo di installazione da fonte sono.perché "make" prima di "make install"

  1. ./configure
  2. fanno
  3. fanno installare

ma perché "fare" prima di "make install", perché non basta fare "make install"

la mia comprensione in modo lontano è "make" solo compilare la fonte in un file eseguibile, e "make install" in realtà metterli nella cartella PATH eseguibile, giusto?

forse non ho chiarito la mia domanda, e mi dispiace per questo.

dicono vogliamo installare eseguibile sulla macchina, possiamo solo fare

  1. ./configure
  2. fanno installare

invece di 3 passaggi indicati sopra.

risposta

10

Quando si esegue make, si sta indicando di seguire essenzialmente una serie di passaggi di costruzione per un particolare obiettivo. Quando viene chiamato make senza parametri, viene eseguito il primo target, che di solito semplicemente compila il progetto. make install mappe per il target install, che in genere non fa altro che copiare i binari nelle rispettive destinazioni.

Spesso il target install dipende dal target di compilazione, quindi è possibile ottenere gli stessi risultati eseguendo semplicemente make install. Tuttavia, posso vedere almeno un buon motivo per eseguirli in passaggi separati: separazione dei privilegi.

In genere, quando si installa il software, esso va in posizioni per le quali gli utenti ordinari non dispongono di accesso in scrittura (come /usr/bin e /usr/local/bin). Spesso, quindi, si finisce effettivamente per eseguire make e quindi sudo make install, in quanto il passaggio di installazione richiede un'escalation di privilegi. Questo è un "Good Thing ™", perché consente al tuo software di essere compilato come un utente normale (che in realtà fa la differenza per alcuni progetti), limitando la portata del danno potenziale per una procedura di compilazione che si comporta male e ottiene solo la root privilegi per la fase di installazione.

+0

Solo una nota a margine: "make" senza commenti salterà qualsiasi target con caratteri jolly. '%' è equivalente a una regex '+' per i nomi di destinazione. Ex. se hai 3 bersagli: 1) "% _targetsuffix:" 2) ​​"wildTarget:" 3) "defaultTarget:" in questo ordine andando dall'alto in basso. Il comando "make" salterà "% _youtargetsuffic:" e crea "wildTarget:" ("defaultTarget:" viene ignorato perché "wildTarget:" lo precede). Spiacente, non so come formattare i commenti per renderli più leggibili. – funa68

0

Un sacco di software in questi giorni farà la cosa giusta con solo make install. In quelli che non lo faranno, la destinazione dell'installazione non ha una dipendenza dai binari compilati. Quindi per giocare sicuri, molte persone usano make && make install o una sua variante solo per essere sicuri.

3

make senza parametri batte ./Makefile (o ./Makefile) e costruisce il primo bersaglio . Per convenzione, questo può essere il target all, ma non necessariamente. make install crea l'obiettivo speciale, installa. Per convenzione, questo prende i risultati di make all e li installa sul computer corrente.

Non tutti hanno bisogno di make install. Ad esempio, se si crea un'app Web da distribuire su un server diverso o se si utilizza un cross-compiler (ad esempio, si crea un'applicazione Android su una macchina Linux), non ha senso eseguire make install.

Nella maggior parte dei casi, la linea singola ./configure && make all install sarà equivalente al processo in tre passaggi che si descrive, ma questo dipende dal prodotto, dalle esigenze specifiche e, di nuovo, solo da una convenzione.

1

Ci sono volte in cui voglio provare a compilare le modifiche al codice ma non a distribuire tali modifiche. Ad esempio, se sto hackerando il codice C di Asterisk, e voglio assicurarmi che le modifiche che sto facendo siano ancora compilabili, salverò ed eseguirò make. Tuttavia, non voglio distribuire tali modifiche perché non ho terminato la codifica.

Per me, eseguire make è solo un modo per assicurarmi che non si verifichino troppi errori di compilazione nel mio codice per cui ho difficoltà a localizzarli. Forse i programmatori C più esperti non hanno questo problema, ma per me, limitare il numero di modifiche tra le compilazioni aiuta a ridurre il numero di possibili modifiche che potrebbero aver distrutto completamente la mia build, e questo rende più facile il debug.

Infine, questo aiuta anche a darmi un punto di arresto. Se voglio andare a pranzo, so che qualcuno può riavviare l'applicazione nel suo stato di funzionamento corrente senza dover venire a cercarmi, poiché solo fare installare copierà i file binari nella cartella dell'applicazione vera e propria.

Potrebbero esserci altre ragioni, ma questa è la ragione per cui ho abbracciato il fatto che i due comandi sono separati. Come altri hanno detto, se li vuoi combinati, puoi combinarli usando la tua shell.