如何处理在 gcc auto-generated header 依赖项中将源代码从 C 移动到 C++?

How to handle moving sources from C to C++ in gcc auto-generated header dependencies?

我们有一个项目,现在正在慢慢地从 C 迁移到 C++。它使用 GNU Make 作为构建系统。我们使用 GCC -M 标志来生成对 header 的依赖。

生成依赖项时GCC 将源文件和所有需要的header 添加到依赖项列表。要work-around header 删除有-MP 标志。但是当源文件从 .c 扩展名移动到 .cpp 扩展名(或在分支之间切换时向后移动)时它不会修复错误,因为仍然存在 auto-generated 对 .c 的依赖,它不再存在。

我想出一些方法来修复它,但所有的接缝都有点不对劲:

  1. 迁移时始终更改文件名
  2. 根据语言在具有依赖性的文件上生成不同的名称
  3. 通过自己的脚本重写生成的依赖项。
  4. 添加目标以忽略依赖项中所有缺失的 .c/.cpp

我是否错过了一些简单的修复方法?

小例子:

-include a.d

%.o: %.c
    gcc -MP -MMD -MF $*.d -MQ $@ -c -o $@ $<

%.o: %.cpp
    g++ -MP -MMD -MF $*.d -MQ $@ -c -o $@ $<

a: a.o
    g++ a.o -o a

在上面的例子中,如果从 a.c 编译 a 然后移动 a.c -> a.cpp

make: *** No rule to make target 'a.c', needed by 'a.o'. Stop.

会出现错误。但是在干净的构建之后会正常通过。

第二个选项(基于 .d 输入文件名的文件名,而不是输出文件名)似乎是最常用的选项。也就是说,使用 -MF $@.d 而不是 -MF $*.d.

如果您当前将目标文件列为依赖项,您或许可以将其切换为源文件列表,您可以使用 $(patsubst …) 从中生成目标文件列表。 (这假定源文件具有常规名称或位置,这些名称或位置指示将在何处使用目标文件。)或者您可以使用 $(wildcard …) 从源树中自动获取列表,或使用生成的清单文件来自版本控制系统的签入文件列表。