CMake零检查无法检测到Xcode生成器的CMakeLists.txt文件中的更新

时间:2018-10-10 15:35:03

标签: c++ xcode cmake

背景

我有一个大型项目,可完美在Windows上运行。 在CMakeLists.txt中应用了一些更改并构建了项目后,Visual Studio项目将正确更新。

Xcode版本:10.0(10A255)或10.1(10B61)(在不同的计算机上测试)。

cmake版本:3.12.2或3.13.1

问题

在Mac OS上为Xcode构建相同项目时出现问题。 配置cmake之后:

cmake .. -G Xcode

生成的项目运行正常,一切正常构建并且测试通过。

现在,当修改CMakeLists.txt文件(开发项目或从存储库中获取新更改)并且选择ZERO_CHECKBUILD_ALL时,构建不会导致Xcode项目更新。 调用cmake .也不会检测到更改。

解决方法

我发现最好的解决方法是删除一切两个文件:cmake_install.cmakeCMakeCache.txt。然后重新运行生成项目cmake .. -G Xcode的命令。
在这种情况下,可以从头开始重做整个检测,但是至少构建不是从零开始的(不会重新编译未更改的文件)。

这很痛苦,因为必须完成许多手动工作,并且必须重新创建项目,这会浪费时间。

提示

在以前的某个项目中,我遇到了类似的问题,但是仅当maven检测到依赖项更新时才发生这种情况,因此这种情况很少发生。发生这种情况时,我刚刚打电话给touch CMakeLists.txt并重新构建,此解决方法很好。此解决方案不适用,因为每个版本都有此问题。

我怀疑protobuf的生成过程中有某些东西,但是当我禁用它时,问题仍然存在。

我试图通过创建简单的项目文件来提供完整的最小示例,但是我无法重现该问题。对于其他所有项目,它都可以正常工作,因此系统配置不是问题。

问题

运行cmake来查找此问题的根源时,如何调试项目生成过程?

这是一个已知问题吗?

是否有更好的解决方法,不会导致完全重建重新生成项目文件(还涉及检测系统功能)?

1 个答案:

答案 0 :(得分:0)

<块引用>

这是一个已知问题吗?

在 CMake Discourse 上,Craig Scott(CMake 维护者之一)评论了这个错误的一个变体,作为 Xcode 的已知架构限制:

<块引用>

使用 Xcode 生成器,目标依赖于 ZERO_CHECK 目标,如果发生变化,它会自动为您重新运行 cmake。但问题是该运行中构建的其余部分仍然使用 cmake . 运行之前的旧细节。如果您再次构建,则会重新构建任何细节发生更改的内容,但如果您知道更改的项目的相关信息,首先明确重新运行 cmake . 会更加稳健,并且可能避免更多不必要的重新构建。

-- https://discourse.cmake.org/t/documented-criteria-for-build-correctness/3087/2?u=alex

鉴于此,您关于“调用 cmake . 未检测到更改”的评论很奇怪,但可能是旧的 CMake 版本,例如您在提出此问题时使用的 3.12 和 3.13,具有此后已修复的错误。它也可能是我们只能猜测的特定于项目的东西。缺少 CMAKE_CONFIGURE_DEPENDS 目录属性? set(... CACHE ... FORCE) 通话不好?不能说...