【发布时间】: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