378

I use CMake with GNU Make and would like to see all commands exactly (for example how the compiler is executed, all the flags etc.).

GNU make has --debug, but it does not seem to be that helpful are there any other options? Does CMake provide additional flags in the generated Makefile for debugging purpose?

3
  • 2
    Or, to add some search terms, How to hide full, verbose executed command lines and show only terse quiet percentage colored output. Commented May 17, 2011 at 16:48
  • Non CMake superset: stackoverflow.com/questions/5820303/… Commented May 5, 2016 at 12:54
  • 2
    mkdir build; cd build; cmake .. --debug-output; make VERBOSE=1 Commented Oct 26, 2018 at 5:53

8 Answers 8

494

When you run make, add VERBOSE=1 to see the full command output. For example:

cmake . make VERBOSE=1 

Or you can add -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON to the cmake command for permanent verbose command output from the generated Makefiles.

cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON . make 

To reduce some possibly less-interesting output you might like to use the following options. The option CMAKE_RULE_MESSAGES=OFF removes lines like [ 33%] Building C object..., while --no-print-directory tells make to not print out the current directory filtering out lines like make[1]: Entering directory and make[1]: Leaving directory.

cmake -DCMAKE_RULE_MESSAGES:BOOL=OFF -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON . make --no-print-directory 
Sign up to request clarification or add additional context in comments.

9 Comments

These solutions make it too verbose, printing a lot of CMake and make internals that are not interesting. Is there any way to only show compile and link commands (i.e. what is usually relevant for debugging problems). Perhaps even only display the command that failed.
The top google hit recommends "if you want to see solely the g++ command lines, you should use grep & Co. - if possible - in connection with verbose Makefiles". Perhaps developers with lots of cmake experience have other advice.
By the way, if you are on a platform that supports it cmake -GNinja . ; ninja -v shows a very nice verbose output with minimal fluff.
Single line... cmake --build . -- VERBOSE=1
One can also use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON in that case, such that we have all the commands in the file compile_commands.json without actually building the sources.
|
109

It is convenient to set the option in the CMakeLists.txt file as:

set(CMAKE_VERBOSE_MAKEFILE ON) 

3 Comments

Please don't do this for your own projects. Not all your users may want to see your verbose build output. Don't force this on everybody consuming your library. CMAKE_VERBOSE_MAKEFILE should be off by default and a user's choice, if they need it, for debugging purposes.
So? You can always add it as a cache variable if you have multiple developers and want to give them a choice. But yes, in a release version of a project you should have it off by default.
This is a great option when using qt.io QtCreator because cmake is called by the GUI. Thank you!
27

cmake --build . --verbose

On Linux and with Makefile generation, this is likely just calling make VERBOSE=1 under the hood, but cmake --build can be more portable for your build system, e.g. working across OSes or if you decide to do e.g. Ninja builds later on:

mkdir build cd build cmake .. cmake --build . --verbose 

Its documentation also suggests that it is equivalent to VERBOSE=1:

--verbose, -v

Enable verbose output - if supported - including the build commands to be executed.

This option can be omitted if VERBOSE environment variable or CMAKE_VERBOSE_MAKEFILE cached variable is set.

Tested on Cmake 3.22.1, Ubuntu 22.04.

3 Comments

Unknown argument --verbose
@KansaiRobot I've just tested on Ubuntu 22.04 Cmake 3.22.1 and it worked. What's your cmake version?
The --verbose option was added in cmake version 3.14.
17

Or simply export VERBOSE environment variable on the shell like this: export VERBOSE=1

1 Comment

On Windows, setting environment variable VERBOSE to 1 works both for MSVC & MinGW. If you want to undo this, you need to set it to empty, not 0.
8

CMake 3.14+

CMake now has --verbose to specify verbose build output. This works regardless of your generator.

cd project cmake -B build/ cmake --build build --verbose 

It's worth noting however Xcode may not work with --verbose

Some generators such as Xcode don't support this option currently. 

Another option it to use the VERBOSE environment variable.

New in version 3.14. Activates verbose output from CMake and your build tools of choice when you start to actually build your project. Note that any given value is ignored. It's just checked for existence. 

Comments

8

If you use the CMake GUI then swap to the advanced view and then the option is called CMAKE_VERBOSE_MAKEFILE.

1 Comment

How can I set this option in text files, without using GUI?
5

I was trying something similar to ensure the -ggdb flag was present.

Call make in a clean directory and grep the flag you are looking for. Looking for debug rather than ggdb I would just write.

make VERBOSE=1 | grep debug

The -ggdb flag was obscure enough that only the compile commands popped up.

Comments

0

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE will generate a file with all compilation commands.

This file is required by some LSP to know how to compile a source file out of the box, but it could also help for debugging compilation problems.

The output file is named ${CMAKE_BINARY_DIR}/compile_commands.json.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.