CMakeLists.txt可以依赖于函数解析的文件吗?

时间:2015-07-21 18:37:24

标签: cmake dependencies

我是CMake的新手,第一次从包含许多子项目的大型项目开始。

由于特殊原因(下面描述的好奇)我已经有一组包含文件,其中包含有关每个CMake目标(lib或exe)所需的源文件的信息 - 而且,目前,我更喜欢(重新)使用这些文件(原因也在下面描述)

编写一个函数来解析这些文件并将其内容作为源文件添加到目标中是一项非常简单的任务。

但是 - 现在问题: 显然,我想让每个目标CMakeLists.txt依赖于生成源文件列表的特定包含文件,以便检测包含文件上的更改,就好像它是对CMakeLists.txt本身的更改一样,但我只是可以没有找到关于如何实现这一目标的任何参考资料。

N.B。:我发现了AddFileDependencies,但这是为了在源文件上添加依赖项,而不是CMakeLists.txt。但是,CMake本身可以以某种方式计算出包含.cmake文件的依赖关系,所以我想,应该可以做某种方式。

好奇的背景:
对于这个项目(相当多的可执行目标所使用的库,都被组织为子项目)我使用QMake(没有实际使用Qt本身)来设置makefile。这样做我能够使用Qt Creator,同时仍然能够自动生成Visual Studio解决方案/项目文件 。我们还在评估不同的IDE,但尚未做出选择。但是使用像QMake / CMake这样的生成器的最重要原因并没有被强制手动为所有这些子项目设置VS文件。

虽然我有时需要欺骗QMake来做我想做的事情,但事情进展得很顺利 - 即使对于VS解决方案 - 除了一件事:Visual Studio使用自定义构建规则混淆了对Flex / Bison和其他文件的依赖。它不断重新编译Flex / Bison /其他文件,说“命令行已更改” - 我放弃了尝试修复。

由于这个原因,我想,我会尝试使用CMake作为生成器,到目前为止看起来非常有前景 - 尽管在CMake中没有内置预编译头支持这些天有些荒谬(关于主题,我知道)。

由于Qt Creators CMake支持到目前为止还不如对QMake项目的支持那么好,我坚持,使用解析包含源文件列表的.pri文件的方法将使我能够并排使用QMake和CMake - 尤其是因为剩下的项目设置比大多数开源项目复杂得多。

2 个答案:

答案 0 :(得分:1)

这是一个很好的技巧,可以完全满足您的需求。它基于我在@rpavlik see this so question的git-revision模块中找到的想法

这是整体想法:

  • 创建虚拟时间戳文件
  • 添加自定义命令,只要输入.pri文件发生更改
  • ,该命令就会触及时间戳
  • CMakeLists.txt
  • 中添加时间戳文件

可能的实施:

set(input_pri_file <path-to-the-input-pri-file>)
set(timestamp_file ${CMAKE_CURRENT_BINARY_DIR}/timestamp.cmake)

add_custom_command(
    OUTPUT ${timestamp_file}
    COMMAND ${CMAKE_COMMAND} -E touch ${timestamp_file}
    MAIN_DEPENDENCY ${input_pri_file}
    VERBATIM
    COMMENT "Updating timestamp.cmake"
)

if(NOT EXISTS "${timestamp_file}")
    file(WRITE ${timestamp_file} "") # create initial empty file
endif()
include(${timestamp_file})

# create the file list from input_pri_file
....
# use the file list
add_executable(main ${filelist})

以下是.pri文件更改时发生的情况:

  • 更改会触发自定义命令的执行
  • 更新时间戳
  • 因为CMakeLists包含依赖于它的时间戳
  • 因此更新时间戳会触发CMakeLists.txt
  • 的重新配置

答案 1 :(得分:0)

如果我有一些输入应该重新启动CMake的配置过程,我会使用configure_file()。参见例如How to make CMake reconfiguration depend on custom file?configure_file()'s unit test

因此,在您的情况下,它看起来像:

configure_file(SomeInput.pri ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri)

然后使用${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri生成源。只需确保添加COPYONLY,因为配置不会重新触发SomeInput.pri的更改。

编辑:或者使用 - 相对较新的添加 - CMAKE_CONFIGURE_DEPENDS目录属性。