2013-03-14 133 views
5

我使用GCC中的-MM标志为对象生成makefile依赖关系。该makefile简要看起来像这样:GCC makefile依赖关系生成路径

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(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标志,但它似乎完全放弃了对象目标。

回答

6

-MT设置整个目标名称。如果你想为每个源不同的目标,你需要一个不同的-MT参数为每个源,这意味着编译器的多个调用和foreach循环:

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

或者,你可以使用SED按摩输出

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

更容易还是把每一个源文件的依赖关系到它自己.D文件,并使用-MMD标志产生,当你编译源文件:

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

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

谢谢!我使用'foreach'循环,'autodep'的内容现在是正确的。但它似乎并不奏效。使用这个问题的例子,如果我更改'src/bar.h'并运行'make',我只是'make:\'src/foo.o'是最新的'。 – 2013-03-15 13:48:08

+0

通过在'all:'之后放置'-include'来解决它。 – 2013-03-15 18:38:58