Ответ 1
Чтобы вызвать сухой прогон:
make -n
Это покажет, что пытается сделать make
.
Я пытаюсь отладить проблему компиляции, но я не могу заставить 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". Я не уверен, как контролировать это поведение.
Чтобы вызвать сухой прогон:
make -n
Это покажет, что пытается сделать make
.
Библиотечные make файлы, сгенерированные autotools (./configure
вы должны выпустить) часто имеют подробный параметр, поэтому в основном использование make VERBOSE=1
или make V=1
должно дать вам полные команды.
Но это зависит от того, как был создан make файл.
Опция -d
может помочь, но она даст вам очень длинный вывод.
Создать независимый от системы метод
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: Как я могу видеть точные команды?
Так как 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
- также работает, но может также включить многопоточное построение, что приведет к дополнительному выводу.
В зависимости от вашей версии automake, вы также можете использовать это:
make AM_DEFAULT_VERBOSITY=1
Ссылка: AM_DEFAULT_VERBOSITY
Примечание: я добавил этот ответ, так как V=1
не работал для меня.
Мне нравится использовать:
make --debug=j
Он показывает команды, которые он выполняет:
https://linux.die.net/man/1/make
--debug [= ФЛАГИ]
Печать отладочной информации в дополнение к обычной обработке. Если флаги опущены, то поведение такое же, как если -d
было указано -d
. FLAGS может быть для всех результатов отладки (аналогично использованию -d
), b
для базовой отладки, v
для более подробной базовой отладки, i
для показа неявных правил, j
для подробностей о вызове команд и m
для отладки при повторной обработке make файлов,