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

tho*_*kra 10 c c++ gcc cmake

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

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

pch.h
 |- dependA.h
 |- dependB.h
 ...
Run Code Online (Sandbox Code Playgroud)

pch.h作为依赖项提供将导致在相应的目标中生成适当的目标,该目标makefile跟踪对其的更改pch.h.但是,CMake不解析内部 包含pch.h,因此不会识别对dependA.h和的更改dependB.h.如果存在依赖关系等,这会扩展dependsA.h.

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

由于任务不是太难,因此有一些明显的想法浮现在脑海中:

解决方案A:

手动输入所有依赖项.显然这是有效的,但是地狱般繁琐,根本无法扩展.

解决方案B:

如果可能,编写一个CMake函数来自动执行该过程并"手动"解析包含.

解决方案C:

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

解决方案D:

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

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

sak*_*kra 4

add_custom_commandIMPLICIT_DEPENDS的选项可能会解决问题:

add_custom_command(
    OUTPUT outFile
    COMMAND ...
    IMPLICIT_DEPENDS CXX "pch.h")
Run Code Online (Sandbox Code Playgroud)

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