CMake - 自动解析预编译头的依赖关系?

时间:2013-10-14 08:33:05

标签: c++ c gcc cmake

到目前为止,至少据我所知,在CMake中没有标准的方法来指定以跨平台方式向项目添加预编译头(PCH),因为C ++编译器处理PCH的方式是供应商之间差异很大。对于G ++,通常可以通过简单地添加自定义命令来解决这个问题,该命令负责使用适当的输入调用编译器并使其生成PCH。

我目前的问题是CMake不会解析您为自定义命令指定的依赖项的依赖项。例如,假设以下结构:

pch.h
 |- dependA.h
 |- dependB.h
 ...

仅提供pch.h作为依赖关系将导致在相应的makefile中生成相应的目标,该目标会跟踪pch.h的更改。但是,CMake无法解析 pch.h内的包含,因此无法识别对dependA.hdependB.h的更改。如果存在dependsA.h的依赖关系,那么这会扩展。

注意:我知道PCH依赖关系可以并且确实经常更改的事实使整个过程受到质疑。然而,这就是它的方式,我无法对它做任何事情。

由于任务不是太难,因此可以想到一些明显的想法:

解决方案A:

手动输入所有依赖项。显然这有效,但是很乏味,而且根本不可扩展。

解决方案B:

如果可能,编写一个自动执行过程的CMake函数,并“手动”解析包含。

解决方案C:

使用不同的语言(例如Python)执行类似操作,并且只提供CMake要添加到自定义命令的依赖项列表。

解决方案D:

使用gcc / g++的功能来解析并打印出PCH的依赖关系树,并解析输出以提取依赖关系列表。

我的问题是:有没有人知道更方便,更快捷的方法来完成这项工作?

1 个答案:

答案 0 :(得分:4)

add_custom_commandIMPLICIT_DEPENDS选项可能会解决问题:

add_custom_command(
    OUTPUT outFile
    COMMAND ...
    IMPLICIT_DEPENDS CXX "pch.h")

IMPLICIT_DEPENDS选项使生成的构建系统在构建时扫描给定输入文件的隐式依赖项。但是,它仅支持Makefile生成器。