GCC makefile依赖生成路径

时间:2013-03-14 21:34:01

标签: gcc makefile

我在GCC中使用-MM标志来生成对象的makefile依赖项。 makefile简要如下:

-include autodep
...
$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)
    $(CC) -MM $(SOURCES) > autodep

源位于文件夹src中。但是,autodep文件将包含没有相对路径的对象目标:

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

我应该如何将它们变成这个:

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

我尝试使用-MT标记,但它似乎完全丢弃了对象目标。

1 个答案:

答案 0 :(得分:6)

-MT设置整个目标名称。如果您希望每个源使用不同的目标,则每个源需要一个不同的-MT参数,这意味着对编译器和foreach循环进行多次调用:

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

或者,您可以使用sed按摩输出

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

更容易将每个源文件的依赖项放入自己的.d文件中,并在编译源文件时使用-MMD标志生成:

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

$(TARGET): build $(OBJECTS)
    $(CC) -shared -o $@ $(OBJECTS)