I'm trying to debug a compilation problem, but I cannot seem to get GCC (or maybe it is make??) to show me the actual compiler and linker commands it is executing.
Here is the output I am seeing:
CCLD libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1
What I want to see should be similar to this:
$ make
gcc -Wall -c -o main.o main.c
gcc -Wall -c -o hello_fn.o hello_fn.c
gcc main.o hello_fn.o -o main
Notice how this example has the complete gcc
command displayed. The above example merely shows things like "CCLD libvirt_parthelper". I'm not sure how to control this behavior.
gcc
command?
To invoke a dry run:
make -n
This will show what make
is attempting to do.
Library makefiles, which are generated by autotools (the ./configure
you have to issue) often have a verbose option, so basically, using make VERBOSE=1
or make V=1
should give you the full commands.
But this depends on how the makefile was generated.
The -d
option might help, but it will give you an extremely long output.
VERBOSE=1
, not V=1
.
Build system independent method
make SHELL='sh -x'
is another option. Sample Makefile
:
a:
@echo a
Output:
+ echo a
a
This sets the special SHELL
variable for make
, and -x
tells sh
to print the expanded line before executing it.
One advantage over -n
is that is actually runs the commands. I have found that for some projects (e.g. Linux kernel) that -n
may stop running much earlier than usual probably because of dependency problems.
One downside of this method is that you have to ensure that the shell that will be used is sh
, which is the default one used by Make as they are POSIX, but could be changed with the SHELL
make variable.
Doing sh -v
would be cool as well, but Dash 0.5.7 (Ubuntu 14.04 sh
) ignores for -c
commands (which seems to be how make
uses it) so it doesn't do anything.
make -p
will also interest you, which prints the values of set variables.
CMake generated Makefiles always support VERBOSE=1
As in:
mkdir build
cd build
cmake ..
make VERBOSE=1
Dedicated question at: Using CMake with GNU Make: How can I see the exact commands?
SHELL='$$SHELL -x'
will make $SHELL
literal which is not evaluated. Using make SHELL="$SHELL -x"
will work.
Since GNU Make version 4.0, the --trace
argument is a nice way to tell what and why a makefile do, outputing lines like:
makefile:8: target 'foo.o' does not exist
or
makefile:12: update target 'foo' due to: bar
make -n
.
Use make V=1
Other suggestions here:
make VERBOSE=1 - did not work at least from my trials.
make -n - displays only logical operation, not command line being executed. E.g. CC source.cpp
make --debug=j - works as well, but might also enable multi threaded building, causing extra output.
make VERBOSE=1
is for CMake. Your trials were most likely with GNU autotools-based projects.
I like to use:
make --debug=j
https://linux.die.net/man/1/make
--debug[=FLAGS]
Print debugging information in addition to normal processing. If the FLAGS are omitted, then the behavior is the same as if -d
was specified. FLAGS may be a for all debugging output (same as using -d
), b
for basic debugging, v
for more verbose basic debugging, i
for showing implicit rules, j
for details on invocation of commands, and m
for debugging while remaking makefiles.
Reaping winning child xyz
and Jobserver client (fds 3,4)
and Need a job token; we don't have children
and so on.
Depending on your automake version, you can also use this:
make AM_DEFAULT_VERBOSITY=1
Reference: AM_DEFAULT_VERBOSITY
Note: I added this answer since V=1
did not work for me.
Success story sharing
make -n
does not execute the commands. Thus correct answer ismake V=1
make V=1
is only working if the Makefile supports it. automake's makefiles do that, but many others don't.make VERBOSE=1
; for GNU autotoolsmake V=1
.make SHELL='sh -x'
: stackoverflow.com/a/32010960/895245