如何跟踪CMakeLists.txt

Jun*_*oue 19 cmake

有没有办法检查cmake在失败的运行中正在做什么?例如,我有一个程序取决于libbacktrace,我可以链接到gcc foo.c -lbacktrace.但是当我写一个CMakeLists.txt喜欢的

cmake_minimum_required(VERSION 2.8)
find_library (BACKTRACE_LIBRARY backtrace)
message (BACKTRACE_LIBRARY=${BACKTRACE_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

和打字cmake <path>,打印出来BACKTRACE_LIBRARY=BACKTRACE_LIBRARY-NOTFOUND.

我该如何找出问题所在?cmake在放弃查找libbacktrace之前执行了哪些命令?它正在执行任何事情吗?在autoconf中,命令都记录在其中config.log,但CMakeOutput.log在这种情况下是空白的.同样,cmake --trace只回显CMakeLists.txt一堆系统cmake文件之后的内容,在这种情况下这是无用的.

请注意,我不是在寻找一种方法来进行这种特殊的find_library工作调用- 这只是一个例子.我的问题是:我有一个没有按预期工作的CMakeLists.txt; 有哪些工具可以帮助我弄清楚它失败的地点和原因?

usr*_*567 12

没有CMake的调试器或类似 ¹.你能做的是:

  1. 阅读CMake的输出,有时它已经给出了"缺少INCLUDE_MYLIB_DIR"等提示.删除CMakeCache.txt和/或删除构建目录,以确保不会丢失输出,因为结果已缓存.重复并检查缓存是否有影响.您会收到更多警告(那些针对CMake脚本的作者/开发人员而不是用户的警告)-Wdev.更多有用的选项是--warn-uninitialized,--warn-unused-vars并且--check-system-vars,请参阅文档以获取更多详细信息.

  2. 检查生成的文件,例如CMakeCache.txt您生成的文件和附加文件,config.h或者输入Doxygen的文件.具有您期望的值的变量是进一步研究的指标.

  3. 查看CMakeFiles子目录中的CMakeError.log和CMakeOuput.log.不幸的是,许多测试不会写入这些文件,但有些测试.例如,C编译器运行将编译器输出放在那里,这有助于找到非预期标志或错误(交叉)编译器的问题.

  4. printf调试.这意味着当您大致知道问题的位置时,输出中间变量message.当您不知道如何评估分支或子表达式(具有AND或OR的表达式的一部分)时,这很有用.此外,您可以将诸如"在mylib版本> 3.2的分支"中的消息放在内部以跟随工作流程.

  5. 降低复杂性.扔出你不知道的东西,直到你的问题消失.再次添加内容,直到问题再次出现.有时使用最小的示例更容易启动新模块来重现问题.令人惊讶的是,这通常有助于查明问题.

  6. 使用--debug-output(用于调试输出)--trace(完整跟踪)和--trace-expand(跟踪和扩展变量)进行调试.对于这些,在第5点取得进展是非常有帮助的,因为否则输出会淹没你.

¹好吧,还有steveire的CMake Daemon Tools.我自己没有使用过它们,但是他们声称提供了内省的可能性,这些内省似乎与调试器非常接近.
编辑:他们现在被称为CMake-server,将成为CMake 3.7的一部分.您可以期待许多工具和IDE会选择它并改进我们开发CMake的方式.


Tor*_*örn 6

在提到的标志--trace(它是变量扩展的同级标志)旁边,--trace-expand还有--debug-output

从文档:

--debug-output
将cmake置于调试模式。

在cmake运行期间打印额外的信息,例如带有message(send_error)调用的堆栈跟踪。

这可能会为您提供所需的信息。也许与--trace

  • 不幸的是,“--trace-expand --debug-output”只是以更多不同的方式呼应了“CMakeLists.txt”中的行,这可能有助于找出“cmake”失败的地方。但我更感兴趣的是我已经知道哪一行发生故障的情况,并且我想要更多有关“cmake”在幕后所做的操作以失败的信息。 (2认同)