【问题标题】:Why CMake custom target won't be built even if dependency was changed为什么即使更改了依赖项也不会构建 CMake 自定义目标
【发布时间】:2018-01-30 21:41:13
【问题描述】:

我的CMakeLists.txt 文件解析一些文本文件,其中库依赖项由开发人员指定。这些文件,我们称它们为linkfile.txt,是列出要链接的库的简单文本文件,这使得不熟悉CMake 的开发人员可以轻松扩展库依赖列表。

我使用 Visual Studio 2015 生成器。

现在,当您修改此文本文件时,Visual Studio 不会在您请求构建​​解决方案时自动运行 CMake 来更新解决方案(当您修改包含的 cmake 文件或 CMakeLists.txt 文件时会自动运行)。

有没有办法告诉CMake,一些额外的文件可能会使解决方案无效并需要再次运行CMake

如果没有,我已经有一个自定义目标可以让用户在需要时手动运行 CMake:

ADD_CUSTOM_TARGET( RECONFIGURE COMMAND ${CMAKE_COMMAND} ${CMAKE_BINARY_DIR} )

所以我可以重复使用它。但是,如果我将DEPENDS [path_to]/linkfile.txt 参数指定为ADD_CUSTOM_TARGET,当我在修改linkfile.txt 后请求生成解决方案时,RECONFIGURE 不会自动生成(而如果修改了cmake 文件或CMakeLists.txt 文件则会自动生成) )。

【问题讨论】:

    标签: visual-studio cmake


    【解决方案1】:

    有没有办法告诉CMake,一些额外的文件可能会使解决方案无效并需要再次运行CMake

    是的。您正在寻找目录属性CMAKE_CONFIGURE_DEPENDS。在您的情况下,您可以这样使用它:

    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS linkfile.txt)
    

    但是,我对 CMake 3.7.2 和 VS 2013 的实验表明,虽然该文件实际上已添加到解决方案中的依赖项列表中,但依赖项扫描程序并没有以某种方式获取它。因此,您可以通过configure_file 传递文件来使用解决方法:

    configure_file(linkfile.txt linkfile.txt COPYONLY)
    

    这会将文件从它的源位置复制到二进制目录中,并且将它作为配置步骤的依赖项引入,以 CMake 确实 尊重的方式。


    尝试使用自定义目标执行此操作会更加复杂。 CMake 的自定义目标总是被认为是过时的, 因此,每当您要求构建一组包含自定义目标的目标时,该自定义目标就会运行。请注意,默认情况下,自定义目标不是all 的一部分,这就是为什么您的目标不会被简单的解决方案重建所拾取的原因。如果它是all 的一部分(通过在add_custom_target() 调用中添加参数ALL),它将在每个 重建时触发,而不管依赖关系如何(自定义目标总是 已过期)。

    解决这个问题的方法是使用自定义命令来运行 CMake,它依赖于 linkfile.txt 并涉及文件 x。自定义目标RECONFIGURE 将在其DEPENDS 中包含x。构建自定义目标意味着必须更新其所有依赖项,这意味着生成 x "from" linkfile.txt 的自定义命令将被检查并在必要时触发。

    但是,以上只是解释;解决问题的正确方法是使用CMAKE_CONFIGURE_DEPENDS

    【讨论】:

    • 这看起来不错。但是,当我添加set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "linkfile.txt"),修改linkfile.txt 然后选择“构建解决方案”时,VS 不运行CMake。还尝试使用GLOBAL 而不是DIRECTORY,同样的行为。如果我修改 CMakeLists.txt 文件,则 CMake 由 VS 运行。请注意,linkfile.txt 与库的 CMakeLists.txt 位于同一位置...
    • @jpo38 越来越好奇。我在 VS 中看到 ZERO_CHECKgenerate.stamp.rule 的依赖项中列出的文件,但它没有获取依赖项。我将在答案中添加一个解决方法。
    • @jpo38 添加并测试了解决方法。如果适用,我会再尝试一下并提交 CMake 错误报告。
    • 这行得通,谢谢。请注意,我必须为configure_file first 参数(${CMAKE_CURRENT_SOURCE_DIR}/linkfile.txt)指定完整的文件路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    相关资源
    最近更新 更多