visual-studio - 为什么即使更改依赖项也不会构建 CMake 自定义目标

标签 visual-studio cmake

我的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 后的解决方案(如果修改了 cmake 文件或 CMakeLists.txt 文件,则会出现此问题)。

最佳答案

Is there a way to tell CMake that some extra files may invalidate the solution and require CMake to be ran again?

是的。您正在寻找目录属性 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。构建自定义目标意味着它的所有依赖项都必须更新,这意味着将检查并在必要时触发“从”linkfile.txt 生成 x 的自定义命令.

但是,以上仅作为解释;解决您的问题的正确方法是使用 CMAKE_CONFIGURE_DEPENDS

关于visual-studio - 为什么即使更改依赖项也不会构建 CMake 自定义目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45820405/

相关文章:

c++ - 迁移 am2cmake

c++ - 将 FetchContent_Declare 与 CMAKE_ARGS 一起使用

linux - OpenCV Cmake 无法找到 ffmpeg 库

visual-studio - 命令行参数

c - 修复 MSVC 编译器错误 C1074 : Illegal extension

cmake - 带有特殊字符的 custom_command ECHO

c++ - 在 MacOS 上编译动态库,库搜索路径指向同一目录(CMake)

visual-studio - 显示方法定义的键盘快捷方式(在 Visual Studio 2008 中)是什么?

c++ - 在 Visual Studio 中,与 std::async 一起使用时未调用 `thread_local` 变量的析构函数,这是错误吗?

c# - 如何从 visual studio 2013 中禁用 mscorlib.dll?