CMake Zero Check无法检测Xcode生成器的CMakeLists.txt文件中的更新

Mar*_*k R 8 c++ xcode cmake

背景

我有一个很棒的项目,可以完美地在Windows上运行.在应用某些更改CMakeLists.txt并构建项目时,Visual Studio项目已正确更新.

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

cmake版本:3.12.2或3.13.1

问题

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

cmake .. -G Xcode
Run Code Online (Sandbox Code Playgroud)

生成的项目工作正常,一切正常构建,测试正在通过.

现在,当CMakeLists.txt文件被修改(开发项目时或从存储库中获取新的更改时)和/ ZERO_CHECK或被BUILD_ALL选中时,构建不会导致Xcode项目更新.调用cmake .也不会检测到更改.

解决方法

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

这很痛苦,因为必须完成大量的手动操作,并且必须重新创建项目,这会花费时间.

提示

在之前的一些项目中,我遇到了类似的问题,但只有当maven检测到依赖项的更新时才会发生这种情况,因此很少发生.当它发生时我只是touch CMakeLists.txt再次打电话和建立,这个解决方法很好.此解决方案不适用,因为每个构建都有此问题.

我怀疑protobuf生成程序有它的东西,但当我禁用它时,问题仍然存在.

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

问题

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

这是一个已知的问题吗?

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

Ale*_*ing 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)电话吗?不能说...