我如何调试CMakeLists.txt文件?

114

除了使用message()命令之外,我如何调试CMakeLists.txt文件(至少执行列出变量等操作)?


也许这个链接会有帮助:https://dev59.com/M1kT5IYBdhLWcg3wPtQv#38869455 - usr1234567
7个回答

70
在最初编写本答案时,CMake没有交互式调试器,但可以使用标志-Wdev--debug-output--trace来获取额外信息,并检查日志文件CMakeFiles\CMakeOutput.logCMakeFiles\CMakeError.log,这些文件主要收集由CMake调用的进程产生的输出(例如在检查类型或头文件存在性时)。 自3.7版本以来, CMake现在正式支持“服务器模式”,因此集成在IDE中很可能会在不久的将来改善。初始支持已经存在于Qt CreatorVisual Studio 2017 RC中。

自3.27版本以来, CMake也支持Debug Adapter Protocol(调试适配器协议),几个IDE供应商(例如CLionVisual Studio)现在要么支持CMake调试,要么已经宣布了对CMake调试的支持。具体工作方式取决于特定的IDE。


我们在CmakeList.txt中调试if语句时使用哪个命令? came --debug ...cmake --debug-output ...都无法打印它们。在Bash中,相当于bash -x <cmd> - jww
@jww 我不完全确定你想要调试什么,但是 --trace 的输出通常非常详细(将输出重定向到文件中!) - Joe
我试图调试脚本并理解为什么某些代码块没有被执行。但我找到了问题所在:string(STRIP ...)出现了问题。另请参见如何剥离Cmake变量中的尾随换行符?。如果您不知道bash -x是什么,请原谅我的无知。 - jww
2
你不应该只提到检查日志,而应该解释如何去检查日志。 - Thomas Jay Rush
@ThomasJayRush,我添加了有关日志文件位置和内容的信息。除此之外,任何进一步的处理都取决于具体问题。 - Joe
显示剩余2条评论

13

你可以尝试使用由VisualGDB工具提供的新CMake脚本调试器。它使用了支持遍历CMakeLists.txt文件、设置代码/数据断点、评估/更改变量等功能的开源CMake分支

这里有一个详细的新调试器步骤教程


10

我喜欢使用 variable_watch 命令 "调试" 我的 CMakeLists.txt 文件。只需要在脚本顶部设置:

variable_watch(SOME_MY_VAR)

7
如果你正在使用一个集成开发环境(IDE), 相关的是,CMake 3.27 提供了 --debugger 标志来启用使用Debug Adapter Protocol进行交互式调试。还请参阅 --cmake-debugger-pipe 标志 --debugger-dap-log 标志
另外,
在 CMake v3.26 之前,您可以(如 CMake 的诊断消息所建议)查看生成的构建系统二进制/构建目录中的 CMakeFiles/CMakeOutput.log 和 CMakeFiles/CMakeError.log 文件。

从CMake v3.26开始,将不再支持/创建CMakeFiles/CMakeOutput.log和CMakeFiles/CMakeError.log文件。根据发布说明:

CMakeFiles/CMakeOutput.log和CMakeFiles/CMakeError.log文件不再由CMake的内置模块填充。cmake(1)在出现CMake错误后不再建议查看它们。之前记录在这些文件中的信息现在记录在cmake-configure-log(7)中。

您可能会发现其他与CMake调试相关的实用工具包括以下内容:

额外信息:如果您想要对构建性能进行分析,您可以查看工具链中所提供的工具,如Ninja和Clang。Craig Scott在这里写了一篇有关该主题的文章:https://crascit.com/2022/06/24/build-performance-insights/


5

这里有steveire的CMake Daemon Tools。我自己没有使用过,但他们声称提供了非常接近调试器的内省可能性。

编辑:它们现在被称为CMake-server,是CMake 3.7的一部分。


4

另外,阅读有关环境变量VERBOSE的内容:https://cmake.org/cmake/help/latest/envvar/VERBOSE.html

我是这样使用它的:

export VERBOSE=defined
make

同时得到更多的冗长信息。

在其他情况下,请编辑CMakeLists.txt文件,并包含以下行:

set(CMAKE_VERBOSE_MAKEFILE ON)

一些有关此事的帖子,请参考 https://bytefreaks.net/programming-2/make-building-with-cmake-verbose
此外,有一些有用的 cmake 选项可以控制调试输出,详见 manpage:https://cmake.org/cmake/help/latest/manual/cmake.1.html

0

1
请注意:我的答案中已经涵盖了您所提到的内容。请参考此链接:https://dev59.com/BmEh5IYBdhLWcg3wHAND#75701905 - starball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接