【问题标题】:How to Trace CMakeLists.txt [duplicate]如何跟踪 CMakeLists.txt [重复]
【发布时间】:2016-08-10 04:50:21
【问题描述】:

有没有办法检查 cmake 在失败的运行中做了什么?例如,我有一个依赖于 libbacktrace 的程序,我可以通过 gcc foo.c -lbacktrace 链接到该程序。但是当我写了CMakeLists.txt之类的

cmake_minimum_required(VERSION 2.8)
find_library (BACKTRACE_LIBRARY backtrace)
message (BACKTRACE_LIBRARY=${BACKTRACE_LIBRARY})

然后输入cmake <path>,它会打印出BACKTRACE_LIBRARY=BACKTRACE_LIBRARY-NOTFOUND

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

请注意,我不是在寻找一种方法来使 find_library 的这种特定调用工作 - 这只是一个示例。我的问题是:我的 CMakeLists.txt 没有按预期工作;有哪些工具可以帮助我找出失败的位置和原因?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    no CMake debugger or similar¹。你可以做的是:

    1. 读取 CMake 的输出,有时它已经给出了诸如“缺少 INCLUDE_MYLIB_DIR”之类的提示)。删除你的 CMakeCache.txt 和/或删除构建目录,以确保你不会因为结果被缓存而错过输出。重复并检查缓存是否有影响。使用-Wdev,您会收到更多警告(那些针对 CMake 脚本的作者/开发者,而不是针对用户的警告)。更有用的选项是 --warn-uninitialized--warn-unused-vars--check-system-vars,有关详细信息,请参阅 documentation

    2. 检查生成的文件,如 CMakeCache.txt 和您生成的其他文件,如 config.h 或 Doxygen 的输入文件。您期望值不同的变量是进一步研究的指标。

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

    4. 使用printf 进行调试。这意味着当您大致知道问题所在的位置时,使用message 输出中间变量。当您不知道如何评估分支或子表达式(带有 AND 或 OR 的表达式的一部分)时,这很有帮助。此外,您可以将“in branch where mylib version is > 3.2”之类的消息放入其中以遵循工作流程。

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

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

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

    【讨论】:

      【解决方案2】:

      除了提到的标志--trace(它是变量扩展兄弟--trace-expand)之外,还有--debug-output

      来自文档:

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

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

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

      【讨论】:

      • 不幸的是,--trace-expand --debug-output 只是以更多不同的方式呼应CMakeLists.txt 中的行,这可能有助于找出cmake 失败的地方。但我更感兴趣的是我已经知道哪条线路失败了,我想了解更多关于 cmake 在幕后所做的事情的信息。
      • 根据find_library 所做的知识,您唯一能做的就是手动(不在CMake 中)查看记录的路径。 <VAR>-NOTFOUND 是 CMake 将在脚本中为您提供的所有内容。
      猜你喜欢
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2020-01-21
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      相关资源
      最近更新 更多