使gcc -MM输出对象文件名的相对路径

时间:2013-01-31 19:07:37

标签: gcc makefile

我正在使用 gcc 来生成我的Makefile的依赖项。但它不使用相对路径。例如,

gcc -MM util/test.c ui/resource.c

产生

test.o: util/test.h
resource.o: ui/resource.h

虽然,为了让 make 找到依赖关系,它可以生成如下内容:

util/test.o: util/test.h
ui/resource.o: ui/resource.h

有没有办法让gcc表现得像第二个例子?

1 个答案:

答案 0 :(得分:4)

来自man gcc

  

-MT 目标
      更改依赖关系生成所发出的规则的目标。默认情况下,CPP获取主输入文件的名称,删除任何目录组件和任何文件后缀(如.c),并附加平台的常用对象后缀。结果是目标。

     

-MT选项会将目标设置为您指定的字符串。如果需要多个目标,可以将它们指定为-MT的单个参数,或使用多个-MT选项。

     

例如,-MT'$(objpfx)foo.o'可能会给出

     

$(objpfx)foo.o:foo.c

     

-MQ 目标
      与-MT相同,但它引用了Make特有的任何字符。 -MQ'$(objpfx)foo.o'给出

     

$$(objpfx)foo.o:foo.c

     

自动引用默认目标,就好像它是使用-MQ一样。

所以,你可以使用例如

gcc -MM -MT util/test.o util/test.c
gcc -MM -MT ui/resource.o ui/resource.c

更新

如果你想在一个文件中使用所有依赖项,有几种可能性。

您可以按顺序执行gcc -MM并重定向输出

( gcc -MM -MT util/test.o util/test.c; gcc -MM -MT ui/resource.o ui/resource.c ) >file.deps

您可以使用sed或perl

对输出进行后处理
gcc -MM util/test.c ui/resource.c | perl -p -e 's,^(.+?)\.o: (.+?)/\1\.c.*,$2/$&,;' >file.deps

您可以重定向第一个输出并将以下内容附加到某个文件

gcc -MM -MT util/test.o util/test.c >file.deps
gcc -MM -MT ui/resource.o ui/resource.c >>file.deps