Как заставить make/GCC показывать мне команды?

Я пытаюсь отладить проблему компиляции, но я не могу заставить GCC (или, может быть, это make??) показать мне фактические команды компилятора и компоновщика, которые он выполняет.

Вот результат, который я вижу:

  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

То, что я хочу увидеть, должно быть примерно таким:

$ 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

Обратите внимание, как в этом примере отображается полная команда gcc. Приведенный выше пример просто показывает такие вещи, как "CCLD libvirt_parthelper". Я не уверен, как контролировать это поведение.

Ответ 1

Чтобы вызвать сухой прогон:

make -n

Это покажет, что пытается сделать make.

Ответ 2

Библиотечные make файлы, сгенерированные autotools (./configure вы должны выпустить) часто имеют подробный параметр, поэтому в основном использование make VERBOSE=1 или make V=1 должно дать вам полные команды.

Но это зависит от того, как был создан make файл.

Опция -d может помочь, но она даст вам очень длинный вывод.

Ответ 3

Создать независимый от системы метод

make SHELL='sh -x'

- еще один вариант. Пример Makefile:

a:
    @echo a

Вывод:

+ echo a
a

Это устанавливает специальную переменную SHELL для make, а -x сообщает sh распечатать развернутую строку перед ее выполнением.

Одно преимущество перед -n заключается в том, что на самом деле выполняются команды. Я обнаружил, что для некоторых проектов (например, ядра Linux), что -n может перестать работать намного раньше обычного, вероятно, из-за проблем с зависимостями.

Один недостаток этого метода заключается в том, что вы должны убедиться, что оболочка, которая будет использоваться, будет sh, которая является стандартной по умолчанию, используемой Make как они представляют собой POSIX, но может быть изменена с помощью переменной SHELL make.

Выполнение sh -v также было бы классно, но Dash 0.5.7 (Ubuntu 14.04 sh) игнорирует команды -c (что похоже на то, как make использует его), поэтому ничего не делает.

make -p также будет интересовать вас, который печатает значения заданных переменных.

Созданные с помощью CMake Makefile

make VERBOSE=1

Смотрите: Использование CMake с GNU Make: Как я могу видеть точные команды?

Ответ 4

Так как GNU Make версии 4.0, аргумент --trace - отличный способ рассказать, что и почему делает make файл, выводя строки:

makefile:8: target 'foo.o' does not exist

или

makefile:12: update target 'foo' due to: bar

Ответ 5

Используйте make V=1

Другие предложения здесь:

  • make VERBOSE=1 - не сработало по крайней мере из моих испытаний.
  • make -n - отображает только логическую операцию, а не выполняемую командную строку. Например, CC source.cpp

  • make --debug=j - также работает, но может также включить многопоточное построение, что приведет к дополнительному выводу.

Ответ 6

В зависимости от вашей версии automake, вы также можете использовать это:

make AM_DEFAULT_VERBOSITY=1

Ссылка: AM_DEFAULT_VERBOSITY

Примечание: я добавил этот ответ, так как V=1 не работал для меня.

Ответ 7

Мне нравится использовать:

make --debug=j

Он показывает команды, которые он выполняет:

https://linux.die.net/man/1/make

--debug [= ФЛАГИ]

Печать отладочной информации в дополнение к обычной обработке. Если флаги опущены, то поведение такое же, как если -d было указано -d. FLAGS может быть для всех результатов отладки (аналогично использованию -d), b для базовой отладки, v для более подробной базовой отладки, i для показа неявных правил, j для подробностей о вызове команд и m для отладки при повторной обработке make файлов,