2014-05-06 10 views
5

Sto cercando di migliorare la soluzione ingenua (regole singole per la compilazione di destinazioni e una aggiuntiva per il collegamento di tutti gli obiettivi precedenti insieme) che ho utilizzato nel mio makefile. Sono venuto con la seguente Makefile (tagliata):Regola target generica per Makefile

.PHONY: clean 

BASE_DIR = ../ 

CC = gcc 
CROSS_COMPILE = arm-none-eabi- 
CFLAGS =-g -I${BASE_DIR}/include 
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib 

SOURCES = first.c second.c third.c fourth.c 
OBJECTS = $(SOURCES:.c=.o) 
EXECUTABLE = $(OBJECTS:.o=) 

all: $(EXECUTABLE) 

%: 
    ${CROSS_COMPILE}$(CC) $(CFLAGS) $(LDFLAGS) $*.c -o $* 

clean: 
    rm ${EXECUTABLE} 

Questo funziona bene, ma mi piacerebbe separare la compilazione e processi che collegano. Perciò ho cercato di modificarlo come segue:

.PHONY: clean 

BASE_DIR = ../ 

CC = gcc 
CROSS_COMPILE = arm-none-eabi- 

CFLAGS =-c -g -I${BASE_DIR}/include 
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib 

SOURCES = first.c second.c third.c fourth.c 
OBJECTS = $(SOURCES:.c=.o) 
EXECUTABLE = $(OBJECTS:.o=) 

all : $(EXECUTABLE) 

%.o : %.c 
    @echo "Compiling c file into o file" 
    ${CROSS_COMPILE}$(CC) $(CFLAGS) $< -o [email protected] 

% : %.o 
    @echo "Linking o file into executable" 
    ${CROSS_COMPILE}$(CC) $(LDFLAGS) $< -o [email protected] 

clean: 
    rm ${EXECUTABLE} 

Questo funziona ok allora invocando la Makefile come ad esempio make first.o; make first o se modifico il EXECUTABLE = $(OBJECTS:.o=) a EXECUTABLE = $(OBJECTS:.o=.out) e % : %.o a %.out : %.o. Se, tuttavia, provo a richiamare la compilazione come make o make first, vengono utilizzate le regole implicite.

Ho provato ad usare il manuale di Makefile ma ci sono davvero molte informazioni, mi sono un po 'confuso.

Come posso modificare il Makefile per essere autorizzati a richiamare la costruzione di obiettivi separati come make <target> o tutti gli obiettivi come make come lo stesso tempo?

risposta

6

Il paragrafo in cui descrivi il tuo problema è molto confuso e difficile da capire. Quando fai domande assicurati che la sezione che descrive il problema sia la più chiara: è utile se fornisci un output di esempio che mostri esattamente quali comandi hai digitato e i risultati che hai ottenuto e spiega cosa invece ti aspetti di ottenere.

Tuttavia, la mia interpretazione è che se si esegue make first utilizza la regola di built-in per compilare first direttamente da first.c, piuttosto che le regole del modello (si noti che entrambe le regole incorporate e le regole del modello sono considerati "implicita regole").

Questo perché make sceglierà la catena di regole implicite "più breve" in modo che la regola che costruisce un eseguibile direttamente dalla sorgente, in una fase, anziché costruire l'oggetto quindi l'eseguibile in due passaggi, sarà preferibile. Se non si desidera utilizzare la regola implicita built-in, allora è necessario o richiamare fare con la bandiera -r, oppure delete it aggiungendo:

% : %.c 

(solo quello) per makefile.

+0

Mi dispiace se la mia descrizione è stata confusa, ho fatto del mio meglio per chiarire. Cosa intendi per "entrambe le regole integrate e le tue regole di pattern sono considerate" regole implicite ""? Le regole che fornisco non sono considerate esplicite? –

+0

No. Le regole esplicite sono regole come 'foo: foo.o': hanno nomi _espliciti di bersagli. Le regole del suffisso ('.c.o') e le regole del modello ('% .o:% .c') non hanno bersagli espliciti; sono regole implicite. Esistono numerose regole implicite fornite di default da make, quelle sono _built-in_ rules. – MadScientist

+0

Rifletti sulla tua domanda: rileggi questa descrizione, cercando di immaginare di non sapere nient'altro sul problema: _Questo funziona bene, quindi invoco il Makefile come ad es. 'make first.o; make first' o se modifico 'EXECUTABLE = $ (OBJECTS: .o =)' in 'EXECUTABLE = $ (OBJECTS: .o = .out)' e '%:% .o' in'% .out:% .o'. Se, comunque, cerco di invocare la compilazione come 'make' o' make first' vengono utilizzate le regole implicite. È davvero chiaro per te? – MadScientist