CMake / Ninja试图编译已删除的`.cpp`文件

时间:2015-06-20 01:44:03

标签: c++ cmake ninja

我发现当我使用cppcmake从我的项目中删除ninja文件时,如果没有先完全删除我的构建目录并从刮。 CMake和/或Ninja显然松散了对它编译的所有cpp文件的一些引用,甚至在重新运行之前删除了CMake缓存.CMake没有删除所有引用。

这是一个已知问题吗?有解决方案吗?我偶尔会跑rm $(grep -R <filename> <builddir>),但这是一个可怕的笨蛋。

编辑:看来我错了,因为我无法复制此问题。手动重新运行CMake似乎始终生成.cpp文件的正确列表,甚至使用GLOB生成源列表。

1 个答案:

答案 0 :(得分:4)

将我的评论转化为答案

使用file(GLOB ...)

收集源文件

是的,在使用file(GLOB ...)命令收集源文件时,CMake不知道新的或已删除的源文件。这是CMake的已知限制。因为这个原因,我已经改变了我的CMake项目以单独列出所有源文件。出于方便,我仍然使用file(GLOB ...)命令收集我的头文件。

引自CMake的file()命令文档:

  

我们不建议使用GLOB从中收集源文件列表   你的源代码树。如果源没有更改CMakeLists.txt文件   添加或删除然后生成的构建系统无法知道何时   让CMake重新生成。

删除CMakeCache.txt以重新触发配置

仅删除CMakeCache.txt可能不足以重新触发CMake配置。 Issue 0014820: warn users about removing only CMakeCache.txt声称您还需要删除所有CMakeFiles目录。

根据我的经验,重新触发CMake配置的最可靠方法是触摸其中一个项目CMakeLists.txt文件。

注意:对于ninja,CMake会添加rebuild_cache目标,以便为您的项目再次方便地运行CMake。

源代码管理更新后的重新触发

只有一个想法:如果删除源文件是因为它们已从源代码管理中删除,那么可能还有一种解决方法仍允许您在源文件上使用file(GLOB ...)

E.g。如果您使用GIT,则可以将以下内容添加到主CMakeLists.txt

configure_file(${CMAKE_SOURCE_DIR}/.git/index ${PROJECT_BINARY_DIR}/git_index.tmp) 

缺点:它将重新触发每个GIT操作(更新,提交,...)的配置。

部分参考资料