【问题标题】:CMake: Remove header dependencyCMake:删除标头依赖项
【发布时间】:2017-05-16 17:10:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 如此复杂的描述...您是否希望某个程序 输出其上次重建/重新链接的时间戳?为此,您希望使用带有时间戳的头文件,但是通过每次生成此文件,无论其源是否更改,您都会触发程序的重建。 我的理解正确吗? 如果是这样,关于同一主题有几个(至少)SO 问题。喜欢this one
  • @Tsyvarev 是的,这就是我想要的,你的理解是正确的。但是,您链接的答案谈到在可执行文件外部生成 separate 时间戳文件......我想我的解决方案可能是修改我的程序以从那些“时间戳文件”中读取,但是我发现该解决方案不太理想。我阅读的其他 SO 问题涉及创建此时间戳标头的机制(自定义命令、自定义目标、使可执行目标依赖于它们等),而不是如何避免重建的特定问题使用时间戳标头时不必要的。

标签: cmake timestamp dependencies


【解决方案1】:

我遇到的问题几乎和你一样。只需将时间戳头文件推送到仅包含此头生成器命令的独立目标即可解决。之后您有多种选择:

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

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

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

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

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

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

注意

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多