除了使用message()
命令之外,我如何调试CMakeLists.txt
文件(至少执行列出变量等操作)?
除了使用message()
命令之外,我如何调试CMakeLists.txt
文件(至少执行列出变量等操作)?
-Wdev
,--debug-output
和--trace
来获取额外信息,并检查日志文件CMakeFiles\CMakeOutput.log
和CMakeFiles\CMakeError.log
,这些文件主要收集由CMake调用的进程产生的输出(例如在检查类型或头文件存在性时)。
自3.7版本以来, CMake现在正式支持“服务器模式”,因此集成在IDE中很可能会在不久的将来改善。初始支持已经存在于Qt Creator和Visual Studio 2017 RC中。
自3.27版本以来, CMake也支持Debug Adapter Protocol(调试适配器协议),几个IDE供应商(例如CLion或Visual Studio)现在要么支持CMake调试,要么已经宣布了对CMake调试的支持。具体工作方式取决于特定的IDE。
CmakeList.txt
中调试if
语句时使用哪个命令? came --debug ...
和cmake --debug-output ...
都无法打印它们。在Bash中,相当于bash -x <cmd>
。 - jww--trace
的输出通常非常详细(将输出重定向到文件中!) - Joestring(STRIP ...)
出现了问题。另请参见如何剥离Cmake变量中的尾随换行符?。如果您不知道bash -x
是什么,请原谅我的无知。 - jww我喜欢使用 variable_watch 命令 "调试" 我的 CMakeLists.txt 文件。只需要在脚本顶部设置:
variable_watch(SOME_MY_VAR)
--debugger
标志来启用使用Debug Adapter Protocol进行交互式调试。还请参阅 --cmake-debugger-pipe
标志和 --debugger-dap-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调试相关的实用工具包括以下内容:
要将CMake置于跟踪模式下,打印所有调用及其来源,请使用 --trace标志 和/或相关标志如 --trace-expand, --trace-format, --trace-source 和 --trace-redirect。
要使CMake发出针对CMakeLists.txt作者的开发者警告,请使用 -Wdev标志。
要使CMake发出关于弃用功能的警告,请使用 -Wdeprecated标志。
要将CMake置于调试模式,打印诸如带有 message(SEND_ERROR) 调用的堆栈跟踪,请使用 --debug-output标志。
要监视变量的更改,请使用 variable_watch命令。
要在使用未初始化的变量时让CMake发出警告,请使用 --warn-uninitialized标志。
要调试诸如find_program()、find_library()、find_file()、find_path()和find_package()等命令,使用 --debug-find标志,或者为了在更细粒度的范围内进行调试,使用 CMAKE_FIND_DEBUG_MODE变量。
要调试try_compile/try_run失败,请使用 --debug-trycompile标志。
如果您想对CMake脚本执行进行性能分析,请参阅 --profiling-output 和 --profiling-output 标志。
额外信息:如果您想要对构建性能进行分析,您可以查看工具链中所提供的工具,如Ninja和Clang。Craig Scott在这里写了一篇有关该主题的文章:https://crascit.com/2022/06/24/build-performance-insights/。
这里有steveire的CMake Daemon Tools。我自己没有使用过,但他们声称提供了非常接近调试器的内省可能性。
编辑:它们现在被称为CMake-server,是CMake 3.7的一部分。
另外,阅读有关环境变量VERBOSE
的内容:https://cmake.org/cmake/help/latest/envvar/VERBOSE.html
我是这样使用它的:
export VERBOSE=defined
make
同时得到更多的冗长信息。
在其他情况下,请编辑CMakeLists.txt
文件,并包含以下行:
set(CMAKE_VERBOSE_MAKEFILE ON)
cmake
选项可以控制调试输出,详见 manpage:https://cmake.org/cmake/help/latest/manual/cmake.1.html。cmake
命令加上--debugger
参数启动,它将通过Debug Adapter Protocol提供调试功能。