Jak zmusić make / GCC do pokazania mi poleceń?


276

Próbuję debugować problem z kompilacją, ale wydaje mi się, że nie mogę uzyskać GCC (a może jest to make ??), aby pokazać mi rzeczywiste polecenia kompilatora i linkera, które wykonuje.

Oto wynik, który widzę:

  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

To, co chcę zobaczyć, powinno być podobne do tego:

$ 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

Zwróć uwagę, jak w tym przykładzie jest wyświetlane pełne gccpolecenie. Powyższy przykład pokazuje tylko takie rzeczy jak „CCLD libvirt_parthelper”. Nie jestem pewien, jak kontrolować to zachowanie.


Czy używasz makefile, czy tylko gccpolecenia?
Blender

20
Wygląda to na wyjście Kbuild lub Autotools . Spróbować make V=1.
jww

Odpowiedzi:


275

Aby wywołać próbę na sucho :

make -n

To pokaże, co makepróbuje zrobić.


30
Znaleziono :) make V = 1 Chociaż powyższa sugestia „make -n” również działała. :) Dziękuję wszystkim za odpowiedzi.
hernejj

75
Różnica polega na tym, make -nże nie wykonuje poleceń. Zatem poprawna odpowiedź tomake V=1
m-ric

19
make V=1działa tylko wtedy, gdy plik Makefile go obsługuje. Pliki makake automake robią to, ale wiele innych nie.
larsr

53
W przypadku CMake użyj make VERBOSE=1; dla autotoolów GNU make V=1.
Ruslan

10
@ m-ric, jeśli chcesz uruchomić, faktycznie uruchom komendy, rozważ make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

175

Pliki makr bibliotek, które są generowane przez narzędzia automatyczne ( ./configurektóre musisz wydać) często mają pełną opcję, więc w zasadzie za pomocą make VERBOSE=1lub make V=1powinny dać ci pełne polecenia.

Zależy to jednak od sposobu wygenerowania pliku makefile.

Ta -dopcja może pomóc, ale da ci wyjątkowo długi wynik.


60
Uwaga: Generowane przez CMake pliki Makefile obsługują tylko VERBOSE=1nie V=1.
blinry

3
V = 1 działało dla mnie, kompilując nuttx z mips-linux-gnu-gcc, dziękuję.
jcomeau_ictx

141

Zbuduj metodę niezależną od systemu

make SHELL='sh -x'

jest inną opcją. Próbka Makefile:

a:
    @echo a

Wynik:

+ echo a
a

Ustawia to specjalną SHELLzmienną makei -xnakazuje shwydrukowanie rozwiniętej linii przed jej wykonaniem.

Zaletą -njest to, że faktycznie uruchamia polecenia. Odkryłem, że w przypadku niektórych projektów (np. Jądro Linuksa), które -nmogą przestać działać znacznie wcześniej niż zwykle, prawdopodobnie z powodu problemów z zależnościami.

Jednym minusem tej metody jest to, że musisz upewnić się, że używana będzie powłoka sh, która jest domyślną powłoką używaną przez Make, ponieważ są POSIX, ale można ją zmienić za pomocą SHELLzmiennej make.

Robienie sh -vbyłoby również fajne, ale Dash 0.5.7 (Ubuntu 14.04 sh) ignoruje -cpolecenia (wydaje się, makeże tak to wykorzystuje), więc nic nie robi.

make -p zainteresuje cię również, co drukuje wartości ustawionych zmiennych.

CMake wygenerował Makefile

make VERBOSE=1

Zobacz: Używanie CMake z GNU Make: Jak mogę zobaczyć dokładne polecenia?


11
Zdecydowanie najlepsza odpowiedź, która nie zależy od tego, jak dobrze oryginalny
plik

2
Jeśli ktoś może wyjaśnić opinię negatywną, daj mi znać, abym mógł nauczyć się i poprawić informacje ;-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

make SHELL='$$SHELL -x'sprawi, że $SHELLliterał nie będzie oceniany. Korzystanie make SHELL="$SHELL -x"będzie działać.
Rick van der Zwet

1
jest to najlepsza ogólna odpowiedź, w przeciwieństwie do niektórych innych odpowiedzi, nie zależy to od użycia cmake
Mike76,

2
make SHELL = „sh -x” jest super!
Jackie Yeh,

22

Od wersji GNU Make w wersji 4.0 --traceargument jest dobrym sposobem, aby powiedzieć, co i dlaczego robi makefile, wypisując wiersze takie jak:

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

lub

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

1
Ten argument wypisuje bardziej szczegółowe informacje niż praca na sucho. Bardzo pomocne jest zrozumienie tworzenia systemów, które mają złożony proces kompilacji, taki jak dpdk.
makerj

19

Posługiwać się make V=1

Inne sugestie tutaj:

  • make VERBOSE=1 - nie działało przynajmniej z moich prób.
  • make -n- wyświetla tylko operację logiczną, a nie wykonywaną linię poleceń. Na przykładCC source.cpp

  • make --debug=j - działa również, ale może również umożliwić budowanie wielowątkowe, powodując dodatkowe wyjście.


4
make VERBOSE=1jest dla CMake. Twoje próby najprawdopodobniej dotyczyły projektów opartych na automatycznych narzędziach GNU.
Ruslan

12

Lubię używać:

make --debug=j

Pokazuje polecenia, które wykonuje:

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

--debug [= FLAGI]

Drukuj informacje debugowania oprócz normalnego przetwarzania. Jeśli FLAGI zostaną pominięte, zachowanie będzie takie samo, jak gdyby -dzostało określone. Flagi mogą być przeznaczone do wszystkich wyników debugowania (tak samo jak przy użyciu -d), bdo podstawowego debugowania, vdo bardziej szczegółowego debugowania podstawowego, ido pokazywania ukrytych reguł, jdo szczegółów dotyczących wywoływania poleceń i mdo debugowania podczas ponownego tworzenia plików makefiles.


7

W zależności od wersji automake możesz także użyć tego:

make AM_DEFAULT_VERBOSITY=1

Odniesienie: AM_DEFAULT_VERBOSITY

Uwaga: dodałem tę odpowiedź, ponieważ V=1nie działała dla mnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.