Как заставить 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". Я не уверен, как контролировать это поведение.

8 ответов

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

make -n

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

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

make SHELL='sh -x'

это еще один вариант. Образец Makefile:

a:
    @echo a

Выход:

+ echo a
a

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

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

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

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

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

Сгенерированные CMake Makefiles

make VERBOSE=1

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

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

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

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

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

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

или же

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

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

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

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

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

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

make --debug=j

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

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

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

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

make AM_DEFAULT_VERBOSITY=1

Ссылка: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html

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

  • Если вы хотите увидеть все команды (включая скомпилированные) целевого запуска по умолчанию:
      make --always-make --dry-run
make -Bn
  • команды show, выполненные при следующем запускеmake:
      make --dry-run
make -n

В этом примере вы можете выбрать цель, отличную от используемой по умолчанию.

Другие вопросы по тегам