2010-04-18 11 views
12

mio Makefile è:rendere sempre ricostruire

OBJS = b.o c.o a.o 
FLAGS = -Wall -Werror 
CC = gcc 

test: $(OBJS) 
    $(CC) $(FLAGS) $(OBJS) -o test 
b.o: b.c b.h 
    $(CC) $(FLAGS) -c b.c 
a.o: a.c b.h c.h 
    $(CC) $(FLAGS) -c a.c 
c.o: c.c c.h 
    $(CC) $(FLAGS) -c c.c 
clean: 
    rm a 
    rm *.o 
all: test 

Se faccio make poi make di nuovo, ricostruisce sempre 'test'. Perché fa questo?

Anche se lo faccio: make a.o ricostruisce ... Im su linux se questo aiuta.

In Windows se cambio 'test' con 'test.exe' e '-o test' con '-o test.exe', funziona correttamente. Quindi immagino che per qualche motivo 'make' nella mia linux non riesco a controllare i datestamp dei miei file nella directory.

L'ho fissato! I file .c sono stati creati in Windows. Ho aperto tutti i file. C e .h in vi, e senza fare nulla, salvo le modifiche, e tutto ha funzionato. Penso che la cosa del datestamp sia stata risolta facendo questo.

+0

Riesci a trovare un caso di test più semplice? (Come un numero inferiore di file, forse un programma di tipo Hello World, in modo che tu possa includere tutto nella domanda.) Hai cambiato il modo in cui la regola * test * funziona in una modifica recente, e sospetto ci siano altre differenze significative da cosa è stato pubblicato. –

+0

Penso che il problema sia linux. Se in quel makefile cambio 'test' con 'text.exe' e nella sua regola '-o text.exe', funziona perfettamente. – fsdfa

+0

Solo a parte, probabilmente non dovresti chiamare il 'test' dell'eseguibile. La maggior parte degli UNIX ha un vero programma di 'test'. – paxdiablo

risposta

14

La tua prima regola è:

test: $(OBJS) 

Ciò significa che se un file chiamato 'test' non esiste, la regola dovrebbe correre e crearlo. Poiché "test" non esiste mai (quella regola in realtà non crea un file chiamato "test"), viene eseguito ogni volta. Si dovrebbe cambiare 'test' a 'a', l'output effettivo di detta norma

Per riferimento futuro, se una regola non crea la cosa sul lato sinistro, si dovrebbe contrassegnare con:

.PHONY: test 
+0

Mi dispiace, era il mio errore di battitura ..è così nel Makefile – fsdfa

2

è necessario specificare che prova è un phony target:

OBJS = b.o c.o a.o 
CFLAGS = -Wall -Werror 
CC = gcc 

.PHONY: all test clean 
# 'all' and 'clean' are also phony 

all: test 
test: a 

a: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o a 

b.o: b.c b.h 
a.o: a.c b.h c.h 
c.o: c.c c.h 

clean: 
    rm a 
    rm *.o 

ho messo tutto prima quindi è la destinazione predefinita (che è comune), rimossi i comandi per la compilazione (make ha già quelli integrati) e modificato FLAGS a CFLAGS (che è il nome comune per i flag del compilatore C e utilizzato dalle regole incorporate di make).

+0

Continua a ricostruire tutto. – fsdfa

2

Come ultima risorsa è possibile eseguire la modalità di debug in Make (make -d) e passare attraverso l'output. Prima di provarlo, ti suggerisco di aggiungere una riga alla regola "test" per vedere se ci sono prerequisiti che Make think richiede la ricostruzione del test (e utilizzare alcune variabili automatiche nel comando compile, come buona pratica).

test: $(OBJS) 
    @echo prereqs that are newer than test: $? 
    $(CC) $(FLAGS) $^ -o [email protected] 
Problemi correlati