2013-03-14 11 views
5

Uso il flag -MM in GCC per generare dipendenze makefile per oggetti. Il makefile appare brevemente in questo modo:Percorso generazione dipendenza GCC makefile

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) > autodep 

Le sorgenti si trovano nella cartella del src. Tuttavia, il file autodep conterrà gli obiettivi oggetto senza il loro percorso relativo:

foo.o: src/foo.c src/foo.h 
bar.o: src/bar.c src/bar.h src/baz.h 

Come non li ho trasformarli in questo:

src/foo.o: src/foo.c src/foo.h 
src/bar.o: src/bar.c src/bar.h src/baz.h 

?

Ho provato a utilizzare il flag -MT, ma sembra eliminare completamente gli obiettivi degli oggetti.

risposta

6

-MT imposta l'intero nome del target. Se si desidera un target diverso per ogni sorgente, è necessario un -MT argomento diverso per ciascuna fonte, il che significa più invocazioni del compilatore e un ciclo foreach:

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    rm autodep 
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;) 

In alternativa, è possibile utilizzare sed per massaggiare l'uscita

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep 

Più facile ancora è quello di mettere le dipendenze per ogni file sorgente in esso file .de e utilizzare il flag -MMD per generare che quando si compila il file sorgente:

-include $(SOURCES:.c=.d) 
CFLAGS += -MMD 

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
+0

Grazie! Io uso il ciclo 'foreach', e il contenuto di' autodep' ora è corretto. Ma in realtà non sembra funzionare. Usando l'esempio della domanda, se cambio 'src/bar.h' ed eseguo' make', ho appena ottenuto make: \ 'src/foo.o 'è aggiornato'. –

+0

Risolto mettendo il '-include' dopo' all: '. –

Problemi correlati