CMake:删除标头依赖项

时间:2017-05-16 17:10:38

标签: cmake timestamp dependencies

有没有办法让CMake“忘记”依赖树中的文件?我的原始问题(避免XY情况)如下:我想为一组工具的构建加时间戳,这些工具之间具有复杂的依赖关系以及其他工具。现在,我想使用纯时间戳,但后来我可能想要从存储库(SVN)添加一些信息。无论我最终实现什么系统都需要具备以下特征(我的“X”):

  • 没有不必要的重建:如果唯一的更改是时间戳,则不应在每个make上重建可执行文件。
  • 更新任何更改:如果要重建任何工具或重新链接,通过更改其代码或其某个依赖项,时间戳需要到更新。

我目前的解决方案是创建一个自定义命令+目标,在make时调用CMake(因此命令使用-P script.cmake调用CMake)来生成timestamp.h文件。我的工具的主要文件将包含该文件,项目将依赖于目标,以便首先重建它。

然而,这有它的缺点:如果我在每次调用make时都更新时间戳文件,那么即使我没有将它列为我的工具的显式依赖项,CMake的依赖扫描程序也会知道该文件。因此,每个make将至少触发相应“主”文件和相应重新链接的重新编译。使用数十个工具,这意味着当我可能同时处理其中的两个或三个时,会减慢构建速度。

所以,我认为我的解决方案是以某种方式让CMake在为每个工具的“main”文件构建其依赖关系树时忘记该文件。我会依赖于依赖于文件的自定义目标,以便在每次调用make时首先重新生成它。但是,构建工具认为该文件是相关的,以确定是否有必要实际重建每个单独的工具。因此,只会重建其他更改的工具(满足我的第一个标准),并且任何导致重建工具的更改显然都会使用刚生成的版本(满足第二个标准)。

令我懊恼的是,我还没有找到让依赖扫描程序忘记这个文件的方法,所以我的解决方案无法使用。我怎么去做这样的事情?它是否可能,或者完全是错误的方式去做?我正在使用CMake 3.4,我的代码目前是C ++,但我想要一个不依赖于C / C ++细节的解决方案,因为我有一个不同的项目(用Fortran编写),我也希望在其中构建时间戳

1 个答案:

答案 0 :(得分:0)

我遇到的问题几乎和你一样。简单地通过将时间戳头文件推送到仅包含此头生成器命令的独立目标来解决。之后你有几个选择:

1 ..通过您正在使用的IDE从构建中排除该项目。例如,对于Visual Studio,您可以通过多种方式执行此操作:

1.1。 Project - > Project Dependencies... - >取消选中包含该标题的项目(并非始终有效:Error while removing project dependency in VS2010

1.2。 Build - > Configuration Manager... - >取消选中具有该标题的项目

2 ..创建一个环境变量,并在add_dependencies文件中的CMakeLists.txt命令周围使用带有该变量的条件。

3 ..通过cmake生成器生成2个独立解决方案,其中包含add_dependencies文件中的CMakeLists.txt排除{。}}。

我使用了特殊[1.2]。当我需要构建和调试时,我取消选中dependecy。默认情况下,始终检查dependecy,因此错过构建服务器的时间戳构建没有问题。

注意

时间戳标题将包含在您要包含该标题的所有项目中(例如,通过add_libraryadd_executable),您仍然可以在项目项目菜单下的IDE中观察它即使项目间接依赖于时间戳项目。如果您不想搜索带有标题的时间戳项目从那里打开它并希望从包含该标题的任何项目中打开它,这将非常有用。

因此,如果从add_libraryadd_executable删除时间戳标头,您就没有机会。