2013-03-14 16 views
5

Używam flagi -MM w GCC do generowania zależności plików Makefile dla obiektów. Makefile skrócie wygląda następująco:Ścieżka generowania zależności makefile GCC

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

Źródła znajdują się w folderze src. Jednak plik autodep będzie zawierać cele obiektów bez ich ścieżki względnej:

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

Jak należy przekształcić je w ten sposób:

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

?

Próbowałem użyć flagi -MT, ale wydaje się, że w ogóle odrzuca obiekty docelowe.

Odpowiedz

6

-MT Ustawia całą nazwę celu. Jeśli chcesz inny cel dla każdego źródła, trzeba inną -MT argument dla każdego źródła, co oznacza Wielokrotne wywołania kompilatora i pętli foreach:

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

Naprzemiennie można użyć sed do masażu wyjście

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

Łatwiej nadal jest umieszczenie zależności dla każdego pliku źródłowego do niego własny plik .d i użyć flagi -MMD wygenerować że podczas kompilacji pliku źródłowego:

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

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

Dzięki! Używam pętli foreach, a zawartość 'autodep' jest teraz poprawna. Ale tak naprawdę nie działa. Korzystając z przykładu z pytania, jeśli zmienię 'src/bar.h' i uruchom' make', po prostu otrzymam 'make: \' src/foo.o 'jest aktualny'. –

+0

Rozwiązano, wstawiając '-include' po' all: '. –

Powiązane problemy