Making CMake print commands before executing
I'm working on a large C++ project built with CMake on Linux. CMake runs okay, producing a horde of Makefiles in the tree of modules and applications. Running GNU make
leads to linker errors. How can I get make
to print out the exact commands before running them?
The -d option does not print the commands, but plenty of information that hasn't been helpful.
The -n option prints all the commands, but does not run them, so I can't tell were exactly the trouble is. Examining the stdout from make -n, I don't see any commands that are relevant. I suspect some commands change depending on the results of earlier commands, and the hierarchy of Makefiles makes it difficult to tell what's really going on.
I don't see any other options in make's man page that seem helpful.
I am fairly sure this will work:
make VERBOSE=1
You should also be able to add this to your CMakeLists.txt to permanently set that:
set(CMAKE_VERBOSE_MAKEFILE on)
This is covered in the CMake FAQ.
For automake-generated Makefiles, try:
make V=1
An option, which applies to GNU make and works with any Makefile, whether generated by CMake or not, is to use the --trace
option to make. This will print out the commands make
is executing and still execute them.
This applies to all commands, not just those that VERBOSE=1
or V=1
triggers the printing of in CMake/automake generated makefiles.
And yet another alternative on Linux is to run make under strace, as strace -f -e trace=execve make <make options>
. The output from strace will include every process that is executed: by make, by a shell script that make ran, etc.
For instance, you might find that the CMake-generated makefile executes /usr/bin/cmake -E __run_co_compile <lots of options ...>
and still wonder what the exact compiler invocation(s) are that this in turn will run. You can get that with the strace method.
For those using cmake --build
, which invokes make
internally, use either:
$ cmake --build <dir> -- VERBOSE=1
Note the --
before VERBOSE=1
! That passes the argument to the underlying make
process.
Or:
$ VERBOSE=1 cmake --build <dir>
which also passes VERBOSE=1
to make
, this time via an environment variable.
Or, if using cmake
version 3.14 or higher:
$ cmake --build <dir> --verbose
Note the order of the arguments! The --verbose
option must come after --build
and its argument.