至少据我所知,至少CMake没有一个标准的方法来指定以跨平台方式向项目添加预编译头(PCH),因为PC编译器的处理方式与供应商.对于G,这通常是通过简单地添加一个自定义命令来处理,该命令负责使用适当的输入调用编译器,并生成PCH.
我当前的问题是,CMake不会解析您为自定义命令指定的依赖关系的依赖关系.例如,假设以下结构:
pch.h |- dependA.h |- dependB.h ...
只提供pch.h作为依赖关系将导致在相应的makefile中生成适当的目标,跟踪对pch.h的更改.但是,CMake不解析pch.h中的include,因此不会识别dependA.h和dependB.h的更改.如果依赖关系依赖于依赖性等等,这将会延续下去.
注意:我知道,PCH依赖关系可以和经常改变的事实使整个过程成为问题.然而,这只是它的方式,我不能真正做任何事情.
由于任务不是太难,有几个明显的想法可以想到:
解决方案A:
手动输入所有依赖项.显然这是有效的,但是如果没有任何规模,那么它就是无聊的.
解决方案B:
如果可能,请编写一个自动化进程并解析包含“手动”的CMake功能.
解决方案C:
使用不同的语言(例如Python)执行类似的操作,并且只需要为CMake提供添加到自定义命令的依赖关系列表.
解决方案D:
使用gcc / g的功能来解析和打印PCH的依赖关系树,并解析输出以提取依赖关系列表.
我的问题是:有没有人知道一个更方便快捷的方式来完成这个工作?
解决方法
add_custom_command的IMPLICIT_DEPENDS选项可能会诀窍:
add_custom_command( OUTPUT outFile COMMAND ... IMPLICIT_DEPENDS CXX "pch.h")
IMPLICIT_DEPENDS选项使生成的构建系统在构建时扫描给定输入文件的隐式依赖关系.但是,它只支持Makefile生成器.