Using CMake with GNU Make: How can I see the exact commands?
Asked Answered
S

8

362

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?

Swatch answered 19/4, 2010 at 19:19 Comment(3)
Or, to add some search terms, How to hide full, verbose executed command lines and show only terse quiet percentage colored output.Lindsley
Non CMake superset: stackoverflow.com/questions/5820303/…Bernadine
mkdir build; cd build; cmake .. --debug-output; make VERBOSE=1Edgaredgard
P
482

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
Peipus answered 20/4, 2010 at 7:33 Comment(9)
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.Aronoff
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.Hocus
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.Peipus
Single line... cmake --build . -- VERBOSE=1Herzog
Apparently, I must be working with an newer cmake version, because there are no makefiles found in my build directory after running cmake...Bunchy
Ok found it: need to run cmake with generate "Unix Makefiles": cmake .. -G"Unix Makefiles"Bunchy
second time here, I'd like to vote up for this answer ones more )Juratory
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.Dufrene
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON works for me at Clion, cmake: 3.20+Rosamondrosamund
T
106

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

set(CMAKE_VERBOSE_MAKEFILE ON)
Tetradymite answered 16/11, 2015 at 17:30 Comment(3)
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.Destination
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.Tetradymite
This is a great option when using qt.io QtCreator because cmake is called by the GUI. Thank you!Mangosteen
P
17

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

Paraguay answered 26/6, 2018 at 6:35 Comment(1)
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.Implosive
B
14

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.

Bernadine answered 1/9, 2020 at 15:6 Comment(2)
Unknown argument --verboseDulse
@Dulse I've just tested on Ubuntu 22.04 Cmake 3.22.1 and it worked. What's your cmake version?Bernadine
A
8

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

Axilla answered 20/4, 2010 at 7:43 Comment(1)
How can I set this option in text files, without using GUI?Kotta
P
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.

Predilection answered 6/12, 2016 at 7:24 Comment(0)
H
5

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.
Hogshead answered 17/8, 2022 at 19:11 Comment(0)
Y
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.

York answered 12/5, 2022 at 8:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.