In che modo questo Makefile crea il programma C senza nemmeno specificare un compilatore?


41

Stavo usando un Makefile dal libro " Advanced Linux Programming (2001)" [codice] . È stato strano per me vedere che GNU make compila correttamente il codice, senza nemmeno specificare un compilatore nel Makefile. È come cuocere senza ricetta!

Questa è una versione minima del codice:

test.c

int main(){}

Makefile

all:            test

e funziona davvero! Questo è il comando che esegue:

cc     test.c   -o test

Non ho trovato nulla di utile nella documentazione. Come è possibile?


PS Una nota aggiuntiva: anche la lingua non è specificata; Perché test.cè disponibile, GNU makeusa cc. Se esiste test.cppo test.cc(quando non c'è test.c), utilizza g++(e non c++).


4
"È come cuocere senza ricetta!" Una ricetta ti consiglierebbe di far bollire l'acqua, ma non se dovresti bollire l'acqua usando una padella su un fornello a gas, una padella su un fornello a induzione, un bollitore elettrico o un calderone posto su un treppiede sopra un fuoco. Non direbbe nemmeno dove dovresti prendere la tua acqua. È come dire makedi far bollire l'acqua e, usando le sue regole interne, make
capirà

1
@Rhymoid È come urlare: voglio una torta! E poi un robot chiamato makecontrolla il tuo frigorifero e scopre che c'è della farina disponibile, quindi ti prepara una torta predefinita dalla sua ricetta interna. :-)
Ho1

@ Ho1: il robot potrebbe chiedere, quale torta vuoi avere signore? :): D
Thushi,

Risposte:


68

Make lo fa usando le sue regole integrate . Questi spiegano in particolare come compilare il codice C e come collegare programmi a oggetto singolo.

In realtà non hai nemmeno bisogno di un Makefile:

make test

funzionerebbe senza uno.

Per vedere le regole nascoste che rendono possibile tutto ciò, usa l' -popzione senza Makefile:

make -p -f /dev/null

Come sottolineato da alephzero , Make ha regole incorporate da molto tempo (se non sempre); La prima versione di Stuart Feldman in Unix V7 li definiscefiles.c , e il suo documento del 1979 li menziona. Fanno anche parte delle specifiche POSIX . (Questo non significa che tutte le implementazioni di Make le supportino - il vecchio Borland Make per DOS no, almeno fino alla versione 3.0.)


2

5
@KingZoingo Make è in effetti una sorta di motore di inferenza: ha una serie di regole (integrate e dal Makefile), artefatti esistenti (file nella directory corrente o nominati nel Makefile) e artefatti richiesti (obiettivi nel Makefile); cerca semplicemente di abbinare le regole e gli artefatti esistenti per determinare se può usarli per ottenere gli artefatti richiesti. Le regole integrate dicono che test.cpuò essere usato per produrre test. make -dti mostrerà il processo in dettaglio ...
Stephen Kitt,

4
@ Ho1 @StephenKitt È stato molto maketempo prima che GNU o POSIX fossero inventati. La prima versione è stata scritta quasi 40 anni fa, e c'erano anche alcune versioni prototipo costruite da script shell ancora prima.
alephzero,

3
@jamesqf CPPinvoca ancora il preprocessore (in cc -Egenere); il compilatore C ++ è CXX.
Stephen Kitt,

3
@ Ho1 CXXin questo contesto è la variabile Make, non un comando - $(CXX)in un Makefile verrà sostituito da un comando per eseguire un compilatore C ++.
Stephen Kitt,
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.