Peter Petrik
Peter Petrik

Reputation: 10185

How can I debug CMakeLists.txt files?

How can I debug CMakeLists.txt files (at least doing things like listing of variables) other than just using the message() command?

Upvotes: 124

Views: 104819

Answers (8)

starball
starball

Reputation: 50915

If you're using an IDE,

Related to that, CMake 3.27 exposes the --debugger flag to enable interactive debugging using the Debug Adapter Protocol. See also the --cmake-debugger-pipe flag and the --debugger-dap-log flag.

Otherwise,

Pre-CMake v3.26, you can (as suggested by CMake's diagnostic messages) look at the CMakeFiles/CMakeOutput.log and CMakeFiles/CMakeError.log files in the generated buildsystem's binary/build directory.

Starting with CMake v3.26, the CMakeFiles/CMakeOutput.log and CMakeFiles/CMakeError.log files will no longer be supported / created. From the release notes:

The CMakeFiles/CMakeOutput.log and CMakeFiles/CMakeError.log files are no longer populated by CMake's built-in modules. cmake(1) no longer suggests looking at them after a CMake Error occurs. Information previously logged to those files is instead logged to the cmake-configure-log(7).

Other CMake debug-related facilities you may find useful include to following:

Bonus info: If you want to profile build performance, you can look into the facilities provided by the tools in your toolchain, such as Ninja and Clang. Craig Scott has written an article on the subject here: https://crascit.com/2022/06/24/build-performance-insights/.

Upvotes: 12

phip1611
phip1611

Reputation: 6170

As it wasn't mentioned, I'd like to add: If you want to debug the effective invocations of execute_process(), you can pass -D CMAKE_EXECUTE_PROCESS_COMMAND_ECHO=STDOUT|STDERR, and the corresponding cmdlines are printed. Requires CMake >= 3.15. Very helpful in my case.

Upvotes: 2

Joe
Joe

Reputation: 6757

At the time of originally writing this answer, there were no interactive debugger for CMake, but it was possible to use the flags -Wdev, --debug-output and --trace for additional information and to check the log files CMakeFiles\CMakeOutput.log and CMakeFiles\CMakeError.log which mainly collect outputs of processes called by CMake (for example while checking for presence of a type or header).

Since version 3.7, CMake now officially supports a "server mode" so integration in IDEs is likely to improve in the near future. Initial support exists both in Qt Creator and Visual Studio 2017 RC

Since version 3.27, CMake also supports the Debug Adapter Protocol and several IDE vendors (for example CLion or Visual Studio) now either support or have announced support for CMake debugging. How it works exactly depends on the specific IDE.

Upvotes: 74

usr1234567
usr1234567

Reputation: 23384

Starting with version 3.27, CMake comes with a built-in debugger. Start cmake with --debugger and it will expose debugging via the Debug Adapter Protocol.

Documentation: https://cmake.org/cmake/help/latest/manual/cmake.1.html#cmdoption-cmake-debugger

Upvotes: 1

Eugene Gr. Philippov
Eugene Gr. Philippov

Reputation: 2092

Also, read about the env var VERBOSE: https://cmake.org/cmake/help/latest/envvar/VERBOSE.html

I used it this way:

export VERBOSE=defined
make

and got some more verbosity.

In other cases, edit CMakeLists.txt file to include the following line:

set(CMAKE_VERBOSE_MAKEFILE ON)

(Some post on this is https://bytefreaks.net/programming-2/make-building-with-cmake-verbose ).

Also, there are useful cmake options controlling debug output, see the manpage: https://cmake.org/cmake/help/latest/manual/cmake.1.html

Upvotes: 5

leanid.chaika
leanid.chaika

Reputation: 2462

I like to use variable_watch to "debug" my CMakeLists.txt files. Just set in top of my script:

variable_watch(SOME_MY_VAR)

Upvotes: 17

Ivan Shcherbakov
Ivan Shcherbakov

Reputation: 2113

You can try using the new CMake Script Debugger provided by the VisualGDB tool. It uses an open-source fork of CMake that supports stepping through CMakeLists.txt files, setting code/data breakpoints, evaluating/changing variables, etc.

There's a detailed step-by-step tutorial on the new debugger here

Upvotes: 14

usr1234567
usr1234567

Reputation: 23384

There are steveire's CMake Daemon Tools. I haven't used them myself, but they claim to offer possibilities for introspection that seem to be pretty close to a debugger.

Edit: They are now called CMake-server and are part of CMake 3.7.

Upvotes: 6

Related Questions