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

277

Я пытаюсь отладить проблему компиляции, но я не могу заставить 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". Я не уверен, как контролировать это поведение.

hernejj
источник
Вы запускаете make-файл или просто gccкоманду?
Блендер
20
Это похоже на вывод Kbuild или Autotools . Попробуй make V=1.
jww
1
Связанный: противоположный вопрос Управляйте выводом команды make, чтобы она была менее многословной, не
повторяйте

Ответы:

275

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

make -n

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

chrisaycock
источник
31
Нашел :) make V = 1 Хотя вышеупомянутое предложение "make -n" также сработало. :) Спасибо всем за ваши ответы.
Херней
76
Разница в том, что make -nне выполняет команды. Таким образом, правильный ответmake V=1
m-ric
20
make V=1работает только если Makefile поддерживает это. Это делают make-файлы automake, но многие другие этого не делают.
Ларср
53
Для CMake используйте make VERBOSE=1; для автоинструментов GNU make V=1.
Руслан
10
@ m-ric, если вы хотите запустить на самом деле запустить команды, рассмотрим make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
175

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

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

-dВариант может помочь, но это даст вам очень длинный выход.

Gui13
источник
60
Примечание. Созданные CMake файлы Makefile поддерживают только VERBOSE=1, но не поддерживают V=1.
blinry
3
V = 1 работал для меня, компилируя nuttx с помощью mips-linux-gnu-gcc, спасибо.
jcomeau_ictx
141

Построить системно-независимый метод

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 Makefiles

make VERBOSE=1

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

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
11
Определенно лучший ответ, который не зависит от того, насколько хорошо был написан / сгенерирован оригинальный Makefile
nodakai
2
Если кто-то может объяснить отрицательный голос, дайте мне знать, чтобы я мог изучить и улучшить информацию ;-)
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
make SHELL='$$SHELL -x'создаст $SHELLлитерал, который не оценивается. Использование make SHELL="$SHELL -x"будет работать.
Рик ван дер Цвет
1
это лучший общий ответ, в отличие от некоторых других ответов, это не зависит от использования cmake
Mike76
2
make SHELL = 'sh -x' супер!
Джеки Yeh
22

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

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

или

makefile:12: update target 'foo' due to: bar
Жюльен Палар
источник
1
Этот аргумент выводит более подробную информацию, чем пробный запуск. Очень полезно понять, что такое make-системы со сложным процессом сборки, такие как dpdk.
makerj
20

использование make V=1

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

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

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

TarmoPikaro
источник
4
make VERBOSE=1это для CMake. Ваши испытания были, скорее всего, с GNU autotools проектов.
Руслан
12

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

make --debug=j

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

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

--debug [=] ФЛАГИ

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

Сантьяго Вильяфуэрте
источник
7

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

make AM_DEFAULT_VERBOSITY=1

Ссылка: AM_DEFAULT_VERBOSITY

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

Ру Хаша
источник