我的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 requireCMake
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/