ChatGPT解决这个技术问题 Extra ChatGPT

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

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?

Or, to add some search terms, How to hide full, verbose executed command lines and show only terse quiet percentage colored output.
mkdir build; cd build; cmake .. --debug-output; make VERBOSE=1

Z
Zoe stands with Ukraine

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

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.
C
Ciro Santilli Путлер Капут 六四事

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

set(CMAKE_VERBOSE_MAKEFILE ON)

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!
m
makerj

Or simply export VERBOSE environment variable on the shell like this: export VERBOSE=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.
S
SteveL

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


How can I set this option in text files, without using GUI?
A
Alexander Griffith

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.


C
Ciro Santilli Путлер Капут 六四事

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.


Unknown argument --verbose
@KansaiRobot I've just tested on Ubuntu 22.04 Cmake 3.22.1 and it worked. What's your cmake version?
S
Stéphane Clérambault

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.


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now